Skip to content

Commit 9efac1c

Browse files
committed
faster row parsing
1 parent 76bf45d commit 9efac1c

File tree

2 files changed

+23
-28
lines changed

2 files changed

+23
-28
lines changed

packages/pg/lib/query.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Query {
2323

2424
// potential for multiple results
2525
this._results = this._result
26-
this._canceledDueToError = false
26+
this._canceledDueToError = null
2727
}
2828

2929
get text() {
@@ -113,10 +113,8 @@ class Query {
113113
this._canceledDueToError = err
114114
return
115115
}
116-
117-
//if (this.callback) {
118-
this._result.addRow(row)
119-
//}
116+
117+
this._result.addRow(row)
120118
}
121119

122120
handleCommandComplete(msg, connection) {

packages/pg/lib/result.js

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ class Result {
1616
this.fields = []
1717
this._parsers = undefined
1818
this._types = types
19-
const rowAsArray = rowMode === 'array'
20-
if (rowAsArray) {
21-
this.parseRow = this._parseRowAsArray
22-
}
2319
this._prebuiltEmptyResultObject = null
2420
}
2521

@@ -55,19 +51,6 @@ class Result {
5551
}
5652
}
5753

58-
_parseRowAsArray(rowData) {
59-
var row = new Array(rowData.length)
60-
for (var i = 0, len = rowData.length; i < len; i++) {
61-
var rawValue = rowData[i]
62-
if (rawValue !== null) {
63-
row[i] = this._parsers[i](rawValue)
64-
} else {
65-
row[i] = null
66-
}
67-
}
68-
return row
69-
}
70-
7154
parseRow(rowData) {
7255
let row = { ...this._prebuiltEmptyResultObject }
7356
for (let i = 0, len = rowData.length; i < len; i++) {
@@ -82,6 +65,11 @@ class Result {
8265
this.rows.push(row)
8366
}
8467

68+
_p(i, rowData) {
69+
const v = rowData[i]
70+
return v === null ? null : this._parsers[i](v)
71+
}
72+
8573
addFields(fieldDescriptions) {
8674
// clears field definitions
8775
// multiple query statements in 1 action can result in multiple sets
@@ -92,18 +80,27 @@ class Result {
9280
this._parsers = new Array(fieldDescriptions.length)
9381
}
9482

95-
var row = {}
83+
const row = {}
9684

97-
for (var i = 0; i < fieldDescriptions.length; i++) {
98-
var desc = fieldDescriptions[i]
85+
let localTypes = this._types || types
86+
87+
let parseFn = 'return {'
88+
for (let i = 0; i < fieldDescriptions.length; i++) {
89+
let desc = fieldDescriptions[i]
9990
row[desc.name] = null
10091

101-
if (this._types) {
102-
this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')
92+
const parser = localTypes.getTypeParser(desc.dataTypeID, desc.format || 'text')
93+
if(parser === String) {
94+
parseFn += JSON.stringify(desc.name) + ': rowData[i],'
10395
} else {
104-
this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')
96+
parseFn += JSON.stringify(desc.name) + ': this._p(i,rowData),'
10597
}
98+
this._parsers[i] = parser
10699
}
100+
101+
parseFn += '}'
102+
this.parseRow = new Function('rowData', parseFn)
103+
107104
this._prebuiltEmptyResultObject = row
108105
}
109106
}

0 commit comments

Comments
 (0)