Files
zurawik.pl/core/class/DbSqlLite.class.php
2026-05-15 18:33:51 +02:00

476 lines
12 KiB
PHP
Raw Permalink Blame History

<?php
/**
* Klasa do obslugi bazy mysql
*
*/
class DbSqlLite implements DBConnection {
protected $user;
protected $pass;
protected $dbHost;
protected $dbName;
protected $dbh;
protected $fileName;
protected $mode = '0666';
protected $characterset = 'utf-8';
/**
* Konstruktor klasy
*
* @param string $user
* @param string $pass
* @param string $dbHost
* @param string $dbName
*/
public function __construct($file) {
$this->fileName = $file;
}
/*Nawiazywanie polaczenia z baza*/
protected function Connect() {
try {
$this->DbConnect();
$this->SetCharacterset();
} catch (Exception $e) {
MFLog::Fatal("Line: ".$e->getLine()." Message: ".$e->getMessage()." Referer: ".getenv('HTTP_REFERER'));
MFLog::Error("Switching app to safe mode");
Core::SetAppSafeMode();
}
}
protected function DbConnect() {
$this->dbh = sqlite_open($this->fileName, $this->mode, $errorMessage);
if(empty($this->dbh)) {
throw new CoreException('Cannot connect to database! '.$errorMessage);
}
}
protected function SetCharacterset() {
//sqlite_query($this->dbh, "SET CHARACTER SET ".$this->characterset);
//sqlite_query($this->dbh, "SET NAMES '".$this->characterset."'");
//sqlite_query($this->dbh, "SET CHARACTER_SET_CLIENT = ".$this->characterset);
//sqlite_query($this->dbh, "SET character_set_results = ".$this->characterset);
//sqlite_query($this->dbh, "SET character_set_connection = ".$this->characterset);
}
public function Escape($string) {
if(Enviroment::CheckMagicQuotes()) {
$return = $string;
} else {
$return = sqlite_escape_string($string);
}
return $return;
}
/*Wykonanie zapytania*/
public function Execute($query) {
if(!$this->dbh) {
$this->Connect();
}
MFLog::Debug($query);
$ret = 'unexecuted';
if($this->dbh) {
$ret = sqlite_query($this->dbh, $query);
}
if(!$ret && $ret!='unexecuted') {
throw new CoreException(sqlite_error_string(sqlite_last_error($this->dbh)).$query);
}
else {
$stmt = new DbSqlLiteStatement($this->dbh, $query);
$stmt->result = $ret;
return $stmt;
}
}
/*Przygotowanie zapytania zwraca obiekt klasy DBMysqlStatement*/
public function Prepare($query) {
if(!$this->dbh) {
$this->Connect();
}
return new DbSqlLiteStatement($this->dbh, $query);
}
/**
* Rozpoczyna transakcje
*
*/
public function BeginTransaction() {
if(!$this->dbh) {
$this->Connect();
}
@sqlite_query("START TRANSACTION ");
}
/**
* Zartwierdza transakcje
*
*/
public function CommitTransaction() {
if(!$this->dbh) {
$this->Connect();
}
@sqlite_query("COMMIT");
}
/**
* Wycofuje transakcje
*
*/
public function Rollback() {
if(!$this->dbh) {
$this->Connect();
}
@sqlite_query("ROLLBACK");
}
/**
* Destruktor zamykajacy polaczenie
*
*/
public function __destruct() {
if(isset($this->dbh) && is_resource($this->dbh)) {
sqlite_close($this->dbh);
}
}
public function GetDbh() {
return $this->dbh;
}
}
/**
* Klasa implementujaca interfejs DBStatement dla mysqla
*
*/
class DbSqlLiteStatement implements DBStatement {
public $result;
public $binds;
public $query;
public $dbh;
private $cacheTime = 30;
private $cacheFile;
private $cachePath = DBCACHE_PATH;
private $cacheEnable = DBCACHE_ENABLE;
private $cacheQuery = false;
/**
* KOnstruktor klasy
*
* @param mysql $dbh
* @param string $query
*/
public function __construct($dbh, $query) {
$this->query = $query;
$this->dbh = $dbh;
if(!$dbh) {
Core::SetAppSafeMode();
//throw new MysqlException("No db connection");
}
}
/**
* Zwraca tresc zapytania
*
* @return unknown
*/
public function GetQuery()
{
return $this->query;
}
/*Zamienia zmienne w zapytaniu na podane wartosci*/
public function BindParam($ph, $pv) {
$this->binds[$ph] = $pv;
return $this;
}
/*Wykonanie zapytania*/
public function Execute() {
$binds = func_get_args();
foreach($binds as $index => $name) {
$this->binds[$index + 1] = $name;
}
$cnt = count($binds);
$query = $this->query;
if (count($this->binds)>0) {
foreach ($this->binds as $ph => $pv) {
// $query = str_replace(":$ph", "'".mysql_escape_string($pv)."'", $query);
$query = str_replace(":$ph", '\''.sqlite_escape_string($pv).'\'', $query);
}
}
MFLog::Debug(__FUNCTION__.' query: '.$query);
if($this->dbh) {
$this->result = sqlite_query($this->dbh, $query);
if(!$this->result) {
throw new MysqlException($query . "<br /><br />" . mysql_error());
}
}
return $this;
}
/*Zwraca wiersz*/
public function FetchRow() {
if(!$this->result) {
throw new MysqlException("Query failed");
}
$this->SetCacheFile($this->query.'FetchRow');
if($this->cacheQuery==false) {
$result = sqlite_fetch_row($this->result);
}
else if ($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode()) {
$result = sqlite_fetch_row($this->result);
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/*Zwraca wiersz jako tablice asocjacyjna*/
public function FetchAssoc() {
$this->SetCacheFile($this->query.'FetchAssoc');
if($this->cacheQuery==false) {
$result = sqlite_fetch_assoc($this->result);
}
else if(($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode())) {
$result = sqlite_fetch_assoc($this->result);
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/*Zwraca ca<63>y wynik jako tablica asocjacyjna*/
public function FetchAllAssoc() {
$this->SetCacheFile($this->query.'FetchAllAssoc');
if($this->cacheQuery==false) {
$result = array();
while($row = $this->fetchAssoc()) {
$result[] = $row;
}
}
else if($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode()) {
$result = array();
$this->cacheQuery = false;
while($row = $this->fetchAssoc()) {
$result[] = $row;
}
$this->SetCacheFile($this->query.'FetchAllAssoc');
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/*Zwraca ca<63>y wynik jako tablica asocjacyjna*/
public function FetchAllRow() {
$this->SetCacheFile($this->query.'FetchAllRow');
if($this->cacheQuery==false) {
$result = array();
while($row = $this->fetchRow()) {
$result[] = $row;
}
}
else if($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode()) {
$result = array();
$this->cacheQuery = false;
while($row = $this->fetchRow()) {
$result[] = $row;
}
$this->SetCacheFile($this->query.'FetchAllRow');
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/*Zwraca liczbe wierszy*/
public function NumRows() {
if(!$this->result) {
throw new MysqlException("Query failed");
}
$this->SetCacheFile($this->query.'NumRows');
if($this->cacheQuery==false) {
$result = sqlite_num_rows($this->result);
}
else if($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode()) {
$result = sqlite_num_rows($this->result);
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/*Zwraca wiersz w postaci tablicy*/
public function FetchArray() {
if(!$this->result) {
throw new MysqlException("Query failed");
}
$this->SetCacheFile($this->query.'FetchArray');
if($this->cacheQuery==false) {
$result = sqlite_fetch_array($this->result);
}
else if($this->cacheQuery==true && !$this->CacheCheck() && !Core::GetAppSafeMode()) {
$result = sqlite_fetch_array($this->result);
$this->CacheWrite($result);
} else {
$result = $this->CacheRead();
}
return $result;
}
/**
* Zwraca id ostatnio zmienionego rekordu
*
* @return integer
*/
public function GetInsertionId() {
if(!$this->result) {
throw new MysqlException("Query failed");
}
return sqlite_last_insert_rowid($this->dbh);
}
/**
* Zwraca liczb<7A> zmienionych rekord<72>w w ostatnim zapytaniu modyfikuj<75>cym dane.
*
* @return integer
*/
public function GetAffectedRows()
{
if(!$this->result) {
throw new MysqlException("Query failed");
}
return sqlite_affected_rows();
}
/**
* Sprawdza czy zaoytanie jest cacheowane
*
* @return boolean
*/
public function CacheCheck() {
if($this->cacheEnable == false || ($this->cacheEnable == true && (is_file($this->cachePath.$this->cacheFile) && filemtime($this->cachePath.$this->cacheFile) > (time() - $this->cacheTime)))) {
return true;
} else {
return false;
}
}
/**
* Zapisuje cache do pliku
*
* @param obj $result
*/
public function CacheWrite($result) {
if($this->cacheEnable != false) {
$records = serialize($result);
$fp = fopen($this->cachePath.$this->cacheFile, "w");
fputs($fp, $records);
fclose($fp);
$this->cacheQuery = false;
}
}
/**
* Odczytuje cache z pliku
*
* @return obj
*/
public function CacheRead() {
if(is_file($this->cachePath.$this->cacheFile)) {
$records = unserialize(file_get_contents($this->cachePath.$this->cacheFile));
$this->cacheQuery = false;
return $records;
} else {
throw new MysqlException('File does not exist: '.$this->cachePath.$this->cacheFile);
}
}
/**
* Uruchamia cacheowanie
*
* @param integer $time
*/
public function CacheStart($time=null) {
if($time!=null && $this->cacheEnable != false) {
$this->cacheTime = $time;
}
if($this->cacheEnable != false)
$this->cacheQuery = true;
else
$this->cacheQuery = false;
return $this;
}
/**
* Ustanawia nazw<7A> pliku cache
*
* @param unknown_type $fileName
*/
public function SetCacheFile($fileName) {
$this->cacheFile=md5($fileName);
}
}
class DBTemp extends DbSqlLite {
/**
* Pusty konstruktor
*
*/
public function __construct() {
$this->fileName = '../SqlLite/sql';
}
public function GetDbh() {
if(empty($this->dbh)) {
$this->Connect();
}
return $this->dbh;
}
}
?>