diff --git a/backend/lib/model/database.php b/backend/lib/model/database.php index 3840896..9ce02cd 100644 --- a/backend/lib/model/database.php +++ b/backend/lib/model/database.php @@ -58,7 +58,7 @@ abstract class DatabaseResultSet implements Iterator { * @return array */ public function next() { - return next($this->_rows); + return next($this->_rows); // TODO with fetch_assoc } /** @@ -147,18 +147,23 @@ interface DatabaseInterface { public function execute($sql); /** - * @brief query - * @param string $sql - * @param int $offset - * @param int $limit - * @return TDatabaseResultSet + * @brief escape strings + * @param string $string to escape + * @return string escaped string */ - public function query($sql, $limit = NULL, $offset = NULL); - public function escapeString($string); + /** + * @brief escape expression + * @param mixed $string to escape + * @return string + */ public function escape($value); + /** + * @brief get last inserted id + * @return integer of the last record + */ public function lastInsertId(); } @@ -166,7 +171,6 @@ interface DatabaseInterface { * @brief abstract database layer definition */ abstract class Database implements DatabaseInterface { - static private $connection = NULL; /** @@ -205,13 +209,72 @@ abstract class Database implements DatabaseInterface { public function escape($value) { if (is_numeric($value)) { - return $value; + return (string) $value; } else { $value = '\'' . $this->escapeString($value) . '\''; } - return $value; + return $value; + } +} + +class DatabaseQuery { + static public function select($table, $fields = '*', $filter = array(), $conjunction = true, $joins = array(), $limit = NULL, $offset = NULL) { + $sql = 'SELECT ' . $fields . ' FROM ' . $table; + + foreach ($joins as $join) { + $sql .= self::join($join[0], $join[1]); + } + + $sql .= self::filter($filter, $conjunction); + + if (!is_null($limit)) + $sql .= ' LIMIT ' . (int) $limit; + + if (!is_null($offset)) + $sql .= ' OFFSET ' . (int) $offset; + + return $sql; + } + + static public function delete($table, $filters, $conjunction = true) { + return 'DELETE FROM ' . $table . self::filter($filters, $conjunction); + } + + static public function update($table, $data, $filters, $conjunction = true) { + $dbh = Database::getConnection(); + + $newData = array(); + foreach ($data as $column => $value) { + $newData[] = $column . ' = ' . $dbh->escape($value); + } + + $sql = 'UPDATE ' . $table . ' SET' . implode(' ,' , $newData) . self::filter($filters, $conjunction); + + return $sql; + } + + static protected function filter($filters, $conjunction) { + $dbh = Database::getConnection(); + + $where = array(); + foreach ($filters as $column => $value) { + if (is_array($value)) { + $where[] = $column . ' IN (' . implode(', ', array_map(array(Database::getConnection(), 'escape'), $value)) . ')'; + } + else { + $where[] = $column . ' = ' . $dbh->escape($value); + } + } + + if (count($where) > 0) { + return ' WHERE ' . implode(($conjunction === true) ? ' && ' : ' || ', $where); + } + } + + static protected function join($table, $condition, $type = 'left') { + return ' ' . strtoupper($type) . ' JOIN ' . $table . ' ON ' . $condition; } } diff --git a/backend/lib/model/db/mysql.php b/backend/lib/model/db/mysql.php index a04b715..214c444 100644 --- a/backend/lib/model/db/mysql.php +++ b/backend/lib/model/db/mysql.php @@ -24,7 +24,7 @@ */ class MySqlException extends DatabaseException { - function __construct($message = null, $code = 0) { + function __construct($message = NULL, $code = 0) { $message = sprintf('%04d: %s', mysql_errno(), mysql_error()); parent::__construct($message, mysql_errno()); } @@ -116,24 +116,7 @@ class MySql extends Database { // TODO replace by mysqli $this->statements[] = $sql; - return $result; - } - - /** - * @brief mysql query - * @param string $sql query - * @param int $offset - * @param int $limit - * @return TDatabaseResultSet - */ - public function query($sql, $limit = NULL, $offset = NULL) { - if (!is_null($limit)) - $sql .= ' LIMIT ' . (int) $limit; - - if (!is_null($offset)) - $sql .= ' OFFSET ' . (int) $offset; - - return new MySqlResultSet($this->execute($sql)); + return new MySqlResultSet($result); } /** diff --git a/backend/lib/model/db/pgsql.php b/backend/lib/model/db/pgsql.php index 7bf5fae..672cb09 100644 --- a/backend/lib/model/db/pgsql.php +++ b/backend/lib/model/db/pgsql.php @@ -116,24 +116,7 @@ class PgSql extends Database { $this->statements[] = $sql; - return $result; - } - - /** - * @brief pgsql query - * @param string $sql query - * @param int $offset - * @param int $limit - * @return TDatabaseResultSet - */ - public function query($sql, $limit = NULL, $offset = NULL) { - if (!is_null($limit)) - $sql .= ' LIMIT ' . (int) $limit; - - if (!is_null($offset)) - $sql .= ' OFFSET ' . (int) $offset; - - return new PgSqlResultSet($this->execute($sql)); + return new PgSqlResultSet($result); } /** diff --git a/backend/lib/model/db/sqlite.php b/backend/lib/model/db/sqlite.php index 72761fa..cf76532 100644 --- a/backend/lib/model/db/sqlite.php +++ b/backend/lib/model/db/sqlite.php @@ -97,24 +97,7 @@ class SqLite extends Database { $this->statements[] = $sql; - return $result; - } - - /** - * @brief sqlite query - * @param string $sql query - * @param int $offset - * @param int $limit - * @return TDatabaseResultSet - */ - public function query($sql, $limit = NULL, $offset = NULL) { - if (!is_null($limit)) - $sql .= ' LIMIT ' . (int) $limit; - - if (!is_null($offset)) - $sql .= ' OFFSET ' . (int) $offset; - - return new SqLiteResultSet($this->execute($sql)); + return new SqLiteResultSet($result); } /** diff --git a/share/tools/tests.php b/share/tests/tests.php similarity index 100% rename from share/tools/tests.php rename to share/tests/tests.php