. * * @author Julien Fontanet * @license http://www.gnu.org/licenses/gpl-3.0-standalone.html GPLv3 * * @package Xen Orchestra Server */ final class JSONDatabase extends \Rekodi\Manager\Memory { /** * */ static function factory($file) { if (file_exists($file)) { $data = @file_get_contents($file); if ((false === $data) || (null === ($data = json_decode($data, true)))) { trigger_error( 'could not read the database', E_USER_ERROR ); } $manager = static::createFromState($data); } else { $manager = new static; // Create tables. $manager->createTable('tokens', function ($table) { $table ->string('id')->unique() ->integer('expiration') ->string('user_id') ; }); $manager->createTable('users', function ($table) { $table ->integer('id')->autoIncremented() ->string('name')->unique() ->string('password') ->integer('permission') ; }); // Insert initial data. $manager->create('users', array( array( 'name' => 'admin', 'password' => '$2y$10$VzBQqiwnhG5zc2.MQmmW4ORcPW6FE7SLhPr1VBV2ubn5zJoesnmli', 'permission' => \Bean\User::ADMIN, ), )); trigger_error( 'no existing database, creating default user (admin:admin)', E_USER_WARNING ); } $manager->_file = $file; return $manager; } /** * */ function createTable($name, $callback) { $result = parent::createTable($name, $callback); $this->_save(); return $result; } /** * */ function deleteTable($name) { $result = parent::deleteTable($name); $this->_save(); return $result; } /** * */ function create($table, array $entries) { $result = parent::create($table, $entries); $this->_save(); return $result; } /** * */ function delete($table, array $filter) { $result = parent::delete($table, $filter); $this->_save(); return $result; } /** * */ function update($table, array $filter, array $properties) { $result = parent::update($table, $filter, $properties); $this->_save(); return $result; } /** * */ private $_file; /** * */ private function _save() { if (!$this->_file) { return; } $bytes = @file_put_contents( $this->_file, json_encode($this->getState()) ); if (!$bytes) { trigger_error( 'could not write the database', E_USER_ERROR ); } } }