abstract class db {
/**
* link to inside object, cache for all queryes
* and count queries
*/
private static
$mysqli = null,
$c = array("read" => 0, "readcache" => 0, "change" => 0
);
/**
* connection to MySQL server
*/
public function connect($host, $user, $pass, $dbname) {
self::$mysqli = @ new mysqli($host, $user, $pass, $dbname);
if (self::$mysqli->connect_errno) {
throw new systemException(self::$mysqli->connect_errno, 'Error', self::$mysqli->connect_error);
}
}
/**
* set character set for connection
*/
public function charset($charset) {
self::$mysqli->set_charset($charset);
if (self::$mysqli->errno) {
throw new systemException(self::$mysqli->errno, 'Error', self::$mysqli->error);
}
}
/**
* method returned escaped and parsed query string
*/
private function buildQuery() {
/**
* get query string and params from arguments
* escaped params before query
*/
$args = $args[0];
foreach ($args as $key => $arg) {
if ($key == 0) {
$query = $arg;
} else {
$params[] = self::$mysqli->real_escape_string($arg);
}
}
throw new systemException('Query is empty');
}
return $query;
}
/**
* private simple update or insert query
*/
private function sendSetQuery($queryString) {
/**
* init single query to database
*/
self::$mysqli->query($queryString);
if (self::$mysqli->errno) {
throw new systemException(self::$mysqli->errno, 'Error', self::$mysqli->error);
}
self::$c['change']++;
return self::affectedRows() == 0 ? false : true;
}
/**
* private simple query
*/
private function sendQuery($queryString) {
/**
* init single query to database
*/
$resource = self::$mysqli->query($queryString);
if (self::$mysqli->errno) {
throw new systemException(self::$mysqli->errno, 'Error', self::$mysqli->error);
}
/**
* result is empty, return false
*/
if (self::affectedRows() == 0) {
return false;
}
/**
* fetched result
*/
while ($row = $resource->fetch_assoc()) {
$result[] = $row;
}
$resource->close();
self::$c['read']++;
return $result;
}
/**
* method returned result from cache or false
* type: "source" or "normalized"
* source as default
*/
private function getResultFromCache($key, $type = "source") {
if (isset(self::$cache[$type][$key])) {
self::$c['readcache']++;
return self::$cache[$type][$key];
}
return false;
}
/**
* normalizer
*/
private function normalize(& $result) {
if (self::affectedRows() == 1) {
$result = $result[0];
if (self::$mysqli->field_count == 1) {
foreach ($result as $item) {
$result = $item;
}
}
}
}
/**
* public single simple update or insert query to DB
*/
public function set() {
/**
* get escaped query string from args
* and receive query result
*/
/**
* return result as true or false
* for affected rows
*/
return self::sendSetQuery($query);
}
/**
* public single simple query without cache
*/
public function query() {
/**
* get escaped query string from args
* and receive query result
*/
return self::sendQuery($query);
}
/**
* public single simple query used cache
*/
public function cachedQuery() {
/**
* get escaped query string from args
* and receive query result
*/
/**
* find result inside cache
*/
$withCache = self::getResultFromCache($query);
if ($withCache) {
return $withCache;
}
/**
* result on cache not found
* receive result of query from DB
*/
$result = self::sendQuery($query);
/**
* save result into local cache without normalize
*/
if ($result) {
self::$cache['source'][$query] = $result;
}
return $result;
}
/**
* public single simple normalized query used cache
*/
public function cachedNormalizeQuery() {
/**
* get escaped query string from args
* and receive query result
*/
/**
* find result inside cache
*/
$withCache = self::getResultFromCache($query, "normalized");
if ($withCache) {
return $withCache;
}
/**
* result on cache not found
* receive query result from DB
*/
$result = self::sendQuery($query);
if (!$result) {
return false;
}
/**
* save result into local cache with normalize
*/
self::normalize(& $result);
self::$cache['source'][$query] = $result;
return $result;
}
/**
* public single simple normalized query without cache
*/
public function normalizeQuery() {
/**
* get escaped query string from args
* and receive query result
*/
$result = self::sendQuery($query);
if (!$result) {
return false;
}
self::normalize(& $result);
return $result;
}
/**
* returned last affected count rows
*/
public function affectedRows() {
return self::$mysqli->affected_rows;
}
/**
* returned last insert ID
*/
public function lastID() {
return self::$mysqli->insert_id;
}
/**
* get counters
*/
public function readQCount() {
return self::$c['read'];
}
public function readCacheQCount() {
return self::$c['readcache'];
}
public function changeQCount() {
return self::$c['change'];
}
public static function sumQCount() {
return self::$c['read'] + self::$c['readcache'] + self::$c['change'];
}
/**
* close current connection
*/
public function close() {
self::$mysqli->close();
}
}