db.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <?php
  2. class DB extends SQLite3 {
  3. private $open = false;
  4. public function __construct () {}
  5. /*
  6. * If the db is saying "unable to open database":
  7. * Check the db.sqlite's permmisions:
  8. * - chmod 775 /path/to/webapp/db.sqlite
  9. * Check the db.sqlite's parent directory permissions
  10. * - chmod 775 /path/to/webapp/
  11. * - chown username:www-data /path/to/webapp
  12. */
  13. private function ensure_connection () {
  14. if (!$this->open) {
  15. $this->open('db.sqlite');
  16. $this->open = true;
  17. } else {
  18. $this->close();
  19. $this->open('db.sqlite');
  20. }
  21. // Create tables if they don't exist
  22. if (!@$this->query('SELECT * FROM dossiers LIMIT 1')) {
  23. $res = $this->query('
  24. CREATE TABLE dossiers (
  25. name varchar(128),
  26. slugname varchar(128),
  27. cloud_link varchar(1024),
  28. wiki_link varchar(1024),
  29. pads_link varchar(1024),
  30. last_edit_date datetime
  31. )
  32. ');
  33. if ($res)
  34. echo "<pre>created dossiers table</pre>";
  35. else
  36. echo "<pre>error creating dossiers table: ".$this->lastErrorMsg()."</pre>";
  37. }
  38. if (!@$this->query('SELECT * FROM projects LIMIT 1')) {
  39. $res = $this->query('
  40. CREATE TABLE projects (
  41. name varchar(128),
  42. slugname varchar(128),
  43. dossier_id integer,
  44. main_pad varchar(1024),
  45. cover_pad varchar(1024),
  46. pads text,
  47. last_edit_date datetime
  48. )
  49. ');
  50. if ($res)
  51. echo "<pre>created projects table</pre>";
  52. else
  53. echo "<pre>error creating projects table: ".$this->lastErrorMsg()."</pre>";
  54. }
  55. // Add columns that don't exist (retro-compatibility)
  56. // TODO: have a version number (in db/table comment ?) so that we don't have to blindly query
  57. @$this->query('ALTER TABLE dossiers ADD pads_link varchar(1024)');
  58. return true;
  59. }
  60. public function GetObjects ($type) {
  61. $this->ensure_connection();
  62. if (!in_array($type,['dossiers','projects'])) {
  63. echo "<pre>mistake '$type'</pre>";
  64. return [];
  65. }
  66. $results = $this->query("SELECT rowid, * FROM $type");
  67. $objects = [];
  68. while ($o = $results->fetchArray(SQLITE3_ASSOC))
  69. $objects[$o['rowid']] = $o;
  70. return $objects;
  71. }
  72. public function GetEmptyObject ($type) {
  73. switch ($type) {
  74. case 'dossier':
  75. return [
  76. 'rowid'=>'',
  77. 'name'=>'',
  78. 'slugname'=>'',
  79. 'cloud_link'=>'',
  80. 'wiki_link'=>'',
  81. 'pads_link'=>'',
  82. 'last_edit_date'=>'',
  83. ];
  84. case 'project':
  85. return [
  86. 'rowid'=>'',
  87. 'name'=>'',
  88. 'slugname'=>'',
  89. 'dossier_id'=>'',
  90. 'dossier'=>'',
  91. 'main_pad'=>'',
  92. 'cover_pad'=>'',
  93. 'pads'=>'',
  94. 'last_edit_date'=>'',
  95. ];
  96. }
  97. }
  98. public function CreateOrEdit ($type,$params) {
  99. switch ($type) {
  100. case 'dossier':
  101. return $this->CreateOrEditDossier($params);
  102. case 'project':
  103. return $this->CreateOrEditProject($params);
  104. }
  105. }
  106. public function CreateOrEditDossier ($params) {
  107. $this->ensure_connection();
  108. // EDITION
  109. if (isset($params['rowid']) && $params['rowid']) {
  110. $q = $this->prepare("
  111. UPDATE dossiers
  112. SET
  113. name = :name,
  114. cloud_link = :cloud_link,
  115. wiki_link = :wiki_link,
  116. pads_link = :pads_link,
  117. last_edit_date = datetime('now')
  118. WHERE
  119. rowid = :rowid
  120. ");
  121. $q->bindValue(':name', $params['name'], SQLITE3_TEXT);
  122. $q->bindValue(':cloud_link', $params['cloud_link'], SQLITE3_TEXT);
  123. $q->bindValue(':wiki_link', $params['wiki_link'], SQLITE3_TEXT);
  124. $q->bindValue(':pads_link', $params['pads_link'], SQLITE3_TEXT);
  125. $q->bindValue(':rowid', $params['rowid'], SQLITE3_INTEGER);
  126. $result = $q->execute();
  127. if (!$result)
  128. echo "<pre>Erreur à l'édition: ".$this->lastErrorMsg()."</pre>";
  129. else
  130. return $params['rowid'];
  131. }
  132. // CREATION
  133. else {
  134. $slug = preg_replace('_\W+_','-',strtolower($params['name']));
  135. $slug = preg_replace('_^-|-$_','',$slug);
  136. $q = $this->prepare("
  137. INSERT INTO dossiers
  138. (name, slugname, cloud_link, wiki_link, pads_link, last_edit_date)
  139. VALUES
  140. (:name, :slugname, :cloud_link, :wiki_link, :pads_link, datetime('now'))
  141. ");
  142. $q->bindValue(':name', $params['name'], SQLITE3_TEXT);
  143. $q->bindValue(':slugname', $slug, SQLITE3_TEXT);
  144. $q->bindValue(':cloud_link', $params['cloud_link'], SQLITE3_TEXT);
  145. $q->bindValue(':wiki_link', $params['wiki_link'], SQLITE3_TEXT);
  146. $q->bindValue(':pads_link', $params['pads_link'], SQLITE3_TEXT);
  147. $result = $q->execute();
  148. if ($result)
  149. return $this->lastInsertRowID();
  150. }
  151. return false;
  152. }
  153. public function CreateOrEditProject ($params) {
  154. $this->ensure_connection();
  155. // $params['pads'] = json_encode($params['pads']);
  156. // EDITION
  157. if (isset($params['rowid']) && $params['rowid']) {
  158. $q = $this->prepare("
  159. UPDATE projects
  160. SET
  161. name = :name,
  162. dossier_id = :dossier_id,
  163. main_pad = :main_pad,
  164. cover_pad = :cover_pad,
  165. pads = :pads,
  166. last_edit_date = datetime('now')
  167. WHERE
  168. rowid = :rowid
  169. ");
  170. $q->bindValue(':name', $params['name'], SQLITE3_TEXT);
  171. $q->bindValue(':dossier_id', $params['dossier_id'], SQLITE3_INTEGER);
  172. $q->bindValue(':main_pad', $params['main_pad'], SQLITE3_TEXT);
  173. $q->bindValue(':cover_pad', $params['cover_pad'], SQLITE3_TEXT);
  174. $q->bindValue(':pads', 'TODO', SQLITE3_TEXT);
  175. $q->bindValue(':rowid', $params['rowid'], SQLITE3_INTEGER);
  176. $result = $q->execute();
  177. if (!$result)
  178. echo "<pre>Erreur à l'édition: ".$this->lastErrorMsg()."</pre>";
  179. else
  180. return $params['rowid'];
  181. }
  182. // CREATION
  183. else {
  184. $slug = preg_replace('_\W+_','-',strtolower($params['name']));
  185. $slug = preg_replace('_^-|-$_','',$slug);
  186. $q = $this->prepare("
  187. INSERT INTO projects
  188. (name, slugname, dossier_id, main_pad, cover_pad, last_edit_date)
  189. VALUES
  190. (:name, :slugname, :dossier_id, :main_pad, :cover_pad, datetime('now'))
  191. ");
  192. $q->bindValue(':name', $params['name'], SQLITE3_TEXT);
  193. $q->bindValue(':slugname', $slug, SQLITE3_TEXT);
  194. $q->bindValue(':dossier_id', $params['dossier_id'], SQLITE3_INTEGER);
  195. $q->bindValue(':main_pad', $params['main_pad'], SQLITE3_TEXT);
  196. $q->bindValue(':cover_pad', $params['cover_pad'], SQLITE3_TEXT);
  197. $q->bindValue(':pads', $params['pads'], SQLITE3_TEXT);
  198. $result = $q->execute();
  199. if ($result)
  200. return $this->lastInsertRowID();
  201. }
  202. return false;
  203. }
  204. public function Delete ($type,$id) {
  205. switch ($type) {
  206. case 'dossier':
  207. return $this->DeleteDossier($id);
  208. case 'project':
  209. return $this->DeleteProject($id);
  210. }
  211. }
  212. public function DeleteDossier ($id) {
  213. $this->ensure_connection();
  214. $q = $this->prepare("DELETE FROM dossiers WHERE rowid = :rowid");
  215. $q->bindValue(':rowid', $id, SQLITE3_INTEGER);
  216. $result = $q->execute();
  217. if (!$result)
  218. echo "<pre>Error deleting dossier $id: ".$this->lastErrorMsg()."</pre>";
  219. return $result?true:false;
  220. }
  221. public function DeleteProject ($id) {
  222. $this->ensure_connection();
  223. $q = $this->prepare("DELETE FROM projects WHERE rowid = :rowid");
  224. $q->bindValue(':rowid', $id, SQLITE3_INTEGER);
  225. $result = $q->execute();
  226. if (!$result)
  227. echo "<pre>Error deleting project $id: ".$this->lastErrorMsg()."</pre>";
  228. return $result?true:false;
  229. }
  230. }