%PDF- %PDF-
Direktori : /data/www_bck/varak.cloud_bck/tracker.varak.cloud/src/Legacy/Datastore/ |
Current File : //data/www_bck/varak.cloud_bck/tracker.varak.cloud/src/Legacy/Datastore/SqliteCommon.php |
<?php /** * TorrentPier – Bull-powered BitTorrent tracker engine * * @copyright Copyright (c) 2005-2018 TorrentPier (https://torrentpier.com) * @link https://github.com/torrentpier/torrentpier for the canonical source repository * @license https://github.com/torrentpier/torrentpier/blob/master/LICENSE MIT License */ namespace TorrentPier\Legacy\Datastore; use SQLite3; /** * Class SqliteCommon * @package TorrentPier\Legacy\Datastore */ class SqliteCommon extends Common { public $cfg = array( 'db_file_path' => 'sqlite.db', 'table_name' => 'table_name', 'table_schema' => 'CREATE TABLE table_name (...)', 'pconnect' => true, 'con_required' => true, 'log_name' => 'SQLite', 'shard_type' => 'none', # none, string, int (тип перевичного ключа для шардинга) 'shard_val' => 0, # для string - кол. начальных символов, для int - делитель (будет использован остаток от деления) ); public $engine = 'SQLite'; public $dbh; public $connected = false; public $shard_val = false; public $table_create_attempts = 0; public function __construct($cfg) { $this->cfg = array_merge($this->cfg, $cfg); $this->dbg_enabled = sql_dbg_enabled(); } public function connect() { $this->cur_query = $this->dbg_enabled ? 'connect to: ' . $this->cfg['db_file_path'] : 'connect'; $this->debug('start'); if (@$this->dbh = new SQLite3($this->cfg['db_file_path'])) { $this->connected = true; } if (!$this->connected && $this->cfg['con_required']) { trigger_error('SQLite not connected', E_USER_ERROR); } $this->debug('stop'); $this->cur_query = null; } public function create_table() { $this->table_create_attempts++; return $this->dbh->query($this->cfg['table_schema']); } public function shard($name) { $type = $this->cfg['shard_type']; if ($type == 'none') { return; } if (\is_array($name)) { trigger_error('cannot shard: $name is array', E_USER_ERROR); } // define shard_val if ($type == 'string') { $shard_val = substr($name, 0, $this->cfg['shard_val']); } else { $shard_val = $name % $this->cfg['shard_val']; } // все запросы должны быть к одному и тому же шарду if ($this->shard_val !== false) { if ($shard_val != $this->shard_val) { trigger_error("shard cannot be reassigned. [{$this->shard_val}, $shard_val, $name]", E_USER_ERROR); } else { return; } } $this->shard_val = $shard_val; $this->cfg['db_file_path'] = str_replace('*', $shard_val, $this->cfg['db_file_path']); } public function query($query) { if (!$this->connected) { $this->connect(); } $this->cur_query = $query; $this->debug('start'); if (!$result = @$this->dbh->query($query)) { $rowsresult = $this->dbh->query("PRAGMA table_info({$this->cfg['table_name']})"); $rowscount = 0; while ($row = $rowsresult->fetchArray(SQLITE3_ASSOC)) { $rowscount++; } if (!$this->table_create_attempts && !$rowscount) { if ($this->create_table()) { $result = $this->dbh->query($query); } } if (!$result) { $this->trigger_error($this->get_error_msg()); } } $this->debug('stop'); $this->cur_query = null; $this->num_queries++; return $result; } public function fetch_row($query) { $result = $this->query($query); return \is_resource($result) ? $result->fetchArray(SQLITE3_ASSOC) : false; } public function fetch_rowset($query) { $result = $this->query($query); $rowset = array(); while ($row = $result->fetchArray(SQLITE3_ASSOC)) { $rowset[] = $row; } return $rowset; } public function changes() { return \is_resource($this->dbh) ? $this->dbh->changes() : 0; } public function escape($str) { return SQLite3::escapeString($str); } public function get_error_msg() { return 'SQLite error #' . $this->dbh->lastErrorCode() . ': ' . $this->dbh->lastErrorMsg(); } public function rm($name = '') { if ($name) { $this->db->shard($this->prefix . $name); $result = $this->db->query("DELETE FROM " . $this->cfg['table_name'] . " WHERE cache_name = '" . SQLite3::escapeString($this->prefix . $name) . "'"); } else { $result = $this->db->query("DELETE FROM " . $this->cfg['table_name']); } return (bool)$result; } public function gc($expire_time = TIMENOW) { $result = $this->db->query("DELETE FROM " . $this->cfg['table_name'] . " WHERE cache_expire_time < $expire_time"); return $result ? sqlite_changes($this->db->dbh) : 0; } public function trigger_error($msg = 'DB Error') { if (error_reporting()) { trigger_error($msg, E_USER_ERROR); } } }