%s on line %d', pg_result_error($result), $sql, $backtrace[0]['file'], $backtrace[0]['line']); add_database_debug_trace ($sql, pg_result_error($result)); 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'); } /** * * Escape string to set it properly to use in sql queries * * @param string String to be cleaned. * * @return string String cleaned. */ function postgresql_escape_string_sql($string) { $str = pg_escape_string($string); return $str; } /** * Get the first value of the first row of a table in the database from an * array with filter conditions. * * Example: get_db_value_filter ('name', 'talert_templates', array ('value' => 2, 'type' => 'equal')); // Equivalent to: // SELECT name FROM talert_templates WHERE value = 2 AND type = 'equal' LIMIT 1 get_db_value_filter ('description', 'talert_templates', array ('name' => 'My alert', 'type' => 'regex'), 'OR'); // Equivalent to: // SELECT description FROM talert_templates WHERE name = 'My alert' OR type = 'equal' LIMIT 1 * * @param string Field name to get * @param string Table to retrieve the data * @param array Conditions to filter the element. See format_array_to_where_clause_sql() * for the format * @param string Join operator for the elements in the filter. * * @return mixed Value of first column of the first row. False if there were no row. */ function postgresql_get_db_value_filter ($field, $table, $filter, $where_join = 'AND') { if (! is_array ($filter) || empty ($filter)) return false; /* Avoid limit and offset if given */ unset ($filter['limit']); unset ($filter['offset']); $sql = sprintf ("SELECT \"%s\" FROM \"%s\" WHERE %s LIMIT 1", $field, $table, format_array_to_where_clause_sql ($filter, $where_join)); $result = get_db_all_rows_sql ($sql); debugPrint($sql); if ($result === false) return false; debugPrint($field); $fieldClean = str_replace('`', '', $field); return $result[0][$fieldClean]; } /** * Formats an array of values into a SQL where clause string. * * This function is useful to generate a WHERE clause for a SQL sentence from * a list of values. Example code: $values = array (); $values['name'] = "Name"; $values['description'] = "Long description"; $values['limit'] = $config['block_size']; // Assume it's 20 $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values); echo $sql; * Will return: * * SELECT * FROM table WHERE `name` = "Name" AND `description` = "Long description" LIMIT 20 * * * @param array Values to be formatted in an array indexed by the field name. * There are special parameters such as 'limit' and 'offset' that will be used * as ORDER, LIMIT and OFFSET clauses respectively. Since LIMIT and OFFSET are * numerics, ORDER can receive a field name or a SQL function and a the ASC or * DESC clause. Examples: $values = array (); $values['value'] = 10; $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values); // SELECT * FROM table WHERE VALUE = 10 $values = array (); $values['value'] = 10; $values['order'] = 'name DESC'; $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values); // SELECT * FROM table WHERE VALUE = 10 ORDER BY name DESC * @param string Join operator. AND by default. * @param string A prefix to be added to the string. It's useful when limit and * offset could be given to avoid this cases: $values = array (); $values['limit'] = 10; $values['offset'] = 20; $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values); // Wrong SQL: SELECT * FROM table WHERE LIMIT 10 OFFSET 20 $values = array (); $values['limit'] = 10; $values['offset'] = 20; $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values, 'AND', 'WHERE'); // Good SQL: SELECT * FROM table LIMIT 10 OFFSET 20 $values = array (); $values['value'] = 5; $values['limit'] = 10; $values['offset'] = 20; $sql = 'SELECT * FROM table WHERE '.format_array_to_where_clause_sql ($values, 'AND', 'WHERE'); // Good SQL: SELECT * FROM table WHERE value = 5 LIMIT 10 OFFSET 20 * * @return string Values joined into an SQL string that can fits into the WHERE * clause of an SQL sentence. */ function postgresql_format_array_to_where_clause_sql ($values, $join = 'AND', $prefix = false) { $fields = array (); if (! is_array ($values)) { return ''; } $query = ''; $limit = ''; $offset = ''; $order = ''; $group = ''; if (isset ($values['limit'])) { $limit = sprintf (' LIMIT %d', $values['limit']); unset ($values['limit']); } if (isset ($values['offset'])) { $offset = sprintf (' OFFSET %d', $values['offset']); unset ($values['offset']); } if (isset ($values['order'])) { if (is_array($values['order'])) { if (!isset($values['order']['order'])) { $orderTexts = array(); foreach ($values['order'] as $orderItem) { $orderTexts[] = $orderItem['field'] . ' ' . $orderItem['order']; } $order = ' ORDER BY ' . implode(', ', $orderTexts); } else { $order = sprintf (' ORDER BY %s %s', $values['order']['field'], $values['order']['order']); } } else { $order = sprintf (' ORDER BY %s', $values['order']); } unset ($values['order']); } if (isset ($values['group'])) { $group = sprintf (' GROUP BY %s', $values['group']); unset ($values['group']); } $i = 1; $max = count ($values); foreach ($values as $field => $value) { if (is_numeric ($field)) { /* User provide the exact operation to do */ $query .= $value; if ($i < $max) { $query .= ' '.$join.' '; } $i++; continue; } if ($field[0] != "\"") { $field = "\"".$field."\""; } if (is_null ($value)) { $query .= sprintf ("%s IS NULL", $field); } elseif (is_int ($value) || is_bool ($value)) { $query .= sprintf ("%s = %d", $field, $value); } else if (is_float ($value) || is_double ($value)) { $query .= sprintf ("%s = %f", $field, $value); } elseif (is_array ($value)) { $query .= sprintf ("%s IN ('%s')", $field, implode ("', '", $value)); } else { if ($value[0] == ">"){ $value = substr($value,1,strlen($value)-1); $query .= sprintf ("%s > '%s'", $field, $value); } else if ($value[0] == "<"){ if ($value[1] == ">"){ $value = substr($value,2,strlen($value)-2); $query .= sprintf ("%s <> '%s'", $field, $value); } else { $value = substr($value,1,strlen($value)-1); $query .= sprintf ("%s < '%s'", $field, $value); } } else if ($value[0] == '%') { $query .= sprintf ("%s LIKE '%s'", $field, $value); } else { $query .= sprintf ("%s = '%s'", $field, $value); } } if ($i < $max) { $query .= ' '.$join.' '; } $i++; } return (! empty ($query) ? $prefix: '').$query.$group.$order.$limit.$offset; } ?>