|
1 | | -//<?php |
2 | | -// ToDO: Remove this file |
3 | | -//namespace headstart\persistence; |
4 | | -// |
5 | | -///** |
6 | | -// * Description of SQLitePersistence |
7 | | -// * |
8 | | -// * @author pkraker |
9 | | -// */ |
10 | | -//require_once 'Persistence.php'; |
11 | | -// |
12 | | -//class SQLitePersistence implements Persistence |
13 | | -//{ |
14 | | -// |
15 | | -// protected $db; |
16 | | -// |
17 | | -// public function __construct($db) { |
18 | | -// try { |
19 | | -// $this->db = new \PDO('sqlite:' . $db); |
20 | | -// $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); |
21 | | -// } catch (PDOException $e) { |
22 | | -// echo 'Connection failed: ' . $e->getMessage(); |
23 | | -// } |
24 | | -// } |
25 | | -// |
26 | | -// public function createTables() { |
27 | | -// $this->db->exec("CREATE TABLE IF NOT EXISTS 'revisions' ( |
28 | | -// 'rev_id' INTEGER NOT NULL, |
29 | | -// 'rev_vis' TEXT NOT NULL, |
30 | | -// 'vis_query' TEXT, |
31 | | -// 'rev_user' TEXT, |
32 | | -// 'rev_timestamp' NUMERIC, |
33 | | -// 'rev_comment' TEXT, |
34 | | -// 'rev_data' TEXT, |
35 | | -// PRIMARY KEY(rev_id, rev_vis), |
36 | | -// FOREIGN KEY('vis_query') REFERENCES visualizations (vis_clean_query), |
37 | | -// FOREIGN KEY('rev_id') REFERENCES revisions (vis_latest) |
38 | | -// )"); |
39 | | -// |
40 | | -// $this->db->exec("CREATE TABLE IF NOT EXISTS 'visualizations' ( |
41 | | -// 'vis_id' TEXT NOT NULL UNIQUE, |
42 | | -// 'vis_query' TEXT, |
43 | | -// 'vis_clean_query' TEXT, |
44 | | -// 'vis_title' TEXT, |
45 | | -// 'vis_latest' INTEGER, |
46 | | -// 'vis_params' TEXT, |
47 | | -// PRIMARY KEY(vis_id) |
48 | | -// )"); |
49 | | -// } |
50 | | -// |
51 | | -// public function createVisualization($vis_id, $vis_title, $data, $vis_clean_query = null, $vis_query = null, $params = null): void |
52 | | -// { |
53 | | -// //create entry in visualization and first revision |
54 | | -// |
55 | | -// $this->prepareAndExecute("INSERT INTO visualizations (vis_id, vis_query, vis_clean_query, vis_title, vis_params) " |
56 | | -// . "VALUES (?, ?, ?, ?, ?)" |
57 | | -// , array($vis_id, $vis_query, $vis_clean_query, $vis_title, $params)); |
58 | | -// |
59 | | -// $this->writeRevision($vis_id, $data, $rev_id = 1); |
60 | | -// } |
61 | | -// |
62 | | -// public function existsVisualization($vis_id): array|bool |
63 | | -// { |
64 | | -// $result = $this->prepareExecuteAndReturnResult( |
65 | | -// "SELECT EXISTS(SELECT 1 FROM visualizations WHERE vis_id=?)" |
66 | | -// , array($vis_id) |
67 | | -// , $first = true); |
68 | | -// |
69 | | -// return $result[0]; |
70 | | -// } |
71 | | -// |
72 | | -// public function getLastVersion($vis_id, $details = false, $context = false): array|bool |
73 | | -// { |
74 | | -// return $this->getRevision($vis_id, null, $details, $context); |
75 | | -// } |
76 | | -// |
77 | | -// public function getRevision($vis_id, $rev_id, $details = false, $context = false): array|bool |
78 | | -// { |
79 | | -// |
80 | | -// $id = ($rev_id == null)?("revisions.rev_id"):("?"); |
81 | | -// $array = ($rev_id == null)?(array(addslashes($vis_id))):(array(addslashes($vis_id), $rev_id)); |
82 | | -// $return_fields = ""; |
83 | | -// if($context === false) { |
84 | | -// $return_fields = ($details==true)?("revisions.*"):("revisions.rev_data"); |
85 | | -// } else { |
86 | | -// $return_fields = "revisions.rev_vis, revisions.vis_query, visualizations.vis_title, " |
87 | | -// . "revisions.rev_timestamp, visualizations.vis_params, revisions.rev_data"; |
88 | | -// } |
89 | | -// |
90 | | -// $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
91 | | -// WHERE visualizations.vis_id = ? |
92 | | -// AND visualizations.vis_id = revisions.rev_vis |
93 | | -// AND visualizations.vis_latest =" . $id |
94 | | -// , $array, (!$details && !$context)); |
95 | | -// |
96 | | -// return $result; |
97 | | -// } |
98 | | -// |
99 | | -// public function getContext($vis_id): array |
100 | | -// { |
101 | | -// $return_fields = "revisions.rev_vis, revisions.vis_query, visualizations.vis_title, " |
102 | | -// . "revisions.rev_timestamp, visualizations.vis_params"; |
103 | | -// |
104 | | -// $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
105 | | -// WHERE visualizations.vis_id = ? |
106 | | -// AND visualizations.vis_id = revisions.rev_vis |
107 | | -// AND visualizations.vis_latest = revisions.rev_id" |
108 | | -// , array($vis_id)); |
109 | | -// |
110 | | -// return $result; |
111 | | -// } |
112 | | -// |
113 | | -// public function getLatestRevisions($limit = 30, $details = false): array |
114 | | -// { |
115 | | -// |
116 | | -// $count_query = $this->prepareExecuteAndReturnResult("SELECT Count(*) FROM revisions", array(), $first = true); |
117 | | -// $count = $count_query[0]; |
118 | | -// $start_index = $count - $limit; |
119 | | -// |
120 | | -// $return_fields = "revisions.rev_vis, revisions.rev_timestamp, revisions.vis_query, visualizations.vis_title"; |
121 | | -// $return_fields .= ($details==true)?(", revisions.rev_data"):(""); |
122 | | -// |
123 | | -// $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
124 | | -// WHERE visualizations.vis_id = revisions.rev_vis |
125 | | -// LIMIT ?, ?" |
126 | | -// , array($start_index, $limit), $first = false); |
127 | | -// |
128 | | -// return $result; |
129 | | -// } |
130 | | -// |
131 | | -// public function writeRevision($vis_id, $data, $rev_id = null): void |
132 | | -// { |
133 | | -// |
134 | | -// $rev = $rev_id; |
135 | | -// |
136 | | -// if($rev == null) { |
137 | | -// $ver = $this->prepareExecuteAndReturnResult("SELECT vis_latest FROM visualizations WHERE vis_id=?", |
138 | | -// array($vis_id), |
139 | | -// $first = true); |
140 | | -// $rev = $ver[0] + 1; |
141 | | -// } |
142 | | -// |
143 | | -// $query = $this->prepareExecuteAndReturnResult("SELECT vis_clean_query FROM visualizations WHERE vis_id=?", |
144 | | -// array($vis_id), |
145 | | -// $first = true); |
146 | | -// |
147 | | -// $this->prepareAndExecute("INSERT INTO revisions (rev_id, rev_vis, rev_user, rev_timestamp, rev_comment, rev_data, vis_query) |
148 | | -// VALUES (:rev_id, :rev_vis, :rev_user, :rev_timestamp, :rev_comment, :rev_data, :vis_query)" |
149 | | -// , array( |
150 | | -// ":rev_id" => $rev |
151 | | -// ,":rev_vis" => $vis_id |
152 | | -// ,":rev_user" => "System" |
153 | | -// ,":rev_timestamp" => date("Y-m-d H:i:s", time()) |
154 | | -// ,":rev_comment" => "Visualization created" |
155 | | -// ,":rev_data" => $data |
156 | | -// ,":vis_query" => $query[0] |
157 | | -// )); |
158 | | -// |
159 | | -// $this->prepareAndExecute("UPDATE visualizations SET vis_latest=? WHERE vis_id=?" |
160 | | -// , array($rev, $vis_id)); |
161 | | -// |
162 | | -// } |
163 | | -// |
164 | | -// protected function prepareAndExecute($stmt, $array) { |
165 | | -// try { |
166 | | -// $query = $this->db->prepare($stmt); |
167 | | -// $result = $query->execute($array); |
168 | | -// return array("status" => $result, "query" => $query); |
169 | | -// } catch (PDOException $err) { |
170 | | -// var_dump($err->getMessage()); |
171 | | -// die(".."); |
172 | | -// } |
173 | | -// } |
174 | | -// |
175 | | -// private function prepareExecuteAndReturnResult($stmt, $array, $first = false) { |
176 | | -// $result = $this->prepareAndExecute($stmt, $array); |
177 | | -// $fetch_result = $result["query"]->fetchAll(); |
178 | | -// |
179 | | -// if ($fetch_result == false) { |
180 | | -// return false; |
181 | | -// } else if ($first == true) { |
182 | | -// return $fetch_result[0]; |
183 | | -// } else { |
184 | | -// return $fetch_result; |
185 | | -// } |
186 | | -// } |
187 | | -// |
188 | | -// public function createID($string_array, $payload): string |
189 | | -// { |
190 | | -// $string_to_hash = implode(" ", $string_array); |
191 | | -// $unique_id = md5($string_to_hash); |
192 | | -// |
193 | | -// return $unique_id; |
194 | | -// } |
195 | | -// |
196 | | -//} |
| 1 | +<?php |
| 2 | + |
| 3 | +namespace headstart\persistence; |
| 4 | + |
| 5 | +// ToDo: Remove this file after cleunuping all references to it |
| 6 | + |
| 7 | +/** |
| 8 | + * Description of SQLitePersistence |
| 9 | + * |
| 10 | + * @author pkraker |
| 11 | + */ |
| 12 | +require_once 'Persistence.php'; |
| 13 | + |
| 14 | +class SQLitePersistence implements Persistence |
| 15 | +{ |
| 16 | + |
| 17 | + protected $db; |
| 18 | + |
| 19 | + public function __construct($db) { |
| 20 | + try { |
| 21 | + $this->db = new \PDO('sqlite:' . $db); |
| 22 | + $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); |
| 23 | + } catch (PDOException $e) { |
| 24 | + echo 'Connection failed: ' . $e->getMessage(); |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + public function createTables() { |
| 29 | + $this->db->exec("CREATE TABLE IF NOT EXISTS 'revisions' ( |
| 30 | + 'rev_id' INTEGER NOT NULL, |
| 31 | + 'rev_vis' TEXT NOT NULL, |
| 32 | + 'vis_query' TEXT, |
| 33 | + 'rev_user' TEXT, |
| 34 | + 'rev_timestamp' NUMERIC, |
| 35 | + 'rev_comment' TEXT, |
| 36 | + 'rev_data' TEXT, |
| 37 | + PRIMARY KEY(rev_id, rev_vis), |
| 38 | + FOREIGN KEY('vis_query') REFERENCES visualizations (vis_clean_query), |
| 39 | + FOREIGN KEY('rev_id') REFERENCES revisions (vis_latest) |
| 40 | + )"); |
| 41 | + |
| 42 | + $this->db->exec("CREATE TABLE IF NOT EXISTS 'visualizations' ( |
| 43 | + 'vis_id' TEXT NOT NULL UNIQUE, |
| 44 | + 'vis_query' TEXT, |
| 45 | + 'vis_clean_query' TEXT, |
| 46 | + 'vis_title' TEXT, |
| 47 | + 'vis_latest' INTEGER, |
| 48 | + 'vis_params' TEXT, |
| 49 | + PRIMARY KEY(vis_id) |
| 50 | + )"); |
| 51 | + } |
| 52 | + |
| 53 | + public function createVisualization($vis_id, $vis_title, $data, $vis_clean_query = null, $vis_query = null, $params = null): void |
| 54 | + { |
| 55 | + //create entry in visualization and first revision |
| 56 | + |
| 57 | + $this->prepareAndExecute("INSERT INTO visualizations (vis_id, vis_query, vis_clean_query, vis_title, vis_params) " |
| 58 | + . "VALUES (?, ?, ?, ?, ?)" |
| 59 | + , array($vis_id, $vis_query, $vis_clean_query, $vis_title, $params)); |
| 60 | + |
| 61 | + $this->writeRevision($vis_id, $data, $rev_id = 1); |
| 62 | + } |
| 63 | + |
| 64 | + public function existsVisualization($vis_id): array|bool |
| 65 | + { |
| 66 | + $result = $this->prepareExecuteAndReturnResult( |
| 67 | + "SELECT EXISTS(SELECT 1 FROM visualizations WHERE vis_id=?)" |
| 68 | + , array($vis_id) |
| 69 | + , $first = true); |
| 70 | + |
| 71 | + return $result[0]; |
| 72 | + } |
| 73 | + |
| 74 | + public function getLastVersion($vis_id, $details = false, $context = false): array|bool |
| 75 | + { |
| 76 | + return $this->getRevision($vis_id, null, $details, $context); |
| 77 | + } |
| 78 | + |
| 79 | + public function getRevision($vis_id, $rev_id, $details = false, $context = false): array|bool |
| 80 | + { |
| 81 | + |
| 82 | + $id = ($rev_id == null)?("revisions.rev_id"):("?"); |
| 83 | + $array = ($rev_id == null)?(array(addslashes($vis_id))):(array(addslashes($vis_id), $rev_id)); |
| 84 | + $return_fields = ""; |
| 85 | + if($context === false) { |
| 86 | + $return_fields = ($details==true)?("revisions.*"):("revisions.rev_data"); |
| 87 | + } else { |
| 88 | + $return_fields = "revisions.rev_vis, revisions.vis_query, visualizations.vis_title, " |
| 89 | + . "revisions.rev_timestamp, visualizations.vis_params, revisions.rev_data"; |
| 90 | + } |
| 91 | + |
| 92 | + $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
| 93 | + WHERE visualizations.vis_id = ? |
| 94 | + AND visualizations.vis_id = revisions.rev_vis |
| 95 | + AND visualizations.vis_latest =" . $id |
| 96 | + , $array, (!$details && !$context)); |
| 97 | + |
| 98 | + return $result; |
| 99 | + } |
| 100 | + |
| 101 | + public function getContext($vis_id): array |
| 102 | + { |
| 103 | + $return_fields = "revisions.rev_vis, revisions.vis_query, visualizations.vis_title, " |
| 104 | + . "revisions.rev_timestamp, visualizations.vis_params"; |
| 105 | + |
| 106 | + $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
| 107 | + WHERE visualizations.vis_id = ? |
| 108 | + AND visualizations.vis_id = revisions.rev_vis |
| 109 | + AND visualizations.vis_latest = revisions.rev_id" |
| 110 | + , array($vis_id)); |
| 111 | + |
| 112 | + return $result; |
| 113 | + } |
| 114 | + |
| 115 | + public function getLatestRevisions($limit = 30, $details = false): array |
| 116 | + { |
| 117 | + |
| 118 | + $count_query = $this->prepareExecuteAndReturnResult("SELECT Count(*) FROM revisions", array(), $first = true); |
| 119 | + $count = $count_query[0]; |
| 120 | + $start_index = $count - $limit; |
| 121 | + |
| 122 | + $return_fields = "revisions.rev_vis, revisions.rev_timestamp, revisions.vis_query, visualizations.vis_title"; |
| 123 | + $return_fields .= ($details==true)?(", revisions.rev_data"):(""); |
| 124 | + |
| 125 | + $result = $this->prepareExecuteAndReturnResult("SELECT $return_fields FROM revisions, visualizations |
| 126 | + WHERE visualizations.vis_id = revisions.rev_vis |
| 127 | + LIMIT ?, ?" |
| 128 | + , array($start_index, $limit), $first = false); |
| 129 | + |
| 130 | + return $result; |
| 131 | + } |
| 132 | + |
| 133 | + public function writeRevision($vis_id, $data, $rev_id = null): void |
| 134 | + { |
| 135 | + |
| 136 | + $rev = $rev_id; |
| 137 | + |
| 138 | + if($rev == null) { |
| 139 | + $ver = $this->prepareExecuteAndReturnResult("SELECT vis_latest FROM visualizations WHERE vis_id=?", |
| 140 | + array($vis_id), |
| 141 | + $first = true); |
| 142 | + $rev = $ver[0] + 1; |
| 143 | + } |
| 144 | + |
| 145 | + $query = $this->prepareExecuteAndReturnResult("SELECT vis_clean_query FROM visualizations WHERE vis_id=?", |
| 146 | + array($vis_id), |
| 147 | + $first = true); |
| 148 | + |
| 149 | + $this->prepareAndExecute("INSERT INTO revisions (rev_id, rev_vis, rev_user, rev_timestamp, rev_comment, rev_data, vis_query) |
| 150 | + VALUES (:rev_id, :rev_vis, :rev_user, :rev_timestamp, :rev_comment, :rev_data, :vis_query)" |
| 151 | + , array( |
| 152 | + ":rev_id" => $rev |
| 153 | + ,":rev_vis" => $vis_id |
| 154 | + ,":rev_user" => "System" |
| 155 | + ,":rev_timestamp" => date("Y-m-d H:i:s", time()) |
| 156 | + ,":rev_comment" => "Visualization created" |
| 157 | + ,":rev_data" => $data |
| 158 | + ,":vis_query" => $query[0] |
| 159 | + )); |
| 160 | + |
| 161 | + $this->prepareAndExecute("UPDATE visualizations SET vis_latest=? WHERE vis_id=?" |
| 162 | + , array($rev, $vis_id)); |
| 163 | + |
| 164 | + } |
| 165 | + |
| 166 | + protected function prepareAndExecute($stmt, $array) { |
| 167 | + try { |
| 168 | + $query = $this->db->prepare($stmt); |
| 169 | + $result = $query->execute($array); |
| 170 | + return array("status" => $result, "query" => $query); |
| 171 | + } catch (PDOException $err) { |
| 172 | + var_dump($err->getMessage()); |
| 173 | + die(".."); |
| 174 | + } |
| 175 | + } |
| 176 | + |
| 177 | + private function prepareExecuteAndReturnResult($stmt, $array, $first = false) { |
| 178 | + $result = $this->prepareAndExecute($stmt, $array); |
| 179 | + $fetch_result = $result["query"]->fetchAll(); |
| 180 | + |
| 181 | + if ($fetch_result == false) { |
| 182 | + return false; |
| 183 | + } else if ($first == true) { |
| 184 | + return $fetch_result[0]; |
| 185 | + } else { |
| 186 | + return $fetch_result; |
| 187 | + } |
| 188 | + } |
| 189 | + |
| 190 | + public function createID($string_array, $payload): string |
| 191 | + { |
| 192 | + $string_to_hash = implode(" ", $string_array); |
| 193 | + $unique_id = md5($string_to_hash); |
| 194 | + |
| 195 | + return $unique_id; |
| 196 | + } |
| 197 | + |
| 198 | +} |
0 commit comments