<?php
/*
* Copyright (C) 2002-2004
* @author chenxi
* @version $Id: mysqli_Driver.class.php,v 0.1 2004/11/02 17:37:50
*/
require_once ('util/StringUtils.class.php');
require_once ('util/String.class.php');
class mysql_Driver extends Object {
/* éè¦è§£æçurl */
var $url = '';
/* è§£æåçurlä¿¡æ¯ï¼å
æ¬ä¸»æºåã端å£ãç¨æ·åãå¯ç ãæ°æ®åºçä¿¡æ¯ */
var $urlProps = array();
/* é»è®¤æ°æ®åºç±»åï¼ç¨æ¥åå»ºæ°æ®åºè¿æ¥å®ä¾ */
var $dbtype = 'mysql';
/* $urlProps䏿°æ®åºç±»åç´¢å¼å */
var $dbtype_key = 'dbtype';
/* $urlProps䏿°æ®åºä¸»æºåç´¢å¼å */
var $dbhost_key = 'dbhost';
/* $urlProps䏿°æ®åºç«¯å£ç´¢å¼å */
var $dbport_key = 'dbport';
/* $urlProps䏿°æ®åºç¨æ·åç´¢å¼å */
var $dbuser_key = 'dbuser';
/* $urlProps䏿°æ®åºç¨æ·å¯ç ç´¢å¼å */
var $dbpass_key = 'dbpass';
/* $urlProps䏿°æ®åºåç´¢å¼å */
var $dbname_key = 'dbname';
/* é»è®¤æ°æ®åºä¸»æºå */
var $DEFAULT_HOST= 'localhost';
/* é»è®¤æ°æ®ç«¯å£ */
var $DEFAULT_PORT= '3306';
/**
* æé 彿°
* $param String $url
*/
function &mysql_Driver(&$url) {
if ($this->acceptsURL($url))
$this->connect($url);
return null;
}
/**
* ææå½æ°
*/
function __destruct() {
$this->url = '';
$this->urlProps = array();
}
/**
* @param $url
* @return 妿$urlåæ³è¿åtrueï¼å¦åè¿åfalse
*/
function acceptsURL(&$url) {
return ($urlProps != null && is_array($urlProps));
}
/**
* è·åmysqli_Connectionçå®ä¾
* @param String $url
* @param $info
* @return Object mysqli_Connection
*/
function connect(&$url, $info=NULL) {
if (($this->urlProps = $this->parseURL($url)) == NULL)
return NULL;
require_once ('pdbc/mysql/Connection.class.php');
/* singleton get unique instance of mysql_Connection */
return mysql_Connection::getInstance($this);
}
/**
* è·åä¸»çæ¬å·(Major Version)
* @return int (Major Version)
*/
function getMajorVersion() {
return (int)0;
}
/**
* è·åMinor Version
* @return int (Minor Version)
*/
function getMinorVersion() {
return (int)1;
}
/**
* è·åè§£æåçurlä¿¡æ¯
* @return Array urlProps
*/
function getUrlProps() {
return $this->urlProps;
}
/**
* è·åçæ¬
* @return String
*/
function getVersion() {
return $this->getMajorVersion().'.'.$this->getMinorVersion();
}
function getDriverProperty($property_key=NULL) {
if ((bool)$property_key)
return $this->urlProps;
else
return $this->urlProps[$property_key];
}
/**
* Document me!
*/
function getPropertyInfo(&$url, $info=NULL) {
//not implement yet
}
/**
* æ£æ¥æ°æ®åºæå¡å¨æ¯å¦ç¬¦åpdbcè§è
* @return boolean
*/
function pdbcCompliant() {
//mysql is not compliant with pdbc specification
return false;
}
/**
* è§£æä¼ å
¥çurlï¼ç»æåå
¥urlProps
* @param String $url
* @return String[] $urlProps
*/
function parseURL(&$url) {
if (NULL === $url || !(bool)$url)
return NULL;
$surl = new String($url);
#if (!StringUtils::startsWith($url, 'pdbc:', true)) { //StringUtils model
if (!$surl->startsWith('pdbc:mysql')) {
if ((int)5 == $debug)
print 'url??';
$this->throws('url??');
//return null;
}
$pdbc = strpos($url, ':');
$dslash = strpos($url, '://');
if ($pdbc !== false && $dslash !== false) {
$dbtype = substr($url, ($pdbc + 1), ($dslash - strlen('pdbc:')));
$dbtype[$dbtype_key] = $dbtype;
}
$pos = strpos($url, '?');
if (false !== $pos) {
$userPassPair = substr($url, ($pos + 1));
$url = substr($url, 0, $pos);
}
$userPass = $this->parseUserPass($userPassPair);
$url = substr($url, 13);
$slash = strpos($url, '/');
if ($slash !== false) {
$hostPortPair = substr($url, 0, $slash);
$hostPort = $this->parseHostPort($hostPortPair);
}
$dbname = array();
$dbname[$this->dbname_key] = substr($url, ($slash + 1));
$urlProps = array_merge($dbname, $hostPort, $userPass);
return $urlProps;
}
/**
* è§£æä¸»æºåã端å£ç段
* @param String $hostPortPair
* @return String[] $hostPort
*/
function parseHostPort(&$hostPortPair) {
$dbhost = 'localhost';
$hostPort = array();
$pos = strpos($hostPortPair, ':');
if ($pos !== false) {
$dbhost = substr($hostPortPair, 0, $pos);
$dbport = substr($hostPortPair, ($pos + 1));
} else {
if (is_string($hostPortPair) && !$hostPortPair) {
$dbhost = $hostPortPair;
$dbport = $this->DEFAULT_PORT;
} else if (is_int($hostPortPair)) {
$dbhost = $this->DEFAULT_HOST;
$dbport = $hostPortPair;
} else {
$dbhost = $this->DEFAULT_HOST;
$dbport = $this->DEFAULT_PORT;
}
}
$hostPort[$this->dbhost_key] = $dbhost;
$hostPort[$this->dbport_key] = $dbport;
return $hostPort;
}
/**
* è§£æç¨æ·åãå¯ç çæ®µ
* @param String $userPassPair
* @return String[] $userPass
*/
function parseUserPass(&$userPassPair) {
$userPass = array();
if ((bool)$userPassPair) {
require_once ('util/StringTokenizer.class.php');
$userPassToken = new StringTokenizer($userPassPair, '&');
$i = 0;
while ($userPassToken->hasMoreTokens()) {
$up = new StringTokenizer($userPassToken->nextToken(), '=');
if ($up->hasMoreTokens()) {
$param = $up->nextToken();
}
if ($up->hasMoreTokens()) {
$value = $up->nextToken();
}
$userPass[$param] = $value;
}
} else {
$userPass[$this->dbuser_key] = '';
$userPass[$this->dbpass_key] = '';
}
return $userPass;
}
}
?>