Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83738adcb6 | ||
|
|
5454133239 | ||
|
|
87f35f23c3 | ||
|
|
3c4c5d3106 | ||
|
|
b080727ff3 |
105
4dev/database/function/upgrade_serial_to_identity.sql
Normal file
105
4dev/database/function/upgrade_serial_to_identity.sql
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
-- Upgrae serial to identity type
|
||||||
|
--
|
||||||
|
-- @param reclass tbl The table where the column is located
|
||||||
|
-- @param name col The column to be changed
|
||||||
|
-- @param varchar identity_type [default=a] Allowed a, d, assigned, default
|
||||||
|
-- @param varchar col_type [default=''] Allowed smallint, int, bigint, int2, int4, int8
|
||||||
|
-- @raises EXCEPTON on column not found, no linked sequence, more than one linked sequence found
|
||||||
|
--
|
||||||
|
CREATE OR REPLACE FUNCTION upgrade_serial_to_identity(
|
||||||
|
tbl regclass,
|
||||||
|
col name,
|
||||||
|
identity_type varchar = 'a',
|
||||||
|
col_type varchar = ''
|
||||||
|
)
|
||||||
|
RETURNS void
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
colnum smallint;
|
||||||
|
seqid oid;
|
||||||
|
count int;
|
||||||
|
col_type_oid int;
|
||||||
|
col_type_len int;
|
||||||
|
current_col_atttypid oid;
|
||||||
|
current_col_attlen int;
|
||||||
|
BEGIN
|
||||||
|
-- switch between always (default) or default identiy type
|
||||||
|
IF identity_type NOT IN ('a', 'd', 'assigned', 'default') THEN
|
||||||
|
identity_type := 'a';
|
||||||
|
ELSE
|
||||||
|
IF identity_type = 'default' THEN
|
||||||
|
identity_type := 'd';
|
||||||
|
ELSIF identity_type = 'assigned' THEN
|
||||||
|
identity_type := 'a';
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
-- find column number, attribute oid and attribute len
|
||||||
|
SELECT attnum, atttypid, attlen
|
||||||
|
INTO colnum, current_col_atttypid, current_col_attlen
|
||||||
|
FROM pg_attribute
|
||||||
|
WHERE attrelid = tbl AND attname = col;
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
RAISE EXCEPTION 'column does not exist';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- find sequence
|
||||||
|
SELECT INTO seqid objid
|
||||||
|
FROM pg_depend
|
||||||
|
WHERE (refclassid, refobjid, refobjsubid) = ('pg_class'::regclass, tbl, colnum)
|
||||||
|
AND classid = 'pg_class'::regclass AND objsubid = 0
|
||||||
|
AND deptype = 'a';
|
||||||
|
|
||||||
|
GET DIAGNOSTICS count = ROW_COUNT;
|
||||||
|
IF count < 1 THEN
|
||||||
|
RAISE EXCEPTION 'no linked sequence found';
|
||||||
|
ELSIF count > 1 THEN
|
||||||
|
RAISE EXCEPTION 'more than one linked sequence found';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- drop the default
|
||||||
|
EXECUTE 'ALTER TABLE ' || tbl || ' ALTER COLUMN ' || quote_ident(col) || ' DROP DEFAULT';
|
||||||
|
|
||||||
|
-- change the dependency between column and sequence to internal
|
||||||
|
UPDATE pg_depend
|
||||||
|
SET deptype = 'i'
|
||||||
|
WHERE (classid, objid, objsubid) = ('pg_class'::regclass, seqid, 0)
|
||||||
|
AND deptype = 'a';
|
||||||
|
|
||||||
|
-- mark the column as identity column
|
||||||
|
UPDATE pg_attribute
|
||||||
|
-- set to 'd' for default
|
||||||
|
SET attidentity = identity_type
|
||||||
|
WHERE attrelid = tbl
|
||||||
|
AND attname = col;
|
||||||
|
RAISE NOTICE 'Update to identity for table "%" and columen "%" with type "%"', tbl, col, identity_type;
|
||||||
|
|
||||||
|
-- set type if requested and not empty
|
||||||
|
IF col_type <> '' THEN
|
||||||
|
IF col_type IN ('smallint', 'int', 'bigint', 'int2', 'int4', 'int8') THEN
|
||||||
|
-- rewrite smallint, int, bigint
|
||||||
|
IF col_type = 'smallint' THEN
|
||||||
|
col_type := 'int2';
|
||||||
|
ELSIF col_type = 'int' THEN
|
||||||
|
col_type := 'int4';
|
||||||
|
ELSIF col_type = 'bigint' THEN
|
||||||
|
col_type := 'int8';
|
||||||
|
END IF;
|
||||||
|
-- get the length and oid for selected
|
||||||
|
SELECT oid, typlen INTO col_type_oid, col_type_len FROM pg_type WHERE typname = col_type;
|
||||||
|
-- set only if diff or hight
|
||||||
|
IF current_col_atttypid <> col_type_oid AND col_type_len > current_col_attlen THEN
|
||||||
|
RAISE NOTICE 'Change col type: %', col_type;
|
||||||
|
-- update type
|
||||||
|
UPDATE pg_attribute
|
||||||
|
SET
|
||||||
|
atttypid = col_type_oid, attlen = col_type_len
|
||||||
|
WHERE attrelid = tbl
|
||||||
|
AND attname = col;
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
RAISE NOTICE 'Invalid col type: %', col_type;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access;
|
-- DROP TABLE edit_access;
|
||||||
CREATE TABLE edit_access (
|
CREATE TABLE edit_access (
|
||||||
edit_access_id SERIAL PRIMARY KEY,
|
edit_access_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
protected SMALLINT DEFAULT 0,
|
protected SMALLINT DEFAULT 0,
|
||||||
deleted SMALLINT DEFAULT 0,
|
deleted SMALLINT DEFAULT 0,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_data;
|
-- DROP TABLE edit_access_data;
|
||||||
CREATE TABLE edit_access_data (
|
CREATE TABLE edit_access_data (
|
||||||
edit_access_data_id SERIAL PRIMARY KEY,
|
edit_access_data_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_right;
|
-- DROP TABLE edit_access_right;
|
||||||
CREATE TABLE edit_access_right (
|
CREATE TABLE edit_access_right (
|
||||||
edit_access_right_id SERIAL PRIMARY KEY,
|
edit_access_right_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
level SMALLINT,
|
level SMALLINT,
|
||||||
type VARCHAR,
|
type VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_user;
|
-- DROP TABLE edit_access_user;
|
||||||
CREATE TABLE edit_access_user (
|
CREATE TABLE edit_access_user (
|
||||||
edit_access_user_id SERIAL PRIMARY KEY,
|
edit_access_user_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_user_id INT NOT NULL,
|
edit_user_id INT NOT NULL,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_group;
|
-- DROP TABLE edit_group;
|
||||||
CREATE TABLE edit_group (
|
CREATE TABLE edit_group (
|
||||||
edit_group_id SERIAL PRIMARY KEY,
|
edit_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_language;
|
-- DROP TABLE edit_language;
|
||||||
CREATE TABLE edit_language (
|
CREATE TABLE edit_language (
|
||||||
edit_language_id SERIAL PRIMARY KEY,
|
edit_language_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||||
long_name VARCHAR,
|
long_name VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_log;
|
-- DROP TABLE edit_log;
|
||||||
CREATE TABLE edit_log (
|
CREATE TABLE edit_log (
|
||||||
edit_log_id SERIAL PRIMARY KEY,
|
edit_log_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||||
username VARCHAR,
|
username VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_menu_group;
|
-- DROP TABLE edit_menu_group;
|
||||||
CREATE TABLE edit_menu_group (
|
CREATE TABLE edit_menu_group (
|
||||||
edit_menu_group_id SERIAL PRIMARY KEY,
|
edit_menu_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR,
|
flag VARCHAR,
|
||||||
order_number INT NOT NULL
|
order_number INT NOT NULL
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page;
|
-- DROP TABLE edit_page;
|
||||||
CREATE TABLE edit_page (
|
CREATE TABLE edit_page (
|
||||||
edit_page_id SERIAL PRIMARY KEY,
|
edit_page_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
filename VARCHAR,
|
filename VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_access;
|
-- DROP TABLE edit_page_access;
|
||||||
CREATE TABLE edit_page_access (
|
CREATE TABLE edit_page_access (
|
||||||
edit_page_access_id SERIAL PRIMARY KEY,
|
edit_page_access_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_content;
|
-- DROP TABLE edit_page_content;
|
||||||
CREATE TABLE edit_page_content (
|
CREATE TABLE edit_page_content (
|
||||||
edit_page_content_id SERIAL PRIMARY KEY,
|
edit_page_content_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_query_string;
|
-- DROP TABLE edit_query_string;
|
||||||
CREATE TABLE edit_query_string (
|
CREATE TABLE edit_query_string (
|
||||||
edit_query_string_id SERIAL PRIMARY KEY,
|
edit_query_string_id SERIAINT GENERATED ALWAYS AS IDENTITYL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_scheme;
|
-- DROP TABLE edit_scheme;
|
||||||
CREATE TABLE edit_scheme (
|
CREATE TABLE edit_scheme (
|
||||||
edit_scheme_id SERIAL PRIMARY KEY,
|
edit_scheme_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
header_color VARCHAR,
|
header_color VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_user;
|
-- DROP TABLE edit_user;
|
||||||
CREATE TABLE edit_user (
|
CREATE TABLE edit_user (
|
||||||
edit_user_id SERIAL PRIMARY KEY,
|
edit_user_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
connect_edit_user_id INT, -- possible reference to other user
|
connect_edit_user_id INT, -- possible reference to other user
|
||||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_language_id INT NOT NULL,
|
edit_language_id INT NOT NULL,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_visible_group;
|
-- DROP TABLE edit_visible_group;
|
||||||
CREATE TABLE edit_visible_group (
|
CREATE TABLE edit_visible_group (
|
||||||
edit_visible_group_id SERIAL PRIMARY KEY,
|
edit_visible_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR
|
flag VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -160,15 +160,12 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// create the tables
|
// create the tables
|
||||||
$db->dbExec(
|
$db->dbExec(
|
||||||
// primary key name is table + '_id'
|
// primary key name is table + '_id'
|
||||||
|
// table_with_primary_key_id SERIAL PRIMARY KEY,
|
||||||
<<<SQL
|
<<<SQL
|
||||||
CREATE TABLE table_with_primary_key (
|
CREATE TABLE table_with_primary_key (
|
||||||
table_with_primary_key_id SERIAL PRIMARY KEY,
|
table_with_primary_key_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
$base_table
|
$base_table
|
||||||
SQL
|
SQL
|
||||||
/* "CREATE TABLE table_with_primary_key ("
|
|
||||||
// primary key name is table + '_id'
|
|
||||||
. "table_with_primary_key_id SERIAL PRIMARY KEY, "
|
|
||||||
. $base_table */
|
|
||||||
);
|
);
|
||||||
$db->dbExec(
|
$db->dbExec(
|
||||||
<<<SQL
|
<<<SQL
|
||||||
|
|||||||
@@ -285,6 +285,22 @@ interface SqlFunctions
|
|||||||
*/
|
*/
|
||||||
public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool;
|
public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $parameter
|
||||||
|
* @param bool $strip
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __dbVersionInfo(string $parameter, bool $strip = true): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function __dbVersionInfoParameterList(): array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -292,6 +308,13 @@ interface SqlFunctions
|
|||||||
*/
|
*/
|
||||||
public function __dbVersion(): string;
|
public function __dbVersion(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function __dbVersionNumeric(): int;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -306,6 +329,14 @@ interface SqlFunctions
|
|||||||
?int &$end = null
|
?int &$end = null
|
||||||
): ?array;
|
): ?array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $parameter
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
public function __dbParameter(string $parameter): string|bool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -343,6 +374,14 @@ interface SqlFunctions
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __dbGetEncoding(): string;
|
public function __dbGetEncoding(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function __dbCountQueryParams(string $query): int;
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -407,17 +407,13 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
}
|
}
|
||||||
// no PK name given at all
|
// no PK name given at all
|
||||||
if (empty($pk_name)) {
|
if (empty($pk_name)) {
|
||||||
// if name is plurar, make it singular
|
|
||||||
// if (preg_match("/.*s$/i", $table))
|
|
||||||
// $table = substr($table, 0, -1);
|
|
||||||
// set pk_name to "id"
|
// set pk_name to "id"
|
||||||
$pk_name = $table . "_id";
|
$pk_name = $table . "_id";
|
||||||
}
|
}
|
||||||
$seq = ($schema ? $schema . '.' : '') . $table . "_" . $pk_name . "_seq";
|
$q = "SELECT CURRVAL(pg_get_serial_sequence($1, $2)) AS insert_id";
|
||||||
$q = "SELECT CURRVAL('$seq') AS insert_id";
|
|
||||||
// I have to do manually or I overwrite the original insert internal vars ...
|
// I have to do manually or I overwrite the original insert internal vars ...
|
||||||
if ($q = $this->__dbQuery($q)) {
|
if ($cursor = $this->__dbQueryParams($q, [$table, $pk_name])) {
|
||||||
if (is_array($res = $this->__dbFetchArray($q))) {
|
if (is_array($res = $this->__dbFetchArray($cursor))) {
|
||||||
list($id) = $res;
|
list($id) = $res;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -451,26 +447,36 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
$table_prefix = $schema . '.';
|
$table_prefix = $schema . '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$params = [$table_prefix . $table];
|
||||||
|
$replace = ['', ''];
|
||||||
// read from table the PK name
|
// read from table the PK name
|
||||||
// faster primary key get
|
// faster primary key get
|
||||||
$q = "SELECT pg_attribute.attname AS column_name, "
|
$q = <<<SQL
|
||||||
. "format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type "
|
SELECT
|
||||||
. "FROM pg_index, pg_class, pg_attribute ";
|
pg_attribute.attname AS column_name,
|
||||||
|
format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type
|
||||||
|
FROM pg_index, pg_class, pg_attribute{PG_NAMESPACE}
|
||||||
|
WHERE
|
||||||
|
-- regclass translates the OID to the name
|
||||||
|
pg_class.oid = $1::regclass AND
|
||||||
|
indrelid = pg_class.oid AND
|
||||||
|
pg_attribute.attrelid = pg_class.oid AND
|
||||||
|
pg_attribute.attnum = any(pg_index.indkey) AND
|
||||||
|
indisprimary
|
||||||
|
{NSPNAME}
|
||||||
|
SQL;
|
||||||
if ($schema) {
|
if ($schema) {
|
||||||
$q .= ", pg_namespace ";
|
$params[] = $schema;
|
||||||
|
$replace = [
|
||||||
|
", pg_namespace",
|
||||||
|
"AND pg_class.relnamespace = pg_namespace.oid AND nspname = $2"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
$q .= "WHERE "
|
$cursor = $this->__dbQueryParams(str_replace(
|
||||||
// regclass translates the OID to the name
|
['{PG_NAMESPACE}', '{NSPNAME}'],
|
||||||
. "pg_class.oid = '" . $table_prefix . $table . "'::regclass AND "
|
$replace,
|
||||||
. "indrelid = pg_class.oid AND ";
|
$q
|
||||||
if ($schema) {
|
), $params);
|
||||||
$q .= "nspname = '" . $schema . "' AND "
|
|
||||||
. "pg_class.relnamespace = pg_namespace.oid AND ";
|
|
||||||
}
|
|
||||||
$q .= "pg_attribute.attrelid = pg_class.oid AND "
|
|
||||||
. "pg_attribute.attnum = any(pg_index.indkey) "
|
|
||||||
. "AND indisprimary";
|
|
||||||
$cursor = $this->__dbQuery($q);
|
|
||||||
if ($cursor !== false) {
|
if ($cursor !== false) {
|
||||||
$__db_fetch_array = $this->__dbFetchArray($cursor);
|
$__db_fetch_array = $this->__dbFetchArray($cursor);
|
||||||
if (!is_array($__db_fetch_array)) {
|
if (!is_array($__db_fetch_array)) {
|
||||||
@@ -895,11 +901,13 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
public function __dbSetSchema(string $db_schema): int
|
public function __dbSetSchema(string $db_schema): int
|
||||||
{
|
{
|
||||||
// check if schema actually exists
|
// check if schema actually exists
|
||||||
$query = "SELECT EXISTS("
|
$query = <<<SQL
|
||||||
. "SELECT 1 FROM information_schema.schemata "
|
SELECT EXISTS (
|
||||||
. "WHERE schema_name = " . $this->__dbEscapeLiteral($db_schema)
|
SELECT 1 FROM information_schema.schemata
|
||||||
. ")";
|
WHERE schema_name = $1
|
||||||
$cursor = $this->__dbQuery($query);
|
)
|
||||||
|
SQL;
|
||||||
|
$cursor = $this->__dbQueryParams($query, [$db_schema]);
|
||||||
// abort if execution fails
|
// abort if execution fails
|
||||||
if ($cursor === false) {
|
if ($cursor === false) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user