aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/includes')
-rw-r--r--phpBB/includes/acp/acp_database.php101
1 files changed, 98 insertions, 3 deletions
diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
index f76e744e62..5ce8c2fd4c 100644
--- a/phpBB/includes/acp/acp_database.php
+++ b/phpBB/includes/acp/acp_database.php
@@ -129,6 +129,7 @@ class acp_database
case 'postgres':
$sql_data .= "BEGIN;\n";
+ break;
case 'mssql':
case 'mssql_odbc':
@@ -153,6 +154,7 @@ class acp_database
case 'postgres':
case 'mssql':
+ case 'mssql_odbc':
$sql_data .= '# Table: ' . $table_name . "\n";
$sql_data .= "DROP TABLE $table_name;\nGO\n";
break;
@@ -464,7 +466,6 @@ class acp_database
$db->sql_freeresult($result);
break;
- case 'mssql':
case 'mssql_odbc':
$aryType = $aryName = array();
@@ -479,6 +480,101 @@ class acp_database
$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\n";
}
+ $i_num_fields = odbc_num_fields($result);
+
+ for ($i = 0; $i < $i_num_fields; $i++)
+ {
+ $aryType[] = odbc_field_type($result, $i);
+ $aryName[] = odbc_field_name($result, $i);
+ }
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $schema_vals = $schema_fields = array();
+
+ // Build the SQL statement to recreate the data.
+ for ($i = 0; $i < $i_num_fields; $i++)
+ {
+ $strVal = $row[$aryName[$i]];
+
+ if (preg_match('#char|text|bool#i', $aryType[$i]))
+ {
+ $strQuote = "'";
+ $strEmpty = '';
+ $strVal = addslashes($strVal);
+ }
+ else if (preg_match('#date|timestamp#i', $aryType[$i]))
+ {
+ if (empty($strVal))
+ {
+ $strQuote = '';
+ }
+ else
+ {
+ $strQuote = "'";
+ }
+ }
+ else
+ {
+ $strQuote = '';
+ $strEmpty = 'NULL';
+ }
+
+ if (empty($strVal) && $strVal !== '0')
+ {
+ $strVal = $strEmpty;
+ }
+
+ $schema_vals[] = $strQuote . $strVal . $strQuote;
+ $schema_fields[] = $aryName[$i];
+ }
+
+ // Take the ordered fields and their associated data and build it
+ // into a valid sql statement to recreate that field in the data.
+ $sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES(' . implode(', ', $schema_vals) . ");\n";
+
+ if ($store == true)
+ {
+ $write($fp, $sql_data);
+ }
+
+ if ($download == true)
+ {
+ if (!empty($oper))
+ {
+ echo $oper($sql_data);
+ }
+ else
+ {
+ echo $sql_data;
+ }
+ }
+
+ $sql_data = '';
+
+ }
+ $db->sql_freeresult($result);
+
+ if ($retrieved_data)
+ {
+ $sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\n";
+ }
+ break;
+
+ case 'mssql':
+ $aryType = $aryName = array();
+
+ // Grab all of the data from current table.
+ $sql = "SELECT * FROM {$table_name}";
+ $result = $db->sql_query($sql);
+
+ $retrieved_data = $db->sql_numrows($result);
+
+ if ($retrieved_data)
+ {
+ $sql_data .= "\nSET IDENTITY_INSERT $table_name ON\n";
+ }
+
$i_num_fields = mssql_num_fields($result);
for ($i = 0; $i < $i_num_fields; $i++)
@@ -552,13 +648,12 @@ class acp_database
$sql_data = '';
}
+ $db->sql_freeresult($result);
if ($retrieved_data)
{
$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\n";
}
-
- $db->sql_freeresult($result);
break;
default: