Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator06 [2015/11/30 12:24] Andrei Roșu-Cojocaru |
laboratoare:laborator06 [2015/11/30 15:31] (current) Andrei Roșu-Cojocaru |
||
|---|---|---|---|
| Line 1133: | Line 1133: | ||
| * ''trace'' - permite reținerea stivei de execuție în cadrul obiectelor ''Error'' care să includă apelul metodei din cadrul bibliotecii, cu deprecieri ale performanțelor pentru majoritatea apelurilor (implicit, ''true''); | * ''trace'' - permite reținerea stivei de execuție în cadrul obiectelor ''Error'' care să includă apelul metodei din cadrul bibliotecii, cu deprecieri ale performanțelor pentru majoritatea apelurilor (implicit, ''true''); | ||
| * ''multipleStatements'' - stabilește comportamentul în privința utilizării mai multor expresii MySQL în cadrul aceleiași interogări, ceea ce ar putea reprezenta o breșă de securitate în privința atacurilor prin injecția de SQL malițios (implicit, ''false''); | * ''multipleStatements'' - stabilește comportamentul în privința utilizării mai multor expresii MySQL în cadrul aceleiași interogări, ceea ce ar putea reprezenta o breșă de securitate în privința atacurilor prin injecția de SQL malițios (implicit, ''false''); | ||
| - | * ''flags'' - stabilește o listă cu valori care vor controla comportamentul conexiunii; | + | * ''flags'' - stabilește o listă cu valori care vor controla comportamentul conexiunii; aceștia sunt transmiși sub forma unui șir de caractere în care delimitatorul este caracterul '',''; un flag care este adăugat în plus față de cele implicite trebuie prefixat de caracterul ''+'' iar în situația în care se dorește ca un flag implicit să fie șters, acesta trebuie prefixat de caracterul ''-''; lista de flag-uri implicite este: |
| + | * ''CONNECT_WITH_DB'' - permite specificarea denumirii bazei de date în momentul în care este definită o conexiune; | ||
| + | * ''FOUND_ROWS'' - transmite atributul ''found_rows'' al argumentului ''result'' din cadrul metodei de tip callback transmisă prin metoda ''query()'', în loc de ''affected_rows''; | ||
| + | * ''IGNORE_SPACE'' - interpretorul SQL va ignora spațiile care preced caracterul ''('' în cadrul interogărilor; | ||
| + | * ''LOCAL_FILES'' - permite încărcarea înregistrărilor într-o bază de date folosind ''LOAD DATA LOCAL''; | ||
| + | * ''LONG_FLAG''; | ||
| + | * ''LONG_PASSWORD'' - folosește o versiune îmbunătățită a mecanismului de autentificare; | ||
| + | * ''MULTI_RESULTS'' - semnalează posibilitatea de gestiune concurentă a mai multe seturi de rezultate; | ||
| + | * ''PROTOCOL_41'' - folosește versiunea 4.1 a protocolului de conectare la baza de date; | ||
| + | * ''PS_MULTI_RESULTS'' - semnalează posibilitatea de gestiune concurentă a mai multe seturi de rezultate; | ||
| + | * ''SECURE_CONNECTION'' - indică faptul că este suportată mecanismul de autentificare nativ din versiunea 4.1 a protocolului de conectare la baza de date; | ||
| + | * ''TRANSACTIONS'' - solicită utilizarea flag-urilor care indică starea tranzacției; | ||
| + | * ''MULTI_STATEMENTS'' - transmis în mod automat în situația în care parametrul ''multipleStatements'' are valoarea ''true''; | ||
| * ''ssl'' - transmite un obiect care conține parametri SSL sau un șir de caracyere care conține denumirea unui profil SSL. | * ''ssl'' - transmite un obiect care conține parametri SSL sau un șir de caracyere care conține denumirea unui profil SSL. | ||
| Line 1168: | Line 1180: | ||
| connection.destroy(); | connection.destroy(); | ||
| </code> | </code> | ||
| + | |||
| + | În situația în care se dorește folosirea unui grup de conexiuni, se poate folosi metoda ''createPool()'' a obiectului ''mysql'' astfel încât numărul de conexiuni este specificat prin intermediul proprietății ''connectionLimit''. Obținerea unei conexiuni se face ulterior prin apelul metodei ''getConnection()'', iar în momentul în care aceasta nu mai este necesară se poate apela metoda ''release()''. Un grup de conexiuni este terminat prin apelul metodei ''end()''. | ||
| **Realizarea unei interogări** este realizată de regulă prin intermediul metodei ''query()'' apelată pe obiectul de tip ''Connection'', care suportă următoarele forme: | **Realizarea unei interogări** este realizată de regulă prin intermediul metodei ''query()'' apelată pe obiectul de tip ''Connection'', care suportă următoarele forme: | ||
| - | * ''query(statement, callback)'' - este utilizată de regulă pentru acele interogări care nu folosesc parametri sau pentru care parametrii sunt incluși în interogare; metoda primește ca argument o funcție de tip callback, având ca parametri obiectul eroare (în situația în care aceasta se produce), obiectul care reține rezultatul, acesta având forma unui tablou (chiar dacă rezultatul conține o singură înregistrare) și un obiect în care se regăsesc informații cu privire la câmpurile pentru care s-a realizat interogarea respectivă: <code javascript> | + | * ''query(statement, callback)'' - este utilizată de regulă pentru acele interogări care nu folosesc parametri sau pentru care parametrii sunt incluși în interogare; metoda primește ca argument o funcție de tip callback, având ca parametri obiectul eroare (în situația în care aceasta se produce), obiectul care reține rezultatul, acesta având forma unui tablou (chiar dacă rezultatul conține o singură înregistrare) și un obiect în care se regăsesc informații cu privire la câmpurile pentru care s-a realizat interogarea respectivă: |
| - | connection.statement('SELECT * FROM book', function(error, result, fields) { | + | |
| + | <code javascript> | ||
| + | connection.query('SELECT * FROM book', function(error, result, fields) { | ||
| if (error) { | if (error) { | ||
| console.log('An error has occurred: %s', error); | console.log('An error has occurred: %s', error); | ||
| Line 1206: | Line 1222: | ||
| </code> | </code> | ||
| - | * ''query(statement, parameters, callback)'' - este utilizată de regulă pentru acele interogări care folosesc parametri; faptul că se utilizează un parametru este marcat prin caracterul ''?''; argumentul care indică parametrii are forma unei liste și trebuie să respecte exact ordinea în care aceștia sunt menționați în cadrul interogării <code javascript> | + | * ''query(statement, parameters, callback)'' - este utilizată de regulă pentru acele interogări care folosesc parametri; faptul că se utilizează un parametru este marcat prin caracterul ''?''; argumentul care indică parametrii are forma unei liste și trebuie să respecte exact ordinea în care aceștia sunt menționați în cadrul interogării |
| - | connection.statement('SELECT * FROM book b WHERE b.id = ?', [bookId], function(error, result, fields) { | + | |
| + | <code javascript> | ||
| + | connection.query('SELECT * FROM book b WHERE b.id = ?', [bookId], function(error, result, fields) { | ||
| // ... | // ... | ||
| }); | }); | ||
| </code> | </code> | ||
| + | |||
| * ''query(options, callback)'' - este utilizat atunci când se dorește să se folosească anumite funcționalități pentru controlul modului în care vor fi furnizate rezultatele: | * ''query(options, callback)'' - este utilizat atunci când se dorește să se folosească anumite funcționalități pentru controlul modului în care vor fi furnizate rezultatele: | ||
| * ''nestTables'' permite stocarea valorilor corespunzătoare coloanelor având aceeași denumire în momentul în care sunt utilizate operații de asociere; se poate folosi valoarea ''true'' (situație în care denumirea coloanelor este prefixată de denumirea tabelei din care provin) sau ''_'' (caz în care valorile distincte aparținând unor coloane cu aceeași denumire sunt concatenate folosind acest delimitator); | * ''nestTables'' permite stocarea valorilor corespunzătoare coloanelor având aceeași denumire în momentul în care sunt utilizate operații de asociere; se poate folosi valoarea ''true'' (situație în care denumirea coloanelor este prefixată de denumirea tabelei din care provin) sau ''_'' (caz în care valorile distincte aparținând unor coloane cu aceeași denumire sunt concatenate folosind acest delimitator); | ||
| Line 1219: | Line 1238: | ||
| <code javascript> | <code javascript> | ||
| - | connection.statement({ | + | connection.query({ |
| sql: 'SELECT * FROM books WHERE b.id = ?', | sql: 'SELECT * FROM books WHERE b.id = ?', | ||
| values: [bookId], | values: [bookId], | ||
| Line 1230: | Line 1249: | ||
| </code> | </code> | ||
| - | * ''query(options, parameters, callback)'' - este utilizat pentru interogări parametrizate, atunci când valorile acestora sunt furnizate distinct, nu în cadrul atributului ''values'': <code javascript> | + | * ''query(options, parameters, callback)'' - este utilizat pentru interogări parametrizate, atunci când valorile acestora sunt furnizate distinct, nu în cadrul atributului ''values'': |
| - | connection.statement({ | + | |
| + | <code javascript> | ||
| + | connection.query({ | ||
| sql: 'SELECT * FROM books WHERE b.id = ?', | sql: 'SELECT * FROM books WHERE b.id = ?', | ||
| nestTables: true, | nestTables: true, | ||
| Line 1238: | Line 1259: | ||
| }, [bookId], function (error, result, fields) { | }, [bookId], function (error, result, fields) { | ||
| // ... | // ... | ||
| + | }); | ||
| + | </code> | ||
| + | |||
| + | În cazul interogărilor parametrizate, în situația în care pe post de parametrii se folosesc anumite câmpuri pentru care nu se aplică regulile de transformare obișnuite, se folosește șirul de caractere ''??''. De asemenea, șirul de caractere poate fi pregătit local, înainte de a fi transmis către sistemul de gestiune pentru baze de date MySQL, prin intermediul metodei ''format()'': | ||
| + | |||
| + | <code javascript> | ||
| + | var unformatted_statement = 'SELECT * FROM ?? WHERE ?? = ?'; | ||
| + | var parameters = ['book', 'id', bookId]; | ||
| + | var formatted_statement = mysql.format(unformatted_statement, parameters); | ||
| + | // ... | ||
| + | </code> | ||
| + | |||
| + | Pentru operațiile de **adăugare**, **modificare**, **ștergere**, se pot determina informații legate de identificatorul valorii care este adăugată, respectiv de numărul de înregistrări care au fost modificate / șterse, ca proprietăți ale obiectului ''result'' transmis ca parametru al funcției de tip callback în momentul în care este invocată metoda ''query()'': | ||
| + | * ''insertId'' - stochează identificatorul înregistrării care a fost adăugată în baza de date în urma unei interogări de tip ''INSERT'' transmisă ca parametru al metodei ''query()'': <code javascript> | ||
| + | var book = { | ||
| + | "title": title, | ||
| + | "subtitle": subtitle, | ||
| + | "description": description, | ||
| + | "edition": edition, | ||
| + | "printing_year": printing_year, | ||
| + | "collection_id": collection_id | ||
| + | }; | ||
| + | var query = connection.query('INSERT INTO book SET ?', book, function(error, result) { | ||
| + | if (error) { | ||
| + | console.log('An error has occurred: %s', error); | ||
| + | return; | ||
| + | } | ||
| + | console.log('The record has been successfully inserted with id %d', result.insertId); | ||
| + | }); | ||
| + | console.log(query.sql); | ||
| + | </code> | ||
| + | * ''changedRows'' - determină numărul de înregistrări care au fost modificate în urma unei interogări de tip ''UPDATE'' transmisă ca parametru al metodei ''query()'': <code javascript> | ||
| + | var query = connection.query('UPDATE book SET edition = edition + 1 WHERE printing_year > ?', [printingYear], function(error, result) { | ||
| + | if (error) { | ||
| + | console.log('An error has occurred: %s', error); | ||
| + | return; | ||
| + | } | ||
| + | console.log('%s records have been successfully updated', result.changedRows); | ||
| + | }); | ||
| + | </code> | ||
| + | * ''affectedRows'' - determină numărul de înregistrări care au fost șterse în urma unei interogări de tip ''DELETE'' transmisă ca parametru al metodei ''query()'': <code javascript> | ||
| + | var query = connection.query('DELETE FROM book WHERE collection_id IN ?', [collectionId], function(error, result) { | ||
| + | if (error) { | ||
| + | console.log('An error has occurred: %s', error); | ||
| + | return; | ||
| + | } | ||
| + | console.log('%s records have been successfully deleted', result.affectedRows); | ||
| }); | }); | ||
| </code> | </code> | ||
| Line 1295: | Line 1363: | ||
| </code> | </code> | ||
| * se lansează în execuție serverul HTTP pe un anumit port: <code javascript> | * se lansează în execuție serverul HTTP pe un anumit port: <code javascript> | ||
| - | app.lister(8080); | + | app.listen(8080); |
| </code> | </code> | ||
| * fișierul ''package.json'' - conține informații cu privire la aplicația web (denumire, versiune, cuvinte-cheie, autor precum și modulele folosite, descrise sub formă de dependențe - pentru fiecare atribut se indică denumirea și versiunea care se dorește a fi utilizată) <file json package.json> | * fișierul ''package.json'' - conține informații cu privire la aplicația web (denumire, versiune, cuvinte-cheie, autor precum și modulele folosite, descrise sub formă de dependențe - pentru fiecare atribut se indică denumirea și versiunea care se dorește a fi utilizată) <file json package.json> | ||
