@deterministic-code/datasources-oracle 0.0.0-stage → 0.1.3

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.
@@ -0,0 +1,4 @@
1
+ import { AlterTableStatementTextRenderer, type AlterAction } from "@deterministic-code/datasources";
2
+ export declare class OracleAlterTableStatementRenderer extends AlterTableStatementTextRenderer {
3
+ protected actionSql(action: AlterAction): string;
4
+ }
@@ -0,0 +1,10 @@
1
+ import { AlterTableStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleAlterTableStatementRenderer extends AlterTableStatementTextRenderer {
3
+ actionSql(action) {
4
+ return action.kind === "addColumn"
5
+ ? `ADD (${this.column(action.column)})`
6
+ : action.kind === "alterColumn"
7
+ ? `MODIFY (${this.column(action.column)})`
8
+ : super.actionSql(action);
9
+ }
10
+ }
@@ -0,0 +1,4 @@
1
+ import { CreateTableStatementTextRenderer, type Column } from "@deterministic-code/datasources";
2
+ export declare class OracleCreateTableStatementRenderer extends CreateTableStatementTextRenderer {
3
+ protected identity(column: Column): string;
4
+ }
@@ -0,0 +1,6 @@
1
+ import { CreateTableStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleCreateTableStatementRenderer extends CreateTableStatementTextRenderer {
3
+ identity(column) {
4
+ return column.identity ? " GENERATED BY DEFAULT AS IDENTITY" : "";
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ import { CreateTriggerStatementTextRenderer, type CreateTriggerStatement } from "@deterministic-code/datasources";
2
+ export declare class OracleCreateTriggerStatementRenderer extends CreateTriggerStatementTextRenderer {
3
+ render(statement: CreateTriggerStatement): string;
4
+ }
@@ -0,0 +1,12 @@
1
+ import { CreateTriggerStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleCreateTriggerStatementRenderer extends CreateTriggerStatementTextRenderer {
3
+ render(statement) {
4
+ return `CREATE OR REPLACE TRIGGER ${statement.name}
5
+ BEFORE UPDATE ON ${statement.table}
6
+ FOR EACH ROW
7
+ BEGIN
8
+ :NEW.${statement.updatedColumn} := ${statement.utcNow};
9
+ END;
10
+ /`;
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ import { DefaultValueConverter, DeterministicTypeConverter, StatementTextRenderer, type Cell, type DatasourceOptions, type ICommand, type IConnection, type IDriver, type Information, type ITransaction, type IsolationLevel, type TypeConverter } from "@deterministic-code/datasources";
2
+ export declare class OracleDriver implements IDriver {
3
+ readonly statementRenderer: StatementTextRenderer;
4
+ readonly information: Information;
5
+ rowTypeConverters: Record<string, TypeConverter<Cell, Cell>>;
6
+ readonly quoteLeft = "\"";
7
+ readonly quoteRight = "\"";
8
+ readonly typeConverter: DeterministicTypeConverter;
9
+ readonly defaultValueConverter: DefaultValueConverter;
10
+ columnType: (name: string) => string;
11
+ connection: (options?: DatasourceOptions) => IConnection;
12
+ command: (connection: IConnection) => ICommand;
13
+ transaction: (connection: IConnection, _isolation?: IsolationLevel) => ITransaction;
14
+ }
@@ -0,0 +1,62 @@
1
+ import { columnType as identityColumnType, DefaultValueConverter, DeterministicTypeConverter, StatementTextRenderer, StubTransaction, } from "@deterministic-code/datasources";
2
+ import { OracleConnection } from "./connection.js";
3
+ import { OracleStatementRenderer } from "./OracleStatementRenderer.js";
4
+ const statements = new StatementTextRenderer(t => new OracleStatementRenderer(t));
5
+ export class OracleDriver {
6
+ statementRenderer = statements;
7
+ information = {
8
+ descriptions: ["Oracle driver."],
9
+ overrides: [
10
+ "Overrides CreateCreateStoredProcedureStatement to PROCEDURE Create{Plural}",
11
+ "Overrides CreateReadStoredProcedureStatement to PROCEDURE Read{Plural}By{Properties}",
12
+ "Overrides CreateUpdateStoredProcedureStatement to PROCEDURE Update{Plural}By{Properties}",
13
+ "Overrides CreateDeleteStoredProcedureStatement to PROCEDURE Delete{Plural}By{Properties}",
14
+ "Overrides CreateBulkCreateStoredProcedureStatement to PROCEDURE BulkCreate{Plural}",
15
+ "Overrides CreateBulkUpdateStoredProcedureStatement to PROCEDURE BulkUpdate{Plural}",
16
+ "Overrides CreateBulkDeleteStoredProcedureStatement to PROCEDURE BulkDelete{Plural}",
17
+ ],
18
+ changeLogs: [],
19
+ };
20
+ rowTypeConverters = {};
21
+ quoteLeft = '"';
22
+ quoteRight = '"';
23
+ typeConverter = new DeterministicTypeConverter({
24
+ string: "CLOB",
25
+ character: "CHAR(1)",
26
+ number: "NUMBER(10)",
27
+ integer: "NUMBER(10)",
28
+ unsignedinteger: "NUMBER(10)",
29
+ smallinteger: "NUMBER(5)",
30
+ unsignedsmallinteger: "NUMBER(5)",
31
+ biginteger: "NUMBER(19)",
32
+ unsignedbiginteger: "NUMBER(20)",
33
+ float: "BINARY_DOUBLE",
34
+ decimal: "NUMBER",
35
+ boolean: "NUMBER(1)",
36
+ datetime: "TIMESTAMP",
37
+ binary: "BLOB",
38
+ uuid: "VARCHAR2(36)",
39
+ reference: "NUMBER(10)",
40
+ }, {
41
+ dialectName: "oracle",
42
+ stringUnlimited: "CLOB",
43
+ stringSized: (n) => `VARCHAR2(${n})`,
44
+ character: "CHAR",
45
+ decimal: { kind: "required", type: "NUMBER" },
46
+ binaryUnlimited: "BLOB",
47
+ binarySized: (n) => `RAW(${n})`,
48
+ });
49
+ defaultValueConverter = new DefaultValueConverter({
50
+ newId: () => "SYS_GUID()",
51
+ now: () => "LOCALTIMESTAMP",
52
+ utcNow: () => "SYS_EXTRACT_UTC(SYSTIMESTAMP)",
53
+ booleanOn: "1",
54
+ booleanOff: "0",
55
+ hex: (arg) => `HEXTORAW('${arg}')`,
56
+ hexReverse: /^HEXTORAW\('(.*)'\)$/,
57
+ });
58
+ columnType = identityColumnType;
59
+ connection = (options) => OracleConnection.from(options);
60
+ command = (connection) => connection.createCommand();
61
+ transaction = (connection, _isolation) => new StubTransaction(connection.provider, connection);
62
+ }
@@ -0,0 +1,4 @@
1
+ import { DropIndexStatementTextRenderer, type DropIndexStatement } from "@deterministic-code/datasources";
2
+ export declare class OracleDropIndexStatementRenderer extends DropIndexStatementTextRenderer {
3
+ render(statement: DropIndexStatement): string;
4
+ }
@@ -0,0 +1,6 @@
1
+ import { DropIndexStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleDropIndexStatementRenderer extends DropIndexStatementTextRenderer {
3
+ render(statement) {
4
+ return `DROP INDEX ${statement.name}`;
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ import { DropTableStatementTextRenderer, type DropTableStatement } from "@deterministic-code/datasources";
2
+ export declare class OracleDropTableStatementRenderer extends DropTableStatementTextRenderer {
3
+ render(statement: DropTableStatement): string;
4
+ }
@@ -0,0 +1,7 @@
1
+ import { DropTableStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleDropTableStatementRenderer extends DropTableStatementTextRenderer {
3
+ render(statement) {
4
+ return `BEGIN EXECUTE IMMEDIATE 'DROP TABLE ${statement.table} CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
5
+ /`;
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ import { DropTriggerStatementTextRenderer, type DropTriggerStatement } from "@deterministic-code/datasources";
2
+ export declare class OracleDropTriggerStatementRenderer extends DropTriggerStatementTextRenderer {
3
+ render(statement: DropTriggerStatement): string;
4
+ }
@@ -0,0 +1,6 @@
1
+ import { DropTriggerStatementTextRenderer } from "@deterministic-code/datasources";
2
+ export class OracleDropTriggerStatementRenderer extends DropTriggerStatementTextRenderer {
3
+ render(statement) {
4
+ return `DROP TRIGGER ${statement.name}`;
5
+ }
6
+ }
@@ -0,0 +1,17 @@
1
+ import { AlterTableStatement, CreateBulkCreateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateCreateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateTableStatement, CreateTriggerStatement, CreateUpdateStoredProcedureStatement, DropIndexStatement, DropTableStatement, DropTriggerStatement, StatementRenderer, type StatementTextRenderer } from "@deterministic-code/datasources";
2
+ export declare class OracleStatementRenderer extends StatementRenderer {
3
+ constructor(text: StatementTextRenderer);
4
+ protected visitCreateTable(create: CreateTableStatement): string;
5
+ protected visitAlterTable(alter: AlterTableStatement): string;
6
+ protected visitDropIndex(index: DropIndexStatement): string;
7
+ protected visitDropTrigger(trigger: DropTriggerStatement): string;
8
+ protected visitCreateTrigger(trigger: CreateTriggerStatement): string;
9
+ protected visitDropTable(drop: DropTableStatement): string;
10
+ protected visitCreateCreateStoredProcedureStatement(statement: CreateCreateStoredProcedureStatement): string;
11
+ protected visitCreateReadStoredProcedureStatement(statement: CreateReadStoredProcedureStatement): string;
12
+ protected visitCreateUpdateStoredProcedureStatement(statement: CreateUpdateStoredProcedureStatement): string;
13
+ protected visitCreateDeleteStoredProcedureStatement(statement: CreateDeleteStoredProcedureStatement): string;
14
+ protected visitCreateBulkCreateStoredProcedureStatement(statement: CreateBulkCreateStoredProcedureStatement): string;
15
+ protected visitCreateBulkUpdateStoredProcedureStatement(statement: CreateBulkUpdateStoredProcedureStatement): string;
16
+ protected visitCreateBulkDeleteStoredProcedureStatement(statement: CreateBulkDeleteStoredProcedureStatement): string;
17
+ }
@@ -0,0 +1,52 @@
1
+ import { StatementRenderer, } from "@deterministic-code/datasources";
2
+ import { OracleAlterTableStatementRenderer } from "./OracleAlterTableStatementRenderer.js";
3
+ import { OracleCreateTableStatementRenderer } from "./OracleCreateTableStatementRenderer.js";
4
+ import { OracleCreateTriggerStatementRenderer } from "./OracleCreateTriggerStatementRenderer.js";
5
+ import { OracleDropIndexStatementRenderer } from "./OracleDropIndexStatementRenderer.js";
6
+ import { OracleDropTableStatementRenderer } from "./OracleDropTableStatementRenderer.js";
7
+ import { OracleDropTriggerStatementRenderer } from "./OracleDropTriggerStatementRenderer.js";
8
+ import { OracleStoredProcedureStatementRenderer } from "./OracleStoredProcedureStatementRenderer.js";
9
+ export class OracleStatementRenderer extends StatementRenderer {
10
+ constructor(text) {
11
+ super(text);
12
+ }
13
+ visitCreateTable(create) {
14
+ return new OracleCreateTableStatementRenderer().render(create);
15
+ }
16
+ visitAlterTable(alter) {
17
+ return new OracleAlterTableStatementRenderer().renderAlter(alter);
18
+ }
19
+ visitDropIndex(index) {
20
+ return new OracleDropIndexStatementRenderer().render(index);
21
+ }
22
+ visitDropTrigger(trigger) {
23
+ return new OracleDropTriggerStatementRenderer().render(trigger);
24
+ }
25
+ visitCreateTrigger(trigger) {
26
+ return new OracleCreateTriggerStatementRenderer().render(trigger);
27
+ }
28
+ visitDropTable(drop) {
29
+ return new OracleDropTableStatementRenderer().render(drop);
30
+ }
31
+ visitCreateCreateStoredProcedureStatement(statement) {
32
+ return new OracleStoredProcedureStatementRenderer().renderCreate(statement);
33
+ }
34
+ visitCreateReadStoredProcedureStatement(statement) {
35
+ return new OracleStoredProcedureStatementRenderer().renderRead(statement);
36
+ }
37
+ visitCreateUpdateStoredProcedureStatement(statement) {
38
+ return new OracleStoredProcedureStatementRenderer().renderUpdate(statement);
39
+ }
40
+ visitCreateDeleteStoredProcedureStatement(statement) {
41
+ return new OracleStoredProcedureStatementRenderer().renderDelete(statement);
42
+ }
43
+ visitCreateBulkCreateStoredProcedureStatement(statement) {
44
+ return new OracleStoredProcedureStatementRenderer().renderBulkCreate(statement);
45
+ }
46
+ visitCreateBulkUpdateStoredProcedureStatement(statement) {
47
+ return new OracleStoredProcedureStatementRenderer().renderBulkUpdate(statement);
48
+ }
49
+ visitCreateBulkDeleteStoredProcedureStatement(statement) {
50
+ return new OracleStoredProcedureStatementRenderer().renderBulkDelete(statement);
51
+ }
52
+ }
@@ -0,0 +1,10 @@
1
+ import type { CreateBulkCreateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateCreateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateUpdateStoredProcedureStatement } from "@deterministic-code/datasources";
2
+ export declare class OracleStoredProcedureStatementRenderer {
3
+ renderCreate(statement: CreateCreateStoredProcedureStatement): string;
4
+ renderRead(statement: CreateReadStoredProcedureStatement): string;
5
+ renderUpdate(statement: CreateUpdateStoredProcedureStatement): string;
6
+ renderDelete(statement: CreateDeleteStoredProcedureStatement): string;
7
+ renderBulkCreate(statement: CreateBulkCreateStoredProcedureStatement): string;
8
+ renderBulkUpdate(statement: CreateBulkUpdateStoredProcedureStatement): string;
9
+ renderBulkDelete(statement: CreateBulkDeleteStoredProcedureStatement): string;
10
+ }
@@ -0,0 +1,92 @@
1
+ const params = (list) => list.map((p) => ` ${p.name} IN ${p.type}`).join(",\n");
2
+ const jsonColumns = (columns) => columns.map((c) => `${c.name} ${c.type} PATH '$.${c.name}'`).join(", ");
3
+ export class OracleStoredProcedureStatementRenderer {
4
+ renderCreate(statement) {
5
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(
6
+ ${params(statement.parameters)}
7
+ ) AS
8
+ BEGIN
9
+ INSERT INTO ${statement.table} (${statement.parameters.map((p) => p.name).join(", ")})
10
+ VALUES (${statement.parameters.map((p) => p.name).join(", ")});
11
+ END;`;
12
+ }
13
+ renderRead(statement) {
14
+ const aliased = statement.columns.map((c) => `t.${c}`).join(", ");
15
+ if (statement.byProperties.length === 0) {
16
+ return `CREATE OR REPLACE PROCEDURE ${statement.name} AS
17
+ BEGIN
18
+ SELECT ${aliased} FROM ${statement.table} t ORDER BY t.${statement.key};
19
+ END;`;
20
+ }
21
+ const signature = statement.byProperties
22
+ .map((c) => `${c} IN ${statement.parameters.find((p) => p.name === c)?.type ?? statement.keyType}`)
23
+ .join(", ");
24
+ const pred = statement.byProperties.map((c) => `t.${c} = ${c}`).join(" AND ");
25
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(${signature}) AS
26
+ BEGIN
27
+ SELECT ${aliased} FROM ${statement.table} t WHERE ${pred};
28
+ END;`;
29
+ }
30
+ renderUpdate(statement) {
31
+ const sets = statement.writable.map((c) => ` t.${c} = ${c}`);
32
+ if (statement.auditUpdated !== undefined) {
33
+ const auditParam = statement.parameters.find((p) => p.name.includes("new_updated"));
34
+ if (auditParam)
35
+ sets.push(` t.${statement.auditUpdated} = ${auditParam.name}`);
36
+ }
37
+ const by = statement.byProperties.length > 0 ? statement.byProperties : [statement.key];
38
+ const pred = by.map((c) => `t.${c} = ${c}`).join(" AND ");
39
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(
40
+ ${params(statement.parameters)}
41
+ ) AS
42
+ BEGIN
43
+ UPDATE ${statement.table} t
44
+ SET
45
+ ${sets.join(",\n")}
46
+ WHERE ${pred};
47
+ END;`;
48
+ }
49
+ renderDelete(statement) {
50
+ const by = statement.byProperties.length > 0 ? statement.byProperties : [statement.key];
51
+ const signature = by
52
+ .map((c) => `${c} IN ${statement.parameters.find((p) => p.name === c)?.type ?? statement.keyType}`)
53
+ .join(", ");
54
+ const pred = by.map((c) => `t.${c} = ${c}`).join(" AND ");
55
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(${signature}) AS
56
+ BEGIN
57
+ DELETE FROM ${statement.table} t WHERE ${pred};
58
+ END;`;
59
+ }
60
+ renderBulkCreate(statement) {
61
+ const cols = statement.columns.map((c) => c.name).join(", ");
62
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(${statement.payload.name} IN CLOB) AS
63
+ BEGIN
64
+ INSERT INTO ${statement.table} (${cols})
65
+ SELECT ${cols}
66
+ FROM JSON_TABLE(${statement.payload.name}, '$[*]' COLUMNS (${jsonColumns(statement.columns)}));
67
+ END;`;
68
+ }
69
+ renderBulkUpdate(statement) {
70
+ const sets = statement.columns
71
+ .filter((c) => c.name !== statement.key)
72
+ .map((c) => `t.${c.name} = payload_rows.${c.name}`)
73
+ .join(", ");
74
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(${statement.payload.name} IN CLOB) AS
75
+ BEGIN
76
+ MERGE INTO ${statement.table} t
77
+ USING (
78
+ SELECT * FROM JSON_TABLE(${statement.payload.name}, '$[*]' COLUMNS (${jsonColumns(statement.columns)}))
79
+ ) payload_rows ON (t.${statement.key} = payload_rows.${statement.key})
80
+ WHEN MATCHED THEN UPDATE SET ${sets};
81
+ END;`;
82
+ }
83
+ renderBulkDelete(statement) {
84
+ return `CREATE OR REPLACE PROCEDURE ${statement.name}(${statement.payload.name} IN CLOB) AS
85
+ BEGIN
86
+ DELETE FROM ${statement.table} t
87
+ WHERE t.${statement.key} IN (
88
+ SELECT ${statement.key} FROM JSON_TABLE(${statement.payload.name}, '$[*]' COLUMNS (${statement.key} ${statement.keyType} PATH '$.${statement.key}'))
89
+ );
90
+ END;`;
91
+ }
92
+ }
@@ -0,0 +1,6 @@
1
+ import { StubConnection, type DatasourceOptions, type ICommand } from "@deterministic-code/datasources";
2
+ export declare class OracleConnection extends StubConnection {
3
+ constructor(_options?: DatasourceOptions);
4
+ createCommand: () => ICommand;
5
+ static from: (options?: DatasourceOptions) => OracleConnection;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { StubCommand, StubConnection, } from "@deterministic-code/datasources";
2
+ export class OracleConnection extends StubConnection {
3
+ constructor(_options) {
4
+ super("oracle");
5
+ }
6
+ createCommand = () => new StubCommand(this.provider, this);
7
+ static from = (options) => new OracleConnection(options);
8
+ }
@@ -0,0 +1 @@
1
+ export { OracleDriver } from "./OracleDriver.js";
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export { OracleDriver } from "./OracleDriver.js";
package/package.json CHANGED
@@ -1,6 +1,23 @@
1
1
  {
2
2
  "name": "@deterministic-code/datasources-oracle",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.3",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.js",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.js",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "dependencies": {
21
+ "@deterministic-code/datasources": "^0.1.3"
22
+ }
23
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.