Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1822f399d2 | ||
|
|
208861d057 | ||
|
|
1957554301 | ||
|
|
bef3ba5fcd | ||
|
|
591a11c955 | ||
|
|
b40918ddb8 | ||
|
|
b8946265c3 | ||
|
|
d649905dbb | ||
|
|
22da85448e | ||
|
|
531f72dcb3 |
@@ -37,7 +37,6 @@ var pg = require('pg');
|
||||
var copyFrom = require('pg-copy-streams').from;
|
||||
|
||||
pg.connect(function(err, client, done) {
|
||||
var text = 'COPY my_table FROM STDIN';
|
||||
var stream = client.query(copyFrom('COPY my_table FROM STDIN'));
|
||||
var fileStream = fs.createReadStream('some_file.tdv')
|
||||
fileStream.pipe(stream);
|
||||
|
||||
19
copy-to.js
19
copy-to.js
@@ -8,18 +8,23 @@ var util = require('util')
|
||||
var CopyStreamQuery = function(text) {
|
||||
Transform.call(this)
|
||||
this.text = text
|
||||
this._listeners = null
|
||||
this._listeners = {}
|
||||
this._copyOutResponse = null
|
||||
this.rowCount = 0
|
||||
}
|
||||
|
||||
util.inherits(CopyStreamQuery, Transform)
|
||||
|
||||
var eventTypes = ['close', 'data', 'end', 'error']
|
||||
|
||||
CopyStreamQuery.prototype.submit = function(connection) {
|
||||
connection.query(this.text)
|
||||
this.connection = connection
|
||||
this._listeners = connection.stream.listeners('data')
|
||||
connection.stream.removeAllListeners('data')
|
||||
var self = this
|
||||
eventTypes.forEach(function(type) {
|
||||
self._listeners[type] = connection.stream.listeners(type)
|
||||
connection.stream.removeAllListeners(type)
|
||||
})
|
||||
connection.stream.pipe(this)
|
||||
}
|
||||
|
||||
@@ -32,10 +37,12 @@ var code = {
|
||||
|
||||
CopyStreamQuery.prototype._detach = function() {
|
||||
this.connection.stream.unpipe()
|
||||
this.connection.stream.removeAllListeners('data')
|
||||
var self = this
|
||||
this._listeners.forEach(function(listener) {
|
||||
self.connection.stream.on('data', listener)
|
||||
eventTypes.forEach(function(type) {
|
||||
self.connection.stream.removeAllListeners(type)
|
||||
self._listeners[type].forEach(function(listener) {
|
||||
self.connection.stream.on(type, listener)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pg-copy-streams",
|
||||
"version": "0.2.1",
|
||||
"version": "0.2.3",
|
||||
"description": "Low-Level COPY TO and COPY FROM streams for PostgreSQL in JavaScript using",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
@@ -27,6 +27,7 @@
|
||||
"concat-stream": "~1.1.0",
|
||||
"gonna": "0.0.0",
|
||||
"lodash": "~2.2.1",
|
||||
"heroku-env": "~0.1.1"
|
||||
"heroku-env": "~0.1.1",
|
||||
"async": "~0.2.10"
|
||||
}
|
||||
}
|
||||
|
||||
65
test/binary.js
Normal file
65
test/binary.js
Normal file
@@ -0,0 +1,65 @@
|
||||
var assert = require('assert')
|
||||
var gonna = require('gonna')
|
||||
|
||||
var async = require('async')
|
||||
var concat = require('concat-stream')
|
||||
var _ = require('lodash')
|
||||
var pg = require('pg.js')
|
||||
|
||||
var from = require('../').from
|
||||
var to = require('../').to
|
||||
|
||||
var testBinaryCopy = function() {
|
||||
var client = function() {
|
||||
var client = new pg.Client()
|
||||
client.connect()
|
||||
return client
|
||||
}
|
||||
|
||||
var fromClient = client()
|
||||
var toClient = client()
|
||||
|
||||
queries = [
|
||||
'CREATE TABLE data (num BIGINT, word TEXT)',
|
||||
'INSERT INTO data (num, word) VALUES (1, \'hello\'), (2, \'other thing\'), (3, \'goodbye\')',
|
||||
'CREATE TABLE data_copy (LIKE data INCLUDING ALL)'
|
||||
]
|
||||
|
||||
async.eachSeries(queries, _.bind(fromClient.query, fromClient), function(err) {
|
||||
assert.ifError(err)
|
||||
|
||||
var fromStream = fromClient.query(to('COPY (SELECT * FROM data) TO STDOUT BINARY'))
|
||||
var toStream = toClient.query(from('COPY data_copy FROM STDIN BINARY'))
|
||||
|
||||
runStream = function(callback) {
|
||||
fromStream.on('error', callback)
|
||||
toStream.on('error', callback)
|
||||
toStream.on('finish', callback)
|
||||
fromStream.pipe(toStream)
|
||||
}
|
||||
runStream(function(err) {
|
||||
assert.ifError(err)
|
||||
|
||||
toClient.query('SELECT * FROM data_copy ORDER BY num', function(err, res){
|
||||
assert.equal(res.rowCount, 3, 'expected 3 rows but got ' + res.rowCount)
|
||||
assert.equal(res.rows[0].num, 1)
|
||||
assert.equal(res.rows[0].word, 'hello')
|
||||
assert.equal(res.rows[1].num, 2)
|
||||
assert.equal(res.rows[1].word, 'other thing')
|
||||
assert.equal(res.rows[2].num, 3)
|
||||
assert.equal(res.rows[2].word, 'goodbye')
|
||||
queries = [
|
||||
'DROP TABLE data',
|
||||
'DROP TABLE data_copy'
|
||||
]
|
||||
async.each(queries, _.bind(fromClient.query, fromClient), function(err) {
|
||||
assert.ifError(err)
|
||||
fromClient.end()
|
||||
toClient.end()
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
testBinaryCopy()
|
||||
@@ -1,20 +1,21 @@
|
||||
var assert = require('assert')
|
||||
var gonna = require('gonna')
|
||||
|
||||
var concat = require('concat-stream')
|
||||
var _ = require('lodash')
|
||||
var async = require('async')
|
||||
var concat = require('concat-stream')
|
||||
var pg = require('pg.js')
|
||||
|
||||
var copy = require('../').to
|
||||
|
||||
var client = function() {
|
||||
var client = new pg.Client()
|
||||
client.connect()
|
||||
return client
|
||||
}
|
||||
|
||||
var testRange = function(top) {
|
||||
var client = function() {
|
||||
var client = new pg.Client()
|
||||
client.connect()
|
||||
return client
|
||||
}
|
||||
|
||||
var fromClient = client()
|
||||
var copy = require('../').to
|
||||
|
||||
var txt = 'COPY (SELECT * from generate_series(0, ' + (top - 1) + ')) TO STDOUT'
|
||||
|
||||
var stream = fromClient.query(copy(txt))
|
||||
@@ -32,3 +33,28 @@ var testRange = function(top) {
|
||||
}
|
||||
|
||||
testRange(10000)
|
||||
|
||||
var testLeak = function(rounds) {
|
||||
var fromClient = client()
|
||||
var txt = 'COPY (SELECT 10) TO STDOUT'
|
||||
|
||||
var runStream = function(num, callback) {
|
||||
var stream = fromClient.query(copy(txt))
|
||||
stream.on('data', function(data) {
|
||||
// Just throw away the data.
|
||||
})
|
||||
stream.on('end', callback)
|
||||
stream.on('error', callback)
|
||||
}
|
||||
|
||||
async.timesSeries(rounds, runStream, function(err) {
|
||||
assert.equal(err, null)
|
||||
assert.equal(fromClient.connection.stream.listeners('close').length, 0)
|
||||
assert.equal(fromClient.connection.stream.listeners('data').length, 1)
|
||||
assert.equal(fromClient.connection.stream.listeners('end').length, 2)
|
||||
assert.equal(fromClient.connection.stream.listeners('error').length, 1)
|
||||
fromClient.end()
|
||||
})
|
||||
}
|
||||
|
||||
testLeak(5)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
require('./copy-from')
|
||||
require('./copy-to')
|
||||
require('./binary')
|
||||
|
||||
Reference in New Issue
Block a user