diff options
author | Evgeny Zinoviev <me@ch1p.io> | 2024-01-31 06:11:00 +0300 |
---|---|---|
committer | Evgeny Zinoviev <me@ch1p.io> | 2024-01-31 20:45:40 +0300 |
commit | c0dc531ebefd8912819f3b6c8bda1fed3c7e750c (patch) | |
tree | 2c75aa9df182260aef09faf4befd81a4c2b9c5e2 /engine/database | |
parent | 48d688cdf7f9eae1bf11b8a6f0e5b98687c604cb (diff) |
make it simple, but not simpler
Diffstat (limited to 'engine/database')
-rw-r--r-- | engine/database/CommonDatabase.php | 107 | ||||
-rw-r--r-- | engine/database/MySQLConnection.php | 82 | ||||
-rw-r--r-- | engine/database/SQLiteConnection.php | 81 |
3 files changed, 0 insertions, 270 deletions
diff --git a/engine/database/CommonDatabase.php b/engine/database/CommonDatabase.php deleted file mode 100644 index 13ea79c..0000000 --- a/engine/database/CommonDatabase.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php - -abstract class CommonDatabase { - - abstract public function query(string $sql, ...$args); - abstract public function escape(string $s): string; - abstract public function fetch($q): ?array; - abstract public function fetchAll($q): ?array; - abstract public function fetchRow($q): ?array; - abstract public function result($q, int $field = 0); - abstract public function insertId(): ?int; - abstract public function numRows($q): ?int; - - protected function prepareQuery(string $sql, ...$args): string { - global $config; - if (!empty($args)) { - $mark_count = substr_count($sql, '?'); - $positions = array(); - $last_pos = -1; - for ($i = 0; $i < $mark_count; $i++) { - $last_pos = strpos($sql, '?', $last_pos + 1); - $positions[] = $last_pos; - } - for ($i = $mark_count - 1; $i >= 0; $i--) { - $arg_val = $args[$i]; - if (is_null($arg_val)) { - $v = 'NULL'; - } else { - $v = '\''.$this->escape($arg_val) . '\''; - } - $sql = substr_replace($sql, $v, $positions[$i], 1); - } - } - if (!empty($config['db']['log'])) - logDebug(__METHOD__.': ', $sql); - return $sql; - } - - public function insert(string $table, array $fields) { - return $this->performInsert('INSERT', $table, $fields); - } - - public function replace(string $table, array $fields) { - return $this->performInsert('REPLACE', $table, $fields); - } - - protected function performInsert(string $command, string $table, array $fields) { - $names = []; - $values = []; - $count = 0; - foreach ($fields as $k => $v) { - $names[] = $k; - $values[] = $v; - $count++; - } - - $sql = "{$command} INTO `{$table}` (`" . implode('`, `', $names) . "`) VALUES (" . implode(', ', array_fill(0, $count, '?')) . ")"; - array_unshift($values, $sql); - - return $this->query(...$values); - } - - public function update(string $table, array $rows, ...$cond) { - $fields = []; - $args = []; - foreach ($rows as $row_name => $row_value) { - $fields[] = "`{$row_name}`=?"; - $args[] = $row_value; - } - $sql = "UPDATE `$table` SET ".implode(', ', $fields); - if (!empty($cond)) { - $sql .= " WHERE ".$cond[0]; - if (count($cond) > 1) - $args = array_merge($args, array_slice($cond, 1)); - } - return $this->query($sql, ...$args); - } - - public function multipleInsert(string $table, array $rows) { - list($names, $values) = $this->getMultipleInsertValues($rows); - $sql = "INSERT INTO `{$table}` (`".implode('`, `', $names)."`) VALUES ".$values; - return $this->query($sql); - } - - public function multipleReplace(string $table, array $rows) { - list($names, $values) = $this->getMultipleInsertValues($rows); - $sql = "REPLACE INTO `{$table}` (`".implode('`, `', $names)."`) VALUES ".$values; - return $this->query($sql); - } - - protected function getMultipleInsertValues(array $rows): array { - $names = []; - $sql_rows = []; - foreach ($rows as $i => $fields) { - $row_values = []; - foreach ($fields as $field_name => $field_val) { - if ($i == 0) { - $names[] = $field_name; - } - $row_values[] = $this->escape($field_val); - } - $sql_rows[] = "('".implode("', '", $row_values)."')"; - } - return [$names, implode(', ', $sql_rows)]; - } - -}
\ No newline at end of file diff --git a/engine/database/MySQLConnection.php b/engine/database/MySQLConnection.php deleted file mode 100644 index c4e47e5..0000000 --- a/engine/database/MySQLConnection.php +++ /dev/null @@ -1,82 +0,0 @@ -<?php - -class MySQLConnection extends CommonDatabase { - - protected ?mysqli $link = null; - - public function __construct( - protected string $host, - protected string $user, - protected string $password, - protected string $database) {} - - public function __destruct() { - if ($this->link) - $this->link->close(); - } - - public function connect(): bool { - $this->link = new mysqli(); - $result = $this->link->real_connect($this->host, $this->user, $this->password, $this->database); - if ($result) - $this->link->set_charset('utf8mb4'); - return !!$result; - } - - public function query(string $sql, ...$args): mysqli_result|bool { - $sql = $this->prepareQuery($sql, ...$args); - $q = $this->link->query($sql); - if (!$q) - logError(__METHOD__.': '.$this->link->error."\n$sql\n".backtrace(1)); - return $q; - } - - public function fetch($q): ?array { - $row = $q->fetch_assoc(); - if (!$row) { - $q->free(); - return null; - } - return $row; - } - - public function fetchAll($q): ?array { - if (!$q) - return null; - $list = []; - while ($f = $q->fetch_assoc()) { - $list[] = $f; - } - $q->free(); - return $list; - } - - public function fetchRow($q): ?array { - return $q?->fetch_row(); - } - - public function result($q, $field = 0) { - return $q?->fetch_row()[$field]; - } - - public function insertId(): int { - return $this->link->insert_id; - } - - public function numRows($q): ?int { - return $q?->num_rows; - } - - // public function affectedRows() { - // return $this->link->affected_rows; - // } - // - // public function foundRows() { - // return $this->fetch($this->query("SELECT FOUND_ROWS() AS `count`"))['count']; - // } - - public function escape(string $s): string { - return $this->link->real_escape_string($s); - } - -} diff --git a/engine/database/SQLiteConnection.php b/engine/database/SQLiteConnection.php deleted file mode 100644 index 6b03c7c..0000000 --- a/engine/database/SQLiteConnection.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -class SQLiteConnection extends CommonDatabase { - - const SCHEMA_VERSION = 0; - - protected SQLite3 $link; - - public function __construct(string $db_path) { - $will_create = !file_exists($db_path); - $this->link = new SQLite3($db_path); - if ($will_create) - setperm($db_path); - $this->link->enableExceptions(true); - $this->upgradeSchema(); - } - - protected function upgradeSchema() { - $cur = $this->getSchemaVersion(); - if ($cur == self::SCHEMA_VERSION) - return; - - if ($cur < 1) { - // TODO - } - - $this->syncSchemaVersion(); - } - - protected function getSchemaVersion() { - return $this->link->query("PRAGMA user_version")->fetchArray()[0]; - } - - protected function syncSchemaVersion() { - $this->link->exec("PRAGMA user_version=".self::SCHEMA_VERSION); - } - - public function query(string $sql, ...$params): SQLite3Result { - return $this->link->query($this->prepareQuery($sql, ...$params)); - } - - public function exec(string $sql, ...$params) { - return $this->link->exec($this->prepareQuery($sql, ...$params)); - } - - public function querySingle(string $sql, ...$params) { - return $this->link->querySingle($this->prepareQuery($sql, ...$params)); - } - - public function querySingleRow(string $sql, ...$params) { - return $this->link->querySingle($this->prepareQuery($sql, ...$params), true); - } - - public function insertId(): int { - return $this->link->lastInsertRowID(); - } - - public function escape(string $s): string { - return $this->link->escapeString($s); - } - - public function fetch($q): ?array { - // TODO: Implement fetch() method. - } - - public function fetchAll($q): ?array { - // TODO: Implement fetchAll() method. - } - - public function fetchRow($q): ?array { - // TODO: Implement fetchRow() method. - } - - public function result($q, int $field = 0) { - return $q?->fetchArray()[$field]; - } - - public function numRows($q): ?int { - // TODO: Implement numRows() method. - } -}
\ No newline at end of file |