|
|
|
@ -4,12 +4,14 @@ import { |
|
|
|
QueryTypes, |
|
|
|
SqlQuery, |
|
|
|
QueryJson, |
|
|
|
Operation, |
|
|
|
} from "../definitions/datasource" |
|
|
|
import { |
|
|
|
finaliseExternalTables, |
|
|
|
getSqlQuery, |
|
|
|
buildExternalTableId, |
|
|
|
convertSqlType, |
|
|
|
SqlClients, |
|
|
|
} from "./utils" |
|
|
|
import oracledb, { |
|
|
|
ExecuteOptions, |
|
|
|
@ -168,7 +170,7 @@ module OracleModule { |
|
|
|
OR cons.status IS NULL) |
|
|
|
` |
|
|
|
constructor(config: OracleConfig) { |
|
|
|
super("oracledb") |
|
|
|
super(SqlClients.ORACLE) |
|
|
|
this.config = config |
|
|
|
} |
|
|
|
|
|
|
|
@ -346,13 +348,29 @@ module OracleModule { |
|
|
|
this.schemaErrors = final.errors |
|
|
|
} |
|
|
|
|
|
|
|
private async internalQuery<T>(query: SqlQuery): Promise<Result<T>> { |
|
|
|
/** |
|
|
|
* Knex default returning behaviour does not work with oracle |
|
|
|
* Manually add the behaviour for the return column |
|
|
|
*/ |
|
|
|
private addReturning(query: SqlQuery, bindings: BindParameters, returnColumn: string) { |
|
|
|
if (bindings instanceof Array) { |
|
|
|
bindings.push({ dir: oracledb.BIND_OUT }) |
|
|
|
query.sql = query.sql + ` returning \"${returnColumn}\" into :${bindings.length}` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async internalQuery<T>(query: SqlQuery, returnColum?: string, operation?: string): Promise<Result<T>> { |
|
|
|
let connection |
|
|
|
try { |
|
|
|
connection = await this.getConnection() |
|
|
|
|
|
|
|
const options: ExecuteOptions = { autoCommit: true } |
|
|
|
const bindings: BindParameters = query.bindings || [] |
|
|
|
|
|
|
|
if (returnColum && (operation === Operation.CREATE || operation === Operation.UPDATE)) { |
|
|
|
this.addReturning(query, bindings, returnColum) |
|
|
|
} |
|
|
|
|
|
|
|
const result: Result<T> = await connection.execute<T>( |
|
|
|
query.sql, |
|
|
|
bindings, |
|
|
|
@ -411,20 +429,12 @@ module OracleModule { |
|
|
|
} |
|
|
|
|
|
|
|
async query(json: QueryJson) { |
|
|
|
const operation = this._operation(json).toLowerCase() |
|
|
|
const input = this._query(json, { disableReturning: true }) |
|
|
|
if (Array.isArray(input)) { |
|
|
|
const responses = [] |
|
|
|
for (let query of input) { |
|
|
|
responses.push(await this.internalQuery(query)) |
|
|
|
} |
|
|
|
return responses |
|
|
|
} else { |
|
|
|
const response = await this.internalQuery(input) |
|
|
|
return response.rows && response.rows.length |
|
|
|
? response.rows |
|
|
|
: [{ [operation]: true }] |
|
|
|
} |
|
|
|
const primaryKeys = json.meta!.table!.primary |
|
|
|
const primaryKey = primaryKeys ? primaryKeys[0] : undefined |
|
|
|
const queryFn = (query: any, operation: string) => this.internalQuery(query, primaryKey, operation) |
|
|
|
const processFn = (response: any) => response.rows ? response.rows : [] |
|
|
|
const output = await this.queryWithReturning(json, queryFn, processFn) |
|
|
|
return output |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|