public function getForeignKeys($table) { $result = $this->connection->query("\n\t\t\tSELECT\n\t\t\t\tco.conname::varchar AS name,\n\t\t\t\tal.attname::varchar AS column,\n\t\t\t\tnf.nspname || '.' || cf.relname::varchar AS ref_table,\n\t\t\t\taf.attname::varchar AS ref_column\n\t\t\tFROM\n\t\t\t\tpg_catalog.pg_constraint AS co\n\t\t\t\tJOIN pg_catalog.pg_class AS cl ON co.conrelid = cl.oid\n\t\t\t\tJOIN pg_catalog.pg_class AS cf ON co.confrelid = cf.oid\n\t\t\t\tJOIN pg_catalog.pg_namespace AS nf ON nf.oid = cf.relnamespace\n\t\t\t\tJOIN pg_catalog.pg_attribute AS al ON al.attrelid = cl.oid AND al.attnum = %raw\n\t\t\t\tJOIN pg_catalog.pg_attribute AS af ON af.attrelid = cf.oid AND af.attnum = %raw\n\t\t\tWHERE\n\t\t\t\tco.contype = 'f'\n\t\t\t\tAND cl.oid = %s::regclass\n\t\t\t\tAND nf.nspname = ANY (pg_catalog.current_schemas(FALSE))\n\t\t", 'co.conkey[1]', 'co.confkey[1]', $table); $keys = []; foreach ($result as $row) { $keys[$row->column] = $row->toArray(); } return $keys; }
public function remove(IEntity $parent, array $remove) { if (!$remove) { return; } $this->mapperOne->beginTransaction(); $list = $this->buildList($parent, $remove); $this->connection->query('DELETE FROM %table WHERE %column[] IN %any', $this->joinTable, array_keys(reset($list)), array_map('array_values', $list)); }
public function getForeignKeys($table) { $result = $this->connection->query(' SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = %s ', $table); $keys = []; foreach ($result as $row) { $keys[$row->COLUMN_NAME] = ['name' => $row->CONSTRAINT_NAME, 'column' => $row->COLUMN_NAME, 'ref_table' => $row->REFERENCED_TABLE_NAME, 'ref_column' => $row->REFERENCED_COLUMN_NAME]; } return $keys; }
public function remove(IEntity $entity) { $this->beginTransaction(); $primary = []; $id = (array) $entity->getPersistedId(); foreach ($this->getStorageReflection()->getStoragePrimaryKey() as $key) { $primary[$key] = array_shift($id); } $this->connection->query('DELETE FROM %table WHERE %and', $this->getTableName(), $primary); }
/** * Imports & executes queries from sql file. * Code taken from Adminer (http://www.adminer.org) & modified, * @author Jakub Vrána * @author Jan Tvrdík * @author Michael Moravec * @author Jan Škrášek * @license Apache License * * @param Connection $connection * @param string $file path to imported file * @return int number of executed queries */ public static function executeFile(Connection $connection, $file) { $query = @file_get_contents($file); if ($query === FALSE) { throw new IOException("Cannot open file '{$file}'."); } $delimiter = ';'; $offset = $queries = 0; $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\\n]*\\n|--\\n)"; $driver = $connection->getDriver(); if ($driver instanceof MysqliDriver) { $parse = '[\'"[]|/\\*|-- |$'; } elseif ($driver instanceof PgsqlDriver) { $parse = '[\'"]|/\\*|-- |$|\\$[^$]*\\$'; } else { // general $parse = '[\'"`#]|/\\*|-- |$'; } while ($query != '') { if (!$offset && preg_match("~^{$space}*DELIMITER\\s+(\\S+)~i", $query, $match)) { $delimiter = $match[1]; $query = substr($query, strlen($match[0])); } else { preg_match('(' . preg_quote($delimiter) . "\\s*|{$parse})", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match $found = $match[0][0]; $offset = $match[0][1] + strlen($found); if (!$found && rtrim($query) === '') { break; } if (!$found || rtrim($found) == $delimiter) { // end of a query $q = substr($query, 0, $match[0][1]); $queries++; $connection->query('%raw', $q); $query = substr($query, $offset); $offset = 0; } else { // find matching quote or comment end while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES $s = $match[0][0]; $offset = $match[0][1] + strlen($s); if ($s[0] !== '\\') { break; } } } } } return $queries; }
protected function processRemove(IEntity $entity, $primary) { $this->connection->query('DELETE FROM %table WHERE %and', $this->getTableName(), $primary); }
public function exec($sql) { $this->conn->query('%raw', $sql); return $this->conn->getAffectedRows(); }