#!/usr/bin/ruby -w # # Prochazi strukturu databaze a vytvari test # # Pouziti: webmysqltest.rb db_user db_heslo jmeno_databaze cesta_ke_generovanemu_testu # require 'mysql' php_pred='query("SHOW TABLES"); while (list($tbl) = $res->fetch_row()) { $restbl = $db->query("DESCRIBE ".$tbl); $arr = array(); while ($col = $restbl->fetch_assoc()) { $nazev = $col["Field"]; unset($col["Field"]); $arr[$nazev] = $col; } $lokalni[$tbl] = $arr; $restbl->free(); } $res->free(); echo "VYSLEDEK TESTU: ".($globalni == $lokalni ? "OK" : "FAILED!")."\n"; function compare_func($a, $b) { if (is_array($b) && is_array($b)) { $p = array_udiff_assoc($a, $b, "compare_func"); if (!empty($p)) { print_r($p); return 1; } $r = array_udiff_assoc($b, $a, "compare_func"); if (!empty($r)) { print_r($r); return -1; } return 0; } if ($a == $b) { return 0; } return ($a > $b)? 1:-1; } function vypis_pole($arr) { foreach($arr as $k=>$v) echo "\t\t[" . $k . "] => " . $v . "\n"; } if ($globalni != $lokalni) { echo "VERZE PROGRAMU, KTEROU POUZIVATE, VYZADUJE NASLEDUJICI CASTI DB ODLISNE:\n"; $glo_vs_lok = array_udiff_assoc($globalni, $lokalni, "compare_func"); if (!empty($glo_vs_lok)) { echo "ODLISNOSTI TABULEK POUZITE VERZE VUCI LOKALNIM:\n"; vypis_pole(array_keys($glo_vs_lok)); } echo "LOKALNI DATABAZE OBSAHUJE NASLEDUJICI CASTI, KTERE NEJSOU VYZADOVANY:\n"; $lok_vs_glo = array_udiff_assoc($lokalni, $globalni, "compare_func"); if (!empty($lok_vs_glo)) { echo "ODLISNOSTI TABULEK LOKALNI VERZE VUCI VYZADOVANYM:\n"; vypis_pole(array_keys($lok_vs_glo)); } exit(1); } else { exit(0); } ?>' fields = Array[ "Field", "Type", "Null", "Key", "Default", "Extra" ] if $*.length != 4 puts "Mysql structure test creator" puts "Usage: webmysqltest.rb login pass database test_file_path" exit 0 end begin dbh = Mysql.real_connect("localhost", ARGV[0], ARGV[1], ARGV[2]) res = dbh.query("SHOW TABLES") f = File.new(ARGV[3], "w") f.puts(php_pred) f.puts("$globalni = array(") while row = res.fetch_row do # vygenerovat php f.puts("\t\"" + row[0] + '"' + " => array(") tblres = dbh.query("DESCRIBE " + row[0]) while col = tblres.fetch_row do nazev = col[0] f.puts("\t\t\"" + nazev + "\" => array(") col.each_index {|i| if (i != 0) k = fields[i] v = col[i] if (v == nil) v = "" end f.puts("\t\t\t\""+k+"\"=>\""+v+"\",") end } f.puts("\t\t),") end tblres.free f.puts("\t),") end f.puts(");") f.puts(php_po) f.close res.free puts "Test struktury databaze byl vygenerovan." rescue Mysql::Error => e puts "Error code: #{e.errno}" puts "Error message: #{e.error}" puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate") ensure dbh.close if dbh end