@things-factory/integration-base 6.1.112 → 6.1.115

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-base",
3
- "version": "6.1.112",
3
+ "version": "6.1.115",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -26,12 +26,12 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@apollo/client": "^3.6.9",
29
- "@things-factory/api": "^6.1.112",
30
- "@things-factory/auth-base": "^6.1.112",
29
+ "@things-factory/api": "^6.1.115",
30
+ "@things-factory/auth-base": "^6.1.115",
31
31
  "@things-factory/env": "^6.1.112",
32
- "@things-factory/oauth2-client": "^6.1.112",
33
- "@things-factory/scheduler-client": "^6.1.112",
34
- "@things-factory/shell": "^6.1.112",
32
+ "@things-factory/oauth2-client": "^6.1.115",
33
+ "@things-factory/scheduler-client": "^6.1.115",
34
+ "@things-factory/shell": "^6.1.115",
35
35
  "async-mqtt": "^2.5.0",
36
36
  "chance": "^1.1.11",
37
37
  "cross-fetch": "^3.0.4",
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@types/cron": "^2.0.1"
48
48
  },
49
- "gitHead": "d33ec2c83a2dafeedd6a32921574b726f6fca785"
49
+ "gitHead": "3677982365595b0f3a8ec26e47c234878ecbb910"
50
50
  }
@@ -41,6 +41,16 @@ export class OracleConnector implements Connector {
41
41
  })
42
42
  ).rows
43
43
  },
44
+ execute: async (procedure, params) => {
45
+ // TODO: need to check if this is available when procedure string is a common query.
46
+ procedure = `BEGIN
47
+ ${procedure}
48
+ END;`
49
+
50
+ return await client.execute(procedure, params, {
51
+ outFormat: Client.OBJECT
52
+ })
53
+ },
44
54
  close: client.close.bind(client)
45
55
  })
46
56
 
@@ -81,7 +91,7 @@ export class OracleConnector implements Connector {
81
91
  }
82
92
 
83
93
  get taskPrefixes() {
84
- return ['database']
94
+ return ['database', 'oracle']
85
95
  }
86
96
 
87
97
  get help() {
@@ -93,5 +103,6 @@ ConnectionManager.registerConnector('oracle-connector', new OracleConnector())
93
103
 
94
104
  // need reference:
95
105
  // https://download.oracle.com/otn_software/mac/instantclient/193000/instantclient-basiclite-macos.x64-19.3.0.0.0dbru.zip
106
+ // https://node-oracledb.readthedocs.io/en/latest/index.html
96
107
 
97
108
  // docker pull store/oracle/database-instantclient:12.2.0.1
@@ -37,3 +37,4 @@ import './data-mapper'
37
37
  import './headless-post'
38
38
  import './headless-scrap'
39
39
  import './set-domain'
40
+ import './oracle-procedure'
@@ -0,0 +1,106 @@
1
+ import { VM } from 'vm2'
2
+ import { logger } from '@things-factory/env'
3
+ import { access } from '@things-factory/utils'
4
+ import { ConnectionManager } from '../connection-manager'
5
+ import { TaskRegistry } from '../task-registry'
6
+
7
+ try {
8
+ var oracledb = require('oracledb')
9
+ } catch (err) {
10
+ logger.error('oracledb module loading failed')
11
+ }
12
+
13
+ type ProcedureParameterType = { name: string; dir: string; type: string; val: any; maxSize: number }
14
+
15
+ const TYPES = {
16
+ Number: oracledb.NUMBER,
17
+ String: oracledb.STRING,
18
+ Date: oracledb.DATE,
19
+ Buffer: oracledb.BUFFER,
20
+ Blob: oracledb.BLOB,
21
+ Clob: oracledb.CLOB,
22
+ Cursor: oracledb.CURSOR
23
+ }
24
+
25
+ const DIR = {
26
+ In: oracledb.BIND_IN,
27
+ Inout: oracledb.BIND_INOUT,
28
+ Out: oracledb.BIND_OUT
29
+ }
30
+
31
+ async function OracleProcedure(step, context) {
32
+ var { domain, data, variables } = context
33
+ var { connection: connectionName, params } = step
34
+
35
+ var { procedure, parameters } = params as { procedure: string; parameters: ProcedureParameterType[] }
36
+
37
+ var dbconnection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
38
+
39
+ const vm = new VM({
40
+ sandbox: {
41
+ domain,
42
+ data,
43
+ variables
44
+ }
45
+ })
46
+
47
+ procedure = vm.run('`' + procedure + '`')
48
+
49
+ const procedureParameters =
50
+ parameters &&
51
+ parameters.reduce((sum, { name, val, dir, type, maxSize }) => {
52
+ sum[name] = {
53
+ dir: DIR[dir],
54
+ type: TYPES[type],
55
+ val: access(val, data),
56
+ maxSize
57
+ }
58
+
59
+ // remove empty keys
60
+ Object.keys(sum[name]).forEach(key => {
61
+ if (!sum[name][key]) {
62
+ delete sum[name][key]
63
+ }
64
+ })
65
+
66
+ return sum
67
+ }, {})
68
+
69
+ const result = await dbconnection.execute(procedure, procedureParameters)
70
+
71
+ var taskResult = {}
72
+ let paramKeys = Object.keys(procedureParameters)
73
+
74
+ for (const paramKey of paramKeys) {
75
+ if (procedureParameters[paramKey].dir === oracledb.BIND_OUT) {
76
+ if (procedureParameters[paramKey].type === oracledb.CURSOR) {
77
+ const resultSetTemp = result.outBinds[paramKey]
78
+ taskResult[paramKey] = await resultSetTemp.getRows()
79
+ await resultSetTemp.close()
80
+ } else {
81
+ taskResult[paramKey] = result.outBinds[paramKey]
82
+ }
83
+ }
84
+ }
85
+
86
+ console.log('taskResult: ', taskResult)
87
+
88
+ return {
89
+ data: taskResult
90
+ }
91
+ }
92
+
93
+ OracleProcedure.parameterSpec = [
94
+ {
95
+ type: 'textarea',
96
+ name: 'procedure',
97
+ label: 'procedure'
98
+ },
99
+ {
100
+ type: 'procedure-parameters',
101
+ name: 'parameters',
102
+ label: 'params'
103
+ }
104
+ ]
105
+
106
+ TaskRegistry.registerTaskHandler('oracle-procedure', OracleProcedure)