1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-30 21:40:43 +02:00

[ticket/9686] Fix mssqlnative database data export

We require version 1.1 of the sqlsrv extension anyway so the regular
sqlsrv_num_rows can be used instead of buffering the result. The result
buffer (class result_mssqlnative) should never automatically free the
resource it receives - we consistently close resources using sql_freeresult().

PHPBB3-9686
This commit is contained in:
Nils Adermann
2010-10-25 03:27:38 +02:00
parent acabe5a013
commit 5c5b0fc4be
2 changed files with 46 additions and 28 deletions

View File

@@ -1619,41 +1619,48 @@ class mssql_extractor extends base_extractor
function write_data_mssqlnative($table_name)
{
global $db;
$ary_type = $ary_name = $meta_array = array();
$ary_type = $ary_name = array();
$ident_set = false;
$sql_data = '';
// Grab all of the data from current table.
$sql = "SELECT * FROM $table_name";
$db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
$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);
$i_num_fields = sqlsrv_num_fields($result);
if (!$retrieved_data)
{
$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++)
{
$info = $db->mssqlnative_fieldInfo($table_name, $meta_array[$i]['Name']);
$ary_type[$i] = $info->type();
$ary_name[$i] = $info->name();
$ary_type[$i] = $row->field_type($i);
$ary_name[$i] = $row->field_name($i);
}
$db->sql_freeresult($result_fields);
$sql = "SELECT 1 as has_identity
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
$result2 = $db->sql_query($sql);
$row2 = $db->sql_fetchrow($result2);
if ($retrieved_data)
if (!empty($row2['has_identity']))
{
$sql = "SELECT 1 as has_identity
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
$result2 = $db->sql_query($sql);
$row2 = $db->sql_fetchrow($result2);
if (!empty($row2['has_identity']))
{
$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
$ident_set = true;
}
$db->sql_freeresult($result2);
$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
$ident_set = true;
}
$db->sql_freeresult($result2);
while ($row = $db->sql_fetchrow($result))
{
@@ -1664,7 +1671,8 @@ class mssql_extractor extends base_extractor
{
$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_empty = "''";
@@ -1705,7 +1713,7 @@ class mssql_extractor extends base_extractor
}
$db->sql_freeresult($result);
if ($retrieved_data && $ident_set)
if ($ident_set)
{
$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
}