You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.5 KiB
68 lines
1.5 KiB
import { NodeAdapterError } from "./node_adapter_error.mjs"; |
|
import { ResponseWrapper } from "./response_wrapper.mjs"; |
|
import { log } from "./log.mjs"; |
|
|
|
|
|
export class QueryWrapper { |
|
constructor(sql, ...args) { |
|
this.sql = sql.trim(); |
|
this.args = args; |
|
this.operation = sql.replace(/[^a-z].*/i, "").toUpperCase(); |
|
} |
|
|
|
isAnyOf(...operations) { |
|
for (const op of operations) { |
|
if(op.toUpperCase() === this.operation) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
execute(db) { |
|
if (this.isAnyOf("INSERT", "UPDATE", "DELETE")) { |
|
return this.executeRun(db); |
|
} else { |
|
return this.executeAll(db); |
|
} |
|
} |
|
|
|
executeRun(db) { |
|
return new Promise((resolve, reject) => { |
|
const self = this; |
|
|
|
log(this.sql); |
|
db.run(this.sql, ...this.args, function (err) { |
|
if (err) { |
|
reject(NodeAdapterError.from(err)); |
|
return; |
|
} |
|
|
|
const result = {}; |
|
|
|
if (self.isAnyOf("INSERT")) { |
|
result.insertId = this.lastID; |
|
} |
|
|
|
if (self.isAnyOf("UPDATE", "DELETE")) { |
|
result.rowsAffected = this.changes; |
|
} |
|
|
|
resolve(ResponseWrapper.success(result)); |
|
}); |
|
}); |
|
} |
|
|
|
executeAll(db) { |
|
return new Promise((resolve, reject) => { |
|
log(this.sql); |
|
db.all(this.sql, ...this.args, function (err, rows) { |
|
if (err) { |
|
reject(NodeAdapterError.from(err)); |
|
return; |
|
} |
|
resolve(ResponseWrapper.success({rows})); |
|
}); |
|
}); |
|
} |
|
} |