From: Janusz Dobrowolski Date: Tue, 18 Nov 2008 21:40:50 +0000 (+0000) Subject: Added system upgrade page for site admins. X-Git-Tag: v2.4.2~19^2~1741 X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=commitdiff_plain;h=06b2ced510cc44239e267d50b7007d98f686da55;p=fa-stable.git Added system upgrade page for site admins. --- diff --git a/admin/db/company_db.inc b/admin/db/company_db.inc index 8a832211..fde84cfe 100644 --- a/admin/db/company_db.inc +++ b/admin/db/company_db.inc @@ -80,9 +80,10 @@ function update_company_setup($coy_name, $coy_no, $gst_no, $tax_prd, $tax_last, db_query($sql, "The company setup could not be updated "); } -function get_company_prefs() +function get_company_prefs($tbpref = TB_PREF) { - $sql = "SELECT * FROM ".TB_PREF."company WHERE coy_code=1"; + $sql = "SELECT * FROM ".$tbpref."company WHERE coy_code=1"; + $result = db_query($sql, "The company preferences could not be retrieved"); if (db_num_rows($result) == 0) @@ -91,9 +92,9 @@ function get_company_prefs() return db_fetch($result); } -function get_company_pref($pref_name) +function get_company_pref($pref_name, $tbpref = TB_PREF) { - $prefs = get_company_prefs(); + $prefs = get_company_prefs($tbpref); return $prefs[$pref_name]; } diff --git a/admin/db/maintenance_db.inc b/admin/db/maintenance_db.inc index 1a08ce62..97eea2a8 100644 --- a/admin/db/maintenance_db.inc +++ b/admin/db/maintenance_db.inc @@ -105,7 +105,7 @@ function db_drop_db($connection) } } -function db_import($filename, $connection) +function db_import($filename, $connection, $force=true) { global $db; $allowed_commands = array( @@ -172,7 +172,7 @@ function db_import($filename, $connection) } */ // execute drop tables if exists queries - if (is_array($drop_queries)) + if ($force && is_array($drop_queries)) { foreach($drop_queries as $drop_query) { @@ -277,13 +277,12 @@ function db_unzip($mode, $path) // generates a dump of $db database // $drop and $zip tell if to include the drop table statement or dry to pack -function db_export($conn, $filename, $zip='no', $comment='') +function db_export($conn, $filename, $zip='no', $comment='', $tbpref = TB_PREF) { global $app_title, $version, $power_url, $path_to_root; $error = false; - // set max string size before writing to file $max_size = 1048576 * 2; // 2 MB // changes max size if value can be retrieved @@ -297,7 +296,8 @@ function db_export($conn, $filename, $zip='no', $comment='') $backupfile = $filename . ".zip"; else $backupfile = $filename; - $company = get_company_pref('coy_name'); + $company = get_company_pref('coy_name', $tbpref); + //create comment $out="# MySQL dump of database '".$conn["dbname"]."' on host '".$conn["host"]."'\n"; $out.="# Backup Date and Time: ".date("Y-m-d H:i")."\n"; diff --git a/admin/inst_upgrade.php b/admin/inst_upgrade.php new file mode 100644 index 00000000..793e050b --- /dev/null +++ b/admin/inst_upgrade.php @@ -0,0 +1,184 @@ + $value) + { + if ($row[$property] != $value) + return 3; // failed type/length check + } + return 0; // property check ok. + } + } + return 2; // field not found +} +// +// Creates table of installer objects sorted by version. +// +function get_installers() +{ + global $path_to_root; + + $patchdir = $path_to_root."/sql/"; + $upgrades = array(); + $datadir = @opendir($patchdir); + + if ($datadir) + { + while(false !== ($fname = readdir($datadir))) + { // check all php files but index.php + if (!is_dir($patchdir . $fname) && ($fname != 'index.php') + && stristr($fname, '.php') != false) + { + unset($install); + include_once($patchdir . $fname); + if (isset($install)) // add installer if found + $upgrades[$install->version] = $install; + } + } + ksort($upgrades); // sort by file name + $upgrades = array_values($upgrades); + } + return $upgrades; +} +// +// Apply one differential data set. +// +function upgrade_step($index, $conn) +{ + global $path_to_root, $installers; + + $inst = $installers[$index]; + $sql = $inst->sql; + $pref = $conn['tbpref']; + $ret = true; + + $force = get_post('force_'.$index); + if ($force || get_post('install_'.$index)) + { + if (!$inst->installed($pref) || $force) + { + // if(!$inst->pre_check($pref)) return false; + + if ($sql != '') + $ret &= db_import($path_to_root.'/sql/'.$sql, $conn, $force); + + $ret &= $inst->install($pref, $force); + } + } + return $ret; +} + +function db_open($conn) +{ + $db = mysql_connect($conn["host"] ,$conn["dbuser"], $conn["dbpassword"]); + if (!$db) + return false; + if (!mysql_select_db($conn["dbname"], $db)) + return false; + return $db; +} + +$installers = get_installers(); + +if (get_post('Upgrade')) +{ + + $ret = true; + foreach ($db_connections as $conn) + { + // connect to database + if (!($db = db_open($conn))) + { + display_error(_("Cannot connect to database for company") + ." '".$conn['name']."'"); + continue; + } + // create security backup + if ($conn['tbpref'] != "") + $filename = $conn['dbname'] . "_" . $conn['tbpref'] . date("Ymd_Hi") . ".sql"; + else + $filename = $conn['dbname'] . "_" . date("Ymd_Hi") . ".sql"; + + db_export($conn, $filename, 'no', 'Security backup before upgrade', $conn['tbpref']); + // apply all upgrade data + foreach ($installers as $i => $inst) + { + $ret = upgrade_step($i, $conn); + if (!$ret) + display_error( + sprintf(_("Database upgrade to version %s failed for company '%s'."), + $inst->version, $conn['name']) + .'
' + ._('You should restore company database from latest backup file')); + } +// db_close($conn); ? + if (!$ret) break; + } + if($ret) + display_notification(_('All companies data has been successfully updated')); + $Ajax->activate('_page_body'); +} + +start_form(); +start_table($table_style); +$th = array(_("Version"), _("Description"), _("Sql file"), _("Install"), + _("Force upgrade")); +table_header($th); + +$k = 0; //row colour counter +foreach($installers as $i => $inst) +{ + alt_table_row_color($k); + start_row(); + label_cell($inst->version); + label_cell($inst->description); + label_cell($inst->sql ? $inst->sql : ''._('None').'', 'align=center'); +// this is checked only for first (site admin) company, +// but in fact we should always upgrade all data sets after +// source upgrade. + if ($inst->installed(TB_PREF)) + label_cell(_("Installed")); + else + check_cells(null,'install_'.$i, 0); + check_cells(null,'force_'.$i, 0); + end_row(); +} +end_table(1); +submit_center('Upgrade', _('Upgrade system'), true, _('Save database and perform upgrade'), 'process'); +end_form(); + +end_page(); + +?> \ No newline at end of file diff --git a/applications/setup.php b/applications/setup.php index de752454..31e4a347 100644 --- a/applications/setup.php +++ b/applications/setup.php @@ -35,6 +35,7 @@ $this->add_rapp_function(2, _("Create/Update &Companies"),"admin/create_coy.php?", 14); $this->add_rapp_function(2, _("Install/Update &Languages"),"admin/inst_lang.php?", 14); $this->add_rapp_function(2, _("Install/Update &Modules"),"admin/inst_module.php?", 15); + $this->add_rapp_function(2, _("Software &Upgrade"),"admin/inst_upgrade.php?", 15); if (count($installed_modules) > 0) { foreach ($installed_modules as $mod) diff --git a/sql/alter2.1.php b/sql/alter2.1.php new file mode 100644 index 00000000..8e3a0d54 --- /dev/null +++ b/sql/alter2.1.php @@ -0,0 +1,52 @@ +=4.0.4: + UPDATE `0_bank_trans`, `0_bank_accounts` + SET 0_bank_trans.bank_act=0_bank_accounts.id + WHERE 0_bank_trans.bank_act=0_bank_accounts.account_code; + */ + $sql = "SELECT id, account_code FROM ".$pref."bank_accounts"; + if(!($res = db_query($sql))) { + display_error(_("Cannot retrieve bank accounts codes") + .':
'. db_error_msg($db)); + return false; + } + while ($acc = db_fetch($res)) { + $sql = "UPDATE ".$pref."bank_trans SET bank_act='" + .$acc['id']."' WHERE bank_act=".$acc['account_code']; + if (db_query($sql)==false) { + display_error(_("Cannot update bank transactions") + .':
'. db_error_msg($db)); + return false; + } + } + return true; + } + // + // Checking before install + // + function pre_check($pref) + { + return true; // true when ok, fail otherwise + } + // + // Test if patch was applied before. + // + function installed($pref) { + return !check_table($pref, 'item_codes'); + } +}; + +$install = new fa2_1; +?> \ No newline at end of file