From f10d1fca7e01651b923e2a18163fe3b3383a644a Mon Sep 17 00:00:00 2001 From: zYne Date: Mon, 21 Aug 2006 23:16:55 +0000 Subject: [PATCH] --- Doctrine/Connection/Common.php | 25 +++++ Doctrine/Connection/Exception.php | 13 +++ Doctrine/Connection/Firebird.php | 20 ++++ Doctrine/Connection/Informix.php | 6 ++ Doctrine/Connection/Mssql.php | 72 ++++++++++++++ Doctrine/Connection/Mysql.php | 159 ++++++++++++++++++++++++++++++ Doctrine/Connection/Oracle.php | 32 ++++++ Doctrine/Connection/Pgsql.php | 18 ++++ Doctrine/Connection/Sqlite.php | 7 ++ 9 files changed, 352 insertions(+) create mode 100644 Doctrine/Connection/Common.php create mode 100644 Doctrine/Connection/Exception.php create mode 100644 Doctrine/Connection/Firebird.php create mode 100644 Doctrine/Connection/Informix.php create mode 100644 Doctrine/Connection/Mssql.php create mode 100644 Doctrine/Connection/Mysql.php create mode 100644 Doctrine/Connection/Oracle.php create mode 100644 Doctrine/Connection/Pgsql.php create mode 100644 Doctrine/Connection/Sqlite.php diff --git a/Doctrine/Connection/Common.php b/Doctrine/Connection/Common.php new file mode 100644 index 000000000..677ebc701 --- /dev/null +++ b/Doctrine/Connection/Common.php @@ -0,0 +1,25 @@ + diff --git a/Doctrine/Connection/Exception.php b/Doctrine/Connection/Exception.php new file mode 100644 index 000000000..99b84ef9f --- /dev/null +++ b/Doctrine/Connection/Exception.php @@ -0,0 +1,13 @@ +openConnection() to open a new connection.",Doctrine::ERR_NO_SESSIONS); + } +} +?> diff --git a/Doctrine/Connection/Firebird.php b/Doctrine/Connection/Firebird.php new file mode 100644 index 000000000..329c147f2 --- /dev/null +++ b/Doctrine/Connection/Firebird.php @@ -0,0 +1,20 @@ +query("SELECT UNIQUE FROM ".$sequence); + $data = $stmt->fetch(PDO::FETCH_NUM); + return $data[0]; + } +} +?> diff --git a/Doctrine/Connection/Informix.php b/Doctrine/Connection/Informix.php new file mode 100644 index 000000000..91211220e --- /dev/null +++ b/Doctrine/Connection/Informix.php @@ -0,0 +1,6 @@ + diff --git a/Doctrine/Connection/Mssql.php b/Doctrine/Connection/Mssql.php new file mode 100644 index 000000000..75106e0a8 --- /dev/null +++ b/Doctrine/Connection/Mssql.php @@ -0,0 +1,72 @@ +query("INSERT INTO $sequence (vapor) VALUES (0)"); + $stmt = $this->query("SELECT @@IDENTITY FROM $sequence"); + $data = $stmt->fetch(PDO::FETCH_NUM); + return $data[0]; + } + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * [ borrowed from Zend Framework ] + * + * @param string $query + * @param mixed $limit + * @param mixed $offset + * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html + * @return string + */ + public function modifyLimitQuery($query, $limit, $offset) { + if ($limit) { + + // we need the starting SELECT clause for later + $select = 'SELECT '; + if (preg_match('/^[[:space:]*SELECT[[:space:]]*DISTINCT/i', $query, $matches) == 1) + $select .= 'DISTINCT '; + + $length = strlen($select); + + // is there an offset? + if (! $offset) { + // no offset, it's a simple TOP count + return "$select TOP $count" . substr($query, $length); + } + + // the total of the count **and** the offset, combined. + // this will be used in the "internal" portion of the + // hacked-up statement. + $total = $count + $offset; + + // build the "real" order for the external portion. + $order = implode(',', $parts['order']); + + // build a "reverse" order for the internal portion. + $reverse = $order; + $reverse = str_ireplace(" ASC", " \xFF", $reverse); + $reverse = str_ireplace(" DESC", " ASC", $reverse); + $reverse = str_ireplace(" \xFF", " DESC", $reverse); + + // create a main statement that replaces the SELECT + // with a SELECT TOP + $main = "\n$select TOP $total" . substr($query, $length) . "\n"; + + // build the hacked-up statement. + // do we really need the "as" aliases here? + $query = "SELECT * FROM (" + . "SELECT TOP $count * FROM ($main) AS select_limit_rev ORDER BY $reverse" + . ") AS select_limit ORDER BY $order"; + + } + + return $query; + } +} +?> diff --git a/Doctrine/Connection/Mysql.php b/Doctrine/Connection/Mysql.php new file mode 100644 index 000000000..73a9bc308 --- /dev/null +++ b/Doctrine/Connection/Mysql.php @@ -0,0 +1,159 @@ +setAttribute(PDO::ATTR_EMULATE_PREPARES, true); + parent::__construct($manager,$pdo); + } + /** + * deletes all data access object from the collection + * @param Doctrine_Collection $coll + */ + /** + public function deleteCollection(Doctrine_Collection $coll) { + + $a = $coll->getTable()->getCompositePaths(); + $a = array_merge(array($coll->getTable()->getComponentName()),$a); + + $graph = new Doctrine_DQL_Parser($this); + foreach($coll as $k=>$record) { + switch($record->getState()): + case Doctrine_Record::STATE_DIRTY: + case Doctrine_Record::STATE_CLEAN: + $ids[] = $record->getID(); + break; + endswitch; + } + if(empty($ids)) + return array(); + + $graph->parseQuery("FROM ".implode(", ",$a)." WHERE ".$coll->getTable()->getTableName().".id IN(".implode(", ",$ids).")"); + + $query = $graph->buildDelete(); + + $this->getDBH()->query($query); + return $ids; + } + */ + + /** + * returns maximum identifier values + * + * @param array $names an array of component names + * @return array + */ + public function getMaximumValues2(array $names) { + $values = array(); + foreach($names as $name) { + $table = $this->tables[$name]; + $keys = $table->getPrimaryKeys(); + $tablename = $table->getTableName(); + + if(count($keys) == 1 && $keys[0] == $table->getIdentifier()) { + // record uses auto_increment column + + $sql[] = "SELECT MAX(".$tablename.".".$table->getIdentifier().") as $tablename FROM ".$tablename; + $values[$tablename] = 0; + $array[] = $tablename; + } + } + $sql = implode(" UNION ",$sql); + $stmt = $this->getDBH()->query($sql); + $data = $stmt->fetchAll(PDO::FETCH_NUM); + + foreach($data as $k => $v) { + $values[$array[$k]] = $v[0]; + } + return $values; + } + /** + * bulkInsert + * inserts all the objects in the pending insert list into database + * TODO: THIS IS NOT WORKING YET AS THERE ARE BUGS IN COMPONENTS USING SELF-REFERENCENCING + * + * @return boolean + */ + + /** + public function bulkInsert() { + if(empty($this->insert)) + return false; + + foreach($this->insert as $name => $inserts) { + if( ! isset($inserts[0])) + continue; + + $record = $inserts[0]; + $table = $record->getTable(); + $seq = $table->getSequenceName(); + $keys = $table->getPrimaryKeys(); + + $marks = array(); + $params = array(); + foreach($inserts as $k => $record) { + $record->getTable()->getAttribute(Doctrine::ATTR_LISTENER)->onPreSave($record); + // listen the onPreInsert event + $record->getTable()->getAttribute(Doctrine::ATTR_LISTENER)->onPreInsert($record); + + $array = $record->getPrepared(); + + if(isset($this->validator)) { + if( ! $this->validator->validateRecord($record)) { + continue; + } + } + + $key = implode(", ",array_keys($array)); + if( ! isset($params[$key])) + $params[$key] = array(); + + $marks[$key][] = "(".substr(str_repeat("?, ",count($array)),0,-2).")"; + $params[$key] = array_merge($params[$key], array_values($array)); + + + // listen the onInsert event + $record->getTable()->getAttribute(Doctrine::ATTR_LISTENER)->onInsert($record); + + $record->getTable()->getAttribute(Doctrine::ATTR_LISTENER)->onSave($record); + } + + if( ! empty($marks)) { + foreach($marks as $key => $list) { + $query = "INSERT INTO ".$table->getTableName()." (".$key.") VALUES ".implode(", ", $list); + $stmt = $this->getDBH()->prepare($query); + $stmt->execute($params[$key]); + } + } + if(count($keys) == 1 && $keys[0] == $table->getIdentifier()) { + + // record uses auto_increment column + + $sql = "SELECT MAX(".$table->getIdentifier().") FROM ".$record->getTable()->getTableName(); + $stmt = $this->getDBH()->query($sql); + $data = $stmt->fetch(PDO::FETCH_NUM); + $id = $data[0]; + $stmt->closeCursor(); + + foreach(array_reverse($inserts) as $record) { + + $record->setID((int) $id); + $id--; + } + } + } + + $this->insert = array(); + return true; + } + */ + +} +?> diff --git a/Doctrine/Connection/Oracle.php b/Doctrine/Connection/Oracle.php new file mode 100644 index 000000000..60c506afe --- /dev/null +++ b/Doctrine/Connection/Oracle.php @@ -0,0 +1,32 @@ += ".++$offset; + return $query; + } + /** + * returns the next value in the given sequence + * @param string $sequence + * @return integer + */ + public function getNextID($sequence) { + $stmt = $this->query("SELECT $sequence.nextval FROM dual"); + $data = $stmt->fetch(PDO::FETCH_NUM); + return $data[0]; + } +} +?> diff --git a/Doctrine/Connection/Pgsql.php b/Doctrine/Connection/Pgsql.php new file mode 100644 index 000000000..84928aced --- /dev/null +++ b/Doctrine/Connection/Pgsql.php @@ -0,0 +1,18 @@ +query("SELECT NEXTVAL('$sequence')"); + $data = $stmt->fetch(PDO::FETCH_NUM); + return $data[0]; + } +} +?> diff --git a/Doctrine/Connection/Sqlite.php b/Doctrine/Connection/Sqlite.php new file mode 100644 index 000000000..eeb995f98 --- /dev/null +++ b/Doctrine/Connection/Sqlite.php @@ -0,0 +1,7 @@ +