UNPKG

3.41 kBJavaScriptView Raw
1var EventEmitter = require('events').EventEmitter
2var inherits = require('util').inherits
3var sqlite3 = require('sqlite3')
4var Transaction = require('any-db-transaction')
5
6module.exports = SQLite3
7
8SQLite3.verbose = sqlite3.verbose;
9SQLite3.name = 'sqlite3'
10
11inherits(SQLite3, EventEmitter)
12function SQLite3(db) {
13 EventEmitter.call(this)
14 this._db = db
15 var self = this
16 this._db.on('open', function () { self.emit('open', self) })
17 this._db.on('close', function () { self.emit('end') })
18 this._db.on('error', function (err) { self.emit('error', err) })
19}
20
21SQLite3.prototype.adapter = 'sqlite3'
22
23SQLite3.createConnection = function (opts, callback) {
24 var filename;
25
26 if (opts.host) {
27 filename = opts.host + (opts.database || '')
28 } else {
29 filename = opts.database
30 }
31
32 if (!filename || filename == '/:memory') filename = ':memory:'
33
34 var mode = Object.keys(opts).map(function (k) {
35 return (k == k.toUpperCase() && sqlite3[k]) | 0;
36 }).reduce(function (mode, flag) {
37 return mode | flag;
38 }, 0)
39
40 if (!mode) mode = (sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE)
41
42 var db = new sqlite3.Database(filename, mode)
43 , adapter = new SQLite3(db)
44
45 if (callback) {
46 db.on('open', function () { callback(null, adapter) })
47 }
48
49 db.serialize()
50
51 return adapter
52}
53
54SQLite3.createQuery = function (text, values, callback) {
55 if (text instanceof Query) return text
56 return new Query(text, values, callback)
57}
58
59SQLite3.prototype.query = function (text, values, callback) {
60 var query = text
61 , rowError = false
62 ;
63
64 if (!(query instanceof Query)) {
65 query = SQLite3.createQuery(text, values, callback);
66 }
67
68 if (query.text.match(/^\s*insert\s+/i)) {
69 this._db.run(
70 query.text,
71 query.values,
72 function onComplete(err) {
73 if (err) return query.handleError(err)
74 var result = { rows: [], rowCount: 0, lastInsertId: this.lastID }
75 if (query._callback) query._callback(null, result)
76 query.emit('end', result)
77 }
78 )
79 }
80 else {
81 this._db.each(
82 query.text,
83 query.values,
84 function onRow(err, row) {
85 if (rowError) return
86 rowError = err
87 query.handleRow(row)
88 },
89 function onComplete(err, count) {
90 if (err || rowError) return query.handleError(err || rowError)
91 var result = {
92 rows: query._rows,
93 rowCount: count,
94 lastInsertId: this.lastID
95 }
96 if (query._callback) query._callback(null, result)
97 query.emit('end', result)
98 }
99 )
100 }
101
102 return query
103}
104
105SQLite3.prototype.begin = function (statement, callback) {
106 return Transaction
107 .begin(SQLite3.createQuery, statement, callback)
108 .setConnection(this)
109}
110
111SQLite3.prototype.end = function (callback) {
112 if (callback) this.on('end', callback)
113 this._db.close()
114}
115
116inherits(Query, EventEmitter)
117function Query(text, values, callback) {
118 EventEmitter.call(this)
119 this._rows = []
120 this._buffer = true
121 this.text = text
122 if (typeof values == 'function') {
123 this._callback = values
124 this.values = []
125 } else {
126 this.values = values
127 this._callback = callback
128 }
129}
130
131Query.prototype.handleRow = function (row) {
132 if (this._callback) this._rows.push(row)
133 this.emit('row', row)
134}
135
136Query.prototype.handleError = function (err) {
137 if (this._callback) this._callback(err)
138 else this.emit('error', err)
139}