leukos-tech-dbdriver
v0.2.0
Published
Interface for multiple db on nodejs
Readme
Leukos-Tech-DbDriver
Descrizione
Il package è stato sviluppato internamente per fornire una interfaccia strandard e facilmente adattabile verso le varie librerie di gestione dei database di NodeJs.
Sommario
Installazione
Nella directory principale del tuo progetto digita:
~/your/project/dir$ npm install leukos-tech-dbdriver --saveUtilizzo del package
Oggetto reso dall'import del package
L'import restituisce un oggetto che espone i seguenti metodi (statici):
leukos-tech-dbdriver.driverFactory(type, debug, logger)Factory per generare l'istanza del driver.
leukos-tech-dbdriver.queryResult(
success {boolean},
message {string} = "",
data {Array} = [],
query {string} = "",
params {Array} = [],
insertedIds {Array} = [],
affected {number} = 0,
changed {number} = 0
)Metodo statico per generare l'oggetto QueryResult utilizzato come data exchange object.
leukos-tech-dbdriver.querySuccess(
data {Array} = [],
query {string} = "",
params {Array} = [],
insertedIds {Array} = [],
affected {number} = 0,
changed {number} = 0
)Metodo (statico) di convenienza per generare un oggetto QueryResult con argomento success==true e message vuoto.
leukos-tech-dbdriver.queryFail(
message {string} = "",
data {Array} = [],
query {string} = "",
params {Array} = [],
insertedIds {Array} = [],
affected {number} = 0,
changed {number} = 0
)Funzione di convenienza per generare un oggetto QueryResult con argomento success=false.
Accesso alla factory del driver
Metodo 1
const driverFactory = require('leukos-tech-dbdriver').driverFactory;Metodo 2
const {driverFactory} = require('leukos-tech-dbdriver');Metodo 3
const ltDbDriver = require('leukos-tech-dbdriver');
const driverFacotry = ltDbdriver.driverFactory;`Tramite la factory ottenuta il driver viene generato fornendo a quest'ultima il tipo di driver che si desidera generare e poi, opzionalmente, se attivare il debug e quale oggetto utilizzare per il logging.
let dbDriver = driverFactory(type, debug, logger);(i valori supportati per l'arg type sono contenuti in driverFactory.SUPPORTED_DATABASES)
Appena generato dalla factory l'oggetto dbDriver contiene tutti i metodi, ma le sue proprietà fondamentali (variabili in base al type del driver) non sono ancora state valorizzate: è dunque ancora inutilizzabile.
Per attivare l'oggetto è necessario eseguire il metodo dbDriver.init(params) (Vai alla documentazione).
Arresto del driver
Qualora fosse necessario, al termina dell'utilizzo del driver l'oggetto va fermato col metodo .stop(force):
let driverStopped = await dbDriver.stop()(dalla versione 0.2.0 il comportamento di questo metodo è stato modificato: per ogni copia del Singleton richiesta esso va chiamato, consentendo di chiudere effettivamente la connessione al dataBase soltanto alla chiamata da parte dell'ultimo)
es. Si ipotizzi di avere due moduli differenti che importano il package e lo inizializzano con gli stessi parametri
module1.js
const {driverFactory} = require('leukos-tech-dbdriver');
...
let dbDriver_copy1 = driverFactory(type, debugEnabled, logger, logLevel);
let initDone_copy1 = dbDriver_copy1.init(commonParameters);module2.js
const {driverFactory} = require('leukos-tech-dbdriver');
...
let dbDriver_copy2 = driverFactory(type, debugEnabled, logger, logLevel);
let initDone_copy2 = dbDriver_copy2.init(commonParameters);Si avranno a questo punto 2 copie del medesimo Singleton per l'interazione al database (i parametri sono condivisi).
Effettuando, in module1.js, la chiamata:
let driver_stopped = await dbDriver_copy1.stop();la variabile driver_stopped viene risolta in false e il Singleton è ancora utilizzabile (per il module2).
Ma se dopo di ciò, in module2.js viene eseguita la chiamata:
let driver_stopped = await dbDriver_copy2.stop();la variabile driver_stopped viene ora risolta in true e la connessione al DataBase effettivamente chiusa.
Questo comportamento può essere aggirato fornendo l'argomento force con valore true.
Se la chiamata, nel module1.js fosse:
let driver_stopped = dbDriver_copy1.stop(true);la connesione verrebbe chiusa immediatamente, anche se altre istanze del driver sono in uso presso altri moduli (rendendo inservibili anche queste ultime).
Utilizzo dei metodi
Tutti i metodi del driver restituiscono una Promise. E' possibile quindi utilizzarli con la notazione standard
Driver.<metodo>(...args)
.then( (queryResult) => { ... } )
.catch( (err) => { ... } );o con la notazione async/await
try {
let queryResult = await Driver.<metodo>(...args);
...
} catch (err) {
...
};Metodi della classe Leukos-Tech-DbDriver
DbDriver.init( params {Object} )
Inizializza il driver secondo i parametri forniti come argomento.
Argomenti
params{params} Oggetto con i parametri necessari a rendere operativo il database.
Tipi restituiti
Promise(err, Boolean)
Risolta in true se l'inizializzazione del driver è andata a buon fine coi parametri forniti.
Requisiti dell'Oggetto params:
L'oggetto params deve contenere necessariamente le seguenti proprietà:
user{string} Username per l'accesso al database.password{string} Password per l'accesso al database.database{string} Nome del database che si desidera utilizzare.
Se le proprietà params.host {String} e params.port {Number} non vengono specificate, sono utilizzate quelle di default ("localHost" per il server e es. per MySql 3306).
Test Cases
INI01 - Si risolve in
truequando dei parametri corretti sono forniti al metodo consentendo l'avvio della connessione al database.INI02 - Solleva
Leukos-Tech-JsUtils.custErrors.args.MissingArgErrorse le proprietàparams.database{String},params.user{String},params.password{String} sonoundefined.INI03 - Solleva
Leukos-Tech-JsUtils.custErrors.args.WrongArgTypeErrorse le proprietàparams.database{String},params.user{String},params.password{String} non sono di tipoString.INI04 - Si risolve
falsese le proprietàparams.useroparams.passwordnon equivalgono a credenziali corrette.INI05 - Si risolve in
truee restituisce Singleton del driver tra loro correlati se inizializzato con oggetti (indipendenti) contenenti gli stessi valori.INI06 - Si risolve in
falsese fornito un valore errato perhostoport
DbDriver.ensureTable( tableName {String}, schema {TableSchema} )
Assicura l'esistenza della table specificata come 1° argomento.
Se non esiste la crea secondo i parametri specificati col 2° argomento.
Argomenti
tableName{String} Nome della table di cui verificare l'esistenzaschema{TableSchema} Array di oggetti TableField con cui specificare le proprietà dei vari campi dei record della table corrente (v. sotto).
Tipi restituiti
Promise(err, queryResult)
L'oggetto queryResult contiene le seguenti proprietà:
success{Boolean}truese la table esiste al termine dell'esecuzione del metodomessage{String} Ragione dell'insuccesso semessage==falsedata{Object} Oggetto raw restituito dalla libreria per il databasequery{String} Stringa utilizzata per la query al DB oundefined
Oggetto TableSchema
E' un array di oggetti, ciascuno dei quali contiene le proprietà da assegnare ai diversi campi da creare nella tavola. Ogni oggetto deve avere la seguente struttura:
keyName: STRING,type: STRING,size: NUMBER,isUnsigned: BOOLEAN,autoIncrement: BOOLEAN,notNull: BOOLEAN,isPrimary: BOOLEAN,isIndex: BOOLEAN,isUnique: BOOLEAN,isReference: BOOLEAN,reference: {tableName: STRING, tableField: STRING}
Test Cases
ENS01 - Si risolve in
queryResult.success:truedopo aver creato la table, se forniti parametri conformi.ENS02 - Si risolve in
queryResult.success:trueanche se chiamato per unatablegià esistente, se forniti parametri conformi.ENS03 - Si risolve in
queryResults.success: falsee non crea la table seschemanon possiede la giusta formattazione (non passa la validazione).
DbDriver.insert( tableName {String}, keys {Array}, values{Array} )
Inserisce 1 record nella tavola indicata come primo argomento
Argomenti
tableName{String} Nome della tavola/schema su cui operarekeys{Array} Chiavi del record da inserirevalues{Array} Valori valori per il nuovo record da inserire
Tipi restituiti
Promise(err, queryResult)
L'oggetto queryResult contiene le seguenti proprietà:
success{Boolean}truese l'inserimento si è svolta senza sollevare eccezioni.message{String} Vuoto sesuccess==true. Sefalsecontiene una stringa indicante la ragione dell'insuccesso.data{Object} Oggetto raw restituito dalla libreria utilizzata come interfaccia al DB.query{String} Stringa (SE NECESSARIA) utilizzata per l'inserimento del record.params{Array} Array di parametri utilizzati in associazione con la stringa di inserimento nel database.insertedIds{Array} Array degli id dei nuovi record inseriti.affected{Number} Numero di record inseriti (insertedIds.length).
Utilizzo
E' un metodo asincrono che restituisce una Promise(err, arg).
Può essere quindi usato con la notazione standard
Driver.insert(
"tableName", // Nome della table
["key1", "key2", "key3", ...], // Array con i nomi delle chiavi
["value1", "value2", "value3", ...] // Array coi valori da assegnare ai rispettivi campi
)
.then( (queryResult) => { ... } )
.catch( (err) => { ... } );o con la notazione async/await
try {
let queryResult = await Driver.insert(
"tableName", // Nome della table
["key1", "key2", "key3", ...], // Array con i nomi delle chiavi
["value1", "value2", "value3", ...] // Array coi valori da assegnare ai rispettivi campi
);
...
} catch (err) {
...
};Test Cases
INS01 - Risolve in
queryResult.success: trueed inserisce il record con argomenti conformi (campo id - AUTO_INCREMENT - non fornito).INS02 - Risolve in
queryResult.success: falsee NON inserisce il record con con argomento 'keys' non valido (chiavi errate).INS03 - Risolve in
queryResult.success: trueed inserisce il record con argomenti conformi (campo id - AUTO_INCREMENT - fornito).INS04 - Risolve in
queryResult.success: falsee NON inserisce il record con con argomento 'values' non valido (numero di elementi errato).
DbDriver.find( tableName {String}, keys {Array}, values{Array} )
Argomenti
tableName{String} Nome della tavola/schema su cui operarekeys{Array} Chiavi da utilizzare per la ricercavalues{Array} Valori per le chiavi (deve essere di lunghezza uguale a quella di 'keys')
Tipi Restituiti
Promise(err, queryResult)
L'oggetto queryResult contiene le seguenti proprietà:
success{Boolean}truese la query si è svolta senza sollevare eccezioni (non comporta la restituzione di risultati).message{String} Vuoto sesuccess==true. Altrimenti contiene una stringa indicante la ragione dell'insuccesso.data{Array} Array dei record corrispondenti ai parametri forniti. Vuoto se nessun record corrisponde ai parametri.query{String} Stringa di query (SE NECESSARIA) utilizzata per l'interrogazione al database.params{Array} Array di parametri utilizzati in associazione con la stringa di query per l'interrogazione al database.affected{Number} Numero di risultati prodotti dalla query (data.length)
Utilizzo
E' un metodo asincrono che restituisce una promise. Può essere quindi usato con la notazione standard
Driver.find(tableName, [ "field_name" ], [ "value" ] )
.then( (queryResult) => { ... } )
.catch( (err) => { ... } );o con la notazione async/await
try {
let queryResult = await Driver.find("aTableName", ["fildName1"], ["aValue"]);
...
} catch (err) {
...
};Test Cases
FIN01 - Risolve in
queryResult.success:trueequeryResult.datacontiene i record attesi con valori conformi.FIN02 - Risolve in
queryResult.success:trueequeryResult.datacontiene tutti i record della table se chiamato senza argomenti (eccettotableName).FIN03 - Risolve in
queryResult.success:falsesekeysevaluessono Array di lunghezza diversa.FIN04 - Risolve in
queryResult.success:trueequeryResult.datacontiene i record attesi con valori conformi (campi multipli diversi daid).
DbDriver.update( tableName {String}, ids {Array}, keys {Array}, values {Array}, idKey {String} = "id" )
Aggiorna 1 o più record nella tavola indicata come primo argomento, con i valori specificati
Argomenti
tableName{String} Nome della tavola/schema su cui operare.recordIds{Array} Array di id per i record da aggiornare.keys{Array} Chiavi del/i record da aggiornare.values{Array} Valori per il/i record da aggiornare, da assegnare alle rispettive chiavi (stesso indice).idKey{String} Chiave da utilizzare per il campo id dei record (default ="id")
Tipi restituiti
Promise(err, queryResult)
L'oggetto queryResult contiene le seguenti proprietà:
success{Boolean}truese l'aggiornamento valori si è svolto senza sollevare eccezioni.message{String} Vuoto sesuccess=true. Sefalsecontiene una stringa indicante la ragione dell'insuccesso.data{Object} Oggetto raw restituito dalla libreria per la comunicazione col DB (permysqlèOkPacket).query{String} Stringa (SE NECESSARIA) utilizzata per l'inserimento del record.params{Array} Array di parametri utilizzati in associazione con la stringa di inserimento nel database.changed{Number} Numero dei record modificaty dalla query.
Utilizzo
E' un metodo asincrono che restituisce una Promise. Può essere quindi usato con la notazione standard
Driver.update(`
"tableName", // Nome della table
[ 1 ], // Array con gli id da aggiornare
[ "key1", "key2", ... ], // array con i nomi delle chiavi (*dbSchema[i].keyName*).
[ "value1", "value2", ... ] // Array coi nuovi valori da assegnare ai rispettivi campi.
)
.then( (queryResult) => { ... } )
.catch( (err) => { ... }); o con la notazione async/await
try {
let queryResult = Driver.update(
"tableName", // Nome della table
[ 1 ], // Array con gli id da aggiornare
[ "key1", "key2", ... ], // array con i nomi delle chiavi (*dbSchema[i].keyName*).
[ "value1", "value2", ... ] // Array coi nuovi valori da assegnare ai rispettivi campi.
);
...
} catch (err) {
...
};Test Cases
- UPD01 - Risolve in
queryResult.success: trueed aggiorna il record con parametri conformi.
DbDriver.delete( tableName {String}, ids {Array} idKey {String} = "id" )
Elimina uno o più record dalla table indicata come primo argomento.
Argomenti
tableName{String} Nome della tavola/schema su cui operareids{Array} Id dei records da eliminare.idKey{String} Nome del campo che funge da id del record, se diverso da"id"(valore di default).
Tipi Restituiti
Promise(err, queryResult)
L'oggetto queryResult contiene le seguenti proprietà:
success{Boolean}trueSe almeno un elemento è stato eliminato.message{String} Sesuccess=falsepuò contenenere il motivo dell'insuccesso.query{String} Stringa utilizzata per la query.parameters{Array} Array di parametri utilizzati per la query.affected{Number} Numero di elementi eliminati.
Test Cases
- DEL01 - Risolve in
queryResult.success: trueed elimina gli id indicati se corretti. - DEL02 - Risolve in
queryResult.success: trueed elimina gli id corretti anche se presenti id errati nell'array fornito. - DEL03 - Risolve in
queryResult.success: falsee non elimina gli id forniti se tutti errati
DbDriver.stop( force {Boolean} = false )
Termina la connessione al DataBase in modo ordinato.
Metodo da chiamare quando si vuol terminare l'utilizzo del driver.
Argomenti
force{Boolean} Se fornitotruearresta immediatamente il driver anche se altre istanze del driver sono in uso presso altri moduli. Sefalse(default) termina la connessione al driver solo se tutte le istanze del Singleton hanno invocato tale metodo.
Tipi Restituiti
Promise(err, Boolean)
true se la connessione al DataBase (e il relativo thread) viene effettivamente terminata.
Per approfondimenti vedi il paragrafo dedicato.
Test Cases
- STP01 - Risolve in
falsee non arresta il driver se presenti altre copie dell'istanza che non hanno eseguito tale metodo. - STP02 - Risolve in
trueed arresta immediatamente il driver se fornito argomentoforce==true
