Drupal 6 Database layer

  • 963 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
963
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
5
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Drupal adatbázis API    
  • 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. 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. 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. 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. Példák ● Rossz példa: $res = db_query(”SELECT * FROM {users}  WHERE uid = $uid”);    
  • 7. Példák ● Mi van, ha a valahonnan kapott $uid tartalma a  következő: 1; UPDATE users SET pass = md5('iamhacked')    
  • 8. Akkor bizony  megtörtek :(    
  • 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. String ● String használata $res = db_query(”SELECT uid, name FROM  {users} WHERE name = '%s'”, $searchstring);    
  • 11. További típusok ● Float $res = db_query(”SELECT * FROM {spec_tabla}  WHERE valami_mezo > %F”, $float_ertek);    
  • 12. További típusok ● Bináris $res = db_query(”UPDATE {spec_tabla} SET  valami_adat = %b WHERE id = %d”,  $binaris_adat, $id);    
  • 13. A % escape-elése %% db_query('SELECT nid FROM {node} WHERE  title LIKE '%%%s%%' ORDER BY nid DESC',  $searchstring);    
  • 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. Tábla nevek db_escape_table() db_query('SELECT * FROM {' .  db_escape_table($table) . '}');    
  • 16. Schema API    
  • 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. hook_schema() ● Használat (.install): mymodule_schema() { $schema = array(...); return $schema; } mymodule_install() { drupal_install_schema('mymodule'); } mymodule_uninstall() { drupal_uninstall_schema('mymodule'); }    
  • 19. Schema tömb array( 'tablaneve' => array( 'fields' => $fields, 'indexes' => $indexes, 'unique keys' => $unique_keys, 'primary key' => $primary_key, ), );    
  • 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. Típusok ● serial (pg: automatikus sequence, mysql: auto_increment) ● int ● float ● numeric ● varchar ● char ● text ● blob ● datetime    
  • 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. 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. Kulcsok megadása ● unique keys, indexes: array( 'kulcs0' => array('mezo0', 'mezo1'), 'kulcs1' => array('mezo3'), ) ● primary key array( 'mezo0', 'mezo1' )    
  • 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. 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. 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. 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. 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. 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. 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. 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. Kérdések