98 lines
2.4 KiB
PHP
98 lines
2.4 KiB
PHP
<?php
|
|
namespace nulib\db\sqlite;
|
|
|
|
use nulib\db\CapacitorChannel;
|
|
use nulib\db\CapacitorStorage;
|
|
|
|
/**
|
|
* Class SqliteStorage
|
|
*/
|
|
class SqliteStorage extends CapacitorStorage {
|
|
function __construct($sqlite) {
|
|
$this->db = Sqlite::with($sqlite);
|
|
}
|
|
|
|
/** @var Sqlite */
|
|
protected $db;
|
|
|
|
function db(): Sqlite {
|
|
return $this->db;
|
|
}
|
|
|
|
const PRIMARY_KEY_DEFINITION = [
|
|
"id_" => "integer primary key autoincrement",
|
|
];
|
|
|
|
function _getCreateSql(CapacitorChannel $channel): string {
|
|
$query = new query($this->_createSql($channel));
|
|
return self::format_sql($channel, $query->getSql());
|
|
}
|
|
|
|
function tableExists(string $tableName): bool {
|
|
$name = $this->db->get([
|
|
# depuis la version 3.33.0 le nom officiel de la table est sqlite_schema,
|
|
# mais le nom sqlite_master est toujours valable pour le moment
|
|
"select name from sqlite_master ",
|
|
"where" => ["name" => $tableName],
|
|
]);
|
|
return $name !== null;
|
|
}
|
|
|
|
function channelExists(string $name): bool {
|
|
$name = $this->db->get([
|
|
"select name from _channels",
|
|
"where" => ["name" => $name],
|
|
]);
|
|
return $name !== null;
|
|
}
|
|
|
|
protected function _afterCreate(CapacitorChannel $channel): void {
|
|
$db = $this->db;
|
|
if (!$this->tableExists("_channels")) {
|
|
# ne pas créer si la table existe déjà, pour éviter d'avoir besoin d'un
|
|
# verrou en écriture
|
|
$db->exec([
|
|
"create table if not exists",
|
|
"table" => "_channels",
|
|
"cols" => [
|
|
"name" => "varchar primary key",
|
|
"table_name" => "varchar",
|
|
"class" => "varchar",
|
|
],
|
|
]);
|
|
}
|
|
if (!$this->channelExists($channel->getName())) {
|
|
# ne pas insérer si la ligne existe déjà, pour éviter d'avoir besoin d'un
|
|
# verrou en écriture
|
|
$db->exec([
|
|
"insert",
|
|
"into" => "_channels",
|
|
"values" => [
|
|
"name" => $channel->getName(),
|
|
"table_name" => $channel->getTableName(),
|
|
"class" => get_class($channel),
|
|
],
|
|
"suffix" => "on conflict do nothing",
|
|
]);
|
|
}
|
|
}
|
|
|
|
protected function _beforeReset(CapacitorChannel $channel): void {
|
|
$this->db->exec([
|
|
"delete",
|
|
"from" => "_channels",
|
|
"where" => [
|
|
"name" => $channel->getName(),
|
|
],
|
|
]);
|
|
}
|
|
|
|
function _exists(CapacitorChannel $channel): bool {
|
|
return $this->tableExists($channel->getTableName());
|
|
}
|
|
|
|
function close(): void {
|
|
$this->db->close();
|
|
}
|
|
}
|