summaryrefslogtreecommitdiff
path: root/framework/Data/Common/IbmDb2
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Data/Common/IbmDb2')
-rw-r--r--framework/Data/Common/IbmDb2/TIbmColumnMetaData.php157
-rw-r--r--framework/Data/Common/IbmDb2/TIbmMetaData.php113
-rw-r--r--framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php113
3 files changed, 383 insertions, 0 deletions
diff --git a/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php b/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php
new file mode 100644
index 00000000..284a5fd2
--- /dev/null
+++ b/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * TIbmColumnMetaData class file.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id: TIbmColumnMetaData.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ */
+
+/**
+ * TIbmColumnMetaData class.
+ *
+ * Column details for IBM DB2 database. Using php_pdo_ibm.dll extension.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @version $Id: TIbmColumnMetaData.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ * @since 3.1
+ */
+class TIbmColumnMetaData extends TComponent
+{
+ private $_name;
+ private $_type;
+ private $_length;
+ private $_autoIncrement;
+ private $_default;
+ private $_notNull=true;
+
+ private $_isPrimary=null;
+
+ private $_property;
+
+ /**
+ * Initialize column meta data.
+ *
+ * @param string column name.
+ * @param string column data type.
+ * @param string column data length.
+ * @param boolean column can not be null.
+ * @param string serial name.
+ * @param string default value.
+ */
+ public function __construct($name,$type,$length,$notNull,$autoIncrement,$default,$primary)
+ {
+ $this->_property=$name;
+ $this->_name=$name;
+ $this->_type=$type;
+ $this->_length=$length;
+ $this->_notNull=$notNull;
+ $this->_autoIncrement=$autoIncrement;
+ $this->_default=$default;
+ $this->_isPrimary=$primary;
+ }
+
+ /**
+ * @return string quoted column name.
+ */
+ public function getName()
+ {
+ return $this->_name;
+ }
+
+ /**
+ * @return integer length.
+ */
+ public function getLength()
+ {
+ return $this->_length;
+ }
+
+ /**
+ * @return string active record property name
+ */
+ public function getProperty()
+ {
+ return $this->_property;
+ }
+
+ /**
+ * @return boolean true if column is a sequence, false otherwise.
+ */
+ public function hasSequence()
+ {
+ return $this->_autoIncrement;
+ }
+
+ /**
+ * @return null no sequence name.
+ */
+ public function getSequenceName()
+ {
+ return null;
+ }
+
+ /**
+ * @return boolean true if the column is a primary key, or part of a composite primary key.
+ */
+ public function getIsPrimaryKey()
+ {
+ return $this->_isPrimary;
+ }
+
+ /**
+ * @return string column type
+ */
+ public function getType()
+ {
+ return $this->_type;
+ }
+
+
+ /**
+ * @return boolean false if column can be null, true otherwise.
+ */
+ public function getNotNull()
+ {
+ return $this->_notNull;
+ }
+
+ /**
+ * @return boolean true if column has default value, false otherwise.
+ */
+ public function hasDefault()
+ {
+ return $this->_default !== null;
+ }
+
+ /**
+ * @return string default column value.
+ */
+ public function getDefaultValue()
+ {
+ return $this->_default;
+ }
+
+ /**
+ * @return string PHP primative type derived from the column type.
+ */
+ public function getPHPType()
+ {
+ switch(strtolower($this->_type))
+ {
+ case 'smallint': case 'integer':
+ return 'integer';
+ case 'real': case 'float': case 'double': case 'decimal': case 'bigint':
+ return 'float';
+ default:
+ return 'string';
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/framework/Data/Common/IbmDb2/TIbmMetaData.php b/framework/Data/Common/IbmDb2/TIbmMetaData.php
new file mode 100644
index 00000000..99df5465
--- /dev/null
+++ b/framework/Data/Common/IbmDb2/TIbmMetaData.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * TIbmMetaData class file.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id: TIbmMetaData.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ */
+Prado::using('System.Data.ActiveRecord.Vendor.TDbMetaDataCommon');
+
+/**
+ * TIbmMetaData class.
+ *
+ * Column details for IBM DB2 database. Using php_pdo_ibm.dll extension.
+ *
+ * Does not support LIMIT and OFFSET criterias.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @version $Id: TIbmMetaData.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ * @since 3.1
+ */
+class TIbmMetaData extends TDbMetaDataCommon
+{
+ /**
+ * Build the SQL search string from the criteria object for IBM DB2 database.
+ * @param TDbConnection database connection.
+ * @param TActiveRecordCriteria search criteria.
+ * @return string SQL search.
+ */
+ protected function getSqlFromCriteria($conn, $criteria)
+ {
+ if($criteria===null) return '';
+ $sql = '';
+ if(($condition = $criteria->getCondition())!==null)
+ $sql .= ' WHERE '.$condition;
+ $orders=array();
+ foreach($criteria->getOrdersBy() as $by=>$ordering)
+ $orders[] = $this->getOrdering($by, $ordering);
+ if(count($orders) > 0)
+ $sql .= ' ORDER BY '.implode(', ', $orders);
+ //if(($limit = $criteria->getLimit())!==null)
+ //{
+ // $sql .= ' FETCH FIRST '.intval($limit).' ROWS ONLY';
+ //}
+ return strlen($sql) > 0 ? $sql : '';
+ }
+
+ /**
+ * Lowercase the data keys, IBM DB2 returns uppercase column names
+ * @param mixed record row
+ * @return array record row
+ */
+ public function postQueryRow($row)
+ {
+ if(!is_array($row)) return $row;
+ $result=array();
+ foreach($row as $k=>$v)
+ $result[strtolower($k)]=$v;
+ return $result;
+ }
+
+ /**
+ * Lowercase the data keys, IBM DB2 returns uppercase column names
+ * @param mixed record row
+ * @return array record row
+ */
+ public function postQuery($rows)
+ {
+ $data = array();
+ foreach($rows as $k=>$v)
+ $data[$k] = $this->postQueryRow($v);
+ return $data;
+ }
+
+ public function getSearchRegExpCriteria($fields, $keywords)
+ {
+ if(strlen(trim($keywords)) == 0) return '';
+ $words = array();
+ preg_match_all('/([a-zA-Z0-9-+]+)/', $keywords, $words);
+ $result = array();
+ foreach($fields as $field)
+ {
+ $column = $this->getColumn($field);
+ if($this->isSearchableColumn($column))
+ $result[] = $this->getLikeCriteriaStr($column->getName(), $words[0]);
+ }
+ $a = '('.implode(' OR ', $result).')';
+ error_log($a);
+ return '('.implode(' OR ', $result).')';
+ }
+
+ protected function isSearchableColumn($column)
+ {
+ $type = strtolower($column->getType());
+ return $type === 'char' || $type === 'varchar';
+ }
+
+ protected function getLikeCriteriaStr($column, $words)
+ {
+ $result=array();
+ foreach($words as $word)
+ $result[] = "{$column} LIKE '%{$word}%'";
+ return '('.implode(' AND ', $result).')';
+ }
+
+
+}
+?> \ No newline at end of file
diff --git a/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php b/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php
new file mode 100644
index 00000000..1cd8af95
--- /dev/null
+++ b/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * TIbmMetaDataInspector class file.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id: TIbmMetaDataInspector.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ */
+Prado::using('System.Data.ActiveRecord.Vendor.TDbMetaDataInspector');
+Prado::using('System.Data.ActiveRecord.Vendor.TIbmColumnMetaData');
+Prado::using('System.Data.ActiveRecord.Vendor.TIbmMetaData');
+
+/**
+ * TIbmMetaDataInspector class.
+ *
+ * Column details for IBM DB2 database. Using php_pdo_ibm.dll extension.
+ *
+ * @author Cesar Ramos <cramos[at]gmail[dot]com>
+ * @version $Id: TIbmMetaDataInspector.php 1807 2007-03-31 06:42:15Z wei $
+ * @package System.Data.ActiveRecord.Vendor
+ * @since 3.1
+ */
+class TIbmMetaDataInspector extends TDbMetaDataInspector
+{
+ private $_schema;
+
+ /**
+ * @param string default schema.
+ */
+ public function setSchema($schema)
+ {
+ $this->_schema=$schema;
+ }
+
+ /**
+ * @return string default schema.
+ */
+ public function getSchema()
+ {
+ return $this->_schema;
+ }
+ /**
+ * Get the column definitions for given table.
+ * @param string table name.
+ * @return array column name value pairs of column meta data.
+ */
+ protected function getColumnDefinitions($table)
+ {
+ if(count($parts= explode('.', $table)) > 1)
+ {
+ $tablename = $parts[1];
+ $schema = $parts[0];
+ }
+ else
+ {
+ $tablename = $parts[0];
+ $schema = $this->getSchema();
+ }
+ $sql="SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME='".strtoupper($tablename)."'";
+ if ($schema)
+ $sql=$sql." AND TABSCHEMA='".strtoupper($schema)."'";
+
+ $conn = $this->getDbConnection();
+ $conn->setActive(true);
+ $command = $conn->createCommand($sql);
+ $command->prepare();
+ $result=$command->query($sql);
+ foreach ($result as $col)
+ $cols[strtolower($col['COLNAME'])] = $this->getColumnMetaData($col);
+ return $cols;
+ }
+
+ protected function getColumnMetaData($col)
+ {
+ $name = strtolower($col['COLNAME']);
+ $type = $col['TYPENAME'];
+ $length = $col['LENGTH'];
+ $notNull = $col['NULLS']==='N'?1:0;
+ $autoIncrement=$col['IDENTITY']==='Y'?1:0;
+ $default = $col['DEFAULT'];
+ $primaryKey = $col['KEYSEQ']?1:0;
+ return new TIbmColumnMetaData($name,$type,$length,$notNull,$autoIncrement,$default,$primaryKey);
+ }
+
+ /**
+ * Not implemented, IBM does not always have foreign key constraints.
+ */
+ protected function getConstraintKeys($table)
+ {
+ return array('primary'=>array(), 'foreign'=>array());
+ }
+
+ /**
+ * Create a new instance of meta data.
+ * @param string table name
+ * @param array column meta data
+ * @param array primary key meta data
+ * @param array foreign key meta data.
+ * @return TDbMetaData table meta data.
+ */
+ protected function createMetaData($table, $columns, $primary, $foreign)
+ {
+ $pks = array();
+ foreach($columns as $name=>$column)
+ if($column->getIsPrimaryKey())
+ $pks[] = $name;
+ return new TIbmMetaData($table,$columns,$pks);
+ }
+}
+?> \ No newline at end of file