db.php 6.3 KB

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