Skip to content

Commit 7a02b94

Browse files
committed
Cache columns for prepared statements
1 parent 2e80d49 commit 7a02b94

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

lib/backend.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ function Backend({
1616
onnotify
1717
}) {
1818
let result = null
19-
let columns = null
2019
let rows = 0
2120

2221
const backend = Object.entries({
@@ -85,7 +84,6 @@ function Backend({
8584
: result
8685
)
8786
result = null
88-
columns = null
8987
rows = 0
9088
}
9189

@@ -99,8 +97,8 @@ function Backend({
9997
let column
10098

10199
const row = {}
102-
for (let i = 0; i < columns.length; i++) {
103-
column = columns[i]
100+
for (let i = 0; i < backend.query.statement.columns.length; i++) {
101+
column = backend.query.statement.columns[i]
104102
length = x.readInt32BE(index)
105103
index += 4
106104

@@ -172,18 +170,22 @@ function Backend({
172170
}
173171

174172
function RowDescription(x) {
173+
result = []
174+
rows = 0
175+
176+
if (backend.query.statement.columns)
177+
return
178+
175179
const length = x.readInt16BE(5)
176180
let index = 7
177181
let start
178182

179-
columns = Array(length)
180-
result = []
181-
rows = 0
183+
backend.query.statement.columns = Array(length)
182184

183185
for (let i = 0; i < length; ++i) {
184186
start = index
185187
while (x[index++] !== 0);
186-
columns[i] = {
188+
backend.query.statement.columns[i] = {
187189
n: transform(x.utf8Slice(start, index - 1)),
188190
p: parsers[x.readInt32BE(index + 6)]
189191
}

lib/connection.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -93,24 +93,25 @@ export default function Connection(options = {}) {
9393
: (backend.query = query)
9494

9595
const buffer = statements.has(sig)
96-
? prepared(statements.get(sig), args)
97-
: prepare(sig, str, args)
96+
? prepared(statements.get(sig), args, query)
97+
: prepare(sig, str, args, query)
9898

9999
connection.ready
100100
? socket.write(buffer)
101101
: (messages.push(buffer), socket.connect())
102102
}
103103

104-
function prepared(name, args) {
105-
return frontend.Bind(name, args)
104+
function prepared(statement, args, query) {
105+
query.statement = statement
106+
return frontend.Bind(statement.name, args)
106107
}
107108

108-
function prepare(sig, str, args) {
109-
const name = sig ? 'p' + id++ : ''
110-
sig && statements.set(sig, name)
109+
function prepare(sig, str, args, query) {
110+
query.statement = { name: sig ? 'p' + id++ : '' }
111+
sig && statements.set(sig, query.statement)
111112
return Buffer.concat([
112-
frontend.Parse(name, str, args),
113-
frontend.Bind(name, args)
113+
frontend.Parse(query.statement.name, str, args),
114+
frontend.Bind(query.statement.name, args)
114115
])
115116
}
116117

0 commit comments

Comments
 (0)