Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator06 [2015/11/30 02:23]
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 1167: Line 1179:
   * metoda ''​destroy()''​ determină o terminare imediată a legăturii cu sistemul de gestiune pentru baze de date, garantând faptul că nu se vor mai produce alte evenimente și nici nu vor fi invocate metode de tip callback legate de conexiunea în cauză: <code javascript>​   * metoda ''​destroy()''​ determină o terminare imediată a legăturii cu sistemul de gestiune pentru baze de date, garantând faptul că nu se vor mai produce alte evenimente și nici nu vor fi invocate metode de tip callback legate de conexiunea în cauză: <code javascript>​
 connection.destroy();​ connection.destroy();​
 +</​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:
 +  * ''​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>​
 +connection.query('​SELECT * FROM book', function(error,​ result, fields) {
 +  if (error) {
 +    console.log('​An error has occurred: %s', error);
 +    return;
 +  }
 +  for (var index = 0; index < result.length;​ index++) {
 +    var book = {
 +      "​title":​ result[index].title,​
 +      "​subtitle":​ result[index].subtitle,​
 +      "​description":​ result[index].description,​
 +      "​edition":​ result[index].edition,​
 +      "​printing_year":​ result[index].printing_year,​
 +      "​collection_id":​ result[index].collection_id
 +    };
 +    books.push(book);​
 +  }
 +});
 +</​code>​
 +
 +În situația în care sunt incluși parametri direct în interogare, se recomandă să se utilizeze metoda ''​escape()''​ a obiectului ''​connection'',​ ce transformă caracterele care ar putea să aibă un impact asupra interogării în codul corespunzător,​ care poate fi procesat de interpretorul SQL:
 +  * valorile numerice nu sunt modificate sub nici o formă;
 +  * obiectele ce rețin valori de adevăr sunt convertite la ''​true''​ / ''​false'';​
 +  * valorile de tip dată calendaristică sunt transformate în șiruri de caractere având formatul ''​YYYY-mm-dd HH:​ii:​ss'';​
 +  * obiectele care rețin informații binare (''​Buffer''​) sunt convertite la șiruri de caractere, reprezentate sub forma codului hexazecimal;​
 +  * pentru șirurile de caractere, sunt convertite caracterele speciale;
 +  * tablourile sunt convertite în șiruri de caractere având forma unei liste, în care delimitatorul este caracterul '','';​ în situația în care se folosesc tablouri imbricate, pe baza acestora se vor genera grupuri de liste, în care un grup este încadrat între caracterele ''​(''​ și ''​)'';​
 +  * obiectele sunt transformate în perechi de tip ''​atribut''​ = ''​valoare''​ pentru fiecare atribut (enumerabil) al acestuia (funcțiile fiind ignorate), valorile fiind determinate prin apelarea metodei ''​toString()'';​ valorile de tip ''​undefined''​ sau ''​null''​ sunt convertite automat la ''​NULL'';​ această funcționalitate poate fi utilizată pentru adăugarea unei valori într-o tabelă direct dintr-un obiect JavaScript, fără a se mai preciza coloanele care sunt folosite;
 +  * valorile de tip ''​Nan''​ / ''​Infinity''​ sunt lăsate ca atare, de vreme ce MySQL nu suportă astfel de valori, astfel că în acest caz va fi generată o eroare.
 +
 +<code javascript>​
 +connection.statement('​SELECT * FROM book b WHERE b.id = ' + connection.escape(bookId),​ function(error,​ result, fields) {
 +  // ...
 +});
 +</​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>​
 +connection.query('​SELECT * FROM book b WHERE b.id = ?', [bookId], function(error,​ result, fields) {
 +  // ...
 +});
 +</​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:​
 +    * ''​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); ​
 +    * ''​typeCast''​ stabilește dacă operația de conversie de la tipurile de date MySQL la tipurile de date JavaScript, realizată automat în mod implicit; este recomandat ca o astfel de facilitate să nu fie dezactivată;​
 +    * ''​timeout''​ indică perioada după care se va genera o eroare dacă nu se furnizează un rezultat în intervalul respectiv;
 +    * ''​sql''​ reprezintă interogarea care va fi executată;
 +    * ''​values''​ conține valorile parametrilor,​ sub forma unei liste, în situația în care interogarea este parametrizată.
 +
 +<code javascript>​
 +connection.query({
 +  sql: '​SELECT * FROM books WHERE b.id = ?',
 +  values: [bookId],
 +  nestTables: true,
 +  typeCast: false, // !!! NOT recommended
 +  timeout: 10000
 +}, function (error, result, fields) {
 +  // ... 
 +});
 +</​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>​
 +connection.query({
 +  sql: '​SELECT * FROM books WHERE b.id = ?',
 +  nestTables: true,
 +  typeCast: false, // !!! NOT recommended
 +  timeout: 10000
 +}, [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 1223: 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>​
laboratoare/laborator06.1448843003.txt.gz · Last modified: 2015/11/30 02:23 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0