diff options
Diffstat (limited to 'classes/backends/MaleteDb.php')
-rw-r--r-- | classes/backends/MaleteDb.php | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/classes/backends/MaleteDb.php b/classes/backends/MaleteDb.php new file mode 100644 index 0000000..114995b --- /dev/null +++ b/classes/backends/MaleteDb.php @@ -0,0 +1,161 @@ +<?php + +/** + * Malete implementation of IsisDb. + * + * @warning + * This implementation is currently outdated and lacks + * basic functionalities such as subfield handling and + * therefore it's use is not recommended. + */ +class MaleteDb implements IsisDb { + /** + * @var $fdt + * Field description table. + */ + var $fdt; + + /** + * @var $db + * Database resource. + */ + var $db; + + /** + * @var $format + * Database format, derived from $schema. + */ + var $format; + + /** + * @var $log + * Class action log. + */ + var $log; + + /** + * Constructor. + * + * @see IsisDb::__construct() + */ + public function __construct($schema) { + // Save db schema. + $this->format = $schema; + + // Setup $fdt used by malete. + foreach ($schema['fields'] as $field => $info) { + $this->fdt[$field] = $info['name']; + } + + // Open a database connection. + $this->db = new Isis_Db($this->fdt, $schema['db']['name'], new Isis_Server()); + if (!$this->db->srv->sock) { + return FALSE; + } + } + + /** + * Read an entry. + * + * @see IsisDb::read() + * + * @todo + * Subfield handling. + */ + public function read($id) { + if (!is_numeric($id)) { + return FALSE; + } + if ($results !== FALSE) { + $results = $this->db->read($id); + return $this->tag($results); + } + else { + return FALSE; + } + } + + /** + * Return number of entries in the database. + * + * The Malete API doen't implement such feature so we + * have to emulate it by iterating over all entries + * until MaleteDb::read() returns FALSE. + * + * @see IsisDb::entries() + */ + public function entries() { + // The first entry in a malete database has id 1 and + // not 0, therefore $id's initial value should be 1. + $id = 1; + while($this->db->read($id)) { + $id++; + } + return $id - 1; + } + + /** + * Return an example schema. + * + * @see IsisDb::example() + */ + public function example() { + return SchemaDb::example(); + } + + /** + * Check configuration. + * + * @see IsisDb::check() + */ + public function check($schema, $section = NULL) { + // Check API availability. + if (!class_exists('Isis_Db')) { + throw new Exception('Could not find Isis_Db class. Please check your malete installation.'); + return FALSE; + } + + // Check schema configuration. + return SchemaDb::check($schema, $section); + } + + /** + * Tag results of a db query. + * + * This function converts the keys of query result from field numbers + * to names and and also puts repetition fields into place as Malete + * deals with field repetition by using a 'tag' property in the resulting + * query object. + * + * @param $results + * Database query results. + * + * @return + * Tagged database result. + */ + function tag($results) { + foreach ($results->val as $key => $value) { + $field = $results->tag[$key]; + $name = $this->format['fields'][$field]['name']; + + // Handles field repetition. + if ($this->format['fields'][$field]['repeat']) { + $data[$name][] = $value; + } + else { + $data[$name] = $value; + } + } + return $data; + } + + /** + * Class logger. + * + * @param $message + * Log message. + */ + function logger($message) { + $this->log[] = $message; + } +} |