database.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. const sqlite3 = require('sqlite3')
  2. ,createAccountTable = require('./accounts.js').createTable;
  3. const DB_PATH = __dirname +"/../database.sqlite";
  4. function Database() {
  5. this.db = null;
  6. };
  7. Database.prototype.initDb = function(cb) {
  8. var self = this;
  9. if (self.db) {
  10. cb(null);
  11. } else {
  12. self.db = new sqlite3.Database(DB_PATH, sqlite3.OPEN_READWRITE, (err) => {
  13. if (err) {
  14. if (err.code === "SQLITE_CANTOPEN") {
  15. self.db = new sqlite3.Database(DB_PATH, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
  16. if (!err) {
  17. self.createAllTables([
  18. createAccountTable
  19. ], 0, cb);
  20. } else {
  21. cb(err);
  22. }
  23. });
  24. } else {
  25. cb(err);
  26. }
  27. } else {
  28. cb(null);
  29. }
  30. });
  31. }
  32. };
  33. Database.prototype.createAllTables = function(factories, i, cb) {
  34. var self = this;
  35. if (factories[i]) {
  36. factories[i](self.db, (err) => {
  37. if (!err)
  38. self.createAllTables(factories, ++i, cb);
  39. else
  40. cb(err);
  41. });
  42. } else {
  43. cb(null);
  44. }
  45. };
  46. Database.prototype.query = function(table, fields, cb) {
  47. var args = [];
  48. for (var i in fields)
  49. args.push(fields[i]);
  50. this.db.all("SELECT * FROM `" +table +"` WHERE `" +Object.keys(fields).join("`=? AND") +"`=?", args, (err, rows) => {
  51. if (err) {
  52. console.warn(err);
  53. cb(err, null);
  54. } else {
  55. cb(null, rows);
  56. }
  57. });
  58. };
  59. Database.prototype.queryFirst = function(table, fields, cb) {
  60. var args = [];
  61. for (var i in fields)
  62. args.push(fields[i]);
  63. this.db.get("SELECT * FROM `" +table +"` WHERE `" +Object.keys(fields).join("`=? AND") +"`=?", args, (err, row) => {
  64. if (err) {
  65. console.warn(err);
  66. cb(err, null);
  67. } else {
  68. cb(null, row || null);
  69. }
  70. });
  71. };
  72. Database.prototype.insert = function(table, data, cb) {
  73. var args = []
  74. ,keys = []
  75. ,templateArgs = [];
  76. for (var i in data) {
  77. keys.push('`' +i +'`');
  78. args.push(data[i]);
  79. templateArgs.push('?');
  80. }
  81. this.db.run("INSERT INTO " +table +" ("+ keys.join(",") +") VALUES(" +templateArgs.join(', ') +")", args, function(err) {
  82. if (err) {
  83. console.error(err);
  84. cb(null);
  85. }
  86. cb(this.lastID);
  87. });
  88. };
  89. Database.prototype.update = function(table, id, data, cb) {
  90. var args = [];
  91. for (var i in fields)
  92. args.push(fields[i]);
  93. args.push(id);
  94. this.db.run("UPDATE " +table +" SET `" +Object.keys(data).join("`=?,") +"`=? WHERE id=?", args, (err) => {
  95. if (err) {
  96. console.error(err);
  97. }
  98. cb();
  99. });
  100. };
  101. const singleton = new Database();
  102. module.exports.database = singleton;