-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
better.js
103 lines (89 loc) · 3.36 KB
/
better.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
var _ = require("./lib")
var Heaven = require("heaven/sync")
var SqliteHeaven = require("./prototype")
var Sql = require("sqlate").Sql
var Sqlite = require("./lib/sqlite")
var sql = require("sqlate")
var insert = require("./lib/sql").insert
var insertAll = require("./lib/sql").insertAll
var insertAllWithMaxVariables = require("./lib/sql").insertAllWithMaxVariables
var update = require("./lib/sql").update
var SQLITE_VERSION
var SQLITE_MAX_VARIABLE_NUMBER
var USE_RETURNING
exports = module.exports = BetterSqliteHeaven
exports.insert = insert
exports.insertAll = insertAll
exports.insertAllWithMaxVariables = insertAllWithMaxVariables
exports.update = update
function BetterSqliteHeaven(model, sqlite, table) {
Heaven.call(this, model)
this.sqlite = sqlite
this.table = table
}
BetterSqliteHeaven.prototype = Object.create(Heaven.prototype, {
constructor: {value: BetterSqliteHeaven, configurable: true, writeable: true}
})
BetterSqliteHeaven.prototype.idColumn = SqliteHeaven.idColumn
BetterSqliteHeaven.prototype.with = SqliteHeaven.with
BetterSqliteHeaven.prototype._search = SqliteHeaven._search
BetterSqliteHeaven.prototype._read = SqliteHeaven._read
BetterSqliteHeaven.prototype.create_ = SqliteHeaven.create_
BetterSqliteHeaven.prototype.typeof = SqliteHeaven.typeof
BetterSqliteHeaven.prototype._create = function(attrs) {
if (USE_RETURNING == null
? (USE_RETURNING = Sqlite.hasReturning(getSqliteVersion(this.sqlite)))
: USE_RETURNING
) return _.flatten(insertAllWithMaxVariables(
SQLITE_MAX_VARIABLE_NUMBER ||
(SQLITE_MAX_VARIABLE_NUMBER = getSqliteMaxVariableNumber(this.sqlite)),
this.table,
attrs
).map((q) => (
this.select(sql`${q} RETURNING *`)
)))
else return attrs.map((attrs) => {
var created = this.execute(insert(this.table, attrs))
return this.select1(sql`
SELECT * FROM ${sql.table(this.table)}
WHERE _rowid_ = ${created.lastInsertRowid}
`)
})
}
BetterSqliteHeaven.prototype._create_ = function(attrs) {
insertAllWithMaxVariables(
SQLITE_MAX_VARIABLE_NUMBER ||
(SQLITE_MAX_VARIABLE_NUMBER = getSqliteMaxVariableNumber(this.sqlite)),
this.table,
attrs
).forEach(this.execute, this)
}
BetterSqliteHeaven.prototype._update = function(query, attrs) {
SqliteHeaven._update.call(this, query, attrs)
}
BetterSqliteHeaven.prototype._delete = function(query, attrs) {
SqliteHeaven._delete.call(this, query, attrs)
}
BetterSqliteHeaven.prototype.select = function(sql) {
if (!(sql instanceof Sql)) throw new TypeError("Not Sql: " + sql)
return this.sqlite.prepare(String(sql)).all(sql.parameters)
}
BetterSqliteHeaven.prototype.select1 = function(sql) {
if (!(sql instanceof Sql)) throw new TypeError("Not Sql: " + sql)
return this.sqlite.prepare(String(sql)).get(sql.parameters)
}
BetterSqliteHeaven.prototype.execute = function(sql) {
if (!(sql instanceof Sql)) throw new TypeError("Not Sql: " + sql)
return this.sqlite.prepare(String(sql)).run(sql.parameters)
}
BetterSqliteHeaven.prototype.return = function(value) { return value }
function getSqliteVersion(sqlite) {
// Better SQLite3 doesn't expose the compiled version like Mapbox's SQLite3
// does: https://github.com/WiseLibs/better-sqlite3/issues/1021
return SQLITE_VERSION == null
? (SQLITE_VERSION = sqlite.prepare("SELECT sqlite_version() AS v").get().v)
: SQLITE_VERSION
}
function getSqliteMaxVariableNumber(sqlite) {
return Sqlite.getMaxVariableNumber(getSqliteVersion(sqlite))
}