Note: You are currently viewing documentation for Moodle 3.4. Up-to-date documentation for the latest stable version of Moodle is likely available here: DB layer 2.0.

Development talk:DB layer 2.0

From MoodleDocs

Various Notes (before 20080501)

  • AdoDB, AdoDB over PDO, PDO. (my initial +1 to continue using underlying ADOdb).
  • Placeholder types: :named or ? (will require PHP parsing under some DBs).
  • Multiple connections supported (auto-contained DB object).
  • PERF debugging available.
  • Logging available (to detect wrong uses).


  • Total breakage (all contrib uses)
  • Total breakage (current dmllib 1.0 functions definition).
  • Development mode (branch with radical replacement, some compatibility layer to minimize breakage - current dmllib instantiating new dmllib + stripping slashes ?)


  • Mahara experience. ( it's also worthwhile to note that a long long time ago I also did this for elgg which involved doing the addslashes/stripslashes audit through the code base - we didn't have to do this with mahara as we had placeholders and no slashes right from the start - Penny )
  • Interface example.
  • dmllib 2.0 tests since the beginning.
  • dmllib 2.0 documentation since the beginning.
  • Classes implementation order (PG, MySQL, MSSQL, Oracle).
  • More ideas.


  • Next meeting. TODO: document MDM20080501, AdoDb/PDO decision, Interface + PHP documentation + Docs documentation, define tests to perform. ADDRESS IT for... 20080508 ?

Eloy Lafuente (stronk7) 19:00, 29 April 2008 (CDT)

PDO/ADODB

I think it's interesting to discuss the potential of moving to PDO instead of ADODB but I'm not convinced it needs to be in the same conversation - we should be able to switch out ADODB and use PDO instead with completely no change outside dml - surely nowhere in the code is using $db directly - should always be using execute_sql

Penny Leach

Yup 100% agree, underlying stuff will be completely hidden, so it's a non-priority decision. We'll be able "replace" it more or less easily or, alternatively, create new "Moodle drivers" using different internal stuff. Just prospecting your opinion about PDO. I've done some (basic) research and it seems not to be 100% ready for production under some DBs. But wanted to know if you have some experience with it (or at least you initial feeling).
Eloy Lafuente (stronk7)

Interface proposal

$params - array of sql parameters $name=>$value

$where, $sql - SQL with :name placeholders; converted by us to ? for backends that need it (more flexible when constructing SQL in loops)

$fields - $fieldname=>$requestedvalue

$data - like current data object with 'id' property required

we can search easily for [^>]get_record to find obsolete code


interface moodle_database {

   /// fetching, deleting, inserting and modifying
   public function insert_record($table, object $data);
   public function insert_records($table, array $array_of_datas);

   public function update_record($table, object $data);

   public function execute($sql, array $params=null);

   public function get_record($table, array $fields);
   public function get_record_select($table, $where, array $params=null); 
   public function get_record_sql($sql, array $params=null); 
   public function get_records($table, array $fields, $limitfrom=0, $limitnum=0); // returns associative array
   public function get_records_select($table, $where, array $params=null, $limitfrom=0, $limitnum=0); // returns associative array 
   public function get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0); // returns associative array 
   public function get_recordset($table, array $fields, $limitfrom=0, $limitnum=0); // returns moodle_recordset
   public function get_recordset_select($table, $where, array $params=null, $limitfrom=0, $limitnum=0); // returns moodle_recordset
   public function get_recordset_sql($sql, array $params=null, $limitfrom=0, $limitnum=0); // returns moodle_recordset

   public function count_records($table, array $fields, array $params=null);
   public function count_records_select($table, $where, array $params=null); 

   public function record_exists($table, array $fields);
   public function record_exists_select($table, $where, array $params=null);

   public function delete_records($table, array $fields);
   public function delete_records_select($table, $where, array $params=null);

   public function get_field($table, array $fields);

   public function set_field($table, $newfield, $newvalue, array $fields);
   public function set_field_select($table, $newfield, $newvalue, $where, array $params=null);

   /// sql contructs
   public function sql_bitand($int1, $int2);
   public function sql_bitnot($int1);
   public function sql_bitor($int1, $int2);
   public function sql_bitxor($int1, $int2);
   public function sql_cast_char2int($fieldname, $text=false);
   public function sql_compare_text($fieldname, $numchars=32);
   public function sql_concat();
   public function sql_concat_join($separator="' '", $elements=array());
   public function sql_ilike();
   public function sql_order_by_text($fieldname, $numchars=32);
   public function sql_substr();
   public function sql_emptyfrom(); // oracle hack

/* not needed if we fix code?
   public function sql_as();
   public function sql_isempty($tablename, $fieldname, $nullablefield, $textfield);
   public function sql_isnotempty($tablename, $fieldname, $nullablefield, $textfield);
   public function sql_max($field);
*/

   /// transactions
   public function begin_sql();
   public function commit_sql();
   public function rollback_sql();

   /// Other
   protected function sql_paging_limit($page, $recordsperpage);
}

interface moodle_recordset extends Iterator {
   public function current();
   public function key();
   public function next();
   public function rewind();
   public function valid();

/*   public function fetch_next(); // next() + current()*/
   public function close();
}