diff --git a/include/class.export.php b/include/class.export.php index 372cf62e2d6c55f09e25c59be29ba9691f075df5..dccb3880024953801fa922ff7f150ee328b008a0 100644 --- a/include/class.export.php +++ b/include/class.export.php @@ -1,7 +1,7 @@ <?php /************************************************************************* class.export.php - + Exports stuff (details to follow) Jared Hancock <jared@osticket.com> @@ -15,7 +15,7 @@ **********************************************************************/ class Export { - + /* static */ function dumpQuery($sql, $headers, $how='csv', $filter=false) { $exporters = array( 'csv' => CsvResultsExporter, @@ -137,3 +137,80 @@ class JsonResultsExporter extends ResultSetExporter { echo $exp->encode($rows); } } + +require_once INCLUDE_DIR . 'class.json.php'; +require_once INCLUDE_DIR . 'class.migrater.php'; +require_once INCLUDE_DIR . 'class.signal.php'; + +class DatabaseExporter { + + var $stream; + var $tables = array(CONFIG_TABLE, SYSLOG_TABLE, FILE_TABLE, + FILE_CHUNK_TABLE, STAFF_TABLE, DEPT_TABLE, TOPIC_TABLE, GROUP_TABLE, + GROUP_DEPT_TABLE, TEAM_TABLE, TEAM_MEMBER_TABLE, FAQ_TABLE, + FAQ_ATTACHMENT_TABLE, FAQ_TOPIC_TABLE, FAQ_CATEGORY_TABLE, + CANNED_TABLE, CANNED_ATTACHMENT_TABLE, TICKET_TABLE, + TICKET_THREAD_TABLE, TICKET_ATTACHMENT_TABLE, TICKET_PRIORITY_TABLE, + TICKET_LOCK_TABLE, TICKET_EVENT_TABLE, TICKET_EMAIL_INFO_TABLE, + EMAIL_TABLE, EMAIL_TEMPLATE_TABLE, EMAIL_TEMPLATE_GRP_TABLE, + FILTER_TABLE, FILTER_RULE_TABLE, SLA_TABLE, API_KEY_TABLE, + TIMEZONE_TABLE, SESSION_TABLE, PAGE_TABLE); + + function DatabaseExporter($stream) { + $this->stream = $stream; + } + + function write_block($what) { + fwrite($this->stream, JsonDataEncoder::encode($what)); + fwrite($this->stream, "\x1e"); + } + + function dump($error_stream) { + // Allow plugins to change the tables exported + Signal::send('export.tables', $this, $this->tables); + + $header = array( + array(OSTICKET_BACKUP_SIGNATURE, OSTICKET_BACKUP_VERSION), + array( + 'version'=>THIS_VERSION, + 'table_prefix'=>TABLE_PREFIX, + 'salt'=>SECRET_SALT, + 'dbtype'=>DBTYPE, + 'streams'=>DatabaseMigrater::getUpgradeStreams( + UPGRADE_DIR . 'streams/'), + ), + ); + $this->write_block($header); + + foreach ($this->tables as $t) { + if ($error_stream) $error_stream->write("$t\n"); + // Inspect schema + $table = $indexes = array(); + $res = db_query("show columns from $t"); + while ($field = db_fetch_array($res)) + $table[] = $field; + + $res = db_query("show indexes from $t"); + while ($col = db_fetch_array($res)) + $indexes[] = $col; + + $res = db_query("select * from $t"); + $types = array(); + + if (!$table) { + if ($error_stream) $error_stream->write( + $t.': Cannot export table with no fields'."\n"); + die(); + } + $this->write_block( + array('table', substr($t, strlen(TABLE_PREFIX)), $table, + $indexes)); + + // Dump row data + while ($row = db_fetch_row($res)) + $this->write_block($row); + + $this->write_block(array('end-table')); + } + } +} diff --git a/setup/cli/modules/export.php b/setup/cli/modules/export.php index 33d1320523b36db0b2299261093bc9cc391b25e2..9320fa7452687e9d45c5e3037e556dd2d2c4e8b2 100644 --- a/setup/cli/modules/export.php +++ b/setup/cli/modules/export.php @@ -17,9 +17,7 @@ require_once dirname(__file__) . "/class.module.php"; require_once dirname(__file__) . '/../../../main.inc.php'; -require_once INCLUDE_DIR . 'class.json.php'; -require_once INCLUDE_DIR . 'class.migrater.php'; -require_once INCLUDE_DIR . 'class.signal.php'; +require_once INCLUDE_DIR . 'class.export.php'; define('OSTICKET_BACKUP_SIGNATURE', 'osTicket-Backup'); define('OSTICKET_BACKUP_VERSION', 'A'); @@ -28,17 +26,6 @@ class Exporter extends Module { var $prologue = "Dumps the osTicket database in formats suitable for the importer"; - var $tables = array(CONFIG_TABLE, SYSLOG_TABLE, FILE_TABLE, - FILE_CHUNK_TABLE, STAFF_TABLE, DEPT_TABLE, TOPIC_TABLE, GROUP_TABLE, - GROUP_DEPT_TABLE, TEAM_TABLE, TEAM_MEMBER_TABLE, FAQ_TABLE, - FAQ_ATTACHMENT_TABLE, FAQ_TOPIC_TABLE, FAQ_CATEGORY_TABLE, - CANNED_TABLE, CANNED_ATTACHMENT_TABLE, TICKET_TABLE, - TICKET_THREAD_TABLE, TICKET_ATTACHMENT_TABLE, TICKET_PRIORITY_TABLE, - TICKET_LOCK_TABLE, TICKET_EVENT_TABLE, TICKET_EMAIL_INFO_TABLE, - EMAIL_TABLE, EMAIL_TEMPLATE_TABLE, EMAIL_TEMPLATE_GRP_TABLE, - FILTER_TABLE, FILTER_RULE_TABLE, SLA_TABLE, API_KEY_TABLE, - TIMEZONE_TABLE, SESSION_TABLE, PAGE_TABLE); - var $options = array( 'stream' => array('-o', '--output', 'default'=>'php://stdout', 'help'=> "File or stream to receive the exported output. As a @@ -47,66 +34,15 @@ class Exporter extends Module { 'help'=> "Send zlib compress data to the output stream"), ); - var $stream; - - function write_block($what) { - fwrite($this->stream, JsonDataEncoder::encode($what)); - fwrite($this->stream, "\x1e"); - } - function run($args, $options) { global $ost; $stream = $options['stream']; if ($options['compress']) $stream = "compress.zlib://$stream"; - $this->stream = fopen($stream, 'w'); - - // Allow plugins to change the tables exported - Signal::send('export.tables', $this, $this->tables); - - $header = array( - array(OSTICKET_BACKUP_SIGNATURE, OSTICKET_BACKUP_VERSION), - array( - 'version'=>THIS_VERSION, - 'table_prefix'=>TABLE_PREFIX, - 'salt'=>SECRET_SALT, - 'dbtype'=>DBTYPE, - 'streams'=>DatabaseMigrater::getUpgradeStreams( - UPGRADE_DIR . 'streams/'), - ), - ); - $this->write_block($header); - - foreach ($this->tables as $t) { - $this->stderr->write("$t\n"); - // Inspect schema - $table = $indexes = array(); - $res = db_query("show columns from $t"); - while ($field = db_fetch_array($res)) - $table[] = $field; - - $res = db_query("show indexes from $t"); - while ($col = db_fetch_array($res)) - $indexes[] = $col; - - $res = db_query("select * from $t"); - $types = array(); - - if (!$table) { - $this->stderr->write( - $t.': Cannot export table with no fields'."\n"); - die(); - } - $this->write_block( - array('table', substr($t, strlen(TABLE_PREFIX)), $table, - $indexes)); - - // Dump row data - while ($row = db_fetch_row($res)) - $this->write_block($row); + $stream = fopen($stream, 'w'); - $this->write_block(array('end-table')); - } + $x = new DatabaseExporter($stream); + $x->dump($this->stderr); } }