1 | var EventEmitter = require('events').EventEmitter
|
2 | var inherits = require('util').inherits
|
3 | var sqlite3 = require('sqlite3')
|
4 | var Transaction = require('any-db-transaction')
|
5 |
|
6 | module.exports = SQLite3
|
7 |
|
8 | SQLite3.verbose = sqlite3.verbose;
|
9 | SQLite3.name = 'sqlite3'
|
10 |
|
11 | inherits(SQLite3, EventEmitter)
|
12 | function 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 |
|
21 | SQLite3.prototype.adapter = 'sqlite3'
|
22 |
|
23 | SQLite3.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 |
|
54 | SQLite3.createQuery = function (text, values, callback) {
|
55 | if (text instanceof Query) return text
|
56 | return new Query(text, values, callback)
|
57 | }
|
58 |
|
59 | SQLite3.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 |
|
105 | SQLite3.prototype.begin = function (statement, callback) {
|
106 | return Transaction
|
107 | .begin(SQLite3.createQuery, statement, callback)
|
108 | .setConnection(this)
|
109 | }
|
110 |
|
111 | SQLite3.prototype.end = function (callback) {
|
112 | if (callback) this.on('end', callback)
|
113 | this._db.close()
|
114 | }
|
115 |
|
116 | inherits(Query, EventEmitter)
|
117 | function 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 |
|
131 | Query.prototype.handleRow = function (row) {
|
132 | if (this._callback) this._rows.push(row)
|
133 | this.emit('row', row)
|
134 | }
|
135 |
|
136 | Query.prototype.handleError = function (err) {
|
137 | if (this._callback) this._callback(err)
|
138 | else this.emit('error', err)
|
139 | }
|