00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 require_once 'creole/metadata/TableInfo.php';
00023
00032 class OCI8TableInfo extends TableInfo {
00033
00034 private $schema;
00035
00036 public function __construct(OCI8DatabaseInfo $database, $name)
00037 {
00038 $this->schema = strtoupper( $database->getSchema() );
00039 parent::__construct($database, $name);
00040 $this->name = strtoupper( $this->name );
00041 }
00042
00044 protected function initColumns()
00045 {
00046
00047 include_once 'creole/metadata/ColumnInfo.php';
00048 include_once 'creole/drivers/oracle/OCI8Types.php';
00049
00050
00051
00052
00053
00054
00055 $sql = "
00056 SELECT column_name
00057 , data_type
00058 , data_precision
00059 , data_length
00060 , data_default
00061 , nullable
00062 , data_scale
00063 FROM all_tab_columns
00064 WHERE table_name = '{$this->name}'
00065 AND OWNER = '{$this->schema}'";
00066
00067 $statement = @oci_parse($this->conn->getResource(),$sql);
00068 $success = @oci_execute($statement,OCI_DEFAULT);
00069 if (!$success) {
00070 throw new SQLException("Could Not Get Columns");
00071 }
00072
00073 while ( $statement && $row = oci_fetch_array( $statement
00074 , OCI_ASSOC + OCI_RETURN_NULLS ) ) {
00075 $row = array_change_key_case($row, CASE_LOWER);
00076 $this->columns[$row['column_name']] = new ColumnInfo( $this
00077 , $row['column_name']
00078 , OCI8Types::getType($row['data_type'])
00079 , $row['data_type']
00080 , $row['data_length']
00081 , $row['data_precision']
00082 , $row['data_scale']
00083 , $row['nullable']
00084 , $row['data_default']
00085 );
00086 }
00087
00088 $this->colsLoaded = true;
00089 }
00090
00092 protected function initPrimaryKey()
00093 {
00094 include_once 'creole/metadata/PrimaryKeyInfo.php';
00095
00096
00097 if (!$this->colsLoaded) $this->initColumns();
00098
00099
00100
00101 $sql = "SELECT a.owner, a.table_name,
00102 a.constraint_name, a.column_name
00103 FROM all_cons_columns a, all_constraints b
00104 WHERE b.constraint_type = 'P'
00105 AND a.constraint_name = b.constraint_name
00106 AND b.table_name = '{$this->name}'
00107 AND b.owner = '{$this->schema}'
00108 ";
00109
00110
00111 $statement = @oci_parse($this->conn->getResource(),$sql);
00112 $success = @oci_execute($statement,OCI_DEFAULT);
00113 if (!$success) {
00114 throw new SQLException("Could Not Get Primary Keys");
00115 }
00116
00117 while ( $statement && $row = oci_fetch_assoc( $statement )) {
00118 $row = array_change_key_case($row,CASE_LOWER);
00119
00120 $name = $row['column_name'];
00121
00122 if (!isset($this->primaryKey)) {
00123 $this->primaryKey = new PrimaryKeyInfo($name);
00124 }
00125
00126 $this->primaryKey->addColumn($this->columns[$name]);
00127 }
00128
00129 $this->pkLoaded = true;
00130 }
00131
00133 protected function initIndexes() {
00134
00135 include_once 'creole/metadata/IndexInfo.php';
00136
00137
00138 if (!$this->colsLoaded) $this->initColumns();
00139
00140
00141 $sql = "SELECT
00142 allind.index_name,
00143 allind.table_name,
00144 allind.index_type,
00145 allind.uniqueness,
00146 indcol.column_name
00147 FROM all_indexes allind INNER JOIN all_ind_columns indcol
00148 ON allind.owner = indcol.index_owner
00149 AND allind.index_name = indcol.index_name
00150 WHERE allind.table_owner = '{$this->schema}'
00151 AND allind.table_name = '{$this->name}'
00152 AND allind.index_name NOT IN (SELECT
00153 constraint_name
00154 FROM all_constraints
00155 WHERE constraint_type = 'P')
00156 ORDER BY allind.index_name,
00157 indcol.column_position";
00158
00159 $statement = @oci_parse($this->conn->getResource(),$sql);
00160 $success = @oci_execute($statement,OCI_DEFAULT);
00161 if (!$success) {
00162 throw new SQLException("Could Not Get Primary Keys");
00163 }
00164
00165
00166
00167
00168
00169 while ( $statement && $row = oci_fetch_assoc( $statement )) {
00170 $row = array_change_key_case($row,CASE_LOWER);
00171
00172 $name = $row['index_name'];
00173 $index_col_name = $row['column_name'];
00174
00175 if (!isset($this->indexes[$name])) {
00176 $this->indexes[$name] = new IndexInfo($name);
00177 }
00178
00179 $this->indexes[$name]->addColumn($this->columns[ $index_col_name ]);
00180 }
00181
00182
00183 $this->indexesLoaded = true;
00184 }
00185
00187 protected function initForeignKeys() {
00188
00189 include_once 'creole/metadata/ForeignKeyInfo.php';
00190
00191
00192 if (!$this->colsLoaded) $this->initColumns();
00193
00194
00195
00196
00197
00198 $sql = "
00199 SELECT a.owner AS local_owner
00200 , a.table_name AS local_table
00201 , c.column_name AS local_column
00202 , a.constraint_name AS foreign_key_name
00203 , b.owner AS foreign_owner
00204 , b.table_name AS foreign_table
00205 , d.column_name AS foreign_column
00206 , b.constraint_name AS foreign_constraint_name
00207 , a.delete_rule AS on_delete
00208 FROM user_constraints a
00209 , user_constraints b
00210 , user_cons_columns c
00211 , user_cons_columns d
00212 WHERE a.r_constraint_name = b.constraint_name
00213 AND c.constraint_name = a.constraint_name
00214 AND d.constraint_name = b.constraint_name
00215 AND a.r_owner = b.owner
00216 AND a.constraint_type='R'
00217 AND a.table_name = '{$this->name}'
00218 AND a.owner = '{$this->schema}'
00219 ";
00220
00221 $statement = @oci_parse($this->conn->getResource(),$sql);
00222 $success = @oci_execute($statement,OCI_DEFAULT);
00223 if (!$success) {
00224 throw new SQLException("Could Not Get Primary Keys");
00225 }
00226
00227
00228
00229
00230 while ( $statement && $row = oci_fetch_assoc( $statement )) {
00231 $row = array_change_key_case($row,CASE_LOWER);
00232
00233 $name = $row['foreign_key_name'];
00234
00235 $foreignTable = $this->database->getTable($row['foreign_table']);
00236 $foreignColumn = $foreignTable->getColumn($row['foreign_column']);
00237
00238 $localTable = $this->database->getTable($row['local_table']);
00239 $localColumn = $localTable->getColumn($row['local_column']);
00240
00241 if (!isset($this->foreignKeys[$name])) {
00242 $this->foreignKeys[$name] = new ForeignKeyInfo($name);
00243 }
00244
00245 switch ( $row[ 'on_delete' ] )
00246 {
00247 case 'CASCADE':
00248 $onDelete = ForeignKeyInfo::CASCADE;
00249 break;
00250
00251 case 'SET NULL':
00252 $onDelete = ForeignKeyInfo::SETNULL;
00253 break;
00254
00255 default:
00256 case 'NO ACTION':
00257 $onDelete = ForeignKeyInfo::NONE;
00258 break;
00259 }
00260
00261
00262
00263 $this->foreignKeys[ $name ]->addReference(
00264 $localColumn
00265 , $foreignColumn
00266 , $onDelete
00267 );
00268 }
00269
00270 $this->fksLoaded = true;
00271 }
00272
00273 }