From c641d412193c8c091ebb9c270011b63527590e7f Mon Sep 17 00:00:00 2001 From: OpenXE <> Date: Wed, 23 Nov 2022 14:57:42 +0000 Subject: [PATCH] tool database_export --- tools/database_compare/database_export.php | 231 +++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 tools/database_compare/database_export.php diff --git a/tools/database_compare/database_export.php b/tools/database_compare/database_export.php new file mode 100644 index 00000000..0cdebf79 --- /dev/null +++ b/tools/database_compare/database_export.php @@ -0,0 +1,231 @@ + SHOW FULL TABLES; ++----------------------------------------------+------------+ +| Tables_in_openxe | Table_type | ++----------------------------------------------+------------+ +| abrechnungsartikel | BASE TABLE | +| abrechnungsartikel_gruppe | BASE TABLE | +| abschlagsrechnung_rechnung | BASE TABLE | +| accordion | BASE TABLE | +| adapterbox | BASE TABLE | +| adapterbox_log | BASE TABLE | +| adapterbox_request_log | BASE TABLE | +| adresse | BASE TABLE | +| adresse_abosammelrechnungen | BASE TABLE | +| adresse_accounts | BASE TABLE | +| adresse_filter | BASE TABLE | +| adresse_filter_gruppen | BASE TABLE | +... + + +MariaDB [openxe]> SHOW FULL COLUMNS FROM wiki; ++-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ +| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | ++-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ +| id | int(11) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | | +| name | varchar(255) | utf8mb3_general_ci | YES | MUL | NULL | | select,insert,update,references | | +| content | longtext | utf8mb3_general_ci | NO | | NULL | | select,insert,update,references | | +| lastcontent | longtext | utf8mb3_general_ci | NO | | NULL | | select,insert,update,references | | +| wiki_workspace_id | int(11) | NULL | NO | | 0 | | select,insert,update,references | | +| parent_id | int(11) | NULL | NO | | 0 | | select,insert,update,references | | +| language | varchar(32) | utf8mb3_general_ci | NO | | | | select,insert,update,references | | ++-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ +7 rows in set (0.002 sec) + +*/ + +function implode_with_quote(string $quote, string $delimiter, array $array_to_implode) : string { + return($quote.implode($quote.$delimiter.$quote, $array_to_implode).$quote); +} + +$host = 'localhost'; +$user = 'openxe'; +$passwd = 'openxe'; +$schema = 'openxe'; + +$target_folder = "export"; +$tables_file_name_wo_folder = "tables.txt"; +$delimiter = ";"; +$quote = '"'; + +echo("\n"); + +if ($argc >= 1) { + + if (in_array('-v', $argv)) { + $verbose = true; + } else { + $verbose = false; + } + + if (in_array('-f', $argv)) { + $force = true; + } else { + $force = false; + } + + +/* if (strpos($argv[1],'-') == 0) { + $module_name = $argv[1]; + } else { + info(); + exit; + }*/ + + // First get the contents of the database table structure + $mysqli = mysqli_connect($host, $user, $passwd, $schema); + + /* Check if the connection succeeded */ + if (!$mysqli) { + echo "Connection failed\n"; + echo "Error number: " . mysqli_connect_errno() . "\n"; + echo "Error message: " . mysqli_connect_error() . "\n"; + exit; + } + + echo "Successfully connected!\n"; + + // Prepare files + mkdir($target_folder); + + $tables_file_name = $target_folder."/".$tables_file_name_wo_folder; + + if (!$force && file_exists($tables_file_name)) { + echo("File exists: " .$tables_file_name . "\n"); + echo("Use -f to force overwrite.\n"); + exit; + } + + $tables_file = fopen($tables_file_name, "w"); + if (empty($tables_file)) { + echo ("Failed to write to " . $tables_file_name."\n"); + exit(); + } + + // Get tables and views + + $tables = array(); + + $sql = "SHOW FULL TABLES"; + $result = mysqli_query($mysqli, $sql); + + if (!$result) { + echo "Query error: " . mysqli_error($mysqli); + exit; + } + + $colwidth = 0; + + while ($row = mysqli_fetch_assoc($result)) { + + $table = array(); + $table['name'] = $row['Tables_in_'.$schema]; + $table['type'] = $row['Table_type']; + $tables[] = $table; // Add table to list of tables + + if (strlen($table['name']) > $colwidth) { + $colwidth = strlen($table['name']); + } + } + + $pre_text = "Table name"; + echo(" | ".$pre_text); + for ($filler = strlen($pre_text); $filler < $colwidth; $filler++) { + echo(" "); + } + echo(" | ".'type'."\n"); + echo(" | "); + for ($filler = 0; $filler < $colwidth; $filler++) { + echo("-"); + } + echo("\n"); + + fwrite($tables_file, 'tablename'.$delimiter."type\n"); + + foreach ($tables as $table) { + echo(" | ".$table['name']); + for ($filler = strlen($table['name']); $filler < $colwidth; $filler++) { + echo(" "); + } + echo(" | ".$table['type']." |\n"); + fwrite($tables_file, $table['name'].$delimiter.$table['type']."\n"); + } + fclose($tables_file); + echo(" | "); + for ($filler = 0; $filler < $colwidth; $filler++) { + echo("-"); + } + echo("\n"); + + // Now export all colums of the tables + + $tablecount = 0; + + foreach ($tables as $table) { + $table_file_name = $target_folder."/".$table['name'].".txt"; + + if (!$force && file_exists($table_file_name)) { + echo("File exists: " .$table_file_name . "\n"); + echo("Use -f to force overwrite.\n"); + exit; + } + + $table_file = fopen($table_file_name, "w"); + if (empty($table_file)) { + echo ("Failed to write to " . $table_file_name."\n"); + exit(); + } + + $sql = "SHOW FULL COLUMNS FROM ".$table['name']; + $result = mysqli_query($mysqli, $sql); + + if (!$result) { + echo "Query error: " . mysqli_error($mysqli); + exit; + } + + $first = true; + while ($column = mysqli_fetch_assoc($result)) { + + if ($first) { + fwrite($table_file,implode_with_quote($quote,$delimiter,array_keys($column))."\n"); + $first = false; + } + fwrite($table_file,implode_with_quote($quote,$delimiter,array_values($column))."\n"); + } + $tablecount++; + } + + echo("\nExported $tablecount tables.\n"); + echo("\n\nDone!\n"); + +} else { + info(); + exit; +} + +function info() { + echo("\nOpenXE database extractor\n"); + echo("Copyright 2022 (c) OpenXE project\n\n"); + echo("\n"); + echo("Export database structures in a defined format for database comparison / upgrade\n"); + echo("arg1: ..\n"); + echo("Options\n"); + echo("\t-v: verbose output\n"); + echo("\t-f: force override of existing files\n"); + echo("\t-c: select columns like this: -c col1,col2,col3,col3\n"); + echo("\n"); +} + + +