Compare commits

..

No commits in common. "main" and "legacy" have entirely different histories.
main ... legacy

8 changed files with 381 additions and 1251 deletions

310
README.md
View File

@ -1,137 +1,173 @@
# SQLEasy library **WARNING!!!** It's a legacy version of current library! *Do not use in release product!!*
This library was written from simple work with databases. In current version supported next famous databases: sqlite3 and MySQL. In future, list with supported databases will be replenishing.
## Prepare to work # SQLEasy.js
Before you use this module you must install it. module for simple works from sqlite3 (JavaScript edition)
```bash ## Prepare for work (install from github)
npm install sql-easy-lib --save Use npm from install in your project:
``` ```bash
and you can include it! npm install sql-easy-lib
```node ```
const SQLEasy = require('sql-easy-lib'); import database object in your project
``` ``` javascript
## Tools and main objects const SQLEasy = require('sql-easy-lib');
Before work, you must know about twice main tools: **get_from_key** and **Request**. var database = new SQLEasy.database('/path/to/database.db');
```node ```
const SQLEasy = require('sql-easy-lib'); This object have 4 methods: add, remove, set, get
## Prepare for work (install from github)
var req = new SQLEasy.Request([{id: 1, value: 12}, {name: 'CirillaGif'}]); My module use module **better-sqlite3**, you must download it.
/* This is boolean operation: "(id=1 AND value=12) OR (name=`CirillaGif`)" */ ```bash
var get_from_key = SQLEasy.tools.get_from_key; npm install better-sqlite3
/* get_from_key function, about him in down. */ ```
``` from next, you can download folder of project, and load in folder "node_modules"
**Request** use from create logic expression ``` bash
*example:* cd node_modules
```node git clone https://github.com/Nikiroy78/SQLEasy.js.git
// ... ```
new SQLEasy.Request([{id: 1, value: 12}, {name: 'CirillaGif'}]); import database object in your project
``` ``` javascript
```mysql const SQLEasy = require('SQLEasy.js');
(id=1 AND value=12) OR (name=`CirillaGif`) var database = new SQLEasy.database('/path/to/database.db');
``` ```
**get_from_key** use for more efficient queries from buffer variables. This object have 4 methods: add, remove, set, get
*example:* ## Methods of SQLEasy object
```node ### get
// Without use get_from_key This method getting date from included database
const SQLEasy = require('sql-easy-lib'); ```javascript
var database = new SQLEasy.SQLite3_database('/path/to/database.db'); const sqlite = require('SQLEasy.js');
var rolesData = database.get('users').map(i => { var database = sqlite.database('/path/to/database.db');
return {
user: i, console.log(database.get('table'));
role_data: database.get('role', new SQLEasy.Request([{id: i.role}])) ```
} output...
}); ``` javascript
``` [{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 2, 'content': 'Content number 3 :)'}, {'ID': 3, 'content': 'etc.'}]
```node ```
// With use get_from_key
const SQLEasy = require('sql-easy-lib'); You can apply condition's settings from filt your data...
var database = new SQLEasy.SQLite3_database('/path/to/database.db'); ```javascript
var roleData = database.get('role', new SQLEasy.Request([{id: i.role}])); const sqlite = require('SQLEasy.js');
var rolesData = database.get('users').map(i => { var database = sqlite.database('/path/to/database.db');
return {
user: i, console.log(database.get('table', [{'ID': 0}, {'content': 'etc.'}]));
role_data: SQLEasy.tools.get_from_key(roleData, new SQLEasy.Request([{id: i.role}])) ```
} output...
}); ``` javascript
``` [{'ID': 0, 'content': 'content 1'}, {'ID': 3, 'content': 'etc.'}]
## Methods of databases ```
In all databases methods is equally *(except for the connection)*. Response show is...
```node ```SQL
const SQLEasy = require('sql-easy-lib'); SELECT * FROM table WHERE (ID=0) OR (content='etc.')
/* Method for connection sqlite3 database */ ```
var sqlite3 = new SQLEasy.SQLite3_database('/path/to/database.db'); And you edit uploaded columns
/* Method for connection MySQL database */ ```javascript
var mysql = new SQLEasy.MySQL_database({ const sqlite = require('SQLEasy.js');
host: "mysql.example.org", var database = sqlite.database('/path/to/database.db');
user: "username",
password: "password" console.log(database.get('table', [{'ID': 0}, {'content': 'etc.'}], 'content'));
}); ```
mysql.set_db("Example_db"); // setting database in server output...
``` ``` javascript
*(for example, we use abstract database object):* **database** [{'content': 'content 1'}, {'content': 'etc.'}]
```node ```
const SQLEasy = require('sql-easy-lib'); Response show is...
```SQL
var database = new SQLEasy.AnyDatabase(args); SELECT content FROM table WHERE (ID=0) OR (content='etc.')
``` ```
### get ### add
This is getting items from table: This is sql response
```mysql ```SQL
SELECT INSERT
``` ```
*syntax:* Using add method in your code (from your simply, we used old date from last database).
```node ```javascript
database.get( const sqlite = require('SQLEasy.js');
'table_name', var database = sqlite.database('/path/to/database.db');
new SQLEasy.Request([{param: 'value'}]), // Not required: ...WHERE (CONDITION) in request
'*' // Not required: Items in table database.add('table', [{'ID': 4, 'content': 'test example, from fucking tests :)'}])
); console.log(database.get('table'));
``` ```
```mysql output...
SELECT * FROM table_name WHERE (param=`value`) ```javascript
``` [{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 2, 'content': 'Content number 3 :)'}, {'ID': 3, 'content': 'etc.'}, {'ID': 4, 'content': 'test example, from fucking tests :)'}]
### set ```
This is set values in items in table: ### remove
```mysql Using remove method in your code (from your simply, we used old date from last database).
UPDATE .. SET ```javascript
``` const sqlite = require('SQLEasy.js');
*syntax:* var database = sqlite.database('/path/to/database.db');
```node
database.set( database.remove('table', {'ID': 4});
'table_name', console.log(database.get('table'));
new SQLEasy.Request([{param: 'value_require_edit'}]), // Required: ...WHERE (CONDITION) in request ```
{param: 'value'} // Required: Items in table output...
); ```javascript
``` [{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 2, 'content': 'Content number 3 :)'}, {'ID': 3, 'content': 'etc.'}]
```mysql ```
UPDATE table_name SET param=`value` WHERE (param=`value_require_edit`) ### set
``` Using set method in your code (from your simply, we used old date from last database).
### remove ```javascript
This method for remove items into database. const sqlite = require('SQLEasy.js');
```mysql var database = sqlite.database('/path/to/database.db');
DELETE
``` database.set('table', {'ID': 3}, {'content': 'edited'}); // First param - index key, found param - edit content...
*syntax:* console.log(database.get('table'));
```node ```
database.remove( output...
'table_name', ```javascript
new SQLEasy.Request([{param: 'value'}]) // Required: ...WHERE (CONDITION) in request [{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 2, 'content': 'Content number 3 :)'}, {'ID': 3, 'content': 'edited'}]
); ```
``` ### execute
```mysql This is important method from execute your SQL script in your code.
DELETE FROM table_name WHERE (param=`value_require_edit`) Using method **execute** in test code (from your simply, we used old date from last database).
``` ```javascript
### add const sqlite = require('SQLEasy.js');
Method for add items into database. var database = sqlite.database('/path/to/database');
```mysql
INSERT var data = database.execute('SELECT * FROM table');
``` console.log(data);
*syntax:* ```
```node output...
database.add( ```javascript
'table_name', [{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 2, 'content': 'Content number 3 :)'}, {'ID': 3, 'content': 'etc.'}]
[{param: 'value'}] // Required: ... Rows what you add in table. ```
); ### getIndex
``` Use this method from getting index value.
```mysql ```javascript
INSERT INTO table_name (param) VALUES (`value`) const sqlite = require('SQLEasy.js');
``` var database = sqlite.database('/path/to/database.db');
console.log(database.get('table'));
console.log(database.getIndex('table', 'ID'));
```
output...
```javascript
[{'ID': 0, 'content': 'content 1'}, {'ID': 1, 'content': 'other content'}, {'ID': 3, 'content': 'Content number 3 :)'}, {'ID': 4, 'content': 'edited'}]
2
```
## Other functions that you can use in this module
### get_from_key
This function needs from works data in buffer.
The main advantage of this method is that you do not need to request data from the database every time, it is enough to use the data uploaded to memory:
```javascript
// Legacy method!
const sqlite = require('SQLEasy.js');
var database = sqlite.database('/path/to/database.db');
var rolesData = database.get('users').map(i => {
return {
user: i,
role_data: database.get('role', [{id: i.role}])
}
});
```
```javascript
// New method!
const sqlite = require('SQLEasy.js');
var database = sqlite.database('/path/to/database.db');
var roleData = database.get('role', [{id: i.role}]);
var rolesData = database.get('users').map(i => {
return {
user: i,
role_data: sqlite.get_from_key(roleData, [{id: i.role}])
}
});
```

View File

@ -1,92 +0,0 @@
function get_from_key (db_data, conditions) {
conditions = conditions.requestElements.filter(i => i != {});
if (conditions == [] || !conditions) return db_data;
let item = new Object();
let bool_conditions = new Array();
let condition_item = new Object();
let int_condition = 1;
let out_objs = new Array();
for (let i in db_data) {
bool_conditions = new Array();
item = db_data[i];
for (let index in conditions) {
int_condition = 1;
condition_item = conditions[index];
for (key in condition_item) {
int_condition *= Number(item[key] == condition_item[key]);
}
bool_conditions.push(int_condition);
}
if (bool_conditions.reduce((a, b) => Boolean(a + b))) out_objs.push(item);
}
return out_objs;
}
class SQLEasy_error extends Error {
constructor(message) {
super(message);
this.name = "SQLEasy_error";
}
}
class Request {
constructor (construction) {
if (typeof(construction) != 'object') throw SQLEasy_error('in Request you can use only object type');
try {
construction.map(i => i);
this.requestElements = construction;
}
catch (err) {
this.requestElements = [construction];
}
}
toString (query_funct = (value) => '?') {
let values = new Array();
return { str: this.requestElements.map(items => {
let queries = new Array();
for (let key in items) {
queries.push(`${key}=${query_funct(items[key])}`);
values.push(items[key]);
}
return `(${queries.join(' AND ')})`;
}).join(' OR '), values: values};
}
}
class db {
constructor () {
// get
this.getTable = this.get;
this.getBase = this.get;
this.select = this.get;
// set
this.update = this.set;
this.setItem = this.set;
// add
this.insert = this.add;
this.push = this.add;
this.append = this.add;
// remove
this.del = this.remove;
this.pop = this.remove;
}
}
module.exports = {
Request: Request,
SQLEasy_error: SQLEasy_error,
get_from_key: get_from_key,
Database: db
}

432
index.js
View File

@ -1,233 +1,199 @@
const mysql = require('./mysql'); const sqlite3 = require('better-sqlite3');
const sqlite = require('./sqlite3');
const sqleasy_tools = require('./SQLEasyTools');
class global_data_Parser{
getTable(err, rows){
/*class legacy_sqlite3_db extends sqlite.database { this.rows = rows;
constructor (path, warning=true) { this.err = err;
super(path, warning); // console.log('globalParser:', this.rows);
console.log('You use legacy method of connect to sqlite3 database. If you want use actual method, then use "new SQLite3_database(\'/path/to/database.db\');"'); }
console.log('This connection method can be deactivated in next versions!!'); }
}
}*/
class SQLEasy_error extends Error {
constructor(code='GENERIC', status=500, ...params) {
/*module.exports = { super(...params);
// database: legacy_sqlite3_db, // turn off legacy method of create db if(Error.captureStackTrace) {
SQLite3_database: sqlite.database, Error.captureStackTrace(this, 'SQLEasy_error');
MySQL_database: mysql.mysql_database, }
this.code = code;
Request: sqleasy_tools.Request, this.status = status;
tools: { }
get_from_key: sqleasy_tools.get_from_key }
}
}*/
const sqlite3 = require('better-sqlite3'); function get_from_key (db_data, conditions) {
conditions = conditions.filter(i => i != {});
if (conditions == [] || !conditions) return db_data;
class global_data_Parser{ let item = new Object();
getTable(err, rows){ let bool_conditions = new Array();
this.rows = rows; let condition_item = new Object();
this.err = err; let int_condition = 1;
// console.log('globalParser:', this.rows);
} let out_objs = new Array();
}
for (let i in db_data) {
bool_conditions = new Array();
class SQLEasy_error extends Error { item = db_data[i];
constructor(code='GENERIC', status=500, ...params) {
super(...params); for (let index in conditions) {
if(Error.captureStackTrace) { int_condition = 1;
Error.captureStackTrace(this, 'SQLEasy_error'); condition_item = conditions[index];
} for (key in condition_item) {
this.code = code; int_condition *= Number(item[key] == condition_item[key]);
this.status = status; }
} bool_conditions.push(int_condition);
} }
if (bool_conditions.reduce((a, b) => Boolean(a + b))) out_objs.push(item);
}
function get_from_key (db_data, conditions) {
conditions = conditions.filter(i => i != {}); return out_objs;
if (conditions == [] || !conditions) return db_data; }
let item = new Object();
let bool_conditions = new Array();
let condition_item = new Object(); class database {
let int_condition = 1; constructor(path, warning=true){
if (warning) echo("You use LEGACY version of SQLEasy library (v. 0.9.1). In new version structure was been edited. Show more in: https://www.npmjs.com/package/sql-easy-lib");
let out_objs = new Array(); this.PATH = path;
// this.db = new sqlite3.Database(this.PATH); // async - heresy!
for (let i in db_data) { this.db = new sqlite3(this.PATH);
bool_conditions = new Array(); // Создаём "функции-двойники"
item = db_data[i]; this.getTable = this.getBase;
this.get = this.getTable;
for (let index in conditions) { this.select = this.get;
int_condition = 1; this.set = this.setItem;
condition_item = conditions[index]; this.insert = this.add;
for (key in condition_item) { this.update = this.set;
int_condition *= Number(item[key] == condition_item[key]); this.remove = this.del;
} this.pop = this.del;
bool_conditions.push(int_condition); this.exec = this.execute;
} }
if (bool_conditions.reduce((a, b) => Boolean(a + b))) out_objs.push(item); ToString(value) {
} return typeof(value) === 'string' ? '\'' + value + '\'' : value;
}
return out_objs; getIndex (table, indexColumn, index_starts = 0) {
} // return this.get(table).length;
let tableData = this.get(table).sort((a, b) => a[indexColumn] - b[indexColumn]);
let index = index_starts - 1;
class database { for (let i in tableData) {
constructor(path, warning=true){ if (index_starts <= i) {
if (warning) console.log("You use LEGACY version of SQLEasy library (v. 0.9.1). In new version structure was been edited. Show more in: https://www.npmjs.com/package/sql-easy-lib"); if (i != tableData[i][indexColumn]) return i;
this.PATH = path; index = i;
// this.db = new sqlite3.Database(this.PATH); // async - heresy! }
this.db = new sqlite3(this.PATH); }
// Создаём "функции-двойники" return Number(index) + 1;
this.getTable = this.getBase; }
this.get = this.getTable; execute(SQLRequest) {
this.select = this.get; try {
this.set = this.setItem; return this.db.prepare(SQLRequest).all();
this.insert = this.add; } catch(err) {
this.update = this.set; if(err.message.indexOf('run()') !== -1) {
this.remove = this.del; try {
this.pop = this.del; this.db.prepare(SQLRequest).run();
this.exec = this.execute; return null;
} } catch(err) {
ToString(value) { throw new Error(`SQLEasy error: ${err.message}`);
return typeof(value) === 'string' ? '\'' + value + '\'' : value; }
} }
getIndex (table, indexColumn, index_starts = 0) { else{
// return this.get(table).length; throw new Error(`SQLEasy error: ${err.message}`);
let tableData = this.get(table).sort((a, b) => a[indexColumn] - b[indexColumn]); }
let index = index_starts - 1; }
for (let i in tableData) { }
if (index_starts <= i) { getBase(table, condition=null, keys='*') {
if (i != tableData[i][indexColumn]) return i; let SQLRequest = `SELECT ${keys} FROM ${table}`;
index = i; if(condition !== null){
} let orBlock = new Array();
} for(let i = 0; i < condition.length; i++){
return Number(index) + 1; let andBlock = new Array();
} for(let key in condition[i]){
execute(SQLRequest) { andBlock.push(`${key}=${this.ToString(condition[i][key])}`);
try { }
return this.db.prepare(SQLRequest).all(); orBlock.push(`(${andBlock.join(' AND ')})`);
} catch(err) { }
if(err.message.indexOf('run()') !== -1) { SQLRequest = `${SQLRequest} WHERE ${orBlock.join(' OR ')}`;
try { }
this.db.prepare(SQLRequest).run(); // console.log(SQLRequest); // Убрать после тестов!!
return null; try {
} catch(err) { let rows = this.db.prepare(SQLRequest).all();
throw new Error(`SQLEasy error: ${err.message}`); if(rows !== null & rows !== undefined) return rows;
} else throw new Error('SQLEasy error: Rows given null.');
} } catch(err) {
else{ if(err.message.indexOf('no such table') !== -1){
throw new Error(`SQLEasy error: ${err.message}`); throw new Error('SQLEasy error: this table not founded.');
} }
} else throw new Error(`SQLEasy error: ${err.message}`);
} }
getBase(table, condition=null, keys='*') { }
let SQLRequest = `SELECT ${keys} FROM ${table}`; add(table, addvArray, ignore=false){
if(condition !== null){ this.getBase(table);
let orBlock = new Array(); let SQLRequest = new Array();
for(let i = 0; i < condition.length; i++){ let setting_values = new Array();
let andBlock = new Array(); for(let i = 0; i < addvArray.length; i++) {
for(let key in condition[i]){ let addObject = addvArray[i];
andBlock.push(`${key}=${this.ToString(condition[i][key])}`); let keys = new Array();
} let values = new Array();
orBlock.push(`(${andBlock.join(' AND ')})`); setting_values = new Array();
} for(let key in addObject){
SQLRequest = `${SQLRequest} WHERE ${orBlock.join(' OR ')}`; keys.push(key);
} setting_values.push(addObject[key]);
// console.log(SQLRequest); // Убрать после тестов!! values.push('?');
try { }
let rows = this.db.prepare(SQLRequest).all(); let op = 'INSERT';
if(rows !== null & rows !== undefined) return rows; if(ignore) op = 'INSERT OR IGNORE';
else throw new Error('SQLEasy error: Rows given null.'); SQLRequest.push(`${op} INTO ${table} (${keys.join(', ')}) VALUES (${values.join(', ')});`);
} catch(err) { }
if(err.message.indexOf('no such table') !== -1){ SQLRequest = SQLRequest.join('\n');
throw new Error('SQLEasy error: this table not founded.'); try{
} this.db.prepare(SQLRequest).run(setting_values);
else throw new Error(`SQLEasy error: ${err.message}`); } catch(err){
} if (ignore) throw new Error(`SQLEasy error: ${err.message}`);
} else this.add(table, addvArray, true);
add(table, addvArray, ignore=false){ }
this.getBase(table); }
let SQLRequest = new Array(); del(table, index){
let setting_values = new Array(); this.get(table);
for(let i = 0; i < addvArray.length; i++) { let equal_req = '';
let addObject = addvArray[i]; for(let key in index) {
let keys = new Array(); equal_req = `${key} = ${this.ToString(index[key])}`;
let values = new Array(); break;
setting_values = new Array(); }
for(let key in addObject){ let SQLRequest = `DELETE FROM ${table} WHERE ${equal_req}`;
keys.push(key); try {
setting_values.push(addObject[key]); this.db.prepare(SQLRequest).run();
values.push('?'); } catch(err) {
} throw new Error(`SQLEasy error: ${err.message}`);
let op = 'INSERT'; }
if(ignore) op = 'INSERT OR IGNORE'; }
SQLRequest.push(`${op} INTO ${table} (${keys.join(', ')}) VALUES (${values.join(', ')});`); setItem(table, index, values){
} this.getBase(table);
SQLRequest = SQLRequest.join('\n'); let equal_index = '';
try{ let equal_values = '';
this.db.prepare(SQLRequest).run(setting_values); let value_array = new Array();
} catch(err){
if (ignore) throw new Error(`SQLEasy error: ${err.message}`); for(let key in index){
else this.add(table, addvArray, true); equal_index = `${key} = ${this.ToString(index[key])}`;
} // equal_index = `${key} = ?`;
} break;
del(table, index){ }
this.get(table); for(let key in values){
let equal_req = ''; // equal_values = `${key} = ${this.ToString(values[key])}`;
for(let key in index) { equal_values = `${key} = ?`;
equal_req = `${key} = ${this.ToString(index[key])}`; value_array.push(values[key]);
break; break;
} }
let SQLRequest = `DELETE FROM ${table} WHERE ${equal_req}`; let SQLRequest = `UPDATE ${table} SET ${equal_values} WHERE ${equal_index}`;
try { try {
this.db.prepare(SQLRequest).run(); // this.db.prepare(SQLRequest).get(value_array).run();
} catch(err) { this.db.prepare(SQLRequest).run(value_array);
throw new Error(`SQLEasy error: ${err.message}`); } catch(err) {
} throw new Error(`SQLEasy error: ${err.message}`);
} }
setItem(table, index, values){ }
this.getBase(table); }
let equal_index = '';
let equal_values = '';
let value_array = new Array(); module.exports = {
database: database,
for(let key in index){ get_from_key: get_from_key
equal_index = `${key} = ${this.ToString(index[key])}`; };
// equal_index = `${key} = ?`;
break;
}
for(let key in values){
// equal_values = `${key} = ${this.ToString(values[key])}`;
equal_values = `${key} = ?`;
value_array.push(values[key]);
break;
}
let SQLRequest = `UPDATE ${table} SET ${equal_values} WHERE ${equal_index}`;
try {
// this.db.prepare(SQLRequest).get(value_array).run();
this.db.prepare(SQLRequest).run(value_array);
} catch(err) {
throw new Error(`SQLEasy error: ${err.message}`);
}
}
}
module.exports = {
// Legacy
//database: database, // Turn Off legacy method
// Current
Request: sqleasy_tools.Request,
SQLEasy_error: sqleasy_tools.SQLEasy_error,
// Databases
SQLite3_database: sqlite.database,
MySQL_database: mysql.mysql_database,
// Tools
tools: {
get_from_key: sqleasy_tools.get_from_key
}
};

371
mysql.js
View File

@ -1,371 +0,0 @@
const MySql = require('sync-mysql');
const sqleasy_tools = require('./SQLEasyTools');
class MySQL_error extends Error {
constructor(message) {
super(message);
this.name = "MySQL_error";
}
}
function gen_qw (value) {
if (typeof(value) == 'number') return '?';
else return '??';
}
function compile_responses(responses) {
let string_responses = new Array();
let gen_resp = '';
let item = '';
for (ind in responses) {
item = responses[ind];
if (item == undefined) {
string_responses.push(gen_resp);
break;
}
else if (item.length < 81) {
if (gen_resp == '') {
gen_resp = item;
}
else if ((gen_resp + ';\n' + item).length >= 81) {
string_responses.push(gen_resp);
gen_resp = item;
}
else {
gen_resp += ';\n' + item;
}
}
else string_responses.push(item);
}
if (gen_resp != '') {
string_responses.push(gen_resp);
}
return string_responses;
}
function convert_to_object (output, index_key, save_ik = false) { // Not checked!
let item = new Object();
let out_object = new Object();
let item_obj = new Object();
for (let i in output) {
item = output[i];
item_obj = item;
if (!save_ik) delete item_obj[index_key];
out_object[item[index_key]] = item_obj;
}
return item_obj;
}
class mysql_database {
ToString(value) { // Convertion to string (legacy)
// return typeof (value) === 'string' ? '\'' + value + '\'' : value;
if (typeof (value) === 'string') {
if (warns == true) {
// console.log('WARNING!! You use legacy function, please reword your code from used current methods');
}
value = value.replace(new RegExp("'", 'g'), "\\'");
value = `'${value}'`;
return value;
}
else return value;
}
debug (Text) {
if (this.settings.debug) console.log(Text);
}
constructor(connection_object, settings = new Object()) { // init
this.settings = {
toggle_commit: Boolean(settings.toggle_commit),
warns: Boolean(settings.warns),
debug: Boolean(settings.debug)
}
if (settings.warns == undefined) this.settings.warns = true;
if (settings.debug == undefined) this.settings.debug = false;
if (settings.toggle_commit == undefined) this.settings.toggle_commit = true;
this.connection = new MySql(connection_object);
this.db_connection = undefined;
this.isCommiting = this.settings.toggle_commit;
this.warns = this.settings.warns;
this.commit_steps = new Array();
this.commit_values = new Array();
this.commit_sessions = new Object();
}
toggle_commit (condition) { // toggle using .commit() in methods
this.isCommiting = condition;
}
operation(SQLRequest, values, session = null) { // Add to commit's buffer
if (SQLRequest[SQLRequest.length - 1] != ';') SQLRequest = `${SQLRequest};`
if (session == null) {
this.commit_steps.push(SQLRequest);
for (let v=0; v < values.length; v++) {
this.commit_values.push(values[v]);
}
}
else {
if (this.commit_sessions[session] != undefined) {
this.commit_sessions[session].commit_steps.push(SQLRequest);
for (let v=0; v < values.length; v++) {
this.commit_sessions[session].commit_values.push(values[v]);
}
}
else throw new MySQL_error('Session not founded.');
}
}
new_commit_session (session) { // Create new commit's session
this.commit_sessions[session] = {
commit_steps: new Array(),
commit_values: new Array()
};
}
commit(session = null) { // commit changes in database
// console.log(`Called commit with session ${session}`);
this.debug(`Called commit with session ${session}`);
let SQLRequest = '';
let commit_values = new Array();
if (session == null) {
SQLRequest = this.commit_steps.join('\n');
commit_values = this.commit_values;
}
else {
if (this.commit_sessions[session] != undefined) {
let session_info = this.commit_sessions[session];
SQLRequest = session_info.commit_steps.map((item) => {
if (Boolean(item)) return item;
}).join('\n');
commit_values = session_info.commit_values;
}
else throw new MySQL_error('Session not founded.');
}
let result = undefined;
let error = false;
try {
// this.debug(` >> SQLRequest: ${SQLRequest}\n >> commit_values: ${commit_values}`);
this.debug(`\n################################################################\n${SQLRequest}\n################################################################`);
this.debug(`${commit_values}\n################################################################`);
// result = this.connection.query(SQLRequest, commit_values);
// console.log('SQLRequest:', SQLRequest);
// console.log('commit_values:', commit_values);
result = this.exec(SQLRequest, commit_values);
}
catch (err) {
error = err;
}
if (session == null) this.commit_steps = new Array();
else this.commit_sessions[session].commit_steps = new Array();
if (session == null) this.commit_values = new Array();
else this.commit_sessions[session].commit_values = new Array();
this.debug(` >> LEN: ${this.commit_steps}`);
if (error.message != undefined) {
console.log(error.stack);
throw new MySQL_error(error.message);
}
return result;
}
getIndex(table, index_column, start_index_value = 0) { // getting index
if (this.db_connection == undefined) throw new MySQL_error('You must choose database. Use [mysql_database Object].set_db(\'database_name\')');
// let database_data = this.get(table).sort(i => i[index_column]);
let database_data = this.get(table).sort((a, b) => a[index_column] - b[index_column]);
let filter_dict = new Object();
let item = Object();
let index = start_index_value;
for (let i in database_data) {
item = database_data[i];
if (item[index_column] >= start_index_value) {
if (item[index_column] > index) return index;
else index++;
}
}
/*for (let i = start_index_value; i < database_data.length; i++) {
filter_dict = database_data[i];
filter_dict[index_column] = i;
if (!get_from_key(database_data, [filter_dict])) return i;
}*/
return index;
// return this.get(table).length;
}
// SQL Methods
set_db(database_name) { // using database
try {
this.debug(`USE ${database_name}`);
this.connection.query(`USE ${database_name}`);
this.db_connection = database_name;
}
catch (err) {
throw new MySQL_error(err.message);
}
}
exec(SQLRequest, params = []) { // Execute SQL Request
/*if (typeof(params) !== 'object' || typeof(params) !== 'array') {
params = new Array();
}*/
let SQLRequests = SQLRequest.split(';').filter(i => Boolean(i)).map((item) => `${item.trim()};`);
let results = new Array();
for (let i in compile_responses(SQLRequests)){
SQLRequest = SQLRequests[i];
if (Boolean(SQLRequest)) {
try {
this.debug(`\n################################################################\n${SQLRequest}\n################################################################`);
this.debug(`${params}\n################################################################`);
results.push(this.connection.query(SQLRequest, params));
}
catch (err) {
// console.log(err.stack);
throw new MySQL_error(err.message);
}
}
}
results = results.filter(i => Boolean(i));
/*results = results.map((res) => {
if (res != undefined) return res;
});*/
if (results.length == 1) return results[0];
else return results;
}
get(table, filt = null, keys = '*', commit = false, session = null) { // Select rows from table
if (this.db_connection == undefined) throw new MySQL_error('You must choose database. Use [mysql_database Object].set_db(\'database_name\')');
let SQLRequest = `\nSELECT ${keys} FROM ${this.db_connection}.${table}`;
try {
/*let args = new Array();
if (Boolean(filt) != false) {
let orBlock = new Array();
for (let i = 0; i < filt.length; i++) {
let andBlock = new Array();
for (let key in filt[i]) {
andBlock.push(`${key}=?`);
args.push(filt[i][key]);
}
orBlock.push(`(${andBlock.join(' AND ')})`);
}
SQLRequest = `${SQLRequest} WHERE ${orBlock.join(' OR ')}`;
}
this.debug(`GET: ${SQLRequest}`);
this.debug(`ARGS: ${args}`);*/
if (!!filt) SQLRequest = `${SQLRequest} WHERE ${filt.toString().str}`;
this.debug(' GET >> SQLRequest:', SQLRequest);
if (!!filt) this.operation(SQLRequest, filt.toString().values);
else this.operation(SQLRequest, []);
if (this.isCommiting || commit) return this.commit(session);
}
catch (err) {
console.log(err.stack);
throw new MySQL_error(err.message);
}
}
add(table, addvArray, ignore = false, commit = false, session = null) { // Insert new values
if (this.db_connection == undefined) throw new MySQL_error('You must choose database. Use [mysql_database Object].set_db(\'database_name\')');
try {
this.get(table);
let SQLRequest = new Array();
let args = 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('?');
args.push(addObject[key]);
}
let op = 'INSERT';
if (ignore) op = 'INSERT OR IGNORE';
SQLRequest.push(`${op} INTO ${this.db_connection}.${table} (${keys.join(', ')}) VALUES (${values.join(', ')});`);
}
SQLRequest = SQLRequest.join('\n');
// let SQLRequest = `${}`;
this.debug(` ADD >> ${SQLRequest}`);
this.operation(SQLRequest, args);
if (this.isCommiting || commit) return this.commit(session);
}
catch (err) {
throw new MySQL_error(err.message);
}
}
remove(table, index, commit = false, session = null) { // Delete values
if (this.db_connection == undefined) throw new MySQL_error('You must choose database. Use [mysql_database Object].set_db(\'database_name\')');
try {
this.get(table);
let SQLRequest = new Array();
let args = new Array();
// let equal_req = '';
// let equal_req = new Array();
/*for (let key in index) {
// equal_req = `${key} = ?`;
equal_req.push(`${key} = ?`);
args.push(index[key]);
// break;
}*/
SQLRequest = `DELETE FROM ${this.db_connection}.${table} WHERE ${index.toString().str}`;
this.debug(SQLRequest);
this.operation(SQLRequest, index.toString().values);
if (this.isCommiting || commit) return this.commit(session);
}
catch (err) {
throw new MySQL_error(err.message);
}
}
set(table, index, values, ignore=false, commit = false, session = null) { // Updating setav data
if (this.db_connection == undefined) throw new MySQL_error('You must choose database. Use [mysql_database Object].set_db(\'database_name\')');
try {
let op = 'UPDATE';
this.get(table);
let SQLRequest = new Array();
let args = new Array();
// let equal_index = new Array();
let equal_values = new Array();
for (let key in values) {
equal_values.push(`${key} = ?`);
args.push(values[key]);
}
for (let i in index.requestElements) {
for (let key in index.requestElements[i]) {
// equal_index.push(`${key} = ?`);
args.push(index.requestElements[i][key]);
}
}
if (ignore) op = 'UPDATE OR IGNORE';
SQLRequest = `${op} ${this.db_connection}.${table} SET ${equal_values.join(', ')} WHERE ${index.toString().str}`;
this.debug(SQLRequest);
this.operation(SQLRequest, args);
if (this.isCommiting || commit) return this.commit(session);
}
catch (err) {
console.log(err.stack);
throw new MySQL_error(err.message);
}
}
}
module.exports = {
mysql_database: mysql_database,
MySQL_error: MySQL_error
}

208
package-lock.json generated
View File

@ -1,41 +1,9 @@
{ {
"name": "sql-easy-lib", "name": "sql-easy-lib",
"version": "1.0.0", "version": "0.9.1",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"asap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz",
"integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA=="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"barrage": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/barrage/-/barrage-1.1.0.tgz",
"integrity": "sha512-lmhNsUZG+34gUrZl0SKOeYZ20o4Xni2wd52fzzrIsniQqoqfwa3otEP4Vceks+KwGACNsnQ1YSYtsaPWHrQ+3Q==",
"requires": {
"promise": "^6.0.0"
},
"dependencies": {
"promise": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz",
"integrity": "sha512-O+uwGKreKNKkshzZv2P7N64lk6EP17iXBn0PbUnNQhk+Q0AHLstiTrjkx3v5YBd3cxUe7Sq6KyRhl/A0xUjk7Q==",
"requires": {
"asap": "~1.0.0"
}
}
}
},
"base64-js": { "base64-js": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@ -50,11 +18,6 @@
"prebuild-install": "^7.1.0" "prebuild-install": "^7.1.0"
} }
}, },
"bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
},
"bindings": { "bindings": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
@ -82,66 +45,11 @@
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
} }
}, },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"chownr": { "chownr": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
}, },
"concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"requires": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
},
"dependencies": {
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"decompress-response": { "decompress-response": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@ -183,11 +91,6 @@
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
}, },
"get-port": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
"integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="
},
"github-from-package": { "github-from-package": {
"version": "0.0.0", "version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@ -208,11 +111,6 @@
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
}, },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"lru-cache": { "lru-cache": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@ -236,46 +134,6 @@
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
}, },
"mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"requires": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
},
"dependencies": {
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"napi-build-utils": { "napi-build-utils": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
@ -316,26 +174,6 @@
"tunnel-agent": "^0.6.0" "tunnel-agent": "^0.6.0"
} }
}, },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "~2.0.3"
},
"dependencies": {
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
}
}
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -366,11 +204,6 @@
"util-deprecate": "^1.0.1" "util-deprecate": "^1.0.1"
} }
}, },
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"safe-buffer": { "safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -399,11 +232,6 @@
"simple-concat": "^1.0.0" "simple-concat": "^1.0.0"
} }
}, },
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ=="
},
"string_decoder": { "string_decoder": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -417,25 +245,6 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
}, },
"sync-mysql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sync-mysql/-/sync-mysql-3.0.1.tgz",
"integrity": "sha512-EKWJFuiPRtj1s6bjSaf4tzMFeq8x0JgKtgyIsTTkD20E8pkzInEFxj1B+efbYMjQUfN9MEY3HOsaSYUmSbsUKw==",
"requires": {
"babel-runtime": "^6.18.0",
"concat-stream": "^1.6.0",
"sync-rpc": "^1.1.1",
"then-mysql": "^1.1.1"
}
},
"sync-rpc": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
"integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
"requires": {
"get-port": "^3.1.0"
}
},
"tar-fs": { "tar-fs": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
@ -459,16 +268,6 @@
"readable-stream": "^3.1.1" "readable-stream": "^3.1.1"
} }
}, },
"then-mysql": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/then-mysql/-/then-mysql-1.1.1.tgz",
"integrity": "sha512-QqWODY1xtWFo3XR4GllWFkXMTz+QirJKcggMETNPeGqPDcxUyApqDW5GgAUJEz4Dga3/WrXNmZY0bT+cAWjQ2g==",
"requires": {
"barrage": "^1.1.0",
"mysql": "^2.10.0",
"promise": "^7.1.1"
}
},
"tunnel-agent": { "tunnel-agent": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@ -477,11 +276,6 @@
"safe-buffer": "^5.0.1" "safe-buffer": "^5.0.1"
} }
}, },
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",

View File

@ -1,29 +1,22 @@
{ {
"name": "sql-easy-lib", "name": "sql-easy-lib",
"version": "1.0.8", "version": "0.9.1",
"description": "This library was written from simple work with databases. In current version supported next famous databases: sqlite3 and MySQL. In future, list with supported databases will be replenishing.", "description": "(Legacy version of SQLEasy library)",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+http://git.fullgream.tech/fullgream/SQLEasy.js.git" "url": "git+https://github.com/Nikiroy78/SQLEasy.js.git"
}, },
"author": "FullGreaM", "author": "FullGreaM",
"license": "MIT", "license": "ISC",
"bugs": { "bugs": {
"url": "http://git.fullgream.tech/fullgream/SQLEasy.js/issues" "url": "https://github.com/Nikiroy78/SQLEasy.js/issues"
}, },
"homepage": "http://git.fullgream.tech/fullgream/SQLEasy.js#readme", "homepage": "https://github.com/Nikiroy78/SQLEasy.js#readme",
"dependencies": { "dependencies": {
"better-sqlite3": "^7.5.3", "better-sqlite3": "^7.5.3"
"sync-mysql": "^3.0.1" }
},
"keywords": [
"sqlite3",
"sql",
"database",
"mysql"
]
} }

View File

@ -1,15 +0,0 @@
/* PostreSQL */
const pgsync = require('pg-sync');
class PostgreSQL_Database {
constructor (host, port, database, clientOptions={}) {
this.client = new pgsync.Client(clientOptions);
client.connect(`host=${host} port=${port} dbname=${database}`);
this.client.begin();
this.client.setIsolationLevelSerializable();
// this.client.query(queryText, [params]); -> execute command with SELECT *
// (this.client.prepare(queryText)).execute([params]); -> execute command without SELECT *
}
}

View File

@ -1,181 +0,0 @@
const sqlite3 = require('better-sqlite3');
const sqleasy_tools = require('./SQLEasyTools');
function get_from_key (db_data, conditions) {
conditions = conditions.filter(i => i != {});
if (conditions == [] || !conditions) return db_data;
let item = new Object();
let bool_conditions = new Array();
let condition_item = new Object();
let int_condition = 1;
let out_objs = new Array();
for (let i in db_data) {
bool_conditions = new Array();
item = db_data[i];
for (let index in conditions) {
int_condition = 1;
condition_item = conditions[index];
for (key in condition_item) {
int_condition *= Number(item[key] == condition_item[key]);
}
bool_conditions.push(int_condition);
}
if (bool_conditions.reduce((a, b) => Boolean(a + b))) out_objs.push(item);
}
return out_objs;
}
class database {
constructor(path, warning=true){
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.insert = this.add;
this.update = this.set;
this.remove = this.del;
this.pop = this.del;
this.exec = this.execute;
}
ToString(value) {
return typeof(value) === 'string' ? '\'' + value + '\'' : value;
}
getIndex (table, indexColumn, index_starts = 0) {
// return this.get(table).length;
let tableData = this.get(table).sort((a, b) => a[indexColumn] - b[indexColumn]);
let index = index_starts - 1;
for (let i in tableData) {
if (index_starts <= i) {
if (i != tableData[i][indexColumn]) return i;
index = i;
}
}
return Number(index) + 1;
}
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}`;
let values = null;
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 ${condition.toString().str}`;
}
// console.log(SQLRequest); // Убрать после тестов!!
try {
// let rows = this.db.prepare(SQLRequest).all();
let rows;
if (!condition) rows = this.db.prepare(SQLRequest).all();
else rows = this.db.prepare(SQLRequest).all(condition.toString().values);
if (!!rows) 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();
let setting_values = new Array();
for(let i = 0; i < addvArray.length; i++) {
let addObject = addvArray[i];
let keys = new Array();
let values = new Array();
// setting_values = new Array();
for(let key in addObject){
keys.push(key);
setting_values.push(addObject[key]);
values.push('?');
}
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(setting_values);
// this.db.prepare(SQLRequest).exec(setting_values);
this.db.prepare(SQLRequest).run(setting_values);
} 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 ${index.toString().str}`;
try {
this.db.prepare(SQLRequest).run(index.toString().values);
} catch(err) {
throw new Error(`SQLEasy error: ${err.message}`);
}
}
setItem(table, index, values){
this.getBase(table);
let equal_index = '';
let equal_values = '';
let value_array = new Array();
for (let key in values) {
// equal_values = `${key} = ${this.ToString(values[key])}`;
equal_values = `${key} = ?`;
value_array.push(values[key]);
break;
}
value_array = value_array.concat(index.toString().values);
let SQLRequest = `UPDATE ${table} SET ${equal_values} WHERE ${index.toString().str}`;
try {
// this.db.prepare(SQLRequest).get(value_array).run();
this.db.prepare(SQLRequest).run(value_array);
} catch(err) {
console.log(err.stack);
throw new Error(`SQLEasy error: ${err.message}`);
}
}
}
module.exports = {
database: database,
get_from_key: get_from_key
};