nur-sery/src/db/sqlite/SqliteQuery.php
2024-04-25 00:26:40 +04:00

124 lines
3.2 KiB
PHP

<?php
namespace nur\sery\db\sqlite;
use nur\sery\StateException;
use nur\sery\ValueException;
use SQLite3;
use SQLite3Stmt;
class SqliteQuery {
static function verifix(&$query, ?array &$params=null): void {
if (is_array($query)) {
throw StateException::not_implemented(); #XXX
$prefix = $query[0] ?? null;
if ($prefix === null) {
throw new ValueException("requête invalide");
} elseif (self::is_create($prefix)) {
$query = self::parse_create($query, $params);
} elseif (self::is_select($prefix)) {
$query = self::parse_select($query, $params);
} elseif (self::is_insert($prefix)) {
$query = self::parse_insert($query, $params);
} elseif (self::is_update($prefix)) {
$query = self::parse_update($query, $params);
} elseif (self::is_delete($prefix)) {
$query = self::parse_delete($query, $params);
} else {
throw new ValueException("requête invalide");
}
} elseif (!is_string($query)) {
$query = strval($query);
}
}
const create_SCHEMA = [
"prefix" => "string",
"table" => "string",
"cols" => "array",
"suffix" => "?string",
];
static function is_create(string $sql): bool {
}
static function parse_create(array $query, ?array &$params=null): string {
}
const select_SCHEMA = [
"prefix" => "string",
"cols" => "?array",
"from" => "?string",
"where" => "?array",
"order by" => "?array",
"group by" => "?array",
"having" => "?array",
];
static function is_select(string $sql): bool {
}
static function parse_select(array $query, ?array &$params=null): string {
}
const insert_SCHEMA = [
"prefix" => "string",
"into" => "?string",
"cols" => "?array",
"values" => "?array",
];
static function is_insert(string $sql): bool {
}
static function parse_insert(array $query, ?array &$params=null): string {
}
const update_SCHEMA = [
"prefix" => "string",
"table" => "?string",
"cols" => "?array",
"values" => "?array",
"where" => "?array",
];
static function is_update(string $sql): bool {
}
static function parse_update(array $query, ?array &$params=null): string {
}
const delete_SCHEMA = [
"prefix" => "string",
"from" => "?string",
"where" => "?array",
];
static function is_delete(string $sql): bool {
}
static function parse_delete(array $query, ?array &$params=null): string {
}
function __construct($sql, ?array $params=null) {
self::verifix($sql, $params);
$this->sql = $sql;
$this->params = $params;
}
/** @var string */
protected $sql;
/** @var ?array */
protected $params;
function useStmt(SQLite3 $db, ?SQLite3Stmt &$stmt=null, ?string &$sql=null): bool {
if ($this->params !== null) {
/** @var SQLite3Stmt $stmt */
$stmt = SqliteException::check($db, $db->prepare($this->sql));
$close = true;
try {
foreach ($this->params as $param => $value) {
SqliteException::check($db, $stmt->bindValue($param, $value));
}
$close = false;
return true;
} finally {
if ($close) $stmt->close();
}
} else {
$sql = $this->sql;
return false;
}
}
}