From 7a3ade00cd7806880ce5fc37bbde69bb3333edf3 Mon Sep 17 00:00:00 2001 From: stronk7 Date: Sun, 30 Aug 2009 22:55:45 +0000 Subject: [PATCH] MDL-15181 cross-db temporary tables support. First-cut. --- lib/dml/moodle_temptables.php | 111 +++++++++++++++++++++ lib/dml/mssql_native_moodle_temptables.php | 48 +++++++++ 2 files changed, 159 insertions(+) create mode 100644 lib/dml/moodle_temptables.php create mode 100644 lib/dml/mssql_native_moodle_temptables.php diff --git a/lib/dml/moodle_temptables.php b/lib/dml/moodle_temptables.php new file mode 100644 index 0000000000..3f358fc7f9 --- /dev/null +++ b/lib/dml/moodle_temptables.php @@ -0,0 +1,111 @@ +. + +/** + * Generic temptables object store + * + * Provides support to databases lacking some "expeted behaviour" related + * with some operations with temporary tables like: + * + * - databases not retrieving temp tables from information schema tables (mysql) + * - databases using a different name schema for temp tables (like mssql). + * + * Basically it works as a simple store of created temporary tables, providing + * some simple getters/setters methods. Each database can extend it for its own + * purposes (for example, return correct name, see the mssql implementation) + * + * The unique instance of the object by database connection is shared by the database + * and the sql_generator, so both are able to use its facilities, with the final goal + * of doing temporary tables support 100% cross-db and transparent within the DB API. + * + * Only drivers needing it will use this store. Neither moodle_database (abstract) or + * databses like postgres need this, because they don't lack any temp functionality.º:w + + * + * @package moodlecore + * @subpackage DML + * @copyright 2009 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +class moodle_temptables { + + protected $mdb; // circular reference, to be able to use DB facilities here if needed + protected $prefix; // prefix to be used for all the DB objects + protected $temptables; // simple array of 'tablename' => 'tablename' + + /** + * Creates new moodle_temptables instance + * @param object moodle_database instance + */ + public function __construct($mdb) { + $this->mdb = $mdb; + $this->prefix = $mdb->get_prefix(); + $this->temptables = array(); + } + + /** + * Add one temptable to the store + * + * @param string $tablename name without prefix of the table created as temptable + */ + public function add_temptable($tablename) { + // TODO: throw exception if exists: if ($this->is_temptable... + $this->temptables[$tablename] = $tablename; + } + + /** + * Delete one temptable from the store + * + * @param string $tablename name without prefix of the dropped temptable + */ + public function delete_temptable($tablename) { + // TODO: throw exception if not exists: if (!$this->is_temptable.... + unset($this->temptables[$tablename]); + } + + /** + * Returns all the tablenames (without prefix) existing in the store + * + * @return array containing all the tablenames in the store (tablename both key and value) + */ + public function get_temptables() { + return $this->temptables; + } + + /** + * Returns if one table, based in the information present in the store, is a temp table + * + * @param string $tablename name without prefix of the table we are asking about + * @return bool true if the table is a temp table (based in the store info), false if not + */ + function is_temptable ($tablename) { + return !empty($this->temptables[$tablename]); + } + + /** + * Given one tablename (no prefix), return the name of the corresponding temporary table, + * usually the same name but some databases could require changes (like '#' prefix in mssql) + * + * Override and use this *only* if the database requires modification in the table name. + * + * @param string $tablename name without prefix which corresponding temp tablename nees to calculate + */ + public function get_correct_name($tablename) { + return $this->prefix . $tablename; // No change in name is the usual behaviour + } +} diff --git a/lib/dml/mssql_native_moodle_temptables.php b/lib/dml/mssql_native_moodle_temptables.php new file mode 100644 index 0000000000..b29634cdb7 --- /dev/null +++ b/lib/dml/mssql_native_moodle_temptables.php @@ -0,0 +1,48 @@ +. + +/** + * MSSQL specific temptables store. Needed because temporary tables + * are named diferently than normal tables. Also used to be able to retrieve + * temp table names included in the get_tables() method od the DB. + * + * @package moodlecore + * @subpackage DML + * @copyright 2009 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once($CFG->libdir.'/dml/moodle_temptables.php'); + +class mssql_native_moodle_temptables extends moodle_temptables { + + /** + * Override the method to return the correct real name (prefix = '#') of + * temporary mssql databases. Widely used in the corresponding mssql sql + * generator and database driver + * + * @param string $tablename name without prefix which corresponding temp tablename nees to calculate + */ + public function get_correct_name($tablename) { + // TODO: throw exception if not exists + if (!empty($this->temptables[$tablename])) { + return '#' . $this->prefix . $tablename; + } else { + return $this->prefix . $tablename; + } + } +} -- 2.39.5