Drupal 6 Database layer

1,127 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,127
On SlideShare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Drupal 6 Database layer

  1. 1. Drupal adatbázis API    
  2. 2. Több adatbázis támogatása ● Drupal 6 ● MySQL: támogatott ● PostgreSQL: core támogatja, contribok kevésbé ● MSSQL: a Microsoft nagyon szeretné ● Oracle: contribként elérhető ● Drupal 7 ● MySQL: támogatott ● PostgreSQL: tesztekkel bizonyítottan támogatott    
  3. 3. Könnyűsúlyú API ● Előny ● Kevés visszaesés teljesítményben ● Könnyen használható ● Hátrány ● SQL írásakor nagyon figyelni kell a szintaxisra ● Csak olyan funkciókra lehet támaszkodni, amelyek  mindegyik támogatott adatbáziskezelőn elérhetőek    
  4. 4. Szintaxis különbség ● Tábla neveket körbe kell venni {}­kkel ● Értékek helyett placeholderek ● Példa SELECT ”name” FROM {users} WHERE uid = %d    
  5. 5. Függvények db_add_field, db_add_index, db_add_primary_key, db_add_unique_key, db_affected_rows, db_change_field, db_check_setup, db_column_exists, db_connect, db_create_table, db_create_table_sql, db_decode_blob, db_distinct_field, db_drop_field, db_drop_index, db_drop_primary_key, db_drop_table, db_drop_unique_key, db_encode_blob, db_error, db_escape_string, db_escape_table, db_fetch_array, db_fetch_object, db_field_names, db_field_set_default, db_field_set_no_default, db_is_active, db_last_insert_id, db_lock_table, db_placeholders, db_prefix_tables, db_query, db_query_range, db_query_temporary, db_rename_table, db_result, db_rewrite_sql, db_set_active, db_status_report, db_table_exists, db_type_map, db_type_placeholder, db_unlock_tables, db_version, pager_query, tablesort_sql, update_sql    
  6. 6. Példák ● Rossz példa: $res = db_query(”SELECT * FROM {users}  WHERE uid = $uid”);    
  7. 7. Példák ● Mi van, ha a valahonnan kapott $uid tartalma a  következő: 1; UPDATE users SET pass = md5('iamhacked')    
  8. 8. Akkor bizony  megtörtek :(    
  9. 9. Példák ● Az előző példa helyesen $res = db_query(”SELECT * FROM {users}  WHERE uid = %d”, $uid); ● Az uid lehet bármi, a %d miatt numerikus értékké  lesz konvertálva. ● Az előző rosszindulatú paraméter esetén 1 lesz.    
  10. 10. String ● String használata $res = db_query(”SELECT uid, name FROM  {users} WHERE name = '%s'”, $searchstring);    
  11. 11. További típusok ● Float $res = db_query(”SELECT * FROM {spec_tabla}  WHERE valami_mezo > %F”, $float_ertek);    
  12. 12. További típusok ● Bináris $res = db_query(”UPDATE {spec_tabla} SET  valami_adat = %b WHERE id = %d”,  $binaris_adat, $id);    
  13. 13. A % escape-elése %% db_query('SELECT nid FROM {node} WHERE  title LIKE '%%%s%%' ORDER BY nid DESC',  $searchstring);    
  14. 14. Változó számú érték $data = array(1, 2, 3); db_query('SELECT foo FROM {bar} WHERE  client_id IN (' . db_placeholders($data, 'int') . ')  ORDER BY client_id', $data);    
  15. 15. Tábla nevek db_escape_table() db_query('SELECT * FROM {' .  db_escape_table($table) . '}');    
  16. 16. Schema API    
  17. 17. Schema API ● Automatikus adatbázisséma generálás ● Biztosan adatbázisfüggetlen lesz a kód, amit generál ● Könnyebb karbantartani ● Könnyen lehet csak egyes részeket felhasználni    
  18. 18. hook_schema() ● Használat (.install): mymodule_schema() { $schema = array(...); return $schema; } mymodule_install() { drupal_install_schema('mymodule'); } mymodule_uninstall() { drupal_uninstall_schema('mymodule'); }    
  19. 19. Schema tömb array( 'tablaneve' => array( 'fields' => $fields, 'indexes' => $indexes, 'unique keys' => $unique_keys, 'primary key' => $primary_key, ), );    
  20. 20. Mezők array( 'mezoneve' => array( 'type' => $tipus, 'unsigned' => TRUE, // csak numerikus típussal 'not null' => TRUE, 'length' => $hossz, // nem minden típusnál 'default' => $alapertek, // nem kötelező 'size' => $hossz, // adattípus hossza (nem kötelező), 'precision' => $p, // csak numerikus mezőknél 'scale' => $s, // csak numerikus mezőknél 'serialize' => FALSE, ), );    
  21. 21. Típusok ● serial (pg: automatikus sequence, mysql: auto_increment) ● int ● float ● numeric ● varchar ● char ● text ● blob ● datetime    
  22. 22. Opciók ● size: az adattípus mérete ('tiny', 'small', 'medium',  'normal', 'big'), lásd: Adattípusok és méreteik ● not null: NULL érték engedélyezése ● default: alapértelmezett érték ● length: hossz a következő típusoknál: 'varchar',  'text', 'int' ● unsigned: 'int', 'float', 'numeric' értékeknél érvényes,  alapértelmezett: FALSE    
  23. 23. Opciók ● precision, scale: a 'numeric' típusnál a pontosság  (szignifikáns bitek száma) ● serialize: boolean érték, hogy a tárolt adat  szerializált sztring­e    
  24. 24. Kulcsok megadása ● unique keys, indexes: array( 'kulcs0' => array('mezo0', 'mezo1'), 'kulcs1' => array('mezo3'), ) ● primary key array( 'mezo0', 'mezo1' )    
  25. 25. API db_add_field, db_add_index, db_add_primary_key, db_add_unique_key, db_change_field, db_create_table, db_create_table_sql, db_drop_field, db_drop_index, db_drop_primary_key, db_drop_table, db_drop_unique_key, db_field_names, db_field_set_default, db_field_set_no_default, db_rename_table, db_type_map, db_type_placeholder, drupal_get_schema, drupal_get_schema_unprocessed, drupal_install_schema, drupal_schema_fields_sql, drupal_uninstall_schema, drupal_write_record, _db_create_field_sql, _db_process_field, _drupal_initialize_schema    
  26. 26. Táblafrissítés ● function mymodule_update_6001() { $ret = array(); db_add_field($ret, 'mytable1', 'newcol', array('type' => 'int',  'not null' => TRUE)); $schema['mytable2'] = array(...); db_create_table($ret, 'mytable2', $schema['mytable2']); db_add_unique_key($ret, 'mytable2', 'mykey', array('field1',  'field2')); return $ret; }    
  27. 27. További tudnivalók ● Primary key nem lehet NULL ● NOT NULL utólagos hozzáadása, alapértelmezett  érték nélkül: $ret = array(); db_add_field($ret, 'mytable0', 'col1', array('type' =>  'text', 'not null' => TRUE, 'initial' => 'start'));    
  28. 28. Típusok Field type PHP types Correct Incorrect int integer 0, 3, 17 0.5, '0' float float 7, 5.75 1.24' numeric float 3.14 2.17' datetime string '2007-08-26 13:00:00' Unix timestamp varchar string '', 'hi mom' 0, 3.14 text N/A none serial N/A none blob N/A none    
  29. 29. JOIN ● A direktszorzat nem hatékony ● 3 tábla, 1 millió, fél millió és 50 millió rekorddal ● Hatékony (polinom idejű és memóriaigényű)  megoldás: JOIN    
  30. 30. JOIN ● (INNER) JOIN SELECT * FROM foo JOIN bar ON foo.fid = bar.fid SELECT * FROM foo JOIN bar USING (fid) ● LEFT, RIGHT (OUTER) JOIN SELECT * FROM foo LEFT JOIN bar ON foo.fid =  bar.fid ● NATURAL JOIN SELECT * FROM foo NATURAL JOIN bar ● http://en.wikipedia.org/wiki/Join_(SQL)    
  31. 31. Kompatibilis SQL ● Táblanév köré ” ` helyett ● String köré szigorúan ' ● Adattörlés egyszerre egy táblából ● MySQL­nél az int és a boolean ugyanaz,  Postgres­nél nem!    
  32. 32. Kompatibilis SQL ● Kerülni: ● IGNORE ● REPLACE ● ON DUPLICATE KEY ● CONCAT() csak két argumentummal ● Minden nem aggregált mezőnek szerepelnie kell a  GROUP BY után ● http://drupal.org/node/555514     
  33. 33. Kérdések    

×