ssb Fri Mar 23 23:00:45 2001 EDT Added files: /php4/pear/DB/tests tableinfo.inc /php4/pear/DB/tests/mysql 012.phpt Modified files: /php4/pear DB.php /php4/pear/DB STATUS common.php mysql.php Log: * added Christian Stocker's tableInfo() implementation
Index: php4/pear/DB.php diff -u php4/pear/DB.php:1.52 php4/pear/DB.php:1.53 --- php4/pear/DB.php:1.52 Thu Mar 22 17:15:05 2001 +++ php4/pear/DB.php Fri Mar 23 23:00:44 2001 @@ -17,7 +17,7 @@ // | Tomas V.V.Cox <[EMAIL PROTECTED]> | // +----------------------------------------------------------------------+ // -// $Id: DB.php,v 1.52 2001/03/23 01:15:05 ssb Exp $ +// $Id: DB.php,v 1.53 2001/03/24 07:00:44 ssb Exp $ // // Database independent query interface. // @@ -133,6 +133,17 @@ define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); /** + * these are constants for the tableInfo-function + * they are bitwised or'ed. so if there are more constants to be defined + * in the future, adjust DB_TABLEINFO_FULL accordingly + */ + +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); + + +/** * The main "DB" class is simply a container class with some static * methods for creating DB objects as well as some utility functions * common to all parts of DB. @@ -625,6 +636,11 @@ } $this->result = false; return true; + } + + function tableInfo($mode = null) + { + return $this->dbh->tableInfo($this->result, $mode); } } Index: php4/pear/DB/STATUS diff -u php4/pear/DB/STATUS:1.15 php4/pear/DB/STATUS:1.16 --- php4/pear/DB/STATUS:1.15 Thu Mar 22 17:15:06 2001 +++ php4/pear/DB/STATUS Fri Mar 23 23:00:45 2001 @@ -21,3 +21,4 @@ transactions x n n n x x x n auto-commit x n n n x x x n error mapping - - - T T x E - +tableInfo n n n T n n n n Index: php4/pear/DB/common.php diff -u php4/pear/DB/common.php:1.40 php4/pear/DB/common.php:1.41 --- php4/pear/DB/common.php:1.40 Thu Mar 22 17:15:06 2001 +++ php4/pear/DB/common.php Fri Mar 23 23:00:45 2001 @@ -865,6 +865,14 @@ } // }}} + // {{{ tableInfo() + + function tableInfo($result, $mode = null) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} } ?> Index: php4/pear/DB/mysql.php diff -u php4/pear/DB/mysql.php:1.49 php4/pear/DB/mysql.php:1.50 --- php4/pear/DB/mysql.php:1.49 Mon Feb 19 04:22:26 2001 +++ php4/pear/DB/mysql.php Fri Mar 23 23:00:45 2001 @@ -453,6 +453,102 @@ } // }}} + // {{{ tableInfo() + + function tableInfo($result, $mode = null) { + $count = 0; + $id = 0; + $res = array(); + + /* + * depending on $mode, metadata returns the following values: + * + * - mode is false (default): + * $result[]: + * [0]["table"] table name + * [0]["name"] field name + * [0]["type"] field type + * [0]["len"] field length + * [0]["flags"] field flags + * + * - mode is DB_TABLEINFO_ORDER + * $result[]: + * ["num_fields"] number of metadata records + * [0]["table"] table name + * [0]["name"] field name + * [0]["type"] field type + * [0]["len"] field length + * [0]["flags"] field flags + * ["order"][field name] index of field named "field name" + * The last one is used, if you have a field name, but no index. + * Test: if (isset($result['meta']['myfield'])) { ... + * + * - mode is DB_TABLEINFO_ORDERTABLE + * the same as above. but additionally + * ["ordertable"][table name][field name] index of field + * named "field name" + * + * this is, because if you have fields from different + * tables with the same field name * they override each + * other with DB_TABLEINFO_ORDER + * + * you can combine DB_TABLEINFO_ORDER and + * DB_TABLEINFO_ORDERTABLE with DB_TABLEINFO_ORDER | + * DB_TABLEINFO_ORDERTABLE * or with DB_TABLEINFO_FULL + */ + + // if $result is a string, then we want information about a + // table without a resultset + if (is_string($result)) { + $id = @mysql_list_fields($this->dsn["database"], + $result, $this->connection); + if (empty($id)) { + return $this->mysqlRaiseError(); + } + } else { // else we want information about a resultset + $id = $result; + if (empty($id)) { + return $this->mysqlRaiseError(); + } + } + + $count = @mysql_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (empty($mode)) { + for ($i=0; $i<$count; $i++) { + $res[$i]["table"] = @mysql_field_table ($id, $i); + $res[$i]["name"] = @mysql_field_name ($id, $i); + $res[$i]["type"] = @mysql_field_type ($id, $i); + $res[$i]["len"] = @mysql_field_len ($id, $i); + $res[$i]["flags"] = @mysql_field_flags ($id, $i); + } + } else { // full + $res["num_fields"]= $count; + + for ($i=0; $i<$count; $i++) { + $res[$i]["table"] = @mysql_field_table ($id, $i); + $res[$i]["name"] = @mysql_field_name ($id, $i); + $res[$i]["type"] = @mysql_field_type ($id, $i); + $res[$i]["len"] = @mysql_field_len ($id, $i); + $res[$i]["flags"] = @mysql_field_flags ($id, $i); + if ($mode & DB_TABLEINFO_ORDER) { + $res["order"][$res[$i]["name"]] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res["ordertable"][$res[$i]["table"]][$res[$i]["name"]] = $i; + } + } + } + + // free the result only if we were called on a table + if ($table) { + @mysql_free_result($id); + } + return $res; + } + + // }}} // TODO/wishlist: // simpleFetch Index: php4/pear/DB/tests/tableinfo.inc +++ php4/pear/DB/tests/tableinfo.inc <?php $dbh->setErrorHandling(PEAR_ERROR_DIE); $dbh->query("INSERT INTO phptest VALUES(1, 'one', 'One', '2001-02-16')"); $dbh->query("INSERT INTO phptest VALUES(2, 'two', 'Two', '2001-02-15')"); $dbh->query("INSERT INTO phptest VALUES(3, 'three', 'Three', '2001-02-14')"); $test_mktable_query2 = "CREATE TABLE phptest_fk (a INTEGER, fk INTEGER, c TEXT, d DATE)"; $dbh->query($test_mktable_query2); $dbh->query("INSERT INTO phptest_fk VALUES(1, 1, 'One', '2001-02-16')"); $dbh->query("INSERT INTO phptest_fk VALUES(2, 1, ' Two', '2001-02-15')"); $dbh->query("INSERT INTO phptest_fk VALUES(3, 2, 'Three', '2001-02-14')"); print "testing tableInfo:\n"; $sth = $dbh->query("SELECT * FROM phptest left join phptest_fk on phptest.a = phptest_fk.fk"); $tableInfo = $sth->tableInfo(); print "\nfirst field:\n"; print_foreach($tableInfo[0]) ; print "\neight (last) field:\n"; print_foreach($tableInfo[7]) ; print "\ntesting tableInfo (DB_TABLEINFO_ORDER):\n"; $tableInfo =$sth->tableInfo(DB_TABLEINFO_ORDER); print "\nfirst field:\n"; print_foreach($tableInfo[0]) ; print "\neight field:\n"; print_foreach($tableInfo[3]) ; print "\nnum_fields:\n"; print "$tableInfo[num_fields]\n" ; print "\norder:\n"; print_foreach($tableInfo[order]) ; print "\ntesting tableInfo (DB_TABLEINFO_ORDERTABLE):\n"; $tableInfo =$sth->tableInfo(DB_TABLEINFO_ORDERTABLE); print "\nfirst field:\n"; print_foreach($tableInfo[0]) ; print "\neight field:\n"; print_foreach($tableInfo[3]) ; print "\nnum_fields:\n"; print "$tableInfo[num_fields]\n" ; print "\nordertable:\n"; print_foreach($tableInfo[ordertable]) ; print "\nordertable[phptest]:\n"; print_foreach($tableInfo[ordertable][phptest]) ; print "\nordertable[phptest_fk]:\n"; print_foreach($tableInfo[ordertable][phptest_fk]) ; print "\ntesting tableInfo (table without query-result):\n"; $tableInfo = $dbh->tableInfo("phptest"); print "\nfirst field:\n"; print_foreach($tableInfo[0]) ; print "\nfourth (last) field:\n"; print_foreach($tableInfo[3]) ; print "\ntesting tableInfo (table without query-result and DB_TABLEINFO_FULL):\n"; $tableInfo = $dbh->tableInfo("phptest",DB_TABLEINFO_FULL); print "\nfirst field:\n"; print_foreach($tableInfo[0]) ; print "\norder:\n"; print_foreach($tableInfo[order]) ; print "\nordertable:\n"; print_foreach($tableInfo[ordertable]) ; print "\nordertable[phptest]:\n"; print_foreach($tableInfo[ordertable][phptest]) ; //print_foreach($tableInfo[0]) ; $dbh->query("DELETE FROM phptest WHERE a <> 42"); $dbh->query("DROP TABLE phptest_fk"); function print_foreach ($array) { foreach ($array as $key => $value) { print "$key => $value \n"; } } ?> Index: php4/pear/DB/tests/mysql/012.phpt +++ php4/pear/DB/tests/mysql/012.phpt --TEST-- DB_mysql tableInfo test --SKIPIF-- <?php include("skipif.inc"); ?> --FILE-- <?php require_once "DB.php"; include("mktable.inc"); include("../tableinfo.inc"); ?> --EXPECT-- testing tableInfo: first field: table => phptest name => a type => int len => 11 flags => eight (last) field: table => phptest_fk name => d type => date len => 10 flags => testing tableInfo (DB_TABLEINFO_ORDER): first field: table => phptest name => a type => int len => 11 flags => eight field: table => phptest name => d type => date len => 10 flags => num_fields: 8 order: a => 4 b => 1 c => 6 d => 7 fk => 5 testing tableInfo (DB_TABLEINFO_ORDERTABLE): first field: table => phptest name => a type => int len => 11 flags => eight field: table => phptest name => d type => date len => 10 flags => num_fields: 8 ordertable: phptest => Array phptest_fk => Array ordertable[phptest]: a => 0 b => 1 c => 2 d => 3 ordertable[phptest_fk]: a => 4 fk => 5 c => 6 d => 7 testing tableInfo (table without query-result): first field: table => phptest name => a type => int len => 11 flags => fourth (last) field: table => phptest name => d type => date len => 10 flags => testing tableInfo (table without query-result and DB_TABLEINFO_FULL): first field: table => phptest name => a type => int len => 11 flags => order: a => 0 b => 1 c => 2 d => 3 ordertable: phptest => Array ordertable[phptest]: a => 0 b => 1 c => 2 d => 3
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]