generalized update sql templating for create
This commit is contained in:
parent
a3fabc87d2
commit
26311eba3b
123
lib/dbwrap.js
123
lib/dbwrap.js
|
@ -186,13 +186,19 @@ function wrap(db, dir) {
|
||||||
return new PromiseA(function (resolve, reject) {
|
return new PromiseA(function (resolve, reject) {
|
||||||
var json = JSON.stringify(obj);
|
var json = JSON.stringify(obj);
|
||||||
var data = JSON.parse(json);
|
var data = JSON.parse(json);
|
||||||
delete data[idnameCased];
|
|
||||||
json = JSON.stringify(data);
|
|
||||||
|
|
||||||
var sql = "INSERT INTO " + tablename + " (" + idname + ", json) VALUES (?, ?)";
|
var sql;
|
||||||
var values = [id, json];
|
|
||||||
|
|
||||||
db.run(sql, values, function (err) {
|
// removes known fields from data
|
||||||
|
sql = strainUpdate(id, data, function sqlTpl(fieldable) {
|
||||||
|
return "INSERT INTO " + tablename + " (" + fieldable.join(', ') + ", " + idname + ")"
|
||||||
|
//+ " VALUES ('" + vals.join("', '") + "')"
|
||||||
|
+ " VALUES (" + fieldable.map(function () { return '?'; }).join(", ") + ", ?)"
|
||||||
|
;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('[debug] DB.create() sql:', sql);
|
||||||
|
db.run(sql, [], function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
return;
|
return;
|
||||||
|
@ -215,55 +221,78 @@ function wrap(db, dir) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// pull indices from object
|
||||||
|
function strainUpdate(id, data/*, vals*/, cb) {
|
||||||
|
var fieldable = [];
|
||||||
|
var json;
|
||||||
|
var sql;
|
||||||
|
var vals = [];
|
||||||
|
|
||||||
|
(opts.indices || []).forEach(function (col) {
|
||||||
|
if ('string' === typeof col) {
|
||||||
|
col = { name: col, type: 'TEXT' };
|
||||||
|
}
|
||||||
|
if (!col.type) {
|
||||||
|
col.type = 'TEXT';
|
||||||
|
}
|
||||||
|
|
||||||
|
var val = data[camelCase(col.name)];
|
||||||
|
|
||||||
|
//if (col.name in data)
|
||||||
|
if ('undefined' !== typeof val) {
|
||||||
|
/*
|
||||||
|
fieldable.push(
|
||||||
|
db.escape(snakeCase(col.name))
|
||||||
|
+ " = '" + db.escape(val) + "'"
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
fieldable.push(db.escape(snakeCase(col.name)));
|
||||||
|
vals.push(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete data[col.name];
|
||||||
|
delete data[camelCase(col.name)];
|
||||||
|
});
|
||||||
|
|
||||||
|
delete data[idnameCased];
|
||||||
|
|
||||||
|
if (!fieldable.length || Object.keys(data).length) {
|
||||||
|
json = JSON.stringify(data);
|
||||||
|
fieldable.push("json");
|
||||||
|
//fieldable.push("json = '" + db.escape(json) + "'");
|
||||||
|
vals.push(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
vals.push(id);
|
||||||
|
|
||||||
|
sql = cb(fieldable);
|
||||||
|
|
||||||
|
while (vals.length) {
|
||||||
|
sql = sql.replace(/\?/, "'" + db.escape(vals.shift()) + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
DB.set = function (id, obj) {
|
DB.set = function (id, obj) {
|
||||||
var json = JSON.stringify(obj);
|
var json = JSON.stringify(obj);
|
||||||
var data = JSON.parse(json);
|
var data = JSON.parse(json);
|
||||||
|
|
||||||
return new PromiseA(function (resolve, reject) {
|
return new PromiseA(function (resolve, reject) {
|
||||||
var sql;
|
function sqlTpl(fieldable) {
|
||||||
var fieldable = [];
|
// this will always at least have one fieldable value: json
|
||||||
var vals = [];
|
return "UPDATE " + tablename + " SET "
|
||||||
|
+ (fieldable.join(' = ?, ') + " = ?")
|
||||||
(opts.indices || []).forEach(function (col) {
|
+ " WHERE " + idname + " = ?"
|
||||||
if ('string' === typeof col) {
|
;
|
||||||
col = { name: col, type: 'TEXT' };
|
|
||||||
}
|
|
||||||
if (!col.type) {
|
|
||||||
col.type = 'TEXT';
|
|
||||||
}
|
|
||||||
|
|
||||||
var val = data[camelCase(col.name)];
|
|
||||||
|
|
||||||
//if (col.name in data)
|
|
||||||
if ('undefined' !== typeof val) {
|
|
||||||
/*
|
|
||||||
fieldable.push(
|
|
||||||
db.escape(snakeCase(col.name))
|
|
||||||
+ " = '" + db.escape(val) + "'"
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
fieldable.push(db.escape(snakeCase(col.name)) + " = ?");
|
|
||||||
vals.push(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete data[col.name];
|
|
||||||
});
|
|
||||||
delete data[idnameCased];
|
|
||||||
|
|
||||||
json = JSON.stringify(data);
|
|
||||||
fieldable.push("json = ?");
|
|
||||||
//fieldable.push("json = '" + db.escape(json) + "'");
|
|
||||||
vals.push(json);
|
|
||||||
|
|
||||||
vals.push(id);
|
|
||||||
sql = "UPDATE " + tablename + " SET " + fieldable.join(', ') + " WHERE " + idname + " = ?";
|
|
||||||
|
|
||||||
while (vals.length) {
|
|
||||||
sql = sql.replace(/\?/, "'" + db.escape(vals.shift()) + "'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('[debug] sql:', sql);
|
//var vals = [];
|
||||||
db.run(sql, vals, function (err) {
|
// removes known fields from data
|
||||||
|
var sql = strainUpdate(id, data/*, vals*/, sqlTpl);
|
||||||
|
|
||||||
|
console.log('[debug] DB.set() sql:', sql);
|
||||||
|
db.run(sql, /*vals*/[], function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue