Skip to content

Commit 54204f6

Browse files
committed
Move large object to own file
1 parent dbb668c commit 54204f6

File tree

2 files changed

+72
-71
lines changed

2 files changed

+72
-71
lines changed

src/index.js

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os from 'os'
22
import fs from 'fs'
3-
import Stream from 'stream'
43

54
import {
65
mergeUserTypes,
@@ -21,6 +20,7 @@ import { Query, CLOSE } from './query.js'
2120
import Queue from './queue.js'
2221
import { Errors, PostgresError } from './errors.js'
2322
import Subscribe from './subscribe.js'
23+
import largeObject from './large.js'
2424

2525
Object.assign(Postgres, {
2626
PostgresError,
@@ -56,7 +56,7 @@ function Postgres(a, b) {
5656

5757
Object.assign(sql, {
5858
get parameters() { return options.parameters },
59-
largeObject,
59+
largeObject: largeObject.bind(null, sql),
6060
subscribe,
6161
CLOSE,
6262
END: CLOSE,
@@ -246,75 +246,6 @@ function Postgres(a, b) {
246246
}
247247
}
248248

249-
function largeObject(oid, mode = 0x00020000 | 0x00040000) {
250-
return new Promise(async(resolve, reject) => {
251-
await sql.begin(async sql => {
252-
let finish
253-
!oid && ([{ oid }] = await sql`select lo_creat(-1) as oid`)
254-
const [{ fd }] = await sql`select lo_open(${ oid }, ${ mode }) as fd`
255-
256-
const lo = {
257-
writable,
258-
readable,
259-
close : () => sql`select lo_close(${ fd })`.then(finish),
260-
tell : () => sql`select lo_tell64(${ fd })`,
261-
read : (x) => sql`select loread(${ fd }, ${ x }) as data`,
262-
write : (x) => sql`select lowrite(${ fd }, ${ x })`,
263-
truncate : (x) => sql`select lo_truncate64(${ fd }, ${ x })`,
264-
seek : (x, whence = 0) => sql`select lo_lseek64(${ fd }, ${ x }, ${ whence })`,
265-
size : () => sql`
266-
select
267-
lo_lseek64(${ fd }, location, 0) as position,
268-
seek.size
269-
from (
270-
select
271-
lo_lseek64($1, 0, 2) as size,
272-
tell.location
273-
from (select lo_tell64($1) as location) tell
274-
) seek
275-
`
276-
}
277-
278-
resolve(lo)
279-
280-
return new Promise(async r => finish = r)
281-
282-
async function readable({
283-
highWaterMark = 2048 * 8,
284-
start = 0,
285-
end = Infinity
286-
} = {}) {
287-
let max = end - start
288-
start && await lo.seek(start)
289-
return new Stream.Readable({
290-
highWaterMark,
291-
async read(size) {
292-
const l = size > max ? size - max : size
293-
max -= size
294-
const [{ data }] = await lo.read(l)
295-
this.push(data)
296-
if (data.length < size)
297-
this.push(null)
298-
}
299-
})
300-
}
301-
302-
async function writable({
303-
highWaterMark = 2048 * 8,
304-
start = 0
305-
} = {}) {
306-
start && await lo.seek(start)
307-
return new Stream.Writable({
308-
highWaterMark,
309-
write(chunk, encoding, callback) {
310-
lo.write(chunk).then(() => callback(), callback)
311-
}
312-
})
313-
}
314-
}).catch(reject)
315-
})
316-
}
317-
318249
function json(x) {
319250
return new Parameter(x, 3802)
320251
}

src/large.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import Stream from 'stream'
2+
3+
export default function largeObject(sql, oid, mode = 0x00020000 | 0x00040000) {
4+
return new Promise(async(resolve, reject) => {
5+
await sql.begin(async sql => {
6+
let finish
7+
!oid && ([{ oid }] = await sql`select lo_creat(-1) as oid`)
8+
const [{ fd }] = await sql`select lo_open(${ oid }, ${ mode }) as fd`
9+
10+
const lo = {
11+
writable,
12+
readable,
13+
close : () => sql`select lo_close(${ fd })`.then(finish),
14+
tell : () => sql`select lo_tell64(${ fd })`,
15+
read : (x) => sql`select loread(${ fd }, ${ x }) as data`,
16+
write : (x) => sql`select lowrite(${ fd }, ${ x })`,
17+
truncate : (x) => sql`select lo_truncate64(${ fd }, ${ x })`,
18+
seek : (x, whence = 0) => sql`select lo_lseek64(${ fd }, ${ x }, ${ whence })`,
19+
size : () => sql`
20+
select
21+
lo_lseek64(${ fd }, location, 0) as position,
22+
seek.size
23+
from (
24+
select
25+
lo_lseek64($1, 0, 2) as size,
26+
tell.location
27+
from (select lo_tell64($1) as location) tell
28+
) seek
29+
`
30+
}
31+
32+
resolve(lo)
33+
34+
return new Promise(async r => finish = r)
35+
36+
async function readable({
37+
highWaterMark = 2048 * 8,
38+
start = 0,
39+
end = Infinity
40+
} = {}) {
41+
let max = end - start
42+
start && await lo.seek(start)
43+
return new Stream.Readable({
44+
highWaterMark,
45+
async read(size) {
46+
const l = size > max ? size - max : size
47+
max -= size
48+
const [{ data }] = await lo.read(l)
49+
this.push(data)
50+
if (data.length < size)
51+
this.push(null)
52+
}
53+
})
54+
}
55+
56+
async function writable({
57+
highWaterMark = 2048 * 8,
58+
start = 0
59+
} = {}) {
60+
start && await lo.seek(start)
61+
return new Stream.Writable({
62+
highWaterMark,
63+
write(chunk, encoding, callback) {
64+
lo.write(chunk).then(() => callback(), callback)
65+
}
66+
})
67+
}
68+
}).catch(reject)
69+
})
70+
}

0 commit comments

Comments
 (0)