Merge branch 'ticket/naderman/9686' into develop-olympus

* ticket/naderman/9686:
  [ticket/9686] Fix mssqlnative database data export
This commit is contained in:
Andreas Fischer 2010-10-25 21:54:49 +02:00
commit 52546e8d15
2 changed files with 46 additions and 28 deletions

View file

@ -1619,28 +1619,36 @@ class mssql_extractor extends base_extractor
function write_data_mssqlnative($table_name) function write_data_mssqlnative($table_name)
{ {
global $db; global $db;
$ary_type = $ary_name = $meta_array = array(); $ary_type = $ary_name = array();
$ident_set = false; $ident_set = false;
$sql_data = ''; $sql_data = '';
// Grab all of the data from current table. // Grab all of the data from current table.
$sql = "SELECT * FROM $table_name"; $sql = "SELECT * FROM $table_name";
$db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$retrieved_data = $db->mssqlnative_num_rows($result); $retrieved_data = $db->mssqlnative_num_rows($result);
$meta_array = sqlsrv_field_metadata($result); if (!$retrieved_data)
$i_num_fields = sqlsrv_num_fields($result); {
$db->sql_freeresult($result);
return;
}
$sql = "SELECT * FROM $table_name";
$result_fields = $db->sql_query_limit($sql, 1);
$row = new result_mssqlnative($result_fields);
$i_num_fields = $row->num_fields();
for ($i = 0; $i < $i_num_fields; $i++) for ($i = 0; $i < $i_num_fields; $i++)
{ {
$info = $db->mssqlnative_fieldInfo($table_name, $meta_array[$i]['Name']); $ary_type[$i] = $row->field_type($i);
$ary_type[$i] = $info->type(); $ary_name[$i] = $row->field_name($i);
$ary_name[$i] = $info->name();
} }
$db->sql_freeresult($result_fields);
if ($retrieved_data)
{
$sql = "SELECT 1 as has_identity $sql = "SELECT 1 as has_identity
FROM INFORMATION_SCHEMA.COLUMNS FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1"; WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
@ -1653,7 +1661,6 @@ class mssql_extractor extends base_extractor
$ident_set = true; $ident_set = true;
} }
$db->sql_freeresult($result2); $db->sql_freeresult($result2);
}
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
@ -1664,7 +1671,8 @@ class mssql_extractor extends base_extractor
{ {
$str_val = $row[$ary_name[$i]]; $str_val = $row[$ary_name[$i]];
if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i])) // defaults to type number - better quote just to be safe, so check for is_int too
if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
{ {
$str_quote = ''; $str_quote = '';
$str_empty = "''"; $str_empty = "''";
@ -1705,7 +1713,7 @@ class mssql_extractor extends base_extractor
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($retrieved_data && $ident_set) if ($ident_set)
{ {
$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n"; $sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
} }

View file

@ -51,7 +51,6 @@ class result_mssqlnative
} }
$this->m_row_count = count($this->m_rows); $this->m_row_count = count($this->m_rows);
sqlsrv_free_stmt($queryresult);
} }
private function array_to_obj($array, &$obj) private function array_to_obj($array, &$obj)
@ -199,6 +198,7 @@ class dbal_mssqlnative extends dbal
{ {
var $m_insert_id = NULL; var $m_insert_id = NULL;
var $last_query_text = ''; var $last_query_text = '';
var $query_options = array();
/** /**
* Connect to server * Connect to server
@ -308,10 +308,12 @@ class dbal_mssqlnative extends dbal
if ($this->query_result === false) if ($this->query_result === false)
{ {
if (($this->query_result = @sqlsrv_query($this->db_connect_id, $query)) === false) if (($this->query_result = @sqlsrv_query($this->db_connect_id, $query, array(), $this->query_options)) === false)
{ {
$this->sql_error($query); $this->sql_error($query);
} }
// reset options for next query
$this->query_options = array();
if (defined('DEBUG_EXTRA')) if (defined('DEBUG_EXTRA'))
{ {
@ -598,20 +600,28 @@ class dbal_mssqlnative extends dbal
* Utility method used to retrieve number of rows * Utility method used to retrieve number of rows
* Emulates mysql_num_rows * Emulates mysql_num_rows
* Used in acp_database.php -> write_data_mssqlnative() * Used in acp_database.php -> write_data_mssqlnative()
* Requires a static or keyset cursor to be definde via
* mssqlnative_set_query_options()
*/ */
function mssqlnative_num_rows($res) function mssqlnative_num_rows($res)
{ {
if ($res !== false) if ($res !== false)
{ {
$row = new result_mssqlnative($res); return sqlsrv_num_rows($res);
$num_rows = $row->num_rows();
return $num_rows;
} }
else else
{ {
return false; return false;
} }
} }
/**
* Allows setting mssqlnative specific query options passed to sqlsrv_query as 4th parameter.
*/
function mssqlnative_set_query_options($options)
{
$this->query_options = $options;
}
} }
?> ?>