<?php
/**
* Broker
* @package Broker
*/
namespace Broker;
/**
* Database
*/
abstract class Database {
/**
* Database
*
* @var \PDO
*/
public $database;
/**
* Configuration
*
* @var object
*/
public $configuration;
/**
* Filename
*
* @var string
*/
public $filename;
/**
* Classname
*
* @var string
*/
private $classname;
/**
* Constructor
*
* @param string $directory
* @param object $configuration
* @param string $classname
*/
public function __construct($directory, $configuration, $classname) {
$this->classname = $classname;
if (file_exists ( $directory ) && is_file ( $directory )) {
$this->filename = $directory;
if (! is_writeable ( $this->filename )) {
$this->filename = tempnam ( sys_get_temp_dir (), $this->classname );
}
} else if (is_dir ( $directory )) {
$this->filename = $directory . $this->classname;
if (! is_writable ( $directory ) || (file_exists ( $this->filename ) && ! is_writable ( $this->filename ))) {
$this->filename = tempnam ( sys_get_temp_dir (), $this->classname );
}
}
$this->configuration = $configuration;
$this->database = new \PDO ( "sqlite:" . $this->filename );
$this->database->setAttribute ( \PDO::ATTR_TIMEOUT, 5000 );
// $this->database->setAttribute ( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
$this->init ( false );
}
/**
* Init
*/
abstract function init();
/**
* Get number
*
* @return number
*/
public function number() {
$sql = "SELECT COUNT(*) AS number
FROM \"".$this->classname."\";";
$query = $this->database->prepare ( $sql );
if ($query->execute ()) {
$result = $query->fetch ( \PDO::FETCH_ASSOC );
unset ( $query );
if ($result) {
return intval ( $result ["number"] );
} else {
return 0;
}
} else {
return 0;
}
}
/**
* Reset
*/
public function reset() {
$sql = "DROP TABLE IF EXISTS \"".$this->classname."\";";
$query = $this->database->prepare ( $sql );
$query->execute ();
$this->errorCheck("reset", $query, true);
unset ( $query );
$this->init();
}
/**
* Check for errors
* @param string $source
* @param \PDOStatement $query
* @param boolean $removeDatabase
*/
public function errorCheck($source, $query, $removeDatabase) {
if($query->errorCode()!="00000") {
echo "Problem ".$source." ".$this->classname.": ";
var_dump($query->errorInfo());
if($removeDatabase) {
@unlink($this->filename);
//if unlink somehow didn't work
@chmod($this->filename, 0777);
}
exit();
}
}
}