meraproject/module/core/db/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

122 lines
4.0 KiB
PHP

<?
class DB {
static $DB = null;
static $total_time = 0;
static $logs = [];
static function addLog($q,$time,$res=null){
self::$logs[] = [
number_format($time,8),
$q,
boolval($res),
$res===false?mysqli_error(\DB::$DB):null
];
}
static function execute(Query $q){
$start = microtime(true);
$res = mysqli_query(self::$DB,$q->getQueryString());
$end = (microtime(true)-$start);
//echo "\n".'<br><br>'.$q->getQueryString().'<br>'.$end.'<br>'; var_dump($res); echo "\n\n";
self::addLog($q->getQueryString(),$end,$res);
self::$total_time += $end;
return $res;
}
static function executeString(string $q){ return mysqli_query(self::$DB,$q); }
static function startTransaction(){ self::$DB->begin_transaction( MYSQLI_TRANS_START_READ_WRITE); }
static function endTransaction(){ self::$DB->commit(); }
static function numRows($r){return mysqli_num_rows($r);}
static function insert(Query $q){
$r = new stdClass();
$r->r = $q->execute();
$r->id = intval(mysqli_insert_id(self::$DB));
return $r;
}
static function addUnique(string $table_name,string $name,array $_cols ){
$cols = [];
foreach ($_cols as $v) $cols[] = DB::quotes($v);
$start = microtime(true);
DB::executeString($q = 'ALTER TABLE '.DB::quotes($table_name).' ADD UNIQUE '.DB::quotes($name).' ( '.implode(",",$cols).' )');
$end = (microtime(true)-$start);
self::addLog($q,$end);
}
static function addIndex(string $table_name,string $column ){
$start = microtime(true);
DB::executeString($q = 'ALTER TABLE '.DB::quotes($table_name).' ADD INDEX '.$column.'('.DB::quotes($column).')');
$end = (microtime(true)-$start);
self::addLog($q,$end);
}
static function addIndexManyColumns(string $table_name, $columns = [] ){
$cols = [];
foreach ($columns as $col){
$cols[] = DB::quotes($col);
}
$start = microtime(true);
DB::executeString($q = 'ALTER TABLE '.DB::quotes($table_name).' ADD INDEX '.implode("_",$columns).'('.implode(",",$cols).')');
$end = (microtime(true)-$start);
self::addLog($q,$end);
}
static function calcRows():int{
$res = 0;
$q = "SELECT FOUND_ROWS()";
$r = mysqli_query(self::$DB,$q);
if($r and mysqli_num_rows($r) and $l = mysqli_fetch_array($r)) $res = intval($l[0]);
return $res;
}
static function fetch($r){return mysqli_fetch_assoc($r);}
static function mq($x){ return self::$DB->real_escape_string($x);}
static function mqa(array $a){
foreach ($a as $k=>$v){$a[$k]=self::mq($v);}
return $a;
}
static function quotes($x) {
$res = [];
$a = explode(".",$x);
foreach ($a as $v){
$res[] = "`".self::mq($v)."`";
}
return implode(".",$res);
//return "`".self::mq($x)."`";
}
static function connect(){
$start = microtime(true);
if(Config::$MYSQL_SSL_CERTIFICATE){
$conn = mysqli_init();
$conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$conn->ssl_set(NULL, NULL,Config::$MYSQL_SSL_CERTIFICATE, NULL, NULL);
$conn->real_connect(Config::$MYSQL_HOST, Config::$MYSQL_ADMIN, Config::$MYSQL_PASSWORD, Config::$MYSQL_BASE, 3306, NULL, MYSQLI_CLIENT_SSL);
self::$DB = $conn;
} else {
self::$DB = new mysqli(Config::$MYSQL_HOST, Config::$MYSQL_ADMIN, Config::$MYSQL_PASSWORD, Config::$MYSQL_BASE);
}
mysqli_query(self::$DB, 'SET NAMES '.Config::$MYSQL_CHARSET);
mysqli_query(self::$DB, "SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));");
$end = (microtime(true)-$start);
self::addLog('connect',$end);
}
static function connectWithCert(){
}
static function disconnect(){
self::$DB->close();
}
}