/**
  * Returns metadata for all foreign keys in a table.
  * @param  string
  * @return array
  */
 public function getForeignKeys($table)
 {
     $res = $this->driver->query("\n\t\t\tSELECT f.name AS foreign_key,\n\t\t\tOBJECT_NAME(f.parent_object_id) AS table_name,\n\t\t\tCOL_NAME(fc.parent_object_id,\n\t\t\tfc.parent_column_id) AS column_name,\n\t\t\tOBJECT_NAME (f.referenced_object_id) AS reference_table_name,\n\t\t\tCOL_NAME(fc.referenced_object_id,\n\t\t\tfc.referenced_column_id) AS reference_column_name,\n\t\t\tfc.*\n\t\t\tFROM sys.foreign_keys AS f\n\t\t\tINNER JOIN sys.foreign_key_columns AS fc\n\t\t\tON f.OBJECT_ID = fc.constraint_object_id\n\t\t\tWHERE OBJECT_NAME(f.parent_object_id) = {$this->driver->escapeText($table)}\n\t\t");
     $keys = [];
     while ($row = $res->fetch(TRUE)) {
         $key_name = $row['foreign_key'];
         if (!isset($keys[$key_name])) {
             $keys[$key_name]['name'] = $row['foreign_key'];
             // foreign key name
             $keys[$key_name]['local'] = [$row['column_name']];
             // local columns
             $keys[$key_name]['table'] = $row['reference_table_name'];
             // referenced table
             $keys[$key_name]['foreign'] = [$row['reference_column_name']];
             // referenced columns
             $keys[$key_name]['onDelete'] = FALSE;
             $keys[$key_name]['onUpdate'] = FALSE;
         } else {
             $keys[$key_name]['local'][] = $row['column_name'];
             // local columns
             $keys[$key_name]['foreign'][] = $row['reference_column_name'];
             // referenced columns
         }
     }
     return array_values($keys);
 }
Esempio n. 2
0
 /**
  * Returns metadata for all indexes in a table.
  * @param  string
  * @return array
  */
 public function getIndexes($table)
 {
     $keyUsagesRes = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = {$this->driver->escapeText($table)}");
     $keyUsages = [];
     while ($row = $keyUsagesRes->fetch(TRUE)) {
         $keyUsages[$row['CONSTRAINT_NAME']][(int) $row['ORDINAL_POSITION'] - 1] = $row['COLUMN_NAME'];
     }
     $res = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = {$this->driver->escapeText($table)}");
     $indexes = [];
     while ($row = $res->fetch(TRUE)) {
         $indexes[$row['CONSTRAINT_NAME']]['name'] = $row['CONSTRAINT_NAME'];
         $indexes[$row['CONSTRAINT_NAME']]['unique'] = $row['CONSTRAINT_TYPE'] === 'UNIQUE';
         $indexes[$row['CONSTRAINT_NAME']]['primary'] = $row['CONSTRAINT_TYPE'] === 'PRIMARY KEY';
         $indexes[$row['CONSTRAINT_NAME']]['columns'] = isset($keyUsages[$row['CONSTRAINT_NAME']]) ? $keyUsages[$row['CONSTRAINT_NAME']] : [];
     }
     return array_values($indexes);
 }
 /**
  * Returns metadata for all indexes in a table.
  * @param  string
  * @return array
  */
 public function getIndexes($table)
 {
     $keyUsagesRes = $this->driver->query(sprintf("EXEC [sys].[sp_helpindex] @objname = N%s", $this->driver->escapeText($table)));
     $keyUsages = [];
     while ($row = $keyUsagesRes->fetch(TRUE)) {
         $keyUsages[$row['index_name']] = explode(',', $row['index_keys']);
     }
     $res = $this->driver->query("SELECT [i].* FROM [sys].[indexes] [i] INNER JOIN [sys].[tables] [t] ON [i].[object_id] = [t].[object_id] WHERE [t].[name] = {$this->driver->escapeText($table)}");
     $indexes = [];
     while ($row = $res->fetch(TRUE)) {
         $indexes[$row['name']]['name'] = $row['name'];
         $indexes[$row['name']]['unique'] = $row['is_unique'] === 1;
         $indexes[$row['name']]['primary'] = $row['is_primary_key'] === 1;
         $indexes[$row['name']]['columns'] = isset($keyUsages[$row['name']]) ? $keyUsages[$row['name']] : [];
     }
     return array_values($indexes);
 }
Esempio n. 4
0
 /**
  * Returns metadata for all foreign keys in a table.
  * @param  string
  * @return array
  * @throws Dibi\NotSupportedException
  */
 public function getForeignKeys($table)
 {
     $data = $this->driver->query("SELECT `ENGINE` FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = {$this->driver->escapeText($table)}")->fetch(TRUE);
     if ($data['ENGINE'] !== 'InnoDB') {
         throw new Dibi\NotSupportedException("Foreign keys are not supported in {$data['ENGINE']} tables.");
     }
     $res = $this->driver->query("\n\t\t\tSELECT rc.CONSTRAINT_NAME, rc.UPDATE_RULE, rc.DELETE_RULE, kcu.REFERENCED_TABLE_NAME,\n\t\t\t\tGROUP_CONCAT(kcu.REFERENCED_COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) AS REFERENCED_COLUMNS,\n\t\t\t\tGROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) AS COLUMNS\n\t\t\tFROM information_schema.REFERENTIAL_CONSTRAINTS rc\n\t\t\tINNER JOIN information_schema.KEY_COLUMN_USAGE kcu ON\n\t\t\t\tkcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME\n\t\t\t\tAND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA\n\t\t\tWHERE rc.CONSTRAINT_SCHEMA = DATABASE()\n\t\t\t\tAND rc.TABLE_NAME = {$this->driver->escapeText($table)}\n\t\t\tGROUP BY rc.CONSTRAINT_NAME\n\t\t");
     $foreignKeys = [];
     while ($row = $res->fetch(TRUE)) {
         $keyName = $row['CONSTRAINT_NAME'];
         $foreignKeys[$keyName]['name'] = $keyName;
         $foreignKeys[$keyName]['local'] = explode(',', $row['COLUMNS']);
         $foreignKeys[$keyName]['table'] = $row['REFERENCED_TABLE_NAME'];
         $foreignKeys[$keyName]['foreign'] = explode(',', $row['REFERENCED_COLUMNS']);
         $foreignKeys[$keyName]['onDelete'] = $row['DELETE_RULE'];
         $foreignKeys[$keyName]['onUpdate'] = $row['UPDATE_RULE'];
     }
     return array_values($foreignKeys);
 }
Esempio n. 5
0
 /**
  * Returns metadata for all foreign keys in a table.
  * @param  string
  * @return array
  */
 public function getForeignKeys($table)
 {
     $res = $this->driver->query("PRAGMA foreign_key_list({$this->driver->escapeIdentifier($table)})");
     $keys = [];
     while ($row = $res->fetch(TRUE)) {
         $keys[$row['id']]['name'] = $row['id'];
         // foreign key name
         $keys[$row['id']]['local'][$row['seq']] = $row['from'];
         // local columns
         $keys[$row['id']]['table'] = $row['table'];
         // referenced table
         $keys[$row['id']]['foreign'][$row['seq']] = $row['to'];
         // referenced columns
         $keys[$row['id']]['onDelete'] = $row['on_delete'];
         $keys[$row['id']]['onUpdate'] = $row['on_update'];
         if ($keys[$row['id']]['foreign'][0] == NULL) {
             $keys[$row['id']]['foreign'] = NULL;
         }
     }
     return array_values($keys);
 }
Esempio n. 6
0
 /**
  * Gets a information about the current database.
  * @return Reflection\Database
  */
 public function getDatabaseInfo()
 {
     $this->connected || $this->connect();
     return new Reflection\Database($this->driver->getReflector(), isset($this->config['database']) ? $this->config['database'] : NULL);
 }