node-firebird-driver-native 3.2.2 → 3.4.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.
@@ -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
- if (!metadata)
10
- return undefined;
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
- }
56
- finally {
57
- outBuilder.releaseSync();
58
- }
59
-
60
- metadata.releaseSync();
61
-
62
- return ret;
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
- if (!metadata)
67
- return [];
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;
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
  }
@@ -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
- // Override declarations.
13
- override statement: StatementImpl;
14
- override transaction: TransactionImpl;
15
-
16
- resultSetHandle?: fb.ResultSet;
17
- delayedError: any;
18
-
19
- static async open(statement: StatementImpl, transaction: TransactionImpl, parameters?: Array<any>,
20
- options?: ExecuteQueryOptions): Promise<ResultSetImpl> {
21
- const resultSet = new ResultSetImpl(statement, transaction);
22
-
23
- return await statement.attachment.client.statusAction(async status => {
24
- //// FIXME: options
25
-
26
- await statement.dataWriter(statement.attachment, transaction, statement.inBuffer, parameters);
27
-
28
- resultSet.resultSetHandle = await statement.statementHandle!.openCursorAsync(status, transaction.transactionHandle,
29
- statement.inMetadata, statement.inBuffer, statement.outMetadata, 0);
30
-
31
- return resultSet;
32
- });
33
- }
34
-
35
- /** Closes this result set. */
36
- protected async internalClose(): Promise<void> {
37
- await this.statement.attachment.client.statusAction(async status => {
38
- await this.resultSetHandle!.closeAsync(status);
39
-
40
- this.resultSetHandle = undefined;
41
- });
42
- }
43
-
44
- /** Fetchs data from this result set. */
45
- protected async internalFetch(options?: FetchOptions): Promise<{ finished: boolean; rows: any[][] }> {
46
- return await this.statement.attachment.client.statusAction(async status => {
47
- if (this.delayedError) {
48
- const error = this.delayedError;
49
- this.delayedError = undefined;
50
- throw error;
51
- }
52
-
53
- const rows = [];
54
- const buffers = [this.statement.outBuffer, new Uint8Array(this.statement.outMetadata!.getMessageLengthSync(status))];
55
- let buffer = 0;
56
- let nextFetchPromise = this.resultSetHandle!.fetchNextAsync(status, buffers[buffer]);
57
-
58
- while (true) {
59
- let nextFetch: number;
60
-
61
- try {
62
- nextFetch = await nextFetchPromise;
63
- }
64
- catch (e) {
65
- if (rows.length == 0)
66
- throw e;
67
- else {
68
- this.delayedError = e;
69
- return { finished: false, rows };
70
- }
71
- }
72
-
73
- if (nextFetch == fb.Status.RESULT_OK) {
74
- const buffer1 = buffer;
75
- buffer = ++buffer % 2;
76
-
77
- const finish = options && options.fetchSize && rows.length + 1 >= options.fetchSize;
78
-
79
- if (!finish)
80
- nextFetchPromise = this.resultSetHandle!.fetchNextAsync(status, buffers[buffer]);
81
-
82
- rows.push(await this.statement.dataReader(this.statement.attachment, this.transaction, buffers[buffer1]));
83
-
84
- if (finish)
85
- return { finished: false, rows };
86
- }
87
- else {
88
- return { finished: true, rows };
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
  }