]> dev.renevier.net Git - syp.git/blob - inc/db/mysql.php
web interface to add co-administrators
[syp.git] / inc / db / mysql.php
1 <?php
2 /* Copyright (c) 2009 Arnaud Renevier, Inc, published under the modified BSD
3    license. */
4
5 require_once ("./inc/db/anydb.php");
6
7 class mysqlConnection implements anydbConnection {
8     var $link = null;
9     var $dbprefix = null;
10
11     public function connect ($host, $user, $pwd, $dbname, $dbprefix) {
12         if (!function_exists ("mysql_connect")) {
13             throw new Exception (anydbConnection::err_driver_unavailable);
14         }
15         if ($this->link) { // connection has already been opened
16             return;
17         }
18         $this->link = @mysql_connect ($host,$user,$pwd,true);
19         if (!$this->link) {
20             throw new Exception (anydbConnection::err_connection);
21         }
22         if (!mysql_select_db ($dbname, $this->link)) {
23             throw new Exception (anydbConnection::err_unknown_database);
24         }
25         $this->dbprefix = $dbprefix;
26     }
27
28     public function users_table_exists () {
29         return $this->_tblexists ("users");
30     }
31     public function create_users_table () {
32         $query = sprintf ("CREATE TABLE " .
33                            "%susers (
34                             name VARCHAR(255) NOT NULL, pwd CHAR(32),
35                             PRIMARY KEY (name));", $this->dbprefix);
36         $this->_execute_query ($query);
37     }
38
39     public function items_table_exists () {
40         return $this->_tblexists ("items");
41     }
42     public function create_items_table () {
43         $query = sprintf ("CREATE TABLE " .
44                             "%sitems (
45                                 id MEDIUMINT NOT NULL AUTO_INCREMENT,
46                                 location POINT,
47                                 title VARCHAR(127),
48                                 description TEXT,
49                                 imgpath VARCHAR(255),
50                                 date DATETIME,
51                                 user VARCHAR(255),
52                                 PRIMARY KEY (id)
53                             );", $this->dbprefix);
54         $this->_execute_query ($query);
55     }
56
57     public function setpwd ($user_name, $pwd, $create_if_not_exists) {
58         $usrname_escaped = mysql_real_escape_string ($user_name);
59         $query = sprintf ("SELECT COUNT(*) FROM %susers WHERE name LIKE '%s';",
60                         $this->dbprefix, $usrname_escaped);
61         $res = mysql_fetch_array ($this->_execute_query ($query), MYSQL_NUM);
62         if ($res [0] == 1) {
63             if ($create_if_not_exists) {
64                 $query = sprintf ("UPDATE %susers SET pwd='%s' WHERE name like '%s';", 
65                                $this->dbprefix, md5 ($pwd), $usrname_escaped);
66             } else {
67                 throw new Exception (anydbConnection::err_query);
68             }
69         } else {
70             $query = sprintf ("INSERT INTO %susers VALUES ('%s', '%s');", 
71                                $this->dbprefix, $usrname_escaped, md5 ($pwd));
72         }
73         $this->_execute_query ($query);
74     }
75
76     public function checkpwdmd5 ($user_name, $pwd_md5) {
77         $query = sprintf ("SELECT COUNT(*) FROM %susers WHERE name LIKE '%s'
78                            AND pwd LIKE '%s';",
79                            $this->dbprefix, 
80                            mysql_real_escape_string ($user_name),
81                            mysql_real_escape_string ($pwd_md5));
82         $res = mysql_fetch_array ($this->_execute_query ($query), MYSQL_NUM);
83         if ($res [0] >= 1) {
84             return true;
85         } else {
86             return false;
87         }
88     }
89
90     public function save_feature ($feature) {
91         try {
92             $id = $feature->id;
93         } catch (Exception $e) {}
94         if (isset ($id)) {
95             $query = sprintf ("UPDATE %sitems SET
96                                     imgpath='%s', 
97                                     title='%s', 
98                                     description='%s', 
99                                     location=GeomFromText('POINT(%s %s)')
100                             WHERE id = '%s';",
101                             $this->dbprefix,
102                             mysql_real_escape_string ($feature->imgpath),
103                             mysql_real_escape_string ($feature->title),
104                             mysql_real_escape_string ($feature->description),
105                             $feature->lon,
106                             $feature->lat,
107                             $id);
108                 $this->_execute_query ($query);
109                 return $feature;
110         } else {
111               $query = sprintf ("INSERT INTO %sitems
112                               (imgpath, title, description, location, date, user)
113                                 VALUES ('%s', '%s', '%s', 
114                                GeomFromText('POINT(%s %s)'), NOW(), '%s')", 
115                               $this->dbprefix,
116                               mysql_real_escape_string ($feature->imgpath),
117                               mysql_real_escape_string ($feature->title),
118                               mysql_real_escape_string ($feature->description),
119                               $feature->lon,
120                               $feature->lat,
121                               mysql_real_escape_string ($feature->user)
122                     );
123
124                 $this->_execute_query ($query);
125                 $id = mysql_insert_id ();
126                 return new feature ($id, $feature->lon, $feature->lat,
127                                     $feature->imgpath, $feature->title,
128                                     $feature->description, $feature->date,
129                                     $feature->user);
130         }
131     }
132
133     public function delete_feature ($feature) {
134         $query = sprintf ("DELETE from %sitems WHERE id = '%s'",
135                         $this->dbprefix,
136                         mysql_real_escape_string ($feature->id));
137         $this->_execute_query ($query);
138         return true;
139     }
140
141     public function getfeature ($id) {
142         $query = sprintf ("SELECT id, imgpath, title, description, AsText(location)
143                            AS location, UNIX_TIMESTAMP(date) AS date, user
144                            FROM %sitems WHERE id = '%s';", 
145                         $this->dbprefix, mysql_real_escape_string ($id));
146         $row = mysql_fetch_assoc ($this->_execute_query ($query));
147         if ($row === false) {
148             return null;
149         }
150         return $this->_feature_frow_row ($row);
151     }
152
153     public function listfeatures ($user) {
154         if ($user && ($user != "admin")) {
155             $from_user_query = sprintf (" WHERE user = '%s' ",
156                                         mysql_real_escape_string ($user));
157         } else {
158             $from_user_query = "";
159         }
160
161         $query = sprintf ("SELECT id, imgpath, title, description, AsText(location)
162                             AS location, UNIX_TIMESTAMP(date) AS date, user
163                             FROM %sitems %s;",
164                           $this->dbprefix, $from_user_query);
165
166         $features = array ();
167         $res = $this->_execute_query ($query);
168         while ($row = mysql_fetch_assoc ($res)) {
169             $feature = $this->_feature_frow_row ($row);
170             if (isset ($feature)) {
171                 $features[] = $feature;
172             }
173         }
174         return $features;
175     }
176
177     public function mostrecentfeatures ($num_features) {
178         $query = sprintf ("SELECT id, imgpath, title, description,
179                            AsText(location) AS location, UNIX_TIMESTAMP(date)
180                            AS date, user FROM %sitems ORDER BY date DESC",
181                            $this->dbprefix);
182         if ($num_features) {
183             $query .= sprintf (" LIMIT %d", $num_features);
184         }
185         $features = array ();
186         $res = $this->_execute_query ($query);
187         while ($row = mysql_fetch_assoc ($res)) {
188             $feature = $this->_feature_frow_row ($row);
189             if (isset ($feature)) {
190                 $features[] = $feature;
191             }
192         }
193         return $features;
194     }
195
196     public function imgpath_exists ($imgpath) {
197         $query = sprintf ("SELECT COUNT(*) FROM %sitems WHERE imgpath LIKE '%s';",
198                            $this->dbprefix, mysql_real_escape_string ($imgpath));
199         $res = mysql_fetch_array  ($this->_execute_query ($query), MYSQL_NUM);
200         return ($res [0] >= 1) ? true : false;
201     }
202
203     public function getdbname () {
204         return "Mysql";
205     }
206
207     private function _tblexists ($tblname) {
208         $query = sprintf ("SHOW TABLES LIKE '%s%s';",
209                             $this->dbprefix, $tblname);
210         return mysql_num_rows ($this->_execute_query ($query)) == 1;
211     }
212
213     private function _feature_frow_row ($row) {
214         // XXX: should I remove invalid features from database ?
215         if (!preg_match ('/^POINT\(([0-9\-\.]+)\s+([0-9\-\.]+)\)$/',
216                         $row ["location"], $matches)) {
217             return null;
218         }
219         $lon = $matches [1];
220         $lat = $matches [2];
221         try {
222             $feature = new feature ($row ["id"], $lon, $lat, $row ["imgpath"],
223                                     $row ["title"], $row ["description"],
224                                     $row ["date"], $row ["user"]);
225         } catch (Exception $e) {
226             return null;
227         }
228         return $feature;
229     }
230
231     private function _execute_query ($query) {
232         if (!function_exists ("mysql_query")) {
233             throw new Exception (anydbConnection::err_driver_unavailable);
234         }
235         if (!$this->link) {
236             throw new Exception (anydbConnection::err_query);
237         }
238         $res = mysql_query ($query, $this->link);
239         if ($res == false) {
240             throw new Exception (anydbConnection::err_query);
241         }
242         return $res;
243     }
244 }
245
246 $connection = new mysqlConnection();
247 ?>