diff --git a/database.js b/database.js new file mode 100644 index 0000000..605aad0 --- /dev/null +++ b/database.js @@ -0,0 +1,109 @@ +class DataBase { + + /** + * + * @readonly + */ + static sqlite3 = require('sqlite3').verbose(); + + /** + * + * @readonly + */ + static database = new this.sqlite3.Database('./database/database.db'); + + /** + * + * @param {String[]} keys + * @param {String} table + * @param {String} condition + * @param {Boolean} some + * @param {Function()} callback + */ + static getData(keys, table, condition = '', some = true, callback = () => {}) { + let sql = 'SELECT '; + for (let i = 0; i < keys.length; i++) { + sql += keys[i] === '*' ? keys[i] : '`' + keys[i] + '`'; + if (keys.length > i + 1) + sql += ', '; + } + sql += ' FROM `' + table + '` ' + condition; + + if (some) + this.database.all(sql, (err, rows) => { + callback(err, rows); + }); + else + this.database.get(sql, (err, row) => { + callback(err, row); + }); + }; + + /** + * + * @param {String[]} keys + * @param {Values[]} values + * @param {String} table + * @param {String} condition + * @param {Function()} callback + */ + static updateData(keys, values, table, condition, callback = () => {}) { + let sql = 'UPDATE `' + table + '` SET '; + for (let i = 0; i < keys.length; i++) { + sql += '`' + keys[i] + '` = ' + this.ToString(values[i]); + if (keys.length > i + 1) + sql += ', '; + } + sql += ' ' + condition; + + this.database.run(sql, (err) => { + callback(err); + }); + } + + /** + * @param {String[]} keys + * @param {String[]} values + * @param {String} table + * @param {Function()} callback + */ + static insertData(keys, values, table, callback = () => {}) { + let sql = 'INSERT INTO `' + table + '` ('; + for (let i = 0; i < keys.length; i++) { + sql += '`' + keys[i] + '`'; + if (keys.length > i + 1) + sql += ', '; + } + sql += ') VALUES ('; + for (let i = 0; i < values.length; i++) { + sql += this.ToString(values[i]); + if (values.length > i + 1) + sql += ', '; + } + sql += ')'; + + this.database.run(sql, (err) => { + callback(err); + }); + }; + + /** + * + * @param {String} table + * @param {String} condition + * @param {Function()} callback + */ + static deleteData(table, condition = '', callback = () => {}) { + this.database.run('DELETE FROM `' + table + '` ' + condition, (err) => { + callback(err); + }); + } + + static ToString(value) { + return typeof(value) === 'string' ? '\'' + value + '\'' : value; + } +} + +module.exports = { + database: DataBase +}; diff --git a/index.js b/index.js new file mode 100644 index 0000000..5bdebdb --- /dev/null +++ b/index.js @@ -0,0 +1,148 @@ +// const sqlite3 = require('sqlite3').verbose(); // Пошли в пизду со своим ассинхроном, ублюдки! +const sqlite3 = require('better-sqlite3'); + + +class global_data_Parser{ + getTable(err, rows){ + this.rows = rows; + this.err = err; + // console.log('globalParser:', this.rows); + } +} + + +class SQLEasy_error extends Error { + constructor(code='GENERIC', status=500, ...params) { + super(...params); + if(Error.captureStackTrace) { + Error.captureStackTrace(this, 'SQLEasy_error'); + } + this.code = code; + this.status = status; + } +} + + +class database { + constructor(path){ + this.PATH = path; + // this.db = new sqlite3.Database(this.PATH); // async - heresy! + this.db = new sqlite3(this.PATH); + // Создаём "функции-двойники" + this.getTable = this.getBase; + this.get = this.getTable; + this.select = this.get; + this.set = this.setItem; + this.add = this.insert; + this.update = this.set; + this.remove = this.del; + this.pop = this.del; + this.exec = this.execute; + } + ToString(value) { + return typeof(value) === 'string' ? '\'' + value + '\'' : value; + } + execute(SQLRequest) { + try { + return this.db.prepare(SQLRequest).all(); + } catch(err) { + if(err.message.indexOf('run()') !== -1) { + try { + this.db.prepare(SQLRequest).run(); + return null; + } catch(err) { + throw new Error(`SQLEasy error: ${err.message}`); + } + } + else{ + throw new Error(`SQLEasy error: ${err.message}`); + } + } + } + getBase(table, condition=null, keys='*') { + let SQLRequest = `SELECT ${keys} FROM ${table}`; + if(condition !== null){ + let orBlock = new Array(); + for(let i = 0; i < condition.length; i++){ + let andBlock = new Array(); + for(let key in condition[i]){ + andBlock.push(`${key}=${this.ToString(condition[i][key])}`); + } + orBlock.push(`(${andBlock.join(' AND ')})`); + } + SQLRequest = `${SQLRequest} WHERE ${orBlock.join(' OR ')}`; + } + // console.log(SQLRequest); // Убрать после тестов!! + try { + let rows = this.db.prepare(SQLRequest).all(); + if(rows !== null & rows !== undefined) return rows; + else throw new Error('SQLEasy error: Rows given null.'); + } catch(err) { + if(err.message.indexOf('no such table') !== -1){ + throw new Error('SQLEasy error: this table not founded.'); + } + else throw new Error(`SQLEasy error: ${err.message}`); + } + } + add(table, addvArray, ignore=false){ + this.getBase(table); + let SQLRequest = new Array(); + for(let i = 0; i < addvArray.length; i++) { + let addObject = addvArray[i]; + let keys = new Array(); + let values = new Array(); + for(let key in addObject){ + keys.push(key); + values.push(this.ToString(addObject[key])); + } + let op = 'INSERT'; + if(ignore) op = 'INSERT OR IGNORE'; + SQLRequest.push(`${op} INTO ${table} (${keys.join(', ')}) VALUES (${values.join(', ')});`); + } + SQLRequest = SQLRequest.join('\n'); + try{ + this.db.prepare(SQLRequest).run(); + } catch(err){ + if(ignore) throw new Error(`SQLEasy error: ${err.message}`); + else this.add(table, addvArray, true); + } + } + del(table, index){ + this.get(table); + let equal_req = ''; + for(let key in index) { + equal_req = `${key} = ${this.ToString(index[key])}`; + break; + } + let SQLRequest = `DELETE FROM ${table} WHERE ${equal_req}`; + try { + this.db.prepare(SQLRequest).run(); + } catch(err) { + throw new Error(`SQLEasy error: ${err.message}`); + } + } + setItem(table, index, values){ + this.getBase(table); + let equal_index = ''; + let equal_values = ''; + for(let key in index){ + equal_index = `${key} = ${this.ToString(index[key])}`; + break; + } + for(let key in values){ + equal_values = `${key} = ${this.ToString(values[key])}`; + break; + } + let SQLRequest = `UPDATE ${table} SET ${equal_values} WHERE ${equal_index}`; + try { + this.db.prepare(SQLRequest).run(); + } catch(err) { + throw new Error(`SQLEasy error: ${err.message}`); + } + } +} + + +module.exports = { + database: database +};