diff --git a/pandora_console/ChangeLog b/pandora_console/ChangeLog index 324037e2a3..33c1138572 100644 --- a/pandora_console/ChangeLog +++ b/pandora_console/ChangeLog @@ -1,3 +1,14 @@ +2011-02-14 Miguel de Dios + + * include/db/postgresql.php, include/db/mysql.php, + include/functions_db.php: initial division of the DB core in several + engines, at the moment mysql and postgreSQL (not complete). + + * include/functions_config.php, include/config_process.php: change source + code to use new functions. + + * install.php: mark the mysql engine (in future select). + 2011-02-14 Miguel de Dios * pandoradb.postgreSQL.sql: added "block_size" and "flash_chart" columns on diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 5ade595516..4d57e8dda0 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -59,28 +59,24 @@ else { $config['start_time'] = microtime (true); -// Non-persistent connection: This will help to avoid mysql errors like "has gone away" or locking problems -// If you want persistent connections change it to mysql_pconnect(). -$config['dbconnection'] = mysql_connect ($config["dbhost"], $config["dbuser"], $config["dbpass"]); -if (! $config['dbconnection']) { - include ($config["homedir"]."/general/error_authconfig.php"); - exit; -} - $ownDir = dirname(__FILE__) . '/'; +require_once ($ownDir . 'functions_db.php'); +require_once ($ownDir . 'functions.php'); + +select_db_engine(); +connect_db(); + + if (! defined ('EXTENSIONS_DIR')) define ('EXTENSIONS_DIR', 'extensions'); if (! defined ('ENTERPRISE_DIR')) define ('ENTERPRISE_DIR', 'enterprise'); -mysql_select_db ($config["dbname"]); -require_once ($ownDir . 'functions.php'); -require_once ($ownDir . 'functions_db.php'); require_once ($ownDir. 'functions_config.php'); -process_config (); +process_config(); require_once ($ownDir . 'streams.php'); require_once ($ownDir . 'gettext.php'); @@ -141,12 +137,13 @@ else { // Connect to the history DB if (isset($config['history_db_enabled'])) { if ($config['history_db_enabled']) { - $config['history_db_connection'] = mysql_connect ($config['history_db_host'] . ':' . $config['history_db_port'], $config['history_db_user'], $config['history_db_pass']); - mysql_select_db ($config['history_db_name'], $config['history_db_connection']); + $config['history_db_connection'] = connect_db( + $config['history_db_host'] . ':' . $config['history_db_port'], + $config['history_db_user'], + $config['history_db_pass']); } } // Make dbconnection the default connection again (the link identifier of the already opened link will be returned) -$config['dbconnection'] = mysql_connect ($config["dbhost"], $config["dbuser"], $config["dbpass"]); - +connect_db(); ?> diff --git a/pandora_console/include/db/mysql.php b/pandora_console/include/db/mysql.php new file mode 100644 index 0000000000..586c849941 --- /dev/null +++ b/pandora_console/include/db/mysql.php @@ -0,0 +1,307 @@ +%s on line %d', + mysql_error (), $sql, $backtrace[0]['file'], $backtrace[0]['line']); + add_database_debug_trace ($sql, mysql_error ()); + set_error_handler ('sql_error_handler'); + trigger_error ($error); + restore_error_handler (); + + return false; + } + elseif ($result === true) { + if ($rettype == "insert_id") { + $result = mysql_insert_id (); + } + elseif ($rettype == "info") { + $result = mysql_info (); + } + else { + $result = mysql_affected_rows (); + } + + add_database_debug_trace ($sql, $result, mysql_affected_rows (), + array ('time' => $time)); + return $result; + } + else { + add_database_debug_trace ($sql, 0, mysql_affected_rows (), + array ('time' => $time)); + while ($row = mysql_fetch_assoc ($result)) { + array_push ($retval, $row); + } + + if ($cache === true) + $sql_cache[$sql] = $retval; + mysql_free_result ($result); + } + } + + if (! empty ($retval)) + return $retval; + //Return false, check with === or !== + return false; +} + +/** + * Get all the rows in a table of the database. + * + * @param string Database table name. + * @param string Field to order by. + * @param string $order The type of order, by default 'ASC'. + * + * @return mixed A matrix with all the values in the table + */ +function mysql_get_db_all_rows_in_table($table, $order_field = "", $order = 'ASC') { + if ($order_field != "") { + return get_db_all_rows_sql ("SELECT * FROM `".$table."` ORDER BY ".$order_field . " " . $order); + } + else { + return get_db_all_rows_sql ("SELECT * FROM `".$table."`"); + } +} + +/** + * Inserts strings into database + * + * The number of values should be the same or a positive integer multiple as the number of rows + * If you have an associate array (eg. array ("row1" => "value1")) you can use this function with ($table, array_keys ($array), $array) in it's options + * All arrays and values should have been cleaned before passing. It's not neccessary to add quotes. + * + * @param string Table to insert into + * @param mixed A single value or array of values to insert (can be a multiple amount of rows) + * + * @return mixed False in case of error or invalid values passed. Affected rows otherwise + */ +function mysql_process_sql_insert($table, $values) { + //Empty rows or values not processed + if (empty ($values)) + return false; + + $values = (array) $values; + + $query = sprintf ("INSERT INTO `%s` ", $table); + $fields = array (); + $values_str = ''; + $i = 1; + $max = count ($values); + foreach ($values as $field => $value) { //Add the correct escaping to values + if ($field[0] != "`") { + $field = "`".$field."`"; + } + + array_push ($fields, $field); + + if (is_null ($value)) { + $values_str .= "NULL"; + } + elseif (is_int ($value) || is_bool ($value)) { + $values_str .= sprintf ("%d", $value); + } + else if (is_float ($value) || is_double ($value)) { + $values_str .= sprintf ("%f", $value); + } + else { + $values_str .= sprintf ("'%s'", $value); + } + + if ($i < $max) { + $values_str .= ","; + } + $i++; + } + + $query .= '('.implode (', ', $fields).')'; + + $query .= ' VALUES ('.$values_str.')'; + + return process_sql ($query, 'insert_id'); +} + +/** + * This function comes back with an array in case of SELECT + * in case of UPDATE, DELETE etc. with affected rows + * an empty array in case of SELECT without results + * Queries that return data will be cached so queries don't get repeated + * + * @param string SQL statement to execute + * + * @param string What type of info to return in case of INSERT/UPDATE. + * 'affected_rows' will return mysql_affected_rows (default value) + * 'insert_id' will return the ID of an autoincrement value + * 'info' will return the full (debug) information of a query + * + * @return mixed An array with the rows, columns and values in a multidimensional array or false in error + */ +function mysql_process_sql($sql, $rettype = "affected_rows", $dbconnection = '', $cache = true) { + global $config; + global $sql_cache; + + $retval = array(); + + if ($sql == '') + return false; + + if ($cache && ! empty ($sql_cache[$sql])) { + $retval = $sql_cache[$sql]; + $sql_cache['saved']++; + add_database_debug_trace ($sql); + } + else { + $start = microtime (true); + if ($dbconnection == '') { + $result = mysql_query ($sql); + } + else { + $result = mysql_query ($sql, $dbconnection); + } + $time = microtime (true) - $start; + if ($result === false) { + $backtrace = debug_backtrace (); + $error = sprintf ('%s (\'%s\') in %s on line %d', + mysql_error (), $sql, $backtrace[0]['file'], $backtrace[0]['line']); + add_database_debug_trace ($sql, mysql_error ()); + set_error_handler ('sql_error_handler'); + trigger_error ($error); + restore_error_handler (); + return false; + } + elseif ($result === true) { + if ($rettype == "insert_id") { + $result = mysql_insert_id (); + } + elseif ($rettype == "info") { + $result = mysql_info (); + } + else { + $result = mysql_affected_rows (); + } + + add_database_debug_trace ($sql, $result, mysql_affected_rows (), + array ('time' => $time)); + return $result; + } + else { + add_database_debug_trace ($sql, 0, mysql_affected_rows (), + array ('time' => $time)); + while ($row = mysql_fetch_assoc ($result)) { + array_push ($retval, $row); + } + + if ($cache === true) + $sql_cache[$sql] = $retval; + mysql_free_result ($result); + } + } + + if (! empty ($retval)) + return $retval; + //Return false, check with === or !== + return false; +} +?> \ No newline at end of file diff --git a/pandora_console/include/db/postgresql.php b/pandora_console/include/db/postgresql.php new file mode 100644 index 0000000000..fb6ec0fb24 --- /dev/null +++ b/pandora_console/include/db/postgresql.php @@ -0,0 +1,257 @@ +%s on line %d', + mysql_error (), $sql, $backtrace[0]['file'], $backtrace[0]['line']); + add_database_debug_trace ($sql, mysql_error ()); + set_error_handler ('sql_error_handler'); + trigger_error ($error); + restore_error_handler (); + + return false; + } + else { + $status = pg_result_status($result); + $rows = pg_affected_rows($result); + + if ($status !== 2) { //The query NOT IS a select + if ($rettype == "insert_id") { + $result = postgresql_insert_id($dbconnection); + } + elseif ($rettype == "info") { + $result = pg_result_status($result, PGSQL_STATUS_STRING); + } + else { + $rows = pg_affected_rows($result); + $result = $rows; + } + add_database_debug_trace ($sql, $result, $rows, + array ('time' => $time)); + + return $result; + } + else { //The query IS a select. + add_database_debug_trace ($sql, 0, $rows, array ('time' => $time)); + while ($row = pg_fetch_assoc($result)) { + array_push ($retval, $row); + } + + if ($cache === true) + $sql_cache[$sql] = $retval; + pg_free_result ($result); + } + } + } + + if (! empty ($retval)) { + return $retval; + } + + //Return false, check with === or !== + return false; +} + +/** + * Get all the rows in a table of the database. + * + * @param string Database table name. + * @param string Field to order by. + * @param string $order The type of order, by default 'ASC'. + * + * @return mixed A matrix with all the values in the table + */ +function postgresql_get_db_all_rows_in_table($table, $order_field = "", $order = 'ASC') { + if ($order_field != "") { + return get_db_all_rows_sql ('SELECT * FROM "'.$table.'" ORDER BY "'.$order_field . ' ' . $order); + } + else { + return get_db_all_rows_sql ('SELECT * FROM "'.$table.'"'); + } +} + +/** + * Inserts strings into database + * + * The number of values should be the same or a positive integer multiple as the number of rows + * If you have an associate array (eg. array ("row1" => "value1")) you can use this function with ($table, array_keys ($array), $array) in it's options + * All arrays and values should have been cleaned before passing. It's not neccessary to add quotes. + * + * @param string Table to insert into + * @param mixed A single value or array of values to insert (can be a multiple amount of rows) + * + * @return mixed False in case of error or invalid values passed. Affected rows otherwise + */ +function postgresql_process_sql_insert($table, $values) { + //Empty rows or values not processed + if (empty ($values)) + return false; + + $values = (array) $values; + + $query = sprintf ('INSERT INTO "%s" ', $table); + $fields = array (); + $values_str = ''; + $i = 1; + $max = count ($values); + foreach ($values as $field => $value) { + //Add the correct escaping to values + if ($field[0] != '"') { + $field = '"' . $field . '"'; + } + + array_push ($fields, $field); + + if (is_null ($value)) { + $values_str .= "NULL"; + } + elseif (is_int ($value) || is_bool ($value)) { + $values_str .= sprintf("%d", $value); + } + else if (is_float ($value) || is_double ($value)) { + $values_str .= sprintf("%f", $value); + } + else { + $values_str .= sprintf("'%s'", $value); + } + + if ($i < $max) { + $values_str .= ","; + } + $i++; + } + + $query .= '(' . implode(', ', $fields) . ')'; + + $query .= ' VALUES (' . $values_str . ')'; + + return process_sql($query, 'insert_id'); +} +?> \ No newline at end of file diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index a9e9b368f6..d668fcf8ed 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -46,9 +46,18 @@ function update_config_value ($token, $value) { switch ($token) { case 'list_ACL_IPs_for_API': - $rows = get_db_all_rows_sql('SELECT id_config - FROM tconfig - WHERE token LIKE "%list_ACL_IPs_for_API_%"'); + switch ($config["dbtype"]) { + case "mysql": + $rows = get_db_all_rows_sql('SELECT id_config + FROM tconfig + WHERE token LIKE "%list_ACL_IPs_for_API_%"'); + break; + case "postgresql": + $rows = get_db_all_rows_sql("SELECT id_config + FROM tconfig + WHERE token LIKE '%list_ACL_IPs_for_API_%'"); + break; + } if ($rows !== false) { foreach ($rows as $row) diff --git a/pandora_console/include/functions_db.php b/pandora_console/include/functions_db.php index 47899f0c85..989f137c1b 100644 --- a/pandora_console/include/functions_db.php +++ b/pandora_console/include/functions_db.php @@ -2168,44 +2168,17 @@ function get_db_sql ($sql, $field = 0, $search_history_db = false) { * @return mixed A matrix with all the values returned from the SQL statement or * false in case of empty result */ -function get_db_all_rows_sql ($sql, $search_history_db = false, $cache = true) { +function get_db_all_rows_sql($sql, $search_history_db = false, $cache = true) { global $config; - $history = array (); - - // To disable globally SQL cache depending on global variable. - // Used in several critical places like Metaconsole trans-server queries - if (isset($config["dbcache"])) - $cache = $config["dbcache"]; - - // Read from the history DB if necessary - if ($search_history_db) { - $cache = false; - $history = false; - - if (isset($config['history_db_connection'])) - $history = process_sql ($sql, 'affected_rows', $config['history_db_connection'], false); - - if ($history === false) { - $history = array (); - } + + switch ($config["dbtype"]) { + case "mysql": + return mysql_get_db_all_rows_sql($sql, $search_history_db, $cache); + break; + case "postgresql": + return postgresql_get_db_all_rows_sql($sql, $search_history_db, $cache); + break; } - - $return = process_sql ($sql, 'affected_rows', $config['dbconnection'], $cache); - if ($return === false) { - return false; - } - - // Append result to the history DB data - if (! empty ($return)) { - foreach ($return as $row) { - array_push ($history, $row); - } - } - - if (! empty ($history)) - return $history; - //Return false, check with === or !== - return false; } /** @@ -2374,71 +2347,17 @@ function clean_cache() { * * @return mixed An array with the rows, columns and values in a multidimensional array or false in error */ -function process_sql ($sql, $rettype = "affected_rows", $dbconnection = '', $cache = true) { +function process_sql($sql, $rettype = "affected_rows", $dbconnection = '', $cache = true) { global $config; - global $sql_cache; - $retval = array(); - - if ($sql == '') - return false; - - if ($cache && ! empty ($sql_cache[$sql])) { - $retval = $sql_cache[$sql]; - $sql_cache['saved']++; - add_database_debug_trace ($sql); + switch ($config["dbtype"]) { + case "mysql": + return mysql_process_sql($sql, $rettype, $dbconnection, $cache); + break; + case "postgresql": + return postgresql_process_sql($sql, $rettype, $dbconnection, $cache); + break; } - else { - $start = microtime (true); - if ($dbconnection == '') { - $result = mysql_query ($sql); - } - else { - $result = mysql_query ($sql, $dbconnection); - } - $time = microtime (true) - $start; - if ($result === false) { - $backtrace = debug_backtrace (); - $error = sprintf ('%s (\'%s\') in %s on line %d', - mysql_error (), $sql, $backtrace[0]['file'], $backtrace[0]['line']); - add_database_debug_trace ($sql, mysql_error ()); - set_error_handler ('sql_error_handler'); - trigger_error ($error); - restore_error_handler (); - return false; - } - elseif ($result === true) { - if ($rettype == "insert_id") { - $result = mysql_insert_id (); - } - elseif ($rettype == "info") { - $result = mysql_info (); - } - else { - $result = mysql_affected_rows (); - } - - add_database_debug_trace ($sql, $result, mysql_affected_rows (), - array ('time' => $time)); - return $result; - } - else { - add_database_debug_trace ($sql, 0, mysql_affected_rows (), - array ('time' => $time)); - while ($row = mysql_fetch_assoc ($result)) { - array_push ($retval, $row); - } - - if ($cache === true) - $sql_cache[$sql] = $retval; - mysql_free_result ($result); - } - } - - if (! empty ($retval)) - return $retval; - //Return false, check with === or !== - return false; } /** @@ -2451,10 +2370,15 @@ function process_sql ($sql, $rettype = "affected_rows", $dbconnection = '', $cac * @return mixed A matrix with all the values in the table */ function get_db_all_rows_in_table ($table, $order_field = "", $order = 'ASC') { - if ($order_field != "") { - return get_db_all_rows_sql ("SELECT * FROM `".$table."` ORDER BY ".$order_field . " " . $order); - } else { - return get_db_all_rows_sql ("SELECT * FROM `".$table."`"); + global $config; + + switch ($config["dbtype"]) { + case "mysql": + return mysql_get_db_all_rows_in_table($table, $order_field, $order); + break; + case "postgresql": + return postgresql_get_db_all_rows_in_table($table, $order_field, $order); + break; } } @@ -3470,48 +3394,16 @@ function get_modulegroup_name ($modulegroup_id) { * @return mixed False in case of error or invalid values passed. Affected rows otherwise */ function process_sql_insert ($table, $values) { - //Empty rows or values not processed - if (empty ($values)) - return false; + global $config; - $values = (array) $values; - - $query = sprintf ("INSERT INTO `%s` ", $table); - $fields = array (); - $values_str = ''; - $i = 1; - $max = count ($values); - foreach ($values as $field => $value) { //Add the correct escaping to values - if ($field[0] != "`") { - $field = "`".$field."`"; - } - - array_push ($fields, $field); - - if (is_null ($value)) { - $values_str .= "NULL"; - } - elseif (is_int ($value) || is_bool ($value)) { - $values_str .= sprintf ("%d", $value); - } - else if (is_float ($value) || is_double ($value)) { - $values_str .= sprintf ("%f", $value); - } - else { - $values_str .= sprintf ("'%s'", $value); - } - - if ($i < $max) { - $values_str .= ","; - } - $i++; + switch ($config["dbtype"]) { + case "mysql": + return mysql_process_sql_insert ($table, $values); + break; + case "postgresql": + return postgresql_process_sql_insert ($table, $values); + break; } - - $query .= '('.implode (', ', $fields).')'; - - $query .= ' VALUES ('.$values_str.')'; - - return process_sql ($query, 'insert_id'); } /** diff --git a/pandora_console/install.php b/pandora_console/install.php index 26a1392cde..f76d605d1e 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -495,8 +495,10 @@ function install_step4() { $cfgin = fopen ("include/config.inc.php","r"); $cfgout = fopen ($pandora_config,"w"); $config_contents = fread ($cfgin, filesize("include/config.inc.php")); + $dbtype = 'mysql'; //TODO set other types $config_new = '