@@ -104,7 +104,7 @@ export default function Subscribe(postgres, options) {
104
104
105
105
function data ( x ) {
106
106
if ( x [ 0 ] === 0x77 )
107
- parse ( x . subarray ( 25 ) , state , sql . options . parsers , handle )
107
+ parse ( x . subarray ( 25 ) , state , sql . options . parsers , handle , options . transform )
108
108
else if ( x [ 0 ] === 0x6b && x [ 17 ] )
109
109
pong ( )
110
110
}
@@ -137,15 +137,15 @@ function Time(x) {
137
137
return new Date ( Date . UTC ( 2000 , 0 , 1 ) + Number ( x / BigInt ( 1000 ) ) )
138
138
}
139
139
140
- function parse ( x , state , parsers , handle ) {
140
+ function parse ( x , state , parsers , handle , transform ) {
141
141
const char = ( acc , [ k , v ] ) => ( acc [ k . charCodeAt ( 0 ) ] = v , acc )
142
142
143
143
Object . entries ( {
144
144
R : x => { // Relation
145
145
let i = 1
146
146
const r = state [ x . readUInt32BE ( i ) ] = {
147
- schema : String ( x . subarray ( i += 4 , i = x . indexOf ( 0 , i ) ) ) || 'pg_catalog' ,
148
- table : String ( x . subarray ( i + 1 , i = x . indexOf ( 0 , i + 1 ) ) ) ,
147
+ schema : x . toString ( 'utf8' , i += 4 , i = x . indexOf ( 0 , i ) ) || 'pg_catalog' ,
148
+ table : x . toString ( 'utf8' , i + 1 , i = x . indexOf ( 0 , i + 1 ) ) ,
149
149
columns : Array ( x . readUInt16BE ( i += 2 ) ) ,
150
150
keys : [ ]
151
151
}
@@ -157,7 +157,9 @@ function parse(x, state, parsers, handle) {
157
157
while ( i < x . length ) {
158
158
column = r . columns [ columnIndex ++ ] = {
159
159
key : x [ i ++ ] ,
160
- name : String ( x . subarray ( i , i = x . indexOf ( 0 , i ) ) ) ,
160
+ name : transform . column . from
161
+ ? transform . column . from ( x . toString ( 'utf8' , i , i = x . indexOf ( 0 , i ) ) )
162
+ : x . toString ( 'utf8' , i , i = x . indexOf ( 0 , i ) ) ,
161
163
type : x . readUInt32BE ( i += 1 ) ,
162
164
parser : parsers [ x . readUInt32BE ( i ) ] ,
163
165
atttypmod : x . readUInt32BE ( i += 4 )
@@ -176,8 +178,7 @@ function parse(x, state, parsers, handle) {
176
178
I : x => { // Insert
177
179
let i = 1
178
180
const relation = state [ x . readUInt32BE ( i ) ]
179
- const row = { }
180
- tuples ( x , row , relation . columns , i += 7 )
181
+ const { row } = tuples ( x , relation . columns , i += 7 , transform )
181
182
182
183
handle ( row , {
183
184
command : 'insert' ,
@@ -189,13 +190,10 @@ function parse(x, state, parsers, handle) {
189
190
const relation = state [ x . readUInt32BE ( i ) ]
190
191
i += 4
191
192
const key = x [ i ] === 75
192
- const row = key || x [ i ] === 79
193
- ? { }
193
+ handle ( key || x [ i ] === 79
194
+ ? tuples ( x , key ? relation . keys : relation . columns , i += 3 , transform ) . row
194
195
: null
195
-
196
- tuples ( x , row , key ? relation . keys : relation . columns , i += 3 )
197
-
198
- handle ( row , {
196
+ , {
199
197
command : 'delete' ,
200
198
relation,
201
199
key
@@ -206,35 +204,36 @@ function parse(x, state, parsers, handle) {
206
204
const relation = state [ x . readUInt32BE ( i ) ]
207
205
i += 4
208
206
const key = x [ i ] === 75
209
- const old = key || x [ i ] === 79
210
- ? { }
207
+ const xs = key || x [ i ] === 79
208
+ ? tuples ( x , key ? relation . keys : relation . columns , i += 3 , transform )
211
209
: null
212
210
213
- old && ( i = tuples ( x , old , key ? relation . keys : relation . columns , i += 3 ) )
211
+ xs && ( i = xs . i )
214
212
215
- const row = { }
216
- tuples ( x , row , relation . columns , i + 3 )
213
+ const { row } = tuples ( x , relation . columns , i + 3 , transform )
217
214
218
215
handle ( row , {
219
216
command : 'update' ,
220
217
relation,
221
218
key,
222
- old
219
+ old : xs && xs . row
223
220
} )
224
221
} ,
225
222
T : ( ) => { /* noop */ } , // Truncate,
226
223
C : ( ) => { /* noop */ } // Commit
227
224
} ) . reduce ( char , { } ) [ x [ 0 ] ] ( x )
228
225
}
229
226
230
- function tuples ( x , row , columns , xi ) {
227
+ function tuples ( x , columns , xi , transform ) {
231
228
let type
232
229
, column
230
+ , value
233
231
232
+ const row = transform . raw ? new Array ( columns . length ) : { }
234
233
for ( let i = 0 ; i < columns . length ; i ++ ) {
235
234
type = x [ xi ++ ]
236
235
column = columns [ i ]
237
- row [ column . name ] = type === 110 // n
236
+ value = type === 110 // n
238
237
? null
239
238
: type === 117 // u
240
239
? undefined
@@ -243,9 +242,18 @@ function tuples(x, row, columns, xi) {
243
242
: column . parser . array === true
244
243
? column . parser ( x . toString ( 'utf8' , xi + 5 , xi += 4 + x . readUInt32BE ( xi ) ) )
245
244
: column . parser ( x . toString ( 'utf8' , xi + 4 , xi += 4 + x . readUInt32BE ( xi ) ) )
245
+
246
+ transform . raw
247
+ ? ( row [ i ] = transform . raw === true
248
+ ? value
249
+ : transform . value . from ? transform . value . from ( value , column ) : value )
250
+ : ( row [ column . name ] = transform . value . from
251
+ ? transform . value . from ( value , column )
252
+ : value
253
+ )
246
254
}
247
255
248
- return xi
256
+ return { i : xi , row : transform . row . from ? transform . row . from ( row ) : row }
249
257
}
250
258
251
259
function parseEvent ( x ) {
0 commit comments