{{open_tag|none}} // keep unauthorized users out $this->require_acl ('admin', $this->app); // set the layout $page->layout = 'admin'; // get the version and check if the app installed $version = Appconf::get ($this->app, 'Admin', 'version'); $current = $this->installed ($this->app, $version); if ($current === true) { // app is already installed and up-to-date, stop here $page->title = __ ('Already up-to-date'); printf ('
%s', Appconf::get ($this->app, 'Admin', 'handler'), __ ('Home')); return; } $page->title = sprintf ( '%s: %s', __ ('Upgrading App'), Appconf::get ($this->app, 'Admin', 'name') ); // grab the database driver $conn = conf ('Database', 'master'); $driver = $conn['driver']; // get the base new version and current version for comparison $base_version = preg_replace ('/-.*$/', '', $version); $base_current = preg_replace ('/-.*$/', '', $current); // find upgrade scripts to apply $files = glob ('apps/' . $this->app . '/conf/upgrade_*_' . $driver . '.sql'); $apply = array (); foreach ($files as $k => $file) { if (preg_match ('/^apps\/' . $this->app . '\/conf\/upgrade_([0-9.]+)_' . $driver . '\.sql$/', $file, $regs)) { if (version_compare ($regs[1], $base_current, '>') && version_compare ($regs[1], $base_version, '<=')) { $apply[$regs[1]] = $file; } } } // begin the transaction DB::beginTransaction (); // apply the upgrade scripts foreach ($apply as $ver => $file) { // parse the database schema into individual queries $sql = sql_split (file_get_contents ($file)); // execute each query in turn foreach ($sql as $query) { if (! DB::execute ($query)) { // show error and rollback on failures printf ( '
%s
%s: %s
', __ ('Upgrade failed on version %s. Rolling back changes.', $ver), __ ('Error'), DB::error () ); DB::rollback (); return; } } // add any custom upgrade logic here } // commit the transaction DB::commit (); // mark the new version installed $this->mark_installed ($this->app, $version); printf ('%s', Appconf::get ($this->app, 'Admin', 'handler'), __ ('Done.'));