@otwdesign/db-core 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,10 @@ import type { ConnectionConfig, DriverKind } from './types.ts';
2
2
  type Env = Readonly<Record<string, string | undefined>>;
3
3
  /**
4
4
  * Connections from the environment: `DB_ADMIN_<NAME>_URL`, with `DB_ADMIN_<NAME>_ACCESS`
5
- * (`read`, the default, or `write`), `DB_ADMIN_<NAME>_LABEL` and `DB_ADMIN_<NAME>_TAG` (`local`,
6
- * `development`, `testing`, `staging` or `production`). `DB_ADMIN_SHOP_DATA_URL` becomes the
7
- * connection `shop-data`. Sorted by name; an empty URL is skipped.
5
+ * (`read`, the default, or `write`), `DB_ADMIN_<NAME>_LABEL`, `DB_ADMIN_<NAME>_TAG` (`local`,
6
+ * `development`, `testing`, `staging` or `production`) and `DB_ADMIN_<NAME>_DATABASES` (`all`, the
7
+ * default, or `one`: the URL's database only). `DB_ADMIN_SHOP_DATA_URL` becomes the connection
8
+ * `shop-data`. Sorted by name; an empty URL is skipped.
8
9
  */
9
10
  export declare function connectionsFromEnv(env?: Env): ConnectionConfig[];
10
11
  /** Which driver opens `url`, by its scheme. `source` names where it came from, for the error. */
@@ -10,9 +10,10 @@ const SCHEMES = {
10
10
  };
11
11
  /**
12
12
  * Connections from the environment: `DB_ADMIN_<NAME>_URL`, with `DB_ADMIN_<NAME>_ACCESS`
13
- * (`read`, the default, or `write`), `DB_ADMIN_<NAME>_LABEL` and `DB_ADMIN_<NAME>_TAG` (`local`,
14
- * `development`, `testing`, `staging` or `production`). `DB_ADMIN_SHOP_DATA_URL` becomes the
15
- * connection `shop-data`. Sorted by name; an empty URL is skipped.
13
+ * (`read`, the default, or `write`), `DB_ADMIN_<NAME>_LABEL`, `DB_ADMIN_<NAME>_TAG` (`local`,
14
+ * `development`, `testing`, `staging` or `production`) and `DB_ADMIN_<NAME>_DATABASES` (`all`, the
15
+ * default, or `one`: the URL's database only). `DB_ADMIN_SHOP_DATA_URL` becomes the connection
16
+ * `shop-data`. Sorted by name; an empty URL is skipped.
16
17
  */
17
18
  export function connectionsFromEnv(env = process.env) {
18
19
  const connections = [];
@@ -25,12 +26,14 @@ export function connectionsFromEnv(env = process.env) {
25
26
  driverKind(url, variable);
26
27
  const label = env[`${prefix}_LABEL`]?.trim();
27
28
  const tag = tagOf(env, `${prefix}_TAG`);
29
+ const databases = databasesOf(env, `${prefix}_DATABASES`);
28
30
  connections.push({
29
31
  name: match[1].toLowerCase().replaceAll('_', '-'),
30
32
  url,
31
33
  access: access(env, `${prefix}_ACCESS`),
32
34
  ...(label ? { label } : {}),
33
35
  ...(tag ? { tag } : {}),
36
+ ...(databases ? { databases } : {}),
34
37
  });
35
38
  }
36
39
  return connections.sort((a, b) => a.name.localeCompare(b.name));
@@ -41,6 +44,14 @@ function access(env, variable) {
41
44
  return value;
42
45
  throw new Error(`${variable} must be "read" or "write", not "${env[variable]}".`);
43
46
  }
47
+ function databasesOf(env, variable) {
48
+ const value = env[variable]?.trim();
49
+ if (!value)
50
+ return undefined;
51
+ if (value === 'all' || value === 'one')
52
+ return value;
53
+ throw new Error(`${variable} must be "all" or "one", not "${env[variable]}".`);
54
+ }
44
55
  function tagOf(env, variable) {
45
56
  const value = env[variable]?.trim();
46
57
  if (!value)
@@ -1 +1 @@
1
- {"version":3,"file":"connections.js","sourceRoot":"","sources":["../src/connections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../src/connections.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,11 @@ export declare const TABLES_SQL = "SELECT n.nspname AS schema, c.relname AS name
10
10
  /** One table: columns, primary key, indexes and constraints, as JSON. $1 schema, $2 name. */
11
11
  export declare const TABLE_SQL = "SELECT n.nspname AS schema, c.relname AS name, c.relkind AS kind, c.reltuples AS estimate,\n CASE WHEN c.relkind IN ('r','m') THEN pg_total_relation_size(c.oid) END AS bytes,\n obj_description(c.oid, 'pg_class') AS comment,\n (SELECT coalesce(json_agg(json_build_object(\n 'name', a.attname, 'type', format_type(a.atttypid, a.atttypmod),\n 'nullable', NOT a.attnotnull, 'default', pg_get_expr(d.adbin, d.adrelid),\n 'identity', a.attidentity, 'generated', a.attgenerated,\n 'comment', col_description(a.attrelid, a.attnum)) ORDER BY a.attnum), '[]')\n FROM pg_attribute a\n LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum\n WHERE a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped) AS columns,\n (SELECT coalesce(json_agg(a.attname ORDER BY k.ord), '[]')\n FROM pg_index i\n CROSS JOIN LATERAL unnest(i.indkey::int2[]) WITH ORDINALITY AS k(attnum, ord)\n JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = k.attnum\n WHERE i.indrelid = c.oid AND i.indisprimary) AS primary_key,\n (SELECT coalesce(json_agg(json_build_object(\n 'name', ic.relname, 'definition', pg_get_indexdef(i.indexrelid))\n ORDER BY ic.relname), '[]')\n FROM pg_index i JOIN pg_class ic ON ic.oid = i.indexrelid\n WHERE i.indrelid = c.oid) AS indexes,\n (SELECT coalesce(json_agg(json_build_object(\n 'name', conname, 'definition', pg_get_constraintdef(oid), 'type', contype)\n ORDER BY conname), '[]')\n FROM pg_constraint WHERE conrelid = c.oid AND contype IN ('f', 'c')) AS constraints\n FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ('r','v','m','f','p')";
12
12
  export declare const INFO_SQL = "SELECT current_setting('server_version') AS version, current_database() AS database,\n current_user AS user";
13
+ /**
14
+ * The databases the login may connect to, the current one always among them: no templates, none
15
+ * that refuse connections, none a failed DROP DATABASE left invalid (a connection limit of -2).
16
+ */
17
+ export declare const DATABASES_SQL = "SELECT datname AS name, datname = current_database() AS current\n FROM pg_database\n WHERE datname = current_database()\n OR (datallowconn AND NOT datistemplate AND datconnlimit <> -2\n AND has_database_privilege(oid, 'CONNECT'))\n ORDER BY lower(datname), datname";
13
18
  /** Names for type OIDs: $1 an array of them. */
14
19
  export declare const TYPE_NAMES_SQL = "SELECT oid::text AS oid, format_type(oid, NULL) AS name FROM pg_type WHERE oid = ANY($1::oid[])";
15
20
  export interface CatalogTable {
@@ -70,6 +70,16 @@ export const TABLE_SQL = `SELECT n.nspname AS schema, c.relname AS name, c.relki
70
70
  WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ${RELKINDS}`;
71
71
  export const INFO_SQL = `SELECT current_setting('server_version') AS version, current_database() AS database,
72
72
  current_user AS user`;
73
+ /**
74
+ * The databases the login may connect to, the current one always among them: no templates, none
75
+ * that refuse connections, none a failed DROP DATABASE left invalid (a connection limit of -2).
76
+ */
77
+ export const DATABASES_SQL = `SELECT datname AS name, datname = current_database() AS current
78
+ FROM pg_database
79
+ WHERE datname = current_database()
80
+ OR (datallowconn AND NOT datistemplate AND datconnlimit <> -2
81
+ AND has_database_privilege(oid, 'CONNECT'))
82
+ ORDER BY lower(datname), datname`;
73
83
  /** Names for type OIDs: $1 an array of them. */
74
84
  export const TYPE_NAMES_SQL = 'SELECT oid::text AS oid, format_type(oid, NULL) AS name FROM pg_type WHERE oid = ANY($1::oid[])';
75
85
  export function summary(row) {
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-catalog.js","sourceRoot":"","sources":["../../src/drivers/postgres-catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,UAAU,CAAA;AAEpD;;;GAGG;AAEH,MAAM,KAAK,GAA8B;IACvC,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,mBAAmB;IACtB,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,mBAAmB;CACvB,CAAA;AACD,MAAM,QAAQ,GAAG,uBAAuB,CAAA;AAExC,gFAAgF;AAChF,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAA;AAEhC,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,0FAA0F;IAC1F,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,UAAU,EAAE,KAAK;IACjB,OAAO;IACP,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;IAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,UAAU,QAAQ;IAC3C,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,EAAE;IACd,0DAA0D;IAC1D,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,UAAU,UAAU,SAAS,CAAC,MAAM,CAAC,GAAG;IACtF,cAAc,EAAE,gBAAgB;CACjC,CAAA;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG;;;6BAGG,QAAQ;;;sBAGf,CAAA;AAEtB,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;mEA0B0C,QAAQ,EAAE,CAAA;AAE7E,MAAM,CAAC,MAAM,QAAQ,GAAG;mCACW,CAAA;AAEnC,gDAAgD;AAChD,MAAM,CAAC,MAAM,cAAc,GACzB,iGAAiG,CAAA;AA4BnG,MAAM,UAAU,OAAO,CAAC,GAAiB;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO;QAChC,oDAAoD;QACpD,aAAa,EAAE,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7E,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;KACrD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAgB;IACrC,MAAM,SAAS,GACb,CAAC,CAAC,QAAQ,KAAK,GAAG;QAChB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG;YAClB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG;gBACnB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG;oBACnB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,CAAA;IAChB,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS;QACT,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAA;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,MAAM,CAAC,GAAiC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAyC,CAAA;IACvF,MAAM,IAAI,GAAG,CAAC,IAAe,EAAE,EAAE,CAC/B,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAClG,OAAO;QACL,GAAG,OAAO,CAAC,GAAG,CAAC;QACf,OAAO,EAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAqB,CAAC,GAAG,CAAC,MAAM,CAAC;QACjE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAa;QACnD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB;QAChD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC;QACtB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAA;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"postgres-catalog.js","sourceRoot":"","sources":["../../src/drivers/postgres-catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,UAAU,CAAA;AAEpD;;;GAGG;AAEH,MAAM,KAAK,GAA8B;IACvC,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,mBAAmB;IACtB,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,mBAAmB;CACvB,CAAA;AACD,MAAM,QAAQ,GAAG,uBAAuB,CAAA;AAExC,gFAAgF;AAChF,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAA;AAEhC,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,0FAA0F;IAC1F,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,UAAU,EAAE,KAAK;IACjB,OAAO;IACP,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;IAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,UAAU,QAAQ;IAC3C,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,EAAE;IACd,0DAA0D;IAC1D,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,UAAU,UAAU,SAAS,CAAC,MAAM,CAAC,GAAG;IACtF,cAAc,EAAE,gBAAgB;CACjC,CAAA;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG;;;6BAGG,QAAQ;;;sBAGf,CAAA;AAEtB,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;mEA0B0C,QAAQ,EAAE,CAAA;AAE7E,MAAM,CAAC,MAAM,QAAQ,GAAG;mCACW,CAAA;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;mCAKM,CAAA;AAEnC,gDAAgD;AAChD,MAAM,CAAC,MAAM,cAAc,GACzB,iGAAiG,CAAA;AA4BnG,MAAM,UAAU,OAAO,CAAC,GAAiB;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO;QAChC,oDAAoD;QACpD,aAAa,EAAE,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7E,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;KACrD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAgB;IACrC,MAAM,SAAS,GACb,CAAC,CAAC,QAAQ,KAAK,GAAG;QAChB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG;YAClB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG;gBACnB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG;oBACnB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,CAAA;IAChB,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS;QACT,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAA;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,MAAM,CAAC,GAAiC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAyC,CAAA;IACvF,MAAM,IAAI,GAAG,CAAC,IAAe,EAAE,EAAE,CAC/B,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAClG,OAAO;QACL,GAAG,OAAO,CAAC,GAAG,CAAC;QACf,OAAO,EAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAqB,CAAC,GAAG,CAAC,MAAM,CAAC;QACjE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAa;QACnD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB;QAChD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC;QACtB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAA;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;AAC/B,CAAC"}
@@ -14,6 +14,12 @@ export interface PostgresOptions {
14
14
  */
15
15
  modules?: PostgresModules;
16
16
  }
17
+ /**
18
+ * `url` at another of its server's databases: its path swapped for `database`, its login, host and
19
+ * settings kept. pg reads the path back with decodeURI, which leaves `?` and `#` escaped, so a
20
+ * name with either can't be carried.
21
+ */
22
+ export declare function postgresUrlAt(url: string, database: string): string;
17
23
  /**
18
24
  * A PostgreSQL driver for `url`. It connects on first use, with a pool of up to three
19
25
  * connections, each closed after 10 s unused; an admin tool needs few.
@@ -1,6 +1,6 @@
1
1
  import { connect } from 'node:net';
2
2
  import { ConnectionError, DbAdminError, QueryError } from "../errors.js";
3
- import { detail, dialect, INFO_SQL, literal, quote, summary, TABLE_SQL, TABLES_SQL, TYPE_NAMES_SQL, versionOf, } from "./postgres-catalog.js";
3
+ import { DATABASES_SQL, detail, dialect, INFO_SQL, literal, quote, summary, TABLE_SQL, TABLES_SQL, TYPE_NAMES_SQL, versionOf, } from "./postgres-catalog.js";
4
4
  import { changeStatement, orderBy, Parameters, where, whole } from "./sql.js";
5
5
  /** Every value as the server's text: nothing converted, so nothing lost. */
6
6
  const AS_TEXT = { getTypeParser: () => (value) => value };
@@ -48,6 +48,29 @@ async function load(modules, failure) {
48
48
  }
49
49
  return { Pool: PoolClass, Cursor: Cursor };
50
50
  }
51
+ /** A placeholder host for a URL with none, as pg's own parser uses: `user@/db?host=/socket`. */
52
+ const NO_HOST = '___otw_db_no_host___';
53
+ /**
54
+ * `url` at another of its server's databases: its path swapped for `database`, its login, host and
55
+ * settings kept. pg reads the path back with decodeURI, which leaves `?` and `#` escaped, so a
56
+ * name with either can't be carried.
57
+ */
58
+ export function postgresUrlAt(url, database) {
59
+ if (/[?#]/.test(database)) {
60
+ throw new DbAdminError(`The database "${database}" can't be opened: a connection URL can't name a database with ? or #.`, 400, 'bad-database');
61
+ }
62
+ const hostless = url.includes('@/');
63
+ let parsed;
64
+ try {
65
+ parsed = new URL(hostless ? url.replace('@/', `@${NO_HOST}/`) : url);
66
+ }
67
+ catch {
68
+ // Not the URL itself, which may hold a password.
69
+ throw new DbAdminError("The connection's URL can't be moved to another database.", 500, 'bad-url');
70
+ }
71
+ parsed.pathname = `/${encodeURI(database)}`;
72
+ return hostless ? parsed.href.replace(`@${NO_HOST}/`, '@/') : parsed.href;
73
+ }
51
74
  /**
52
75
  * A PostgreSQL driver for `url`. It connects on first use, with a pool of up to three
53
76
  * connections, each closed after 10 s unused; an admin tool needs few.
@@ -59,12 +82,14 @@ class PostgresDriver {
59
82
  kind = 'postgres';
60
83
  capabilities = { schemas: true, transactionalDdl: true, cancel: true };
61
84
  sql = { identifier: quote, literal };
85
+ #url;
62
86
  #config;
63
87
  #modules;
64
88
  #pool;
65
89
  /** Type names by OID, filled as results bring new ones. */
66
90
  #typeNames = new Map();
67
91
  constructor(url, modules) {
92
+ this.#url = url;
68
93
  this.#modules = modules;
69
94
  this.#config = {
70
95
  connectionString: url,
@@ -145,6 +170,16 @@ class PostgresDriver {
145
170
  query(sql, options) {
146
171
  return this.#run(sql, undefined, options);
147
172
  }
173
+ async databases() {
174
+ const rows = await this.#catalog(DATABASES_SQL);
175
+ return {
176
+ current: rows.find((row) => row.current === 't')?.name ?? '',
177
+ databases: rows.map((row) => row.name),
178
+ };
179
+ }
180
+ withDatabase(name) {
181
+ return new PostgresDriver(postgresUrlAt(this.#url, name), this.#modules);
182
+ }
148
183
  async apply({ schema, table }, changes, { timeoutMs, dryRun = false }) {
149
184
  const statements = changes.map((change) => changeStatement(dialect, `${quote(schema)}.${quote(table)}`, change));
150
185
  const shown = statements.map((s) => s.shown);
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/drivers/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/drivers/postgres.ts"],"names":[],"mappings":"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"}
package/dist/handler.js CHANGED
@@ -13,6 +13,10 @@ const QUERY_ID = /^[A-Za-z0-9_-]{1,64}$/;
13
13
  const MAX_FILTERS = 20;
14
14
  const MAX_CHANGES = 1_000;
15
15
  const MAX_LIST = 1_000;
16
+ /** A connection's other databases kept open at once; the one used longest ago closes first. */
17
+ const MAX_DATABASES = 8;
18
+ /** PostgreSQL's NAMEDATALEN, less its terminator: the longest database name, in bytes. */
19
+ const MAX_DATABASE_NAME = 63;
16
20
  const OPERATORS = new Set([
17
21
  '=',
18
22
  '<>',
@@ -55,6 +59,8 @@ export function createDbAdmin(options) {
55
59
  const limits = { ...DEFAULT_LIMITS, ...options.limits };
56
60
  const audit = options.audit === false ? undefined : (options.audit ?? logAudit);
57
61
  const drivers = new Map();
62
+ /** Each connection's other databases' drivers, the one used last at the end. */
63
+ const others = new Map();
58
64
  const running = new Map();
59
65
  const open = options.driver ?? openDriver;
60
66
  const loadUi = options.ui === false ? undefined : (options.ui ?? defaultUi);
@@ -67,14 +73,54 @@ export function createDbAdmin(options) {
67
73
  }
68
74
  return found;
69
75
  }
70
- /** The connection by name, with this viewer's access to it; unknown and hidden look the same. */
71
- function reach(viewer, name) {
76
+ /**
77
+ * The driver for one of the connection's other databases. The 8 used last stay open; opening a
78
+ * ninth closes the one used longest ago, so a viewer can't keep pools open without end.
79
+ */
80
+ function driverAt(connection, database) {
81
+ let open = others.get(connection.name);
82
+ if (!open)
83
+ others.set(connection.name, (open = new Map()));
84
+ let found = open.get(database);
85
+ if (found)
86
+ open.delete(database);
87
+ else
88
+ found = driver(connection).withDatabase(database);
89
+ open.set(database, found);
90
+ if (open.size > MAX_DATABASES) {
91
+ const [oldest, evicted] = open.entries().next().value;
92
+ open.delete(oldest);
93
+ evicted.close().catch((error) => {
94
+ console.error(`otw-db: could not close database "${oldest}" of "${connection.name}"`, error);
95
+ });
96
+ }
97
+ return found;
98
+ }
99
+ /**
100
+ * The connection by name, with this viewer's access to it and the driver for `database`: one of
101
+ * the server's other databases, or the connection's own when none is named. Unknown and hidden
102
+ * connections look the same.
103
+ */
104
+ function reach(viewer, name, database) {
72
105
  const connection = typeof name === 'string' ? connections.get(name) : undefined;
73
106
  const access = connection ? accessOf(viewer, connection) : null;
74
107
  if (!connection || !access) {
75
108
  throw new DbAdminError(`There's no connection "${String(name)}".`, 404, 'unknown-connection');
76
109
  }
77
- return { connection, access };
110
+ if (database === undefined || database === null || database === '') {
111
+ return { connection, access, db: driver(connection) };
112
+ }
113
+ const named = databaseName(database);
114
+ if (!opensOthers(connection))
115
+ throw oneDatabase(connection);
116
+ return { connection, access, db: driverAt(connection, named), database: named };
117
+ }
118
+ /** Whether the connection may open its server's other databases, and its driver can. */
119
+ function opensOthers(connection) {
120
+ if (connection.databases === 'one')
121
+ return false;
122
+ const opened = driver(connection);
123
+ return typeof opened.databases === 'function' && typeof opened.withDatabase === 'function';
78
124
  }
79
125
  async function record(event) {
80
126
  if (!audit)
@@ -99,7 +145,10 @@ export function createDbAdmin(options) {
99
145
  // A kind without a driver yet is listed, but can't be opened.
100
146
  let capabilities = null;
101
147
  try {
102
- capabilities = driver(connection).capabilities;
148
+ capabilities = {
149
+ ...driver(connection).capabilities,
150
+ databases: opensOthers(connection),
151
+ };
103
152
  }
104
153
  catch (error) {
105
154
  if (!(error instanceof DbAdminError))
@@ -113,12 +162,23 @@ export function createDbAdmin(options) {
113
162
  return { connections: visible };
114
163
  },
115
164
  },
165
+ {
166
+ method: 'GET',
167
+ path: '/api/databases',
168
+ async run(request, viewer) {
169
+ const { connection, db } = reach(viewer, new URL(request.url).searchParams.get('connection'));
170
+ if (!opensOthers(connection))
171
+ throw oneDatabase(connection);
172
+ return await db.databases();
173
+ },
174
+ },
116
175
  {
117
176
  method: 'GET',
118
177
  path: '/api/tables',
119
178
  async run(request, viewer) {
120
- const { connection } = reach(viewer, new URL(request.url).searchParams.get('connection'));
121
- return { tables: await driver(connection).tables() };
179
+ const params = new URL(request.url).searchParams;
180
+ const { db } = reach(viewer, params.get('connection'), params.get('database'));
181
+ return { tables: await db.tables() };
122
182
  },
123
183
  },
124
184
  {
@@ -126,8 +186,8 @@ export function createDbAdmin(options) {
126
186
  path: '/api/table',
127
187
  async run(request, viewer) {
128
188
  const params = new URL(request.url).searchParams;
129
- const { connection } = reach(viewer, params.get('connection'));
130
- const table = await driver(connection).table(text(params.get('schema'), 'schema'), text(params.get('name'), 'name'));
189
+ const { db } = reach(viewer, params.get('connection'), params.get('database'));
190
+ const table = await db.table(text(params.get('schema'), 'schema'), text(params.get('name'), 'name'));
131
191
  if (!table)
132
192
  throw new DbAdminError("There's no such table.", 404, 'unknown-table');
133
193
  return { table };
@@ -137,8 +197,9 @@ export function createDbAdmin(options) {
137
197
  method: 'GET',
138
198
  path: '/api/info',
139
199
  async run(request, viewer) {
140
- const { connection } = reach(viewer, new URL(request.url).searchParams.get('connection'));
141
- return { info: await driver(connection).info() };
200
+ const params = new URL(request.url).searchParams;
201
+ const { db } = reach(viewer, params.get('connection'), params.get('database'));
202
+ return { info: await db.info() };
142
203
  },
143
204
  },
144
205
  {
@@ -146,7 +207,7 @@ export function createDbAdmin(options) {
146
207
  path: '/api/count',
147
208
  async run(request, viewer) {
148
209
  const body = await json(request);
149
- const { connection } = reach(viewer, body.connection);
210
+ const { connection, db, database } = reach(viewer, body.connection, body.database);
150
211
  const target = {
151
212
  schema: text(body.schema, 'schema'),
152
213
  table: text(body.table, 'table'),
@@ -155,13 +216,14 @@ export function createDbAdmin(options) {
155
216
  const started = performance.now();
156
217
  const statement = `count ${target.schema}.${target.table}`;
157
218
  try {
158
- const rows = await driver(connection).count(target, {
219
+ const rows = await db.count(target, {
159
220
  timeoutMs: limits.timeoutMs,
160
221
  signal: request.signal,
161
222
  });
162
223
  await record({
163
224
  viewer: viewer.id,
164
225
  connection: connection.name,
226
+ ...(database ? { database } : {}),
165
227
  action: 'count',
166
228
  statement,
167
229
  durationMs: Math.round(performance.now() - started),
@@ -173,6 +235,7 @@ export function createDbAdmin(options) {
173
235
  await record({
174
236
  viewer: viewer.id,
175
237
  connection: connection.name,
238
+ ...(database ? { database } : {}),
176
239
  action: 'count',
177
240
  statement,
178
241
  durationMs: Math.round(performance.now() - started),
@@ -187,18 +250,19 @@ export function createDbAdmin(options) {
187
250
  path: '/api/rows',
188
251
  async run(request, viewer) {
189
252
  const body = await json(request);
190
- const { connection } = reach(viewer, body.connection);
253
+ const { connection, db, database } = reach(viewer, body.connection, body.database);
191
254
  const page = rowsRequest(body);
192
255
  const started = performance.now();
193
256
  const statement = `${page.schema}.${page.table}`;
194
257
  try {
195
- const result = await driver(connection).rows(page, {
258
+ const result = await db.rows(page, {
196
259
  timeoutMs: limits.timeoutMs,
197
260
  signal: request.signal,
198
261
  });
199
262
  await record({
200
263
  viewer: viewer.id,
201
264
  connection: connection.name,
265
+ ...(database ? { database } : {}),
202
266
  action: 'rows',
203
267
  statement,
204
268
  durationMs: result.durationMs,
@@ -210,6 +274,7 @@ export function createDbAdmin(options) {
210
274
  await record({
211
275
  viewer: viewer.id,
212
276
  connection: connection.name,
277
+ ...(database ? { database } : {}),
213
278
  action: 'rows',
214
279
  statement,
215
280
  durationMs: Math.round(performance.now() - started),
@@ -224,7 +289,7 @@ export function createDbAdmin(options) {
224
289
  path: '/api/query',
225
290
  async run(request, viewer) {
226
291
  const body = await json(request);
227
- const { connection, access } = reach(viewer, body.connection);
292
+ const { connection, access, db, database } = reach(viewer, body.connection, body.database);
228
293
  const sql = text(body.sql, 'sql');
229
294
  const maxRows = body.maxRows === undefined
230
295
  ? limits.maxRows
@@ -242,7 +307,7 @@ export function createDbAdmin(options) {
242
307
  }
243
308
  const started = performance.now();
244
309
  try {
245
- const result = await driver(connection).query(sql, {
310
+ const result = await db.query(sql, {
246
311
  access,
247
312
  maxRows,
248
313
  timeoutMs: limits.timeoutMs,
@@ -251,6 +316,7 @@ export function createDbAdmin(options) {
251
316
  await record({
252
317
  viewer: viewer.id,
253
318
  connection: connection.name,
319
+ ...(database ? { database } : {}),
254
320
  action: 'query',
255
321
  statement: sql,
256
322
  durationMs: result.durationMs,
@@ -262,6 +328,7 @@ export function createDbAdmin(options) {
262
328
  await record({
263
329
  viewer: viewer.id,
264
330
  connection: connection.name,
331
+ ...(database ? { database } : {}),
265
332
  action: 'query',
266
333
  statement: sql,
267
334
  durationMs: Math.round(performance.now() - started),
@@ -281,7 +348,7 @@ export function createDbAdmin(options) {
281
348
  path: '/api/apply',
282
349
  async run(request, viewer) {
283
350
  const body = await json(request);
284
- const { connection, access } = reach(viewer, body.connection);
351
+ const { connection, access, db, database } = reach(viewer, body.connection, body.database);
285
352
  const target = { schema: text(body.schema, 'schema'), table: text(body.table, 'table') };
286
353
  const changes = changesOf(body.changes);
287
354
  const dryRun = body.dryRun === true;
@@ -290,7 +357,7 @@ export function createDbAdmin(options) {
290
357
  }
291
358
  const started = performance.now();
292
359
  try {
293
- const result = await driver(connection).apply(target, changes, {
360
+ const result = await db.apply(target, changes, {
294
361
  timeoutMs: limits.timeoutMs,
295
362
  dryRun,
296
363
  });
@@ -298,6 +365,7 @@ export function createDbAdmin(options) {
298
365
  await record({
299
366
  viewer: viewer.id,
300
367
  connection: connection.name,
368
+ ...(database ? { database } : {}),
301
369
  action: 'apply',
302
370
  statement: result.statements.join(';\n'),
303
371
  durationMs: Math.round(performance.now() - started),
@@ -311,6 +379,7 @@ export function createDbAdmin(options) {
311
379
  await record({
312
380
  viewer: viewer.id,
313
381
  connection: connection.name,
382
+ ...(database ? { database } : {}),
314
383
  action: 'apply',
315
384
  statement: `${changes.length} changes to ${target.schema}.${target.table}`,
316
385
  durationMs: Math.round(performance.now() - started),
@@ -326,12 +395,11 @@ export function createDbAdmin(options) {
326
395
  path: '/api/export',
327
396
  async run(request, viewer) {
328
397
  const body = await json(request);
329
- const { connection } = reach(viewer, body.connection);
398
+ const { connection, db, database } = reach(viewer, body.connection, body.database);
330
399
  const format = formatOf(body.format);
331
400
  const page = rowsRequest({ ...body, limit: undefined, offset: undefined });
332
- const opened = driver(connection);
333
401
  const started = performance.now();
334
- const batches = opened.export(page, { timeoutMs: limits.timeoutMs });
402
+ const batches = db.export(page, { timeoutMs: limits.timeoutMs });
335
403
  // Read the first batch before answering, so a bad table or filter is a proper error.
336
404
  const first = await batches.next();
337
405
  let replayed = false;
@@ -344,9 +412,10 @@ export function createDbAdmin(options) {
344
412
  },
345
413
  return: async () => batches.return(undefined),
346
414
  };
347
- const stream = exportStream(format, replay, page, opened.sql, (rows, error) => void record({
415
+ const stream = exportStream(format, replay, page, db.sql, (rows, error) => void record({
348
416
  viewer: viewer.id,
349
417
  connection: connection.name,
418
+ ...(database ? { database } : {}),
350
419
  action: 'export',
351
420
  statement: `${page.schema}.${page.table} as ${format}`,
352
421
  durationMs: Math.round(performance.now() - started),
@@ -456,8 +525,9 @@ export function createDbAdmin(options) {
456
525
  return reply(404, { error: { code: 'not-found', message: 'Not found.' } });
457
526
  },
458
527
  async close() {
459
- const open = [...drivers.values()];
528
+ const open = [...drivers.values(), ...[...others.values()].flatMap((o) => [...o.values()])];
460
529
  drivers.clear();
530
+ others.clear();
461
531
  await Promise.all(open.map((d) => d.close()));
462
532
  },
463
533
  };
@@ -487,6 +557,18 @@ async function defaultUi() {
487
557
  const { assets } = (await import('@otwdesign/db-ui'));
488
558
  return assets;
489
559
  }
560
+ function oneDatabase(connection) {
561
+ return new DbAdminError(`Connection "${connection.name}" opens its own database only.`, 400, 'one-database');
562
+ }
563
+ /** A database's name as PostgreSQL takes it: up to 63 bytes, with no NUL. */
564
+ function databaseName(value) {
565
+ if (typeof value !== 'string' ||
566
+ value.includes('\0') ||
567
+ new TextEncoder().encode(value).length > MAX_DATABASE_NAME) {
568
+ throw bad('"database" is a database’s name.');
569
+ }
570
+ return value;
571
+ }
490
572
  function accessOf(viewer, connection) {
491
573
  const granted = viewer.access ? viewer.access(connection) : connection.access;
492
574
  if (!granted)