<?php
|
class Database {
|
private $pdo;
|
private $addStatement;
|
|
private $cacheId;
|
private $cacheNum;
|
|
public function __construct($file) {
|
$this->pdo = new PDO('sqlite:'.$file);
|
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$this->pdo->query('CREATE TABLE IF NOT EXISTS vehicles (
|
id INT PRIMARY KEY,
|
num INT UNIQUE,
|
weight INT
|
)');
|
|
$this->addStatement = $this->pdo->prepare('INSERT OR REPLACE INTO vehicles (id, num, weight) VALUES (:id, :num, :weight)');
|
|
$this->_cacheClear();
|
}
|
|
public function beginTransaction() {
|
$this->pdo->beginTransaction();
|
}
|
|
public function commit() {
|
$this->pdo->commit();
|
}
|
|
public function rollback() {
|
$this->pdo->rollback();
|
}
|
|
protected function _cachePopulate() {
|
if($this->cacheId === NULL) {
|
$st = $this->pdo->prepare('SELECT * FROM vehicles');
|
$st->execute();
|
$result = $st->fetchAll(PDO::FETCH_ASSOC);
|
|
$this->cacheId = [];
|
$this->cacheNum = [];
|
foreach($result as $vehicle) {
|
$this->_cacheAdd($vehicle);
|
}
|
}
|
}
|
|
protected function _cacheAdd($vehicle) {
|
$this->_cachePopulate();
|
$this->cacheId[$vehicle['id']] = $vehicle;
|
$this->cacheNum[$vehicle['num']] = $vehicle;
|
}
|
|
protected function _cacheClear() {
|
$this->cacheId = NULL;
|
$this->cacheNum = NULL;
|
}
|
|
public function getAll() {
|
$this->_cachePopulate();
|
return $this->cacheId;
|
}
|
|
public function getById($id) {
|
$this->_cachePopulate();
|
return $this->cacheId[$id] ?? NULL;
|
}
|
|
public function getByNum($num) {
|
$this->_cachePopulate();
|
return $this->cacheNum[$num] ?? NULL;
|
}
|
|
public function clear() {
|
$this->pdo->query('DELETE FROM vehicles');
|
$this->_cacheClear();
|
}
|
|
public function add($id, $num, $weight) {
|
$vehicle = [
|
'id' => (string)$id,
|
'num' => (string)$num,
|
'weight' => (string)$weight
|
];
|
$this->addStatement->execute($vehicle);
|
$this->_cacheAdd($vehicle);
|
}
|
|
public function addMapping($mapping) {
|
$this->beginTransaction();
|
$weight = count($mapping);
|
foreach($mapping as $id => $num) {
|
$this->add($id, $num, $weight);
|
}
|
$this->commit();
|
}
|
}
|