编写你自己的数据库驱动器

假定你想为一个新生的未来的名为DNAbase的数据库编写一个数据库抽象层,该数据库使用分子计算来提升性能。我们不需要从头开始,而是复制一份已有的抽象层,接着修改它。我们将使用PostgreSQL的实现,这是因为MySQL的驱动器被拆分成了,一个includes/database.mysql-common.inc文件,和两个单独的mysql、mysqli驱动器文件。

首先,我们复制一份includes/database.pgsql.inc并将其重命名为includes/database.dnabase.inc。接着我们修改每个包装函数的内部逻辑,使用DNAbase的功能来代替PostgreSQL的功能。当我们完成了所有的这些修改以后,那么在我们的文件中声明了以下函数:
 
_db_query($query, $debug = 0)
db_add_field(&$ret, $table, $field, $spec, $new_keys = array())
db_add_index(&$ret, $table, $name, $fields)
db_add_primary_key(&$ret, $table, $fields)
db_add_unique_key(&$ret, $table, $name, $fields)
db_affected_rows()
db_change_field(&$ret, $table, $field, $field_new, $spec, $new_keys = array())
db_check_setup()
db_column_exists($table, $column)
db_connect($url)
db_create_table_sql($name, $table)
db_decode_blob($data)
db_distinct_field($table, $field, $query)
db_drop_field(&$ret, $table, $field)
db_drop_index(&$ret, $table, $name)
db_drop_primary_key(&$ret, $table)
db_drop_table(&$ret, $table)
db_drop_unique_key(&$ret, $table, $name)
db_encode_blob($data)
db_error()
db_escape_string($text)
db_fetch_array($result)
db_fetch_object($result)
db_field_set_default(&$ret, $table, $field, $default)
db_field_set_no_default(&$ret, $table, $field)
db_last_insert_id($table, $field)
db_lock_table($table)
db_query_range($query)
db_query_temporary($query)
db_query($query)
db_rename_table(&$ret, $table, $new_name)
db_result($result)
db_status_report()
db_table_exists($table)
db_type_map()
db_unlock_tables()
db_version()
 
通过更新settings.php中的$db_url,我们在Drupal中连接到DNAbase数据库来测试这一系统。它看起来是这样的:
$db_url = 'dnabase://john:secret@localhost/mydnadatabase';
 
其中john是用户名,secret是密码,而mydnadatabase是我们将要连接的数据库名。你可能还想创建一个测试模块,来直接调用这些函数以确保它们正常工作。
 老葛的Drupal培训班 Think in Drupal

Drupal版本: