/** * 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); }
/** * 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); }
/** * 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); }
/** * Executes the SQL query. * @param string SQL statement. * @return Result|int result set object (if any) * @throws Exception */ public final function nativeQuery($sql) { $this->connected || $this->connect(); \dibi::$sql = $sql; $event = $this->onEvent ? new Event($this, Event::QUERY, $sql) : NULL; try { $res = $this->driver->query($sql); } catch (Exception $e) { $event && $this->onEvent($event->done($e)); throw $e; } if ($res) { $res = $this->createResultSet($res); } else { $res = $this->driver->getAffectedRows(); } $event && $this->onEvent($event->done($res)); return $res; }
/** * 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); }