在前一节,已经测试了使用原始的PDO方式是可以访问人大金仓的数据库的。在这一节我们将尝试为Joomla写人大金仓的数据库接口类。测试使用Joomla提供的数据库API来访问人大金仓的数据库。

理论基础


Joomla对数据库层做了很好的抽象,为其进行移植预留了充分的可能性。

Joomla的底层数据库接口和实现在 网站的根目录 libraries\joomla\database 这个目录下面。最主要的文件有两个:driver.php和query.php。

  • 其中driver.php文件中定义了各种数据库驱动层面的接口,如果需要让Joomla支持一种新的数据库驱动,只需要将新的数据库驱动继承JDatabaseDriver 这类,然后针对数据库的特有方法实现对应的接口方法即可。
  • query.php文件中定义了数据库提供的一些基础的数据库操作方法。每一个数据库驱动都会自动加载一个与其同名的数据库查询类型。

在driver目录下,系统已经自带了几个常用的数据库驱动类的实现。如图:

joomla数据库驱动实现类.png

因此,需要做的就比较明确了。只需要参考pdomysql.php这个文件,定义我们自己的数据库类即可。

准备文件架构


1,定义驱动类的名称

将人大金仓的数据库驱动类定义为pdokdb.

2,实现人大金仓数据库驱动类

在libraries\joomla\database\driver目录下复制一份pdomysql.php文件,将其命名为pdokdb.php文件.

编辑这个文件,将其类名修改为JDatabaseDriverPdokdb,且让其继承自JDatabaseDriverPdo。代码如下:

class JDatabaseDriverPdokdb extends JDatabaseDriverPdo
{
	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 * @since  3.4
	 */
	public $name = 'pdokdb';

这样我们就有一个人大金仓的数据库驱动实现类了。

3,实现人大金仓数据库查询类

在libraries\joomla\database\query目录下复制一份pdomysql.php文件,将其命名为pdokdb.php文件.

编辑这个文件,将其类名修改为JDatabaseQueryPdokdb.且让其继承自JDatabaseQueryPdomysql  代码如下:

class JDatabaseQueryPdokdb extends JDatabaseQueryPdomysql
{

 这样我们就有一个人大金仓的数据库查询类了。

 这样新增数据库驱动的文件结构就准备好了。

实现具体的人大金仓数据库链接


因为我们继承了 JDatabaseDriverPdo 这个类,因此,必须实现这个类中的定义的虚方法

public function __construct($options)
public function connect()
public function dropTable($tableName, $ifExists = true)
public function select($database)
public function getCollation()
public function getConnectionCollation()
public function getTableCreate($tables)
public function getTableColumns($table, $typeOnly = true)
public function getTableKeys($table)
public function getTableList()
public function lockTable($table)
public function renameTable($oldTable, $newTable, $backup = null, $prefix = null)
public function unlockTables()

最主要的一个方法是实现connect方法。代码如下:

/**
	 * Connects to the database if needed.
	 *
	 * @return  void  Returns void if the database connected successfully.
	 *
	 * @since   3.0.0
	 * @throws  RuntimeException
	 */
	public function connect()
	{
		if ($this->connection)
		{
			return;
		}

		// Make sure the PDO extension for PHP is installed and enabled.
		if (!self::isSupported())
		{
			throw new JDatabaseExceptionUnsupported('PDO Extension is not available.', 1);
		}

		$replace = array();
		$with = array();

		// Find the correct PDO DSN Format to use:
		switch ($this->options['driver'])
		{

			case 'kdb':
				$this->options['port'] = (isset($this->options['port'])) ? $this->options['port'] : 54321;

				$format = 'kdb:host=#HOST#;port=#PORT#;dbname=#DBNAME#';

				$replace = array('#HOST#', '#PORT#', '#DBNAME#');
				$with = array($this->options['host'], $this->options['port'], $this->options['database']);

				break;
		}

		// Create the connection string:
		$connectionString = str_replace($replace, $with, $format);

		try
		{
			$this->connection = new PDO(
				$connectionString,
				$this->options['user'],
				$this->options['password'],
				$this->options['driverOptions']
			);
		}
		catch (PDOException $e)
		{
			throw new JDatabaseExceptionConnecting('Could not connect to PDO: ' . $e->getMessage(), 2, $e);
		}
	}

核心的一个思想就是按照数据库的特定要求来实现对应的方法,如果指定的方法在本数据库驱动中不被支持,支持方法false或者$this即可。

下面是一个初步的代码模板:

人大金仓数据库驱动类:pdokdb.php

人大金仓数据库查询类:pdokdb.php

特别注意,上面的代码只是一个文件的架构,具体的适配并没有全部完成,有兴趣的朋友可以在此基础上进行完成。 

测试新的数据库驱动类


上面已经定义了数据库的驱动类型,下面就开始使用Joomla的方法来使用心得驱动类来访问数据库。代码如下:

try
{
	$option = array(); //prevent problems
	$option['driver']   = 'pdokdb';            // Database driver name
	$option['host']     = 'localhost';    // Database host name
	$option['user']     = 'JOOMLA';       // User for database authentication
	$option['password'] = 'zmax99';   // Password for database authentication
	$option['database'] = 'zmaxtest';      // Database name
	$option['prefix']   = 'a3bav_';             // Database prefix (may be empty)

	//使用标准的Joomla数据库接口来查询数据
	$db = JDatabaseDriver::getInstance( $option );
	$query = $db->getQuery(true);
	$query->select("*")->from("mytest");
	$db->setQuery($query);
	$items = $db->loadObjectList();

	echo "<pre>";
		print_r($items);
	echo "</pre>";
}catch(Exception $e){
	print "Error: " . $e->getMessage()."<br/>";
}

执行结果正常,证明我们写的数据库驱动和数据库查询类成功。

做完这一步并不代表数据库的适配完成了,它只能说明已经具备了初步适配的可能性。接下来,就是迁移数据,进行SQL语法的调整适配。剩下的工作才是难点。

 

评论 (0)

  • 最新在前
  • 最佳在前