diff --git a/app/migrations/CacheModel.php b/app/migrations/CacheModel.php new file mode 100644 index 0000000..82d99bb --- /dev/null +++ b/app/migrations/CacheModel.php @@ -0,0 +1,49 @@ +connection = $pdo; + } + + /** + * Called when the table shall be created or modified + * + * @return void + */ + public function up() + { + $this->database = new Asatru\Database\Migration('CacheModel', $this->connection); + $this->database->drop(); + $this->database->add('id INT NOT NULL AUTO_INCREMENT PRIMARY KEY'); + $this->database->add('ident VARCHAR(260) NOT NULL'); + $this->database->add('value BLOB NULL'); + $this->database->add('updated_at TIMESTAMP'); + $this->database->add('created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP'); + $this->database->create(); + } + + /** + * Called when the table shall be dropped + * + * @return void + */ + public function down() + { + $this->database = new Asatru\Database\Migration('Cache', $this->connection); + $this->database->drop(); + } +} \ No newline at end of file diff --git a/app/migrations/migrations.list b/app/migrations/migrations.list index 63538ff..5ec79b3 100644 --- a/app/migrations/migrations.list +++ b/app/migrations/migrations.list @@ -1 +1,4 @@ 47f3d3306fbd25715600db55b33b1542293ab5eb593205d6f5884bcaafa5d9a4627c76af04b684962c99a9518ef6b3d10e983203f6b5a8576912445d8f285fb7 + +cd19e5ec4a12d40d8d3ecdf267ef890e80fdd94ab28f81fddeb0c12b6f6b88773157e469c2d693abd4583e18b9b5a126c3fcecd6c07f4374c6c6e2837166b2ec + diff --git a/app/models/CacheModel.php b/app/models/CacheModel.php new file mode 100644 index 0000000..6214010 --- /dev/null +++ b/app/models/CacheModel.php @@ -0,0 +1,206 @@ +count() == 0) { + $value = $closure(); + + $data = array( + 'ident' => $ident, + 'value' => $value, + 'updated_at' => date('Y-m-d H:i:s') + ); + + foreach ($data as $key => $val) { + CacheModel::insert($key, $val); + } + + CacheModel::go(); + + return $value; + } else { + $data = $item->get(0); + $dtLast = new DateTime(date('Y-m-d H:i:s', strtotime($data->get('updated_at')))); + $dtLast->add(new DateInterval('PT' . $timeInSeconds . 'S')); + $dtNow = new DateTime('now'); + + if ($dtNow < $dtLast) { + return $data->get('value'); + } else { + $value = $closure(); + + $updData = array( + 'value' => $value, + 'updated_at' => date('Y-m-d H:i:s') + ); + + foreach ($updData as $key => $val) { + CacheModel::update($key, $val); + } + + CacheModel::where('id', '=', $data->get('id')); + + CacheModel::go(); + + return $value; + } + } + + return null; + } + + /** + * Query an entire item + * + * @param $ident + * @param $default + * @return mixed + */ + public static function query($ident, $default = null) + { + $what = null; + if (strpos($ident, '.') !== false) { + $what = explode('.', $ident); + } + + $result = CacheModel::where('ident', '=', (((is_array($what)) && (count($what) > 0)) ? $what[0] : $ident))->first(); + if (!$result) { + return $default; + } + + if ((is_array($what)) && (count($what) > 1)) { + return $result->get($what[1]); + } + + return $result->get('value'); + } + + /** + * Check for item existence + * + * @param $ident + * @return bool + */ + public static function has($ident) + { + $item = CacheModel::find($ident, 'ident'); + if ($item->count() > 0) { + return true; + } + + return false; + } + + /** + * Check if item cache time is elapsed + * + * @param $ident + * @param $timeInSeconds + * @return bool + */ + public static function elapsed($ident, $timeInSeconds) + { + if (!CacheModel::has($ident)) { + return false; + } + + $data = CacheModel::where('ident', '=', $ident)->first(); + + $dtLast = new DateTime(date('Y-m-d H:i:s', strtotime($data->get('updated_at')))); + $dtLast->add(new DateInterval('PT' . $timeInSeconds . 'S')); + $dtNow = new DateTime('now'); + + return ($dtNow >= $dtLast); + } + + /** + * Get item and then delete it + * + * @param $ident + * @return mixed + */ + public static function pull($ident) + { + $item = CacheModel::find($ident, 'ident'); + if ($item->count() > 0) { + $data = $item->get(0); + + CacheModel::where('id', '=', $item->get(0)->get('id'))->delete(); + + return $data->get('value'); + } + + return null; + } + + /** + * Write item to table + * + * @param $ident + * @param $value + * @return bool + */ + public static function put($ident, $value) + { + if (CacheModel::has($ident)) { + return false; + } + + $data = array( + 'ident' => $ident, + 'value' => $value, + 'updated_at' => date('Y-m-d H:i:s') + ); + + foreach ($data as $key => $val) { + CacheModel::insert($key, $val); + } + + CacheModel::go(); + + return true; + } + + /** + * Forget cache item + * + * @param string $ident The item identifier + * @return bool + */ + public static function forget($ident) + { + $item = CacheModel::find($ident, 'ident'); + if ($item->count() > 0) { + CacheModel::where('id', '=', $item->get(0)->get('id'))->delete(); + + return true; + } + + return false; + } + + /** + * Return the associated table name of the migration + * + * @return string + */ + public static function tableName() + { + return 'CacheModel'; + } +} + \ No newline at end of file