open($info); $connections[$name] = &$dba; return $connections[$name]; } function &open($name) { return FADatabase::connect(array('name' => $name)); } } class FADatabaseConnection { var $_dbinfo; var $_dispatcher; function FADatabaseConnection() { $this->_dispatcher = &new FADispatcher; } function addObserver(&$observer) { $this->_dispatcher->addObserver($observer); } function close() { assert(FALSE); } function connect($dbinfo) { assert(FALSE); } function executeQuery($query) { assert(FALSE); } function &createStatement($query) { assert(FALSE); } function &createTransaction() { assert(FALSE); } function notifyAll(&$event) { $this->_dispatcher->notifyAll($event); } function getRow($stmt, $args = array()) { $result = $this->executeQuery($stmt, $args); $result->next(); return $result->current(); } function open($dbinfo) { if ($ret = $this->connect($dbinfo)) { $this->_dbinfo = $dbinfo; } return $ret; } } class FADatabaseResult extends FAIterator { function get($column) { $current = $this->current(); if (isset($current[$column])) return $current[$column]; } function getDate($column, $format = '%x') { $current = $this->current(); if (isset($current[$column])) return strftime($format, $current[$column]); } function getFloat($column) { $current = $this->current(); if (isset($current[$column])) return (float)$current[$column]; } function getInt($column) { $current = $this->current(); if (isset($current[$column])) return (int)$current[$column]; } function getString($column) { $current = $this->current(); if (isset($current[$column])) return (string)$current[$column]; } function getTime($column, $format = '%X') { $current = $this->current(); if (isset($current[$column])) return strftime($format, $current[$column]); } function getTimestamp($column, $format = 'Y-m-d H:i:s') { $current = $this->current(); if (isset($current[$column])) return date($format, $current[$column]); } } class FADatabaseQueryEvent extends FAObservableEvent { var $_message; var $_rows; var $_time; function FADatabaseQueryEvent($message, $rows = 0, $time = 0) { $this->_message = $message; $this->_rows = $rows; $this->_time = $time; } function getMessage() { return $this->_message; } function getRows() { return $this->_rows; } function getTime() { return $this->_time; } } class FADatabaseStatement { function &executeQuery($mode = DBA_ASSOC) { assert(FALSE); } function executeUpdate($mode = DBA_ASSOC) { assert(FALSE); } function set($n, $value) { if (is_int($value) || is_float($value) || is_numeric($value)) { if (ctype_digit($value)) { $this->setInt($n, $value); } else { $this->setFloat($n, $value); } } elseif ($value === NULL) { $this->setNull($n); } else { $this->setString($n, $value); } } function setFloat($n, $value) { assert(FALSE); } function setInt($n, $value) { assert(FALSE); } function setNull($n) { assert(FALSE); } function setString($n, $value) { assert(FALSE); } function getSql() { assert(FALSE); } } class FABasicDatabaseStatement extends FADatabaseStatement { var $_dba; var $_stmt; var $_vars = array(); function FABasicDatabaseStatement($stmt, &$dba) { $count = substr_count($stmt, '?'); if ($count) { $this->_vars = array_fill(1, $count, 'NULL'); } $this->_stmt = str_replace(array('%', '?'), array('%%', '%s'), $stmt); $this->_dba = &$dba; } function &executeQuery($mode = DBA_ASSOC) { return $this->_dba->executeQuery($this->getSql(), $mode); } function executeUpdate($mode = DBA_ASSOC) { return $this->_dba->executeUpdate($this->getSql(), $mode); } function setFloat($n, $value) { $this->_vars[$n] = floatval($value); } function setInt($n, $value) { $this->_vars[$n] = intval($value); } function setNull($n) { $this->_vars[$n] = 'NULL'; } function setString($n, $value) { $this->_vars[$n] = "'".$this->_dba->quote($value)."'"; } function getSql() { $stmt = vsprintf($this->_stmt, $this->_vars); return str_replace('%%', '%', $stmt); } } ?>