Skip to content

Commit 4f5380e

Browse files
committed
performance improvement
1 parent 0f6ed92 commit 4f5380e

File tree

1 file changed

+6
-53
lines changed

1 file changed

+6
-53
lines changed

src/Tqdev/PhpCrudApi/Database/GenericReflection.php

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,6 @@ public function __construct(LazyPdo $pdo, string $driver, string $database, arra
2121
$this->typeConverter = new TypeConverter($driver);
2222
}
2323

24-
private function updateSqlLiteReflectionTables() /*: void */
25-
{
26-
$reflection = $this->query('SELECT "name" FROM "sqlite_master" WHERE "type" = \'table\' and name like \'sys/%\';', []);
27-
if (count($reflection) == 0) {
28-
//create reflection tables
29-
$this->query('CREATE table "sys/version" ("version" integer);', []);
30-
$this->query('CREATE table "sys/tables" ("name" text, "type" text);', []);
31-
$this->query('CREATE table "sys/columns" ("self" text,"cid" integer,"name" text,"type" integer,"notnull" integer,"dflt_value" integer,"pk" integer);', []);
32-
$this->query('CREATE table "sys/foreign_keys" ("self" text,"id" integer,"seq" integer,"table" text,"from" text,"to" text,"on_update" text,"on_delete" text,"match" text);', []);
33-
}
34-
$version = $this->query('pragma schema_version;', [])[0]["schema_version"];
35-
$current = $this->query('SELECT "version" from "sys/version";', []);
36-
if (!$current || count($current) == 0 || !isset($current[0]["schema_version"]) || $version != $current[0]["schema_version"]) {
37-
// reflection may take a while
38-
set_time_limit(3600);
39-
// update version data
40-
$this->query('DELETE FROM "sys/version";', []);
41-
$this->query('INSERT into "sys/version" ("version") VALUES (?);', [$version]);
42-
43-
// update tables data
44-
$this->query('DELETE FROM "sys/tables";', []);
45-
$result = $this->query('SELECT "name", "type" FROM sqlite_master WHERE ("type" = \'table\' or "type" = \'view\') and name not like "sys/%" and name<>"sqlite_sequence";', []);
46-
$tables = array();
47-
foreach ($result as $row) {
48-
$tables[] = $row['name'];
49-
$this->query('INSERT into "sys/tables" ("name", "type") VALUES (?, ?);', [$row['name'], $row['type']]);
50-
}
51-
// update columns and foreign_keys data
52-
$this->query('DELETE FROM "sys/columns";', []);
53-
$this->query('DELETE FROM "sys/foreign_keys";', []);
54-
foreach ($tables as $table) {
55-
$result = $this->query("pragma table_info(`$table`);", []);
56-
foreach ($result as $row) {
57-
array_unshift($row, $table);
58-
$this->query('INSERT into "sys/columns" ("self","cid","name","type","notnull","dflt_value","pk") VALUES (?,?,?,?,?,?,?);', array_values($row));
59-
}
60-
$result = $this->query("pragma foreign_key_list(`$table`);", []);
61-
foreach ($result as $row) {
62-
array_unshift($row, $table);
63-
$this->query('INSERT into "sys/foreign_keys" ("self","id","seq","table","from","to","on_update","on_delete","match") VALUES (?,?,?,?,?,?,?,?,?);', array_values($row));
64-
}
65-
}
66-
}
67-
}
68-
6924
public function getIgnoredTables(): array
7025
{
7126
switch ($this->driver) {
@@ -76,7 +31,7 @@ public function getIgnoredTables(): array
7631
case 'sqlsrv':
7732
return [];
7833
case 'sqlite':
79-
return ['sys/version', 'sys/tables', 'sys/columns', 'sys/foreign_keys'];
34+
return [];
8035
}
8136
}
8237

@@ -90,8 +45,7 @@ private function getTablesSQL(): string
9045
case 'sqlsrv':
9146
return 'SELECT o.name as "TABLE_NAME", o.xtype as "TABLE_TYPE" FROM sysobjects o WHERE o.xtype IN (\'U\', \'V\') ORDER BY "TABLE_NAME"';
9247
case 'sqlite':
93-
$this->updateSqlLiteReflectionTables();
94-
return 'SELECT t.name as "TABLE_NAME", t.type as "TABLE_TYPE" FROM "sys/tables" t WHERE t.type IN (\'table\', \'view\') AND \'\' <> ? ORDER BY "TABLE_NAME"';
48+
return 'SELECT t.name as "TABLE_NAME", t.type as "TABLE_TYPE" FROM sqlite_master t WHERE t.type IN (\'table\', \'view\') AND \'\' <> ? ORDER BY "TABLE_NAME"';
9549
}
9650
}
9751

@@ -105,8 +59,7 @@ private function getTableColumnsSQL(): string
10559
case 'sqlsrv':
10660
return 'SELECT c.name AS "COLUMN_NAME", c.is_nullable AS "IS_NULLABLE", t.Name AS "DATA_TYPE", (c.max_length/2) AS "CHARACTER_MAXIMUM_LENGTH", c.precision AS "NUMERIC_PRECISION", c.scale AS "NUMERIC_SCALE", \'\' AS "COLUMN_TYPE" FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE c.object_id = OBJECT_ID(?) AND \'\' <> ?';
10761
case 'sqlite':
108-
$this->updateSqlLiteReflectionTables();
109-
return 'SELECT "name" AS "COLUMN_NAME", case when "notnull"==1 then \'no\' else \'yes\' end as "IS_NULLABLE", lower("type") AS "DATA_TYPE", 2147483647 AS "CHARACTER_MAXIMUM_LENGTH", 0 AS "NUMERIC_PRECISION", 0 AS "NUMERIC_SCALE", \'\' AS "COLUMN_TYPE" FROM "sys/columns" WHERE "self" = ? AND \'\' <> ?';
62+
return 'SELECT "name" AS "COLUMN_NAME", case when "notnull"==1 then \'no\' else \'yes\' end as "IS_NULLABLE", lower("type") AS "DATA_TYPE", 2147483647 AS "CHARACTER_MAXIMUM_LENGTH", 0 AS "NUMERIC_PRECISION", 0 AS "NUMERIC_SCALE", \'\' AS "COLUMN_TYPE" FROM pragma_table_info(?) WHERE \'\' <> ?';
11063
}
11164
}
11265

@@ -120,7 +73,7 @@ private function getTablePrimaryKeysSQL(): string
12073
case 'sqlsrv':
12174
return 'SELECT c.NAME as "COLUMN_NAME" FROM sys.key_constraints kc inner join sys.objects t on t.object_id = kc.parent_object_id INNER JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id and kc.unique_index_id = ic.index_id INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE kc.type = \'PK\' and t.object_id = OBJECT_ID(?) and \'\' <> ?';
12275
case 'sqlite':
123-
return 'SELECT "name" as "COLUMN_NAME" FROM "sys/columns" WHERE "pk"=1 AND "self"=? AND \'\' <> ?';
76+
return 'SELECT "name" as "COLUMN_NAME" FROM pragma_table_info(?) WHERE "pk"=1 AND \'\' <> ?';
12477
}
12578
}
12679

@@ -134,7 +87,7 @@ private function getTableForeignKeysSQL(): string
13487
case 'sqlsrv':
13588
return 'SELECT COL_NAME(fc.parent_object_id, fc.parent_column_id) AS "COLUMN_NAME", OBJECT_NAME (f.referenced_object_id) AS "REFERENCED_TABLE_NAME" FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id WHERE f.parent_object_id = OBJECT_ID(?) and \'\' <> ?';
13689
case 'sqlite':
137-
return 'SELECT "from" AS "COLUMN_NAME", "table" AS "REFERENCED_TABLE_NAME" FROM "sys/foreign_keys" WHERE "self" = ? AND \'\' <> ?';
90+
return 'SELECT "from" AS "COLUMN_NAME", "table" AS "REFERENCED_TABLE_NAME" FROM pragma_foreign_key_list(?) WHERE \'\' <> ?';
13891
}
13992
}
14093

@@ -246,7 +199,7 @@ public function toJdbcType(string $type, string $size): string
246199
private function query(string $sql, array $parameters): array
247200
{
248201
$stmt = $this->pdo->prepare($sql);
249-
// echo "- $sql -- " . json_encode($parameters, JSON_UNESCAPED_UNICODE) . "\n";
202+
//echo "- $sql -- " . json_encode($parameters, JSON_UNESCAPED_UNICODE) . "\n";
250203
$stmt->execute($parameters);
251204
return $stmt->fetchAll();
252205
}

0 commit comments

Comments
 (0)