diff --git a/modules/core/lib/Storage/SQLPermanentStorage.php b/modules/core/lib/Storage/SQLPermanentStorage.php index 54bb5642bf1b59201b850164f1ac343489d4b64a..c70fd4179829729a67f7c11d351cb74a6490f975 100644 --- a/modules/core/lib/Storage/SQLPermanentStorage.php +++ b/modules/core/lib/Storage/SQLPermanentStorage.php @@ -29,12 +29,11 @@ class sspmod_core_Storage_SQLPermanentStorage { mkdir($sqllitedir); } - $dbfile = $sqllitedir . $name . '.sqllite'; - - if ($this->db = new SQLiteDatabase($dbfile)) { + $dbfile = 'sqlite:' . $sqllitedir . $name . '.sqlite'; + if ($this->db = new \PDO($dbfile)) { $q = @$this->db->query('SELECT key1 FROM data LIMIT 1'); if ($q === false) { - $this->db->queryExec(' + $this->db->exec(' CREATE TABLE data ( key1 text, key2 text, @@ -64,50 +63,49 @@ class sspmod_core_Storage_SQLPermanentStorage { $setDuration = ''; if (is_null($duration)) { - $setDuration = 'NULL'; + $expire = null; } else { - $setDuration = "'" . sqlite_escape_string(time() + $duration) . "'"; + $expire = time() + $duration; } - - $query = "INSERT INTO data (key1,key2,type,created,updated,expire,value) VALUES (" . - "'" . sqlite_escape_string($key1) . "'," . - "'" . sqlite_escape_string($key2) . "'," . - "'" . sqlite_escape_string($type) . "'," . - "'" . sqlite_escape_string(time()) . "'," . - "'" . sqlite_escape_string(time()) . "'," . - $setDuration . "," . - "'" . sqlite_escape_string(serialize($value)) . "')"; - $results = $this->db->queryExec($query); - return $results; + + $query = "INSERT INTO data (key1, key2, type, created, updated, expire, value)" . + " VALUES(:key1, :key2, :type, :created, :updated, :expire, :value)"; + $prepared = $this->db->prepare($query); + $data = array(':key1' => $key1, ':key2' => $key2, + ':type' => $type, ':created' => time(), + ':updated' => time(), ':expire' => $expire, + ':value' => serialize($value)); + $prepared->execute($data); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); + return $results; } private function update($type, $key1, $key2, $value, $duration = NULL) { $setDuration = ''; if (is_null($duration)) { - $setDuration = ", expire = NULL "; + $expire = null; } else { - $setDuration = ", expire = '" . sqlite_escape_string(time() + $duration) . "' "; + $expire = time() + $duration; } - $query = "UPDATE data SET " . - "updated = '" . sqlite_escape_string(time()) . "'," . - "value = '" . sqlite_escape_string(serialize($value)) . "'" . - $setDuration . - "WHERE " . - "key1 = '" . sqlite_escape_string($key1) . "' AND " . - "key2 = '" . sqlite_escape_string($key2) . "' AND " . - "type = '" . sqlite_escape_string($type) . "'"; - $results = $this->db->queryExec($query); - return $results; + $query = "UPDATE data SET updated = :updated, value = :value, expire = :expire WHERE key1 = :key1 AND key2 = :key2 AND type = :type"; + $prepared = $this->db->prepare($query); + $data = array(':key1' => $key1, ':key2' => $key2, + ':type' => $type, ':updated' => time(), + ':expire' => $expire, ':value' => serialize($value)); + $prepared->execute($data); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); + return $results; } public function get($type = NULL, $key1 = NULL, $key2 = NULL) { - - $condition = self::getCondition($type, $key1, $key2); - $query = "SELECT * FROM data WHERE " . $condition; - $results = $this->db->arrayQuery($query, SQLITE_ASSOC); + $conditions = self::getCondition($type, $key1, $key2); + $query = 'SELECT * FROM data WHERE ' . $conditions; + $prepared = $this->db->prepare($query); + $prepared->execute(); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); if (count($results) !== 1) return NULL; $res = $results[0]; @@ -125,19 +123,20 @@ class sspmod_core_Storage_SQLPermanentStorage { } public function exists($type, $key1, $key2) { - $query = "SELECT * FROM data WHERE " . - "key1 = '" . sqlite_escape_string($key1) . "' AND " . - "key2 = '" . sqlite_escape_string($key2) . "' AND " . - "type = '" . sqlite_escape_string($type) . "' LIMIT 1"; - $results = $this->db->arrayQuery($query, SQLITE_ASSOC); + $query = 'SELECT * FROM data WHERE type = :type AND key1 = :key1 AND key2 = :key2 LIMIT 1'; + $prepared = $this->db->prepare($query); + $data = array(':type' => $type, ':key1' => $key1, ':key2' => $key2); + $prepared->execute($data); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); return (count($results) == 1); } public function getList($type = NULL, $key1 = NULL, $key2 = NULL) { - - $condition = self::getCondition($type, $key1, $key2); - $query = "SELECT * FROM data WHERE " . $condition; - $results = $this->db->arrayQuery($query, SQLITE_ASSOC); + $conditions = self::getCondition($type, $key1, $key2); + $query = 'SELECT * FROM data WHERE ' . $conditions; + $prepared = $this->db->prepare($query); + $prepared->execute(); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); if (count($results) == 0) return NULL; foreach($results AS $key => $value) { @@ -147,14 +146,15 @@ class sspmod_core_Storage_SQLPermanentStorage { } public function getKeys($type = NULL, $key1 = NULL, $key2 = NULL, $whichKey = 'type') { - if (!in_array($whichKey, array('key1', 'key2', 'type'), true)) throw new Exception('Invalid key type'); - - $condition = self::getCondition($type, $key1, $key2); - - $query = "SELECT DISTINCT " . $whichKey . " FROM data WHERE " . $condition; - $results = $this->db->arrayQuery($query, SQLITE_ASSOC); + + $conditions = self::getCondition($type, $key1, $key2); + $query = 'SELECT DISTINCT :whichKey FROM data WHERE ' . $conditions; + $prepared = $this->db->prepare($query); + $data = array('whichKey' => $whichKey); + $prepared->execute($data); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); if (count($results) == 0) return NULL; @@ -168,31 +168,30 @@ class sspmod_core_Storage_SQLPermanentStorage { public function remove($type, $key1, $key2) { - $query = "DELETE FROM data WHERE " . - "key1 = '" . sqlite_escape_string($key1) . "' AND " . - "key2 = '" . sqlite_escape_string($key2) . "' AND " . - "type = '" . sqlite_escape_string($type) . "'"; - $results = $this->db->arrayQuery($query, SQLITE_ASSOC); + $query = 'DELETE FROM data WHERE type = :type AND key1 = :key1 AND key2 = :key2'; + $prepared = $this->db->prepare($query); + $data = array(':type' => $type, ':key1' => $key1, ':key2' => $key2); + $prepared->execute($data); + $results = $prepared->fetchAll(PDO::FETCH_ASSOC); return (count($results) == 1); } public function removeExpired() { - $query = "DELETE FROM data WHERE expire NOT NULL AND expire < " . time(); - $this->db->arrayQuery($query, SQLITE_ASSOC); - $changes = $this->db->changes(); - return $changes; + $query = "DELETE FROM data WHERE expire NOT NULL AND expire < :expire"; + $prepared = $this->db->prepare($query); + $data = array(':expire' => time()); + $prepared->execute($data); + return $prepared->rowCount(); } - - + /** * Create a SQL condition statement based on parameters */ - private static function getCondition($type = NULL, $key1 = NULL, $key2 = NULL) { + private function getCondition($type = NULL, $key1 = NULL, $key2 = NULL) { $conditions = array(); - - if (!is_null($type)) $conditions[] = "type = '" . sqlite_escape_string($type) . "'"; - if (!is_null($key1)) $conditions[] = "key1 = '" . sqlite_escape_string($key1) . "'"; - if (!is_null($key2)) $conditions[] = "key2 = '" . sqlite_escape_string($key2) . "'"; + if (!is_null($type)) $conditions[] = "type = " . $this->db->quote($type); + if (!is_null($key1)) $conditions[] = "key1 = " . $this->db->quote($key1); + if (!is_null($key2)) $conditions[] = "key2 = " . $this->db->quote($key2); if (count($conditions) === 0) return '1'; @@ -200,7 +199,5 @@ class sspmod_core_Storage_SQLPermanentStorage { return $condition; } - - }