/* Copyright (c) Rik Snel 2011, license GNU AGPLv3 */
require_once('MDB2.php');
// set some variables to help writing portable SQL
switch ($server_type) {
case 'mysql':
$auto_increment = 'AUTO_INCREMENT';
$show_tables = "SHOW TABLES";
$show_columns = "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '";
$show_columns_post = "'";
//$show_columns = "SHOW COLUMNS FROM ";
//$show_columns_post = "";
$last_insert_id = 'SELECT LAST_INSERT_ID()';
$ifnull = 'IFNULL';
$concat_begin = 'CONCAT(';
$concat_cont = ',';
$concat_end = ')';
$as_varchar = 'AS CHAR';
$group_concat = 'GROUP_CONCAT';
$group_concat_d = 'GROUP_CONCAT';
$group_concat_d_sep = 'SEPARATOR';
break;
case 'sqlsrv':
$auto_increment = 'IDENTITY';
$last_insert_id = 'SELECT SCOPE_IDENTITY()';
$show_tables = "SELECT name FROM sys.Tables";
$show_columns = "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '";
$show_columns_post = "'";
$ifnull = 'ISNULL';
$concat_begin = '';
$concat_cont = '+';
$concat_end = '';
$as_varchar = 'AS VARCHAR';
$group_concat = 'dbo.GROUP_CONCAT';
$group_concat_d = 'dbo.GROUP_CONCAT_D';
$group_concat_d_sep = ',';
break;
default:
error_system('impossible');
}
function mdb2_open($dsn) {
global $server_type;
$mdb2 = MDB2::connect($dsn);
if (MDB2::isError($mdb2)) error_system($mdb2->getMessage().':'.$mdb2->getUserInfo());
if ($server_type == 'mysql') {
mdb2_exec($mdb2, "SET SESSION group_concat_max_len = 65536");
mdb2_exec($mdb2, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci'");
//MDB2_Driver_mysql::setCharset([ 'utf8', 'utf8_unicode_ci' ], $mdb2->getConnection());
}
return $mdb2;
}
function mdb2_res_table($res) {
$no_columns = $res->numCols();
$columns = $res->getColumnNames(true);
//print_r($columns);
if ($no_columns == 0) return;
?>
for ($i = 0; $i < $no_columns; $i++) { ?> echo(isset($columns[$i])?$columns[$i]:'?'); ?> | } ?>
while ($row = $res->fetchRow(MDB2_FETCHMODE_ORDERED)) { ?>
foreach($row as $data) { ?> if ($data === NULL) echo('NULL'); else echo($data); ?> | } ?>
} ?>
$res->seek(); // reset row pointer
}
// format characters
// %% -> %
// %q -> string to be escaped, must already be insides 's in $format
// %w -> string to be escaped, must already be insides 's in $format, also escapes wildcard characters
// %i -> positive integer
// %I -> SQL IDENTIFIER quoting
function mdb2_vprintf($mdb2, $format, $args) {
$out = '';
$arg = 0;
while (($pos = strpos($format, '%')) !== FALSE) {
$out .= substr($format, 0, $pos);
switch ($format[$pos + 1]) {
case '%':
$out .= '%';
break;
case 'I':
if (count($args) <= $arg) error_system('te weinig argumenten');
$out .= $mdb2->quoteIdentifier($args[$arg]);
$arg++;
break;
case 'q':
if (count($args) <= $arg) error_system('te weinig argumenten');
$out .= $mdb2->escape($args[$arg]);
$arg++;
break;
case 'w':
if (count($args) <= $arg) error_system('te weinig argumenten');
$out .= $mdb2->escape($args[$arg], true);
$arg++;
break;
case 'i':
if (count($args) <= $arg) error_system('te weinig argumenten');
$val = (int)$args[$arg];
if ($val === NULL) {
$out .= 'NULL';
} else {
if ($val != $args[$arg]) error_system('SQL argument is geen integer');
if ($val < 0) error_system('SQL argument is een negatieve integer: '.$val);
$out .= $val;
}
$arg++;
break;
default:
error_system('onzinnig format character ->'.$format[$pos+1].'<-');
break;
}
$format = substr($format, $pos + 2);
}
if ($arg != count($args)) error_system('te veel argumenten voor format string');
//echo($out.$format);
return $out.$format;
}
function mdb2_printf($db, $format) {
$args = func_get_args();
array_shift($args);
array_shift($args);
return mdb2_vprintf($db, $format, $args);
}
function mdb2_vquery($mdb2, $format, $args) {
$res = $mdb2->query(mdb2_vprintf($mdb2, $format, $args));
if (MDB2::isError($res)) {
$errorInfo = $mdb2->errorInfo($res);
error_system($res->getMessage().': '.$errorInfo[2]." query ".$format);
}
return $res;
}
function mdb2_query($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vquery($mdb2, $format, $args);
}
function mdb2_vexec_error($mdb2, $err, $format, $args) {
$affected = $mdb2->exec(mdb2_vprintf($mdb2, $format, $args));
if (MDB2::isError($affected)) {
if (MDB2::isError($affected, $err)) {
return false;
} else {
$errorInfo = $mdb2->errorInfo($affected);
error_system($affected->getMessage().': '.$errorInfo[2]);
}
}
return true;
}
function mdb2_exec_error($mdb2, $err, $format) {
$args = func_get_args();
array_shift($args); array_shift($args); array_shift($args);
return mdb2_vexec_error($mdb2, $err, $format, $args);
}
// warning: returns false if no error and returns native errorcode if error
function mdb2_vexec_native_errors($mdb2, $errs, $format, $args) {
$affected = $mdb2->exec(mdb2_vprintf($mdb2, $format, $args));
if (MDB2::isError($affected)) {
$errorInfo = $mdb2->errorInfo($affected);
$native_code = $errorInfo[1];
if (in_array($native_code, $errs)) return $native_code;
else error_system($affected->getMessage().': '.$errorInfo[2].' ('.$errorInfo[1].')');
}
return false;
}
function mdb2_exec_native_errors($mdb2, $errs, $format) {
$args = func_get_args();
array_shift($args); array_shift($args); array_shift($args);
return mdb2_vexec_native_errors($mdb2, $errs, $format, $args);
}
function mdb2_vexec($mdb2, $format, $args) {
$affected = $mdb2->exec(mdb2_vprintf($mdb2, $format, $args));
if (MDB2::isError($affected)) {
$errorInfo = $mdb2->errorInfo($affected);
error_system($affected->getMessage().': '.$errorInfo[2]." query ".$format);
}
return $affected;
}
function mdb2_exec($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vexec($mdb2, $format, $args);
}
function mdb2_vsingle_row($mdb2, $mode, $format, $args) {
$res = mdb2_vquery($mdb2, $format, $args);
$array = $res->fetchRow($mode);
$res->free();
return $array;
}
function mdb2_single_row($mdb2, $mode, $format) {
$args = func_get_args();
array_shift($args); array_shift($args); array_shift($args);
return mdb2_vsingle_row($mdb2, $mode, $format, $args);
}
function mdb2_single_array($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vsingle_row($mdb2, MDB2_FETCHMODE_ORDERED, $format, $args);
}
function mdb2_single_assoc($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vsingle_row($mdb2, MDB2_FETCHMODE_ASSOC, $format, $args);
}
function mdb2_single_val($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
$res = mdb2_vquery($mdb2, $format, $args);
$array = $res->fetchRow();
$res->free();
if (isset($array[0])) return $array[0];
else return NULL;
}
function mdb2_vall($mdb2, $mode, $rekey, $force_array, $group, $format, $args) {
$res = mdb2_vquery($mdb2, $format, $args);
$array = $res->fetchAll($mode, $rekey, $force_array, $group);
$res->free();
return $array;
}
function mdb2_vcol($mdb2, $no, $format, $args) {
$res = mdb2_vquery($mdb2, $format, $args);
$array = $res->fetchCol($no);
$res->free();
return $array;
}
function mdb2_all_ordered($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vall($mdb2, MDB2_FETCHMODE_ORDERED, false, false, false, $format, $args);
}
function mdb2_all_assoc($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vall($mdb2, MDB2_FETCHMODE_ASSOC, false, false, false, $format, $args);
}
function mdb2_all_assoc_rekey($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vall($mdb2, MDB2_FETCHMODE_ASSOC, true, false, false, $format, $args);
}
function mdb2_all_ordered_rekey($mdb2, $format) {
$args = func_get_args();
array_shift($args); array_shift($args);
return mdb2_vall($mdb2, MDB2_FETCHMODE_ORDERED, true, false, false, $format, $args);
}
function mdb2_col($mdb2, $no, $format) {
$args = func_get_args();
array_shift($args); array_shift($args); array_shift($args);
return mdb2_vcol($mdb2, $no, $format, $args);
}
function mdb2_dump_table($db, $table) {
// get datatypes of columns
$datatypes = mdb2_all_assoc_rekey($db, "SELECT column_name, data_type FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '%q'", $table);
//print_r($datatypes);
$cols_array = array();
foreach ($datatypes as $key => $val) {
$cols_array[] = $key;
if ($val == 'int') $formats_array[] = '%i';
else $formats_array[] = "'%q'";
}
$formats = implode(', ', $formats_array);
$cols = implode(', ', $cols_array);
$res = mdb2_query($db, "SELECT $cols FROM $table");
//mdb2_res_table($res);
$count = 0;
while (($row = $res->fetchRow(MDB2_FETCHMODE_ORDERED))) {
if (!($count++)) echo("INSERT INTO $table ( $cols ) VALUES\n");
echo(mdb2_vprintf($db, "( $formats )", $row));
if ($count < 512) echo(',');
else {
$count = 0;
echo(';');
}
echo("\n");
}
//$row = $res->fetchRow(MDB2_FETCHMODE_ORDERED);
//print_r($row);
//echo("INSERT INTO $table ( $cols ) VALUES ( $formats )");
//echo(mdb2_vprintf($db, "INSERT INTO $table ( $cols ) VALUES ( $formats )", $row));
}
function mdb2_dump($db) {
global $show_tables;
//$tables = mdb2_col($db, 0, $show_tables);
//foreach($tables as $table) mdb2_dump_table($db, $table);
mdb2_dump_table($db, 'grp');
}
/* $res: db query result
* $filename: filename for export, watch out for Content-Disposion unsafe characters (comma...)
* $headers: - true = get column titles from $res
* - array() = use this array
* - false = no column titles */
function mdb2_res_export_excel($res, $filename = 'export.csv', $headers = true) {
/* we'll send a .csv file */
header("Content-type: text/csv");
/* some red tape to avoid bugs and weird errormessages in IE */
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header('Content-Disposition: attachment; filename='.$filename.';');
$file = fopen('php://output', 'w');
if (!$file) fatal_error('unable to open output');
if (is_array($headers)) fputcsv($file, $headers, ';');
else if ($headers === true) {
fputcsv($file, $res->getColumnNames($res), ';');
}
while (($row = $res->fetchRow(MDB2_FETCHMODE_ORDERED))) {
fputcsv($file, $row, ';');
}
}
function mdb2_export_excel($db, $filename, $format) {
$args = func_get_args();
array_shift($args); array_shift($args); array_shift($args);
mdb2_res_export_excel(mdb2_vquery($db, $format, $args), $filename);
}
?>