<?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 vehicles2 (
|
id INT PRIMARY KEY,
|
num INT UNIQUE,
|
weight INT,
|
line VARCHAR,
|
date INT
|
)');
|
try {
|
$this->beginTransaction();
|
$this->pdo->query('INSERT INTO vehicles2 SELECT id, num, weight, \'?\', \''.time().'\' FROM vehicles');
|
$this->commit();
|
$this->pdo->query('DROP TABLE vehicles');
|
} catch(PDOException $e) {
|
$this->rollback();
|
}
|
|
$this->addStatement = $this->pdo->prepare('INSERT OR REPLACE INTO vehicles2 (id, num, weight, line, date) VALUES (:id, :num, :weight, :line, :date)');
|
|
$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 vehicles2');
|
$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 getAllById() {
|
$this->_cachePopulate();
|
return $this->cacheId;
|
}
|
|
public function getAllByNum() {
|
$this->_cachePopulate();
|
return $this->cacheNum;
|
}
|
|
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 vehicles2');
|
$this->_cacheClear();
|
}
|
|
public function add($id, $num, $weight, $line = NULL, $date = NULL) {
|
$vehicle = [
|
'id' => (string)$id,
|
'num' => (string)$num,
|
'weight' => (string)$weight,
|
'line' => (string)($line ?? ''),
|
'date' => (string)($date ?? time()),
|
];
|
$this->addStatement->execute($vehicle);
|
$this->_cacheAdd($vehicle);
|
}
|
|
public function addMapping($vehiclesMapping, Mapper $mapper) {
|
$this->beginTransaction();
|
$weight = count($vehiclesMapping);
|
foreach($vehiclesMapping as $id => $num) {
|
$trip = $mapper->getTTSSVehicleTrip($id);
|
$this->add($id, $num, $weight, ($trip['line'] ?? '?') . ' ' . ($trip['direction'] ?? '?'));
|
}
|
$this->commit();
|
}
|
}
|