node-firebird-driver-native 3.2.2 → 3.3.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.
- package/README.md +18 -20
- package/dist/lib/attachment.js +4 -4
- package/dist/lib/attachment.js.map +1 -1
- package/dist/lib/blob.js +6 -4
- package/dist/lib/blob.js.map +1 -1
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/fb-util.js +5 -3
- package/dist/lib/fb-util.js.map +1 -1
- package/dist/lib/resultset.d.ts +1 -1
- package/dist/lib/resultset.js +11 -5
- package/dist/lib/resultset.js.map +1 -1
- package/dist/lib/statement.d.ts +4 -4
- package/dist/lib/statement.js +12 -8
- package/dist/lib/statement.js.map +1 -1
- package/dist/lib/transaction.js +4 -4
- package/dist/lib/transaction.js.map +1 -1
- package/package.json +8 -7
- package/src/lib/attachment.ts +92 -79
- package/src/lib/blob.ts +103 -89
- package/src/lib/client.ts +41 -48
- package/src/lib/events.ts +26 -24
- package/src/lib/fb-util.ts +73 -73
- package/src/lib/resultset.ts +94 -82
- package/src/lib/statement.ts +155 -141
- package/src/lib/transaction.ts +42 -37
- package/tsconfig.json +8 -17
package/src/lib/fb-util.ts
CHANGED
|
@@ -3,82 +3,82 @@ export * from 'node-firebird-driver/dist/lib/impl';
|
|
|
3
3
|
|
|
4
4
|
import * as fb from 'node-firebird-native-api';
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
/** Fix metadata descriptors to types we want to read. */
|
|
8
7
|
export function fixMetadata(status: fb.Status, metadata?: fb.MessageMetadata): fb.MessageMetadata | undefined {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
8
|
+
if (!metadata) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let ret: fb.MessageMetadata;
|
|
13
|
+
|
|
14
|
+
const outBuilder = metadata.getBuilderSync(status)!;
|
|
15
|
+
try {
|
|
16
|
+
for (let i = metadata.getCountSync(status) - 1; i >= 0; --i) {
|
|
17
|
+
switch (metadata.getTypeSync(status, i)) {
|
|
18
|
+
// Transform CHAR descriptors to VARCHAR.
|
|
19
|
+
case sqlTypes.SQL_TEXT:
|
|
20
|
+
outBuilder.setTypeSync(status, i, sqlTypes.SQL_VARYING);
|
|
21
|
+
break;
|
|
22
|
+
|
|
23
|
+
// Transform numeric descriptors to DOUBLE PRECISION.
|
|
24
|
+
case sqlTypes.SQL_SHORT:
|
|
25
|
+
case sqlTypes.SQL_LONG:
|
|
26
|
+
case sqlTypes.SQL_INT64:
|
|
27
|
+
case sqlTypes.SQL_FLOAT:
|
|
28
|
+
outBuilder.setTypeSync(status, i, sqlTypes.SQL_DOUBLE);
|
|
29
|
+
outBuilder.setLengthSync(status, i, 8);
|
|
30
|
+
outBuilder.setScaleSync(status, i, 0);
|
|
31
|
+
break;
|
|
32
|
+
|
|
33
|
+
// Transform TIME_TZ to TIME_TZ_EX.
|
|
34
|
+
case sqlTypes.SQL_TIME_TZ:
|
|
35
|
+
outBuilder.setTypeSync(status, i, sqlTypes.SQL_TIME_TZ_EX);
|
|
36
|
+
break;
|
|
37
|
+
|
|
38
|
+
// Transform TIMESTAMP_TZ to TIMESTAMP_TZ_EX.
|
|
39
|
+
case sqlTypes.SQL_TIMESTAMP_TZ:
|
|
40
|
+
outBuilder.setTypeSync(status, i, sqlTypes.SQL_TIMESTAMP_TZ_EX);
|
|
41
|
+
break;
|
|
42
|
+
|
|
43
|
+
// Transform INT128, DEC16 and DEC34 descriptors to VARCHAR.
|
|
44
|
+
case sqlTypes.SQL_INT128:
|
|
45
|
+
case sqlTypes.SQL_DEC16:
|
|
46
|
+
case sqlTypes.SQL_DEC34:
|
|
47
|
+
outBuilder.setTypeSync(status, i, sqlTypes.SQL_VARYING);
|
|
48
|
+
outBuilder.setLengthSync(status, i, 45);
|
|
49
|
+
outBuilder.setCharSetSync(status, i, charSets.ascii);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ret = outBuilder.getMetadataSync(status)!;
|
|
55
|
+
} finally {
|
|
56
|
+
outBuilder.releaseSync();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
metadata.releaseSync();
|
|
60
|
+
|
|
61
|
+
return ret;
|
|
63
62
|
}
|
|
64
63
|
|
|
65
64
|
export function createDescriptors(status: fb.Status, metadata?: fb.MessageMetadata): Descriptor[] {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
65
|
+
if (!metadata) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const count = metadata.getCountSync(status);
|
|
70
|
+
const ret: Descriptor[] = [];
|
|
71
|
+
|
|
72
|
+
for (let i = 0; i < count; ++i) {
|
|
73
|
+
ret.push({
|
|
74
|
+
type: metadata.getTypeSync(status, i),
|
|
75
|
+
subType: metadata.getSubTypeSync(status, i),
|
|
76
|
+
nullOffset: metadata.getNullOffsetSync(status, i),
|
|
77
|
+
offset: metadata.getOffsetSync(status, i),
|
|
78
|
+
length: metadata.getLengthSync(status, i),
|
|
79
|
+
scale: metadata.getScaleSync(status, i),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return ret;
|
|
84
84
|
}
|
package/src/lib/resultset.ts
CHANGED
|
@@ -6,88 +6,100 @@ import { AbstractResultSet } from 'node-firebird-driver/dist/lib/impl';
|
|
|
6
6
|
|
|
7
7
|
import * as fb from 'node-firebird-native-api';
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
/** ResultSet implementation. */
|
|
11
10
|
export class ResultSetImpl extends AbstractResultSet {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
11
|
+
// Override declarations.
|
|
12
|
+
override statement: StatementImpl;
|
|
13
|
+
override transaction: TransactionImpl;
|
|
14
|
+
|
|
15
|
+
resultSetHandle?: fb.ResultSet;
|
|
16
|
+
delayedError: any;
|
|
17
|
+
|
|
18
|
+
static async open(
|
|
19
|
+
statement: StatementImpl,
|
|
20
|
+
transaction: TransactionImpl,
|
|
21
|
+
parameters?: any[],
|
|
22
|
+
_options?: ExecuteQueryOptions,
|
|
23
|
+
): Promise<ResultSetImpl> {
|
|
24
|
+
const resultSet = new ResultSetImpl(statement, transaction);
|
|
25
|
+
|
|
26
|
+
return await statement.attachment.client.statusAction(async (status) => {
|
|
27
|
+
//// FIXME: options
|
|
28
|
+
|
|
29
|
+
await statement.dataWriter(statement.attachment, transaction, statement.inBuffer, parameters);
|
|
30
|
+
|
|
31
|
+
resultSet.resultSetHandle = await statement.statementHandle!.openCursorAsync(
|
|
32
|
+
status,
|
|
33
|
+
transaction.transactionHandle,
|
|
34
|
+
statement.inMetadata,
|
|
35
|
+
statement.inBuffer,
|
|
36
|
+
statement.outMetadata,
|
|
37
|
+
0,
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return resultSet;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Closes this result set. */
|
|
45
|
+
protected async internalClose(): Promise<void> {
|
|
46
|
+
await this.statement.attachment.client.statusAction(async (status) => {
|
|
47
|
+
await this.resultSetHandle!.closeAsync(status);
|
|
48
|
+
|
|
49
|
+
this.resultSetHandle = undefined;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Fetchs data from this result set. */
|
|
54
|
+
protected async internalFetch(options?: FetchOptions): Promise<{ finished: boolean; rows: any[][] }> {
|
|
55
|
+
return await this.statement.attachment.client.statusAction(async (status) => {
|
|
56
|
+
if (this.delayedError) {
|
|
57
|
+
const error = this.delayedError;
|
|
58
|
+
this.delayedError = undefined;
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const rows = [];
|
|
63
|
+
const buffers = [
|
|
64
|
+
this.statement.outBuffer,
|
|
65
|
+
new Uint8Array(this.statement.outMetadata!.getMessageLengthSync(status)),
|
|
66
|
+
];
|
|
67
|
+
let buffer = 0;
|
|
68
|
+
let nextFetchPromise = this.resultSetHandle!.fetchNextAsync(status, buffers[buffer]);
|
|
69
|
+
|
|
70
|
+
while (true) {
|
|
71
|
+
let nextFetch: number;
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
nextFetch = await nextFetchPromise;
|
|
75
|
+
} catch (e) {
|
|
76
|
+
if (rows.length == 0) {
|
|
77
|
+
throw e;
|
|
78
|
+
} else {
|
|
79
|
+
this.delayedError = e;
|
|
80
|
+
return { finished: false, rows };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (nextFetch == fb.Status.RESULT_OK) {
|
|
85
|
+
const buffer1 = buffer;
|
|
86
|
+
buffer = ++buffer % 2;
|
|
87
|
+
|
|
88
|
+
const finish = options && options.fetchSize && rows.length + 1 >= options.fetchSize;
|
|
89
|
+
|
|
90
|
+
if (!finish) {
|
|
91
|
+
nextFetchPromise = this.resultSetHandle!.fetchNextAsync(status, buffers[buffer]);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
rows.push(await this.statement.dataReader(this.statement.attachment, this.transaction, buffers[buffer1]));
|
|
95
|
+
|
|
96
|
+
if (finish) {
|
|
97
|
+
return { finished: false, rows };
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
return { finished: true, rows };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
93
105
|
}
|
package/src/lib/statement.ts
CHANGED
|
@@ -2,155 +2,169 @@ import { AttachmentImpl } from './attachment';
|
|
|
2
2
|
import { ResultSetImpl } from './resultset';
|
|
3
3
|
import { TransactionImpl } from './transaction';
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
ExecuteOptions,
|
|
7
|
-
ExecuteQueryOptions,
|
|
8
|
-
PrepareOptions
|
|
9
|
-
} from 'node-firebird-driver';
|
|
5
|
+
import { ExecuteOptions, ExecuteQueryOptions, PrepareOptions } from 'node-firebird-driver';
|
|
10
6
|
|
|
11
7
|
import { AbstractStatement, commonInfo, getPortableInteger, statementInfo } from 'node-firebird-driver/dist/lib/impl';
|
|
12
8
|
|
|
13
|
-
import {
|
|
14
|
-
createDataReader,
|
|
15
|
-
createDataWriter,
|
|
16
|
-
createDescriptors,
|
|
17
|
-
fixMetadata,
|
|
18
|
-
DataReader,
|
|
19
|
-
DataWriter
|
|
20
|
-
} from './fb-util';
|
|
9
|
+
import { createDataReader, createDataWriter, createDescriptors, fixMetadata, DataReader, DataWriter } from './fb-util';
|
|
21
10
|
|
|
22
11
|
import * as fb from 'node-firebird-native-api';
|
|
23
12
|
|
|
24
13
|
import { TextDecoder } from 'util';
|
|
25
14
|
|
|
26
|
-
|
|
27
15
|
/** Statement implementation. */
|
|
28
16
|
export class StatementImpl extends AbstractStatement {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
17
|
+
// Override declarations.
|
|
18
|
+
override attachment: AttachmentImpl;
|
|
19
|
+
override hasResultSet: boolean;
|
|
20
|
+
|
|
21
|
+
statementHandle?: fb.Statement;
|
|
22
|
+
inMetadata?: fb.MessageMetadata;
|
|
23
|
+
outMetadata?: fb.MessageMetadata;
|
|
24
|
+
inBuffer: Uint8Array;
|
|
25
|
+
outBuffer: Uint8Array;
|
|
26
|
+
dataWriter: DataWriter;
|
|
27
|
+
dataReader: DataReader;
|
|
28
|
+
|
|
29
|
+
static async prepare(
|
|
30
|
+
attachment: AttachmentImpl,
|
|
31
|
+
transaction: TransactionImpl,
|
|
32
|
+
sqlStmt: string,
|
|
33
|
+
_options?: PrepareOptions,
|
|
34
|
+
): Promise<StatementImpl> {
|
|
35
|
+
const statement = new StatementImpl(attachment);
|
|
36
|
+
|
|
37
|
+
return await attachment.client.statusAction(async (status) => {
|
|
38
|
+
//// FIXME: options/flags, dialect
|
|
39
|
+
statement.statementHandle = await attachment!.attachmentHandle!.prepareAsync(
|
|
40
|
+
status,
|
|
41
|
+
transaction?.transactionHandle,
|
|
42
|
+
0,
|
|
43
|
+
sqlStmt,
|
|
44
|
+
3,
|
|
45
|
+
fb.Statement.PREPARE_PREFETCH_ALL,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
statement.hasResultSet = (statement.statementHandle!.getFlagsSync(status) & fb.Statement.FLAG_HAS_CURSOR) != 0;
|
|
49
|
+
|
|
50
|
+
statement.inMetadata = fixMetadata(status, await statement.statementHandle!.getInputMetadataAsync(status));
|
|
51
|
+
statement.outMetadata = fixMetadata(status, await statement.statementHandle!.getOutputMetadataAsync(status));
|
|
52
|
+
|
|
53
|
+
if (statement.inMetadata) {
|
|
54
|
+
statement.inBuffer = new Uint8Array(statement.inMetadata.getMessageLengthSync(status));
|
|
55
|
+
statement.dataWriter = createDataWriter(createDescriptors(status, statement.inMetadata));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (statement.outMetadata) {
|
|
59
|
+
statement.outBuffer = new Uint8Array(statement.outMetadata.getMessageLengthSync(status));
|
|
60
|
+
statement.dataReader = createDataReader(createDescriptors(status, statement.outMetadata));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return statement;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Disposes this statement's resources. */
|
|
68
|
+
protected async internalDispose(): Promise<void> {
|
|
69
|
+
if (this.outMetadata) {
|
|
70
|
+
this.outMetadata.releaseSync();
|
|
71
|
+
this.outMetadata = undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (this.inMetadata) {
|
|
75
|
+
this.inMetadata.releaseSync();
|
|
76
|
+
this.inMetadata = undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
await this.attachment.client.statusAction((status) => this.statementHandle!.freeAsync(status));
|
|
80
|
+
|
|
81
|
+
this.statementHandle = undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Executes a prepared statement that uses the SET TRANSACTION command. Returns the new transaction. */
|
|
85
|
+
protected async internalExecuteTransaction(_transaction: TransactionImpl): Promise<TransactionImpl> {
|
|
86
|
+
throw new Error('Uninplemented method: executeTransaction.');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Executes a prepared statement that has no result set. */
|
|
90
|
+
protected async internalExecute(
|
|
91
|
+
transaction: TransactionImpl,
|
|
92
|
+
parameters?: any[],
|
|
93
|
+
_options?: ExecuteOptions,
|
|
94
|
+
): Promise<any[]> {
|
|
95
|
+
return await this.attachment.client.statusAction(async (status) => {
|
|
96
|
+
await this.dataWriter(this.attachment, transaction, this.inBuffer, parameters);
|
|
97
|
+
|
|
98
|
+
const newTransaction = await this.statementHandle!.executeAsync(
|
|
99
|
+
status,
|
|
100
|
+
transaction?.transactionHandle,
|
|
101
|
+
this.inMetadata,
|
|
102
|
+
this.inBuffer,
|
|
103
|
+
this.outMetadata,
|
|
104
|
+
this.outBuffer,
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
if (newTransaction && transaction?.transactionHandle != newTransaction) {
|
|
108
|
+
//// FIXME: newTransaction.releaseSync();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return this.outMetadata ? await this.dataReader(this.attachment, transaction, this.outBuffer) : [];
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Executes a prepared statement that has result set. */
|
|
116
|
+
protected async internalExecuteQuery(
|
|
117
|
+
transaction: TransactionImpl,
|
|
118
|
+
parameters?: any[],
|
|
119
|
+
options?: ExecuteQueryOptions,
|
|
120
|
+
): Promise<ResultSetImpl> {
|
|
121
|
+
return await ResultSetImpl.open(this, transaction as TransactionImpl, parameters, options);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async setCursorName(cursorName: string): Promise<void> {
|
|
125
|
+
return await this.attachment.client.statusAction(
|
|
126
|
+
async (status) => await this.statementHandle!.setCursorNameAsync(status, cursorName),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async getExecPathText(): Promise<string | undefined> {
|
|
131
|
+
return await this.attachment.client.statusAction(async (status) => {
|
|
132
|
+
const infoReq = new Uint8Array([statementInfo.sqlExecPathBlrText]);
|
|
133
|
+
const infoRet = new Uint8Array(65535);
|
|
134
|
+
await this.statementHandle!.getInfoAsync(status, infoReq.byteLength, infoReq, infoRet.byteLength, infoRet);
|
|
135
|
+
|
|
136
|
+
if (infoRet[0] == commonInfo.end) {
|
|
137
|
+
return undefined;
|
|
138
|
+
} else {
|
|
139
|
+
if (infoRet[0] != statementInfo.sqlExecPathBlrText) {
|
|
140
|
+
throw new Error('Error retrieving statement execution path.');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const size = getPortableInteger(infoRet.subarray(1), 2);
|
|
144
|
+
return new TextDecoder().decode(infoRet.subarray(3, 3 + size));
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
get columnLabels(): Promise<string[]> {
|
|
150
|
+
const asyncFunc = async (): Promise<string[]> => {
|
|
151
|
+
if (!this.outMetadata) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return await this.attachment.client.statusAction(async (status) => {
|
|
156
|
+
const metaData = this.outMetadata!;
|
|
157
|
+
const count = metaData.getCountSync(status);
|
|
158
|
+
const array: string[] = [];
|
|
159
|
+
|
|
160
|
+
for (let i = 0; i < count; ++i) {
|
|
161
|
+
array.push(metaData.getAliasSync(status, i)!);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return array;
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
return asyncFunc();
|
|
169
|
+
}
|
|
156
170
|
}
|