| | |
| | | <?php |
| | | class Database { |
| | | private $pdo; |
| | | private $getByIdStatement; |
| | | private $getByNumStatement; |
| | | private $addStatement; |
| | | |
| | | private $cacheId; |
| | | private $cacheNum; |
| | | |
| | | public function __construct($file) { |
| | | $this->pdo = new PDO('sqlite:'.$file); |
| | |
| | | weight INT |
| | | )'); |
| | | |
| | | $this->getByIdStatement = $this->pdo->prepare('SELECT num, weight FROM vehicles WHERE id=? LIMIT 1'); |
| | | $this->getByNumStatement = $this->pdo->prepare('SELECT id, weight FROM vehicles WHERE num=? LIMIT 1'); |
| | | $this->addStatement = $this->pdo->prepare('INSERT OR REPLACE INTO vehicles (id, num, weight) VALUES (?, ?, ?)'); |
| | | $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->getByIdStatement->execute([$id]); |
| | | return $this->getByIdStatement->fetch(); |
| | | $this->_cachePopulate(); |
| | | return $this->cacheId[$id] ?? NULL; |
| | | } |
| | | |
| | | public function getByNum($num) { |
| | | $st = $this->getByNumStatement->execute([(int)substr($num, 2)]); |
| | | return $this->getByNumStatement->fetch(); |
| | | $this->_cachePopulate(); |
| | | return $this->cacheNum[$num] ?? NULL; |
| | | } |
| | | |
| | | public function clear() { |
| | | $this->pdo->query('DELETE FROM vehicles'); |
| | | $this->_cacheClear(); |
| | | } |
| | | |
| | | public function add($id, $num, $weight) { |
| | | $this->addStatement->execute([$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 => $vehicle) { |
| | | $this->add($id, (int)substr($vehicle['num'], 2), $weight); |
| | | foreach($mapping as $id => $num) { |
| | | $this->add($id, $num, $weight); |
| | | } |
| | | $this->commit(); |
| | | } |
| | | } |