mytinytodo/includes/class.dbconnection.php

84 lines
2.5 KiB
PHP
Raw Normal View History

2022-08-27 18:07:31 +00:00
<?php declare(strict_types=1);
2022-01-14 19:45:30 +00:00
/*
This file is a part of myTinyTodo.
(C) Copyright 2021,2022 Max Pozdeev <maxpozdeev@gmail.com>
Licensed under the GNU GPL version 2 or any later. See file COPYRIGHT for details.
2022-01-14 19:45:30 +00:00
*/
class DBConnection
{
2023-08-03 20:13:55 +00:00
const DBTYPE_SQLITE = "sqlite";
const DBTYPE_MYSQL = "mysql";
const DBTYPE_POSTGRES = "postgres";
protected static $instance;
public static function init(Database_Abstract $instance) : Database_Abstract
{
self::$instance = $instance;
return $instance;
}
public static function instance() : Database_Abstract
{
if (!isset(self::$instance)) {
throw new Exception("DBConnection is not initialized");
}
return self::$instance;
}
2022-02-07 06:57:03 +00:00
public static function setTablePrefix($prefix)
{
$db = self::instance();
$db->setPrefix($prefix);
}
}
abstract class Database_Abstract
{
2023-08-03 20:13:55 +00:00
const DBTYPE = '';
2022-02-07 15:22:59 +00:00
protected static $readonlyProps = ['prefix', 'lastQuery'];
/** @var string */
protected $prefix = '';
/** @var string */
protected $lastQuery = '';
2022-08-27 18:07:31 +00:00
abstract function connect(array $params): void;
abstract function sq(string $query, ?array $values = null);
abstract function sqa(string $query, ?array $values = null): ?array;
abstract function dq(string $query, ?array $values = null): DatabaseResult_Abstract;
abstract function ex(string $query, ?array $values = null): void;
abstract function affected(): int;
abstract function quote($value): string;
abstract function quoteForLike(string $format, string $string): string;
abstract function like(string $column, string $format, string $string): string;
2023-09-06 19:30:23 +00:00
abstract function ciEquals(string $column, string $value): string;
2022-08-27 18:07:31 +00:00
abstract function lastInsertId(?string $name = null): ?string;
abstract function tableExists(string $table): bool;
abstract function tableFieldExists(string $table, string $field): bool;
2022-02-07 15:22:59 +00:00
function __get(string $propName) {
if ( in_array($propName, self::$readonlyProps) ) {
return $this->{$propName};
}
throw new Error("Attempt to read undefined property ". get_class($this). "::\$$propName");
}
2022-08-27 18:07:31 +00:00
function setPrefix(string $prefix): void {
if ($prefix != '' && !preg_match("/^[a-zA-Z0-9_]+$/", $prefix)) {
throw new Exception("Incorrect table prefix");
}
$this->prefix = $prefix;
}
}
abstract class DatabaseResult_Abstract
{
2022-08-27 18:07:31 +00:00
abstract function fetchRow(): ?array;
abstract function fetchAssoc(): ?array;
}