[Cs-webdbupgrade-commits] SF.net SVN: cs-webdbupgrade:[39] trunk/0.1
Status: Inactive
Brought to you by:
crazedsanity
|
From: <cra...@us...> - 2009-08-13 15:04:25
|
Revision: 39
http://cs-webdbupgrade.svn.sourceforge.net/cs-webdbupgrade/?rev=39&view=rev
Author: crazedsanity
Date: 2009-08-13 15:04:14 +0000 (Thu, 13 Aug 2009)
Log Message:
-----------
Revert back to the last change that didn't have anything to do with v0.2.x
Modified Paths:
--------------
trunk/0.1/VERSION
trunk/0.1/cs_webdbupgrade.class.php
trunk/0.1/schema/schema.sql
Added Paths:
-----------
trunk/0.1/CREDITS
trunk/0.1/LICENSE
trunk/0.1/README.txt
trunk/0.1/exampleUpgrades/
trunk/0.1/exampleUpgrades/upgrade.xml
trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php
trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php
Removed Paths:
-------------
trunk/0.1/docs/
trunk/0.1/exampleUpgrades/upgrade.xml
trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php
trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php
trunk/0.1/upgrades/
Copied: trunk/0.1/CREDITS (from rev 28, trunk/0.1/CREDITS)
===================================================================
--- trunk/0.1/CREDITS (rev 0)
+++ trunk/0.1/CREDITS 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,3 @@
+
+Lead Developer: Dan Falconer (cra...@us...)
+
Copied: trunk/0.1/LICENSE (from rev 28, trunk/0.1/LICENSE)
===================================================================
--- trunk/0.1/LICENSE (rev 0)
+++ trunk/0.1/LICENSE 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,291 @@
+NOTE: a full HTML version of this license can be found at:
+http://www.opensource.org/licenses/gpl-license.php
+
+It has been reproduced below without any HTML.
+==========================================================================
+
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
Copied: trunk/0.1/README.txt (from rev 28, trunk/0.1/README.txt)
===================================================================
--- trunk/0.1/README.txt (rev 0)
+++ trunk/0.1/README.txt 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,60 @@
+
+$Id$
+
+This system is built to make upgrading a database-driven app seamless. No need
+to coordinate SQL or schema changes with the code updates: previously, one would
+have to take the entire website down, run the schema/SQL change, update the code,
+and (if you're lucky) check a "test" website to ensure it works before unleashing
+it upon your users.... if you're unlucky, they both must be run in unison, and
+if the SQL or schema change fails, you're in for a lot of sweating and praying.
+
+Meet your saviour! This system adds the ability to allow your system to upgrade
+itself. Whenever you increment the version in your VERSION file, it can run a
+custom script that will do everything you need AND keep others out until it is
+done. Once the system is updated, the next thing to touch the code containing
+the upgrade system will cause it to run.
+
+CAVEATS: while this system will work with MySQL, I **STRONGLY** recommend
+against it. It was built using PostgreSQL, which has a rock solid transaction
+system: if the upgrade fails, everything rolls-back and it is up to a developer
+to figure out what went wrong--but the system is left in a CONSISTENT STATE.
+With MySQL, this will only work with InnoDB tables--and only if ALL AFFECTED
+TABLES ARE InnoDB. There are also many things that will cause an implicit
+commit, meaning the code will think its in a transaction after that point, but
+it actually isn't (which is possibly worse than not having transactional
+capabilities at all).
+
+The first time this system is implemented, you need to be aware that it will
+look for an "INITIALVERSION" value in your upgrade.xml file. This version
+determines where it should start, so intermediary upgrade scripts will run. It
+is important to realize, however, that this setting can cause grief in and of
+itself: if you give the wrong version, scripts might run that shouldn't. This
+is especially important for long-running projects that are expected to be able
+to be installed at any version: subsequent releases should update this initial
+version (or remove it) as necessary.
+
+MySQL TRANSACTION INFO::: http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html
+
+WORK FLOW:
+
+ --> Is there an existing LOCK file?
+ YES::
+ --> HALT (tell the user there's an upgrade in progress).
+ NO:::
+ --> System checks VERSION file vs. version in database
+ --> Does version file's version match database version?
+ YES:::
+ -- good to go.
+ -- CONTINUE
+ NO:::
+ --> CREATE LOCK FILE
+ --> find named script in upgrade.xml file
+ --> include script, create new class, call method (in upgrade.xml file)
+ --> did upgrade succeed?
+ YES:::
+ --> remove LOCK file
+ --> CONTINUE
+ NO:::
+ --> stop upgrade process.
+ --> HALT
+ --> (continues as before)
\ No newline at end of file
Modified: trunk/0.1/VERSION
===================================================================
--- trunk/0.1/VERSION 2009-08-13 04:09:12 UTC (rev 38)
+++ trunk/0.1/VERSION 2009-08-13 15:04:14 UTC (rev 39)
@@ -1,6 +1,6 @@
## Stores the current version of the cs-versionparse system, and it's source.
## Please do NOT modify this file.
-VERSION: 0.2
+VERSION: 0.1
PROJECT: cs-webdbupgrade
$HeadURL$
\ No newline at end of file
Modified: trunk/0.1/cs_webdbupgrade.class.php
===================================================================
--- trunk/0.1/cs_webdbupgrade.class.php 2009-08-13 04:09:12 UTC (rev 38)
+++ trunk/0.1/cs_webdbupgrade.class.php 2009-08-13 15:04:14 UTC (rev 39)
@@ -13,7 +13,6 @@
*/
require_once(constant('LIBDIR') .'/cs-versionparse/cs_version.abstract.class.php');
-require_once(constant('LIBDIR') .'/cs_debug.php');
class cs_webdbupgrade extends cs_versionAbstract {
@@ -47,16 +46,9 @@
/** Name (absolute location) of *.lock file that indicates an upgrade is running. */
private $lockfile;
- /** Determines if an internal upgrade is happening (avoids some infinite loops) */
- private $internalUpgradeInProgress = false;
-
/** */
private $allowNoDBVersion=true;
- /** Log messages to store during an internal upgrade (to avoid problems) */
- private $storedLogs = array();
- private $debugLogs=array();
-
/** List of acceptable suffixes; example "1.0.0-BETA3" -- NOTE: these MUST be in
* an order that reflects newest -> oldest; "ALPHA happens before BETA, etc. */
private $suffixList = array(
@@ -66,17 +58,34 @@
);
//=========================================================================
- public function __construct($versionFileLocation, $upgradeConfigFile, $lockFile='upgrade.lock') {
+ public function __construct($versionFileLocation, array $config) {
- //setup configuration parameters for database connectivity.
- $dbParams = array(
- 'host' => constant(__CLASS__ .'-DB_CONNECT_HOST'),
- 'port' => constant(__CLASS__ .'-DB_CONNECT_PORT'),
- 'dbname' => constant(__CLASS__ .'-DB_CONNECT_DBNAME'),
- 'user' => constant(__CLASS__ .'-DB_CONNECT_USER'),
- 'password' => constant(__CLASS__ .'-DB_CONNECT_PASSWORD')
- );
- $this->config['DBPARAMS'] = $dbParams;
+ //Handle the config array (cope with XML-ish array)
+ if(is_array($config)) {
+ //check if it is in the complex XML array style...
+ $keys = array_keys($config);
+ if(isset($config[$keys[0]]['type'])) {
+ $this->fix_xml_config($config);
+ $this->config = $this->tempXmlConfig;
+ }
+ else {
+ $this->config = $config;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": no configuration available");
+ }
+
+ //cope with problems in CS-Content v1.0-ALPHA9 (or before)--see http://project.crazedsanity.com/extern/helpdesk/view?ID=281
+ if(isset($this->config['DBPARMLINKER'])) {
+ $this->config['DBPARAMS'] = array();
+ foreach($this->config['DBPARMLINKER'] as $i=>$loc) {
+ $this->config['DBPARAMS'][strtolower($i)] = $this->config[$loc];
+ unset($this->config[$loc]);
+ }
+ unset($this->config['DBPARMLINKER']);
+ }
+
//Check for some required constants.
$requisiteConstants = array('LIBDIR');
if(!defined('LIBDIR')) {
@@ -94,46 +103,32 @@
require_once(constant('LIBDIR') .'/cs-phpxml/cs_phpxmlCreator.class.php');
require_once(constant('LIBDIR') .'/cs-phpxml/cs_arrayToPath.class.php');
+ $this->versionFileLocation = $versionFileLocation;
+
$this->fsObj = new cs_fileSystem(constant('SITE_ROOT'));
$this->gfObj = new cs_globalFunctions;
if(defined('DEBUGPRINTOPT')) {
$this->gfObj->debugPrintOpt = constant('DEBUGPRINTOPT');
}
- if(!defined(__CLASS__ .'-DB_PRIMARYKEY') || !defined(__CLASS__ .'-DB_TABLE')) {
+ if(!isset($this->config['DB_PRIMARYKEY']) || !isset($this->config['DB_TABLE'])) {
throw new exception(__METHOD__ .": no setting for DB_TABLE or DB_PRIMARYKEY, cannot continue");
}
- else {
- $this->config['DB_TABLE'] = constant(__CLASS__ .'-DB_TABLE');
- $this->config['DB_PRIMARYKEY'] = constant(__CLASS__ .'-DB_PRIMARYKEY');
- }
$this->sequenceName = $this->config['DB_TABLE'] .'_'. $this->config['DB_PRIMARYKEY'] .'_seq';
if(!defined('DBTYPE')) {
throw new exception(__METHOD__ .": required constant 'DBTYPE' not set");
}
-
- if(!file_exists($upgradeConfigFile) || !is_readable($upgradeConfigFile)) {
- throw new exception(__METHOD__ .": required upgrade config file location (". $upgradeConfigFile .") not set or unreadable");
+ if(!isset($this->config['CONFIG_FILE_LOCATION'])) {
+ throw new exception(__METHOD__ .": required setting 'CONFIG_FILE_LOCATION' not found");
}
- else {
- $this->config['UPGRADE_CONFIG_FILE'] = $upgradeConfigFile;
- }
if(!strlen($versionFileLocation) || !file_exists($versionFileLocation)) {
throw new exception(__METHOD__ .": unable to locate version file (". $versionFileLocation .")");
}
- $this->set_version_file_location($versionFileLocation);
-
- if(!defined(__CLASS__ .'-RWDIR') || !is_dir(constant(__CLASS__ .'-RWDIR')) || !is_readable(constant(__CLASS__ .'-RWDIR')) || !is_writable(constant(__CLASS__ .'-RWDIR'))) {
- throw new exception(__METHOD__ .": missing RWDIR (". constant(__CLASS__ .'-RWDIR') .") or isn't readable/writable");
+ if(!isset($this->config['RWDIR']) || !is_dir($this->config['RWDIR']) || !is_readable($this->config['RWDIR']) || !is_writable($this->config['RWDIR'])) {
+ throw new exception(__METHOD__ .": missing RWDIR (". $this->config['RWDIR'] .") or isn't readable/writable");
}
- else {
- $this->config['RWDIR'] = constant(__CLASS__ .'-RWDIR');
- }
- if(is_null($lockFile) || !strlen($lockFile)) {
- $lockFile = 'upgrade.lock';
- }
- $this->lockfile = $this->config['RWDIR'] .'/'. $lockFile;
+ $this->lockfile = $this->config['RWDIR'] .'/upgrade.lock';
$this->db = new cs_phpDB(constant('DBTYPE'));
try {
@@ -145,15 +140,12 @@
if($this->check_lockfile()) {
//there is an existing lockfile...
- throw new exception(__METHOD__ .": upgrade in progress: ". $this->fsObj->read($this->lockfile));
+ $this->error_handler(__METHOD__ .": upgrade in progress: ". $this->fsObj->read($this->lockfile));
}
$this->check_internal_upgrades();
-
- try {
- $loggerDb = new cs_phpDB(constant('DBTYPE'));
- $loggerDb->connect($this->config['DBPARAMS'], true);
- $this->logsObj = new cs_webdblogger($loggerDb, "Upgrade ". $this->projectName, false);
+ try {
+ $this->connect_logger("Upgrade");
}
catch(exception $e) {
throw new exception(__METHOD__ .": failed to create logger::: ". $e->getMessage());
@@ -175,12 +167,17 @@
$this->config['UPGRADE_CONFIG_FILE'] = dirname(__FILE__) .'/upgrades/upgrade.xml';
- //set a status flag so we can store log messages (for now).
- $this->internalUpgradeInProgress = true;
+ //connect the logger...
+ try {
+ $this->connect_logger("Internal Upgrade");
+ }
+ catch(exception $e) {
+ $this->error_handler($e->getMessage());
+ }
//do stuff here...
- $this->set_version_file_location(dirname(__FILE__) .'/VERSION');
+ $this->versionFileLocation = dirname(__FILE__) .'/VERSION';
$this->read_version_file();
//if there is an error, then... uh... yeah.
@@ -188,7 +185,7 @@
$this->get_database_version();
}
catch(exception $e) {
- throw new exception(__METHOD__ .": error while retrieving database version: ". $e->getMessage());
+ #throw new exception(__METHOD__ .": error while retrieving database version: ". $e->getMessage());
//try creating the version.
$this->load_initial_version();
@@ -196,13 +193,12 @@
//do upgrades here...
$this->check_versions(true);
- $this->internalUpgradeInProgress = false;
//reset internal vars.
- $this->set_version_file_location($oldVersionFileLocation);
+ $this->versionFileLocation = $oldVersionFileLocation;
$this->config['UPGRADE_CONFIG_FILE'] = $oldUpgradeConfigFile;
$this->read_version_file();
@@ -227,7 +223,7 @@
//check to see if the lock files for upgrading exist.
if($this->upgrade_in_progress()) {
- $this->do_log("Upgrade in progress", 'notice');
+ $this->logsObj->log_by_class("Upgrade in progress", 'notice');
throw new exception(__METHOD__ .": upgrade in progress");
}
else {
@@ -329,7 +325,6 @@
//=========================================================================
private function perform_upgrade() {
- $this->logsObj->suspendLogging=true;
//make sure there's not already a lockfile.
if($this->upgrade_in_progress()) {
//ew. Can't upgrade.
@@ -339,7 +334,7 @@
$lockConfig = $this->upgrade_in_progress(TRUE);
$this->fsObj->cd("/");
- $this->do_log("Starting upgrade process...", 'begin');
+ $this->logsObj->log_by_class("Starting upgrade process...", 'begin');
//TODO: not only should the "create_file()" method be run, but also do a sanity check by calling lock_file_exists().
if($lockConfig === 0) {
@@ -347,7 +342,7 @@
$this->error_handler(__METHOD__ .": failed to set 'upgrade in progress'");
}
else {
- $this->do_log(__METHOD__ .": result of creating lockfile: (". $lockConfig .")", 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": result of creating lockfile: (". $lockConfig .")", 'debug');
//push data into our internal "config" array.
$this->read_upgrade_config_file();
@@ -358,38 +353,39 @@
if($versionConflictInfo !== false) {
- $this->do_log("Upgrading ". $versionConflictInfo ." versions, from " .
+ $this->logsObj->log_by_class("Upgrading ". $versionConflictInfo ." versions, from " .
"(". $this->databaseVersion .") to (". $this->versionFileVersion .")", 'info');
}
$upgradeList = $this->get_upgrade_list();
+
try {
$i=0;
- $this->do_log(__METHOD__ .": starting to run through the upgrade list, starting at (". $this->databaseVersion ."), " .
+ $this->logsObj->log_by_class(__METHOD__ .": starting to run through the upgrade list, starting at (". $this->databaseVersion ."), " .
"total number of upgrades to perform: ". count($upgradeList), 'debug');
$this->db->beginTrans(__METHOD__);
foreach($upgradeList as $fromVersion=>$toVersion) {
$details = __METHOD__ .": upgrading from ". $fromVersion ." to ". $toVersion ."... ";
- $this->do_log($details, 'system');
+ $this->logsObj->log_by_class($details, 'system');
$this->do_single_upgrade($fromVersion, $toVersion);
$this->get_database_version();
$i++;
$details = __METHOD__ .": finished upgrade #". $i .", now at version (". $this->databaseVersion .")";
- $this->do_log($details, 'system');
+ $this->logsObj->log_by_class($details, 'system');
}
if($i < count($upgradeList)) {
- $this->do_log(__METHOD__ .": completed upgrade ". $i ." of ". count($upgradeList), 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": completed upgrade ". $i ." of ". count($upgradeList), 'debug');
}
else {
if($this->databaseVersion == $this->versionFileVersion) {
- $this->do_log(__METHOD__ .": finished upgrading after performing (". $i .") upgrades", 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": finished upgrading after performing (". $i .") upgrades", 'debug');
$this->newVersion = $this->databaseVersion;
}
else {
- $this->do_log(__METHOD__ .": upgradeList::: ". $this->gfObj->debug_print($upgradeList,0), 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": upgradeList::: ". $this->gfObj->debug_print($upgradeList,0), 'debug');
$this->error_handler(__METHOD__ .": finished upgrade, but version wasn't updated (expecting '". $this->versionFileVersion ."', got '". $this->databaseVersion ."')!!!");
}
}
@@ -398,16 +394,12 @@
$this->db->commitTrans();
}
catch(exception $e) {
- $transactionStatus = $this->db->get_transaction_status(false);
- $this->error_handler(__METHOD__ .": transaction status=(". $transactionStatus ."), upgrade aborted:::". $e->getMessage());
+ $this->error_handler(__METHOD__ .": upgrade aborted:::". $e->getMessage());
$this->db->rollbackTrans();
}
- $this->logsObj->suspendLogging=false;
- $this->do_log("Upgrade process complete", 'end');
+ $this->logsObj->log_by_class("Upgrade process complete", 'end');
}
}
- $this->logsObj->suspendLogging=false;
- $logsHandled = $this->logsObj->handle_suspended_logs();
}//end perform_upgrade()
//=========================================================================
@@ -615,7 +607,7 @@
$this->error_handler(__METHOD__ .": target version not specified, unable to proceed with upgrade for ". $versionIndex);
}
}
- $this->do_log("Finished upgrade to ". $this->newVersion, 'system');
+ $this->logsObj->log_by_class("Finished upgrade to ". $this->newVersion, 'system');
}//end do_single_upgrade()
//=========================================================================
@@ -627,14 +619,19 @@
* so the version there is consistent with all the others.
*/
protected function update_database_version($newVersionString) {
- $versionInfo = $this->parse_version_string($newVersionString);
+ $versionArr = $this->parse_version_string($newVersionString);
- $sql = "UPDATE ". $this->config['DB_TABLE'] ." SET version_string='".
- $this->gfObj->cleanString($versionInfo['version_string'], 'sql')
- ."' WHERE project_name='".
- $this->gfObj->cleanString($this->projectName, 'sql') ."'";
+ $queryArr = array();
+ foreach($versionArr as $index=>$value) {
+ $queryArr[$index] = "SELECT internal_data_set_value('". $index ."', '". $value ."');";
+ }
+ $updateData = $versionArr;
+ $sql = "UPDATE ". $this->config['DB_TABLE'] ." SET ".
+ $this->gfObj->string_from_array($updateData, 'update', null, 'sql') ." WHERE " .
+ "project_name='". $this->gfObj->cleanString($this->projectName, 'sql') ."'";
+
$updateRes = $this->db->run_update($sql,false);
if($updateRes == 1) {
$retval = $updateRes;
@@ -674,7 +671,7 @@
}
if(!$retval) {
- $this->do_log("Version check failed, versionString=(". $versionString ."), checkVersion=(". $this->newVersion .")", 'FATAL');
+ $this->logsObj->log_by_class("Version check failed, versionString=(". $versionString ."), checkVersion=(". $this->newVersion .")", 'FATAL');
}
}
@@ -692,16 +689,20 @@
private function do_scripted_upgrade(array $upgradeData) {
$myConfigFile = $upgradeData['SCRIPT_NAME'];
- $this->do_log("Preparing to run script '". $myConfigFile ."'", 'debug');
+ $this->logsObj->log_by_class("Preparing to run script '". $myConfigFile ."'", 'debug');
//we've got the filename, see if it exists.
-
- $scriptsDir = dirname($this->config['UPGRADE_CONFIG_FILE']);
+ if(isset($this->config['UPGRADE_SCRIPTS_DIR'])) {
+ $scriptsDir = $this->config['UPGRADE_SCRIPTS_DIR'];
+ }
+ else {
+ $this->logsObj->log_by_class("No UPGRADE_SCRIPTS_DIR config setting", 'warning');
+ $scriptsDir = dirname($this->config['UPGRADE_CONFIG_FILE']);
+ }
$fileName = $scriptsDir .'/'. $myConfigFile;
-
if(file_exists($fileName)) {
-
- $this->do_log("(". __CLASS__ .") Performing scripted upgrade (". $myConfigFile .") from file '". $fileName ."'", 'DEBUG');
+
+ $this->logsObj->log_by_class("Performing scripted upgrade (". $myConfigFile .")", 'DEBUG');
$createClassName = $upgradeData['CLASS_NAME'];
$classUpgradeMethod = $upgradeData['CALL_METHOD'];
require_once($fileName);
@@ -714,12 +715,12 @@
if($upgradeResult === true) {
//yay, it worked!
- $this->do_log("Upgrade succeeded (". $upgradeResult .")", 'success');
+ $this->logsObj->log_by_class("Upgrade succeeded (". $upgradeResult .")", 'success');
}
else {
$this->error_handler(__METHOD__ .": upgrade failed (". $upgradeResult .")");
}
- $this->do_log("Finished running ". $createClassName ."::". $classUpgradeMethod ."(), result was (". $upgradeResult .")", 'debug');
+ $this->logsObj->log_by_class("Finished running ". $createClassName ."::". $classUpgradeMethod ."(), result was (". $upgradeResult .")", 'debug');
}
else {
$this->error_handler(__METHOD__ .": upgrade method doesn't exist (". $createClassName ."::". $classUpgradeMethod
@@ -792,11 +793,11 @@
$retval[$matchVersion] = $data['TARGET_VERSION'];
}
else {
- $this->do_log(__METHOD__ .": entry in upgrade.xml (". $matchVersion .") is higher than the VERSION file (". $this->versionFileVersion .")", 'warning');
+ $this->logsObj->log_by_class(__METHOD__ .": entry in upgrade.xml (". $matchVersion .") is higher than the VERSION file (". $this->versionFileVersion .")", 'warning');
}
}
else {
- $this->do_log(__METHOD__ .": SKIPPING (". $matchVersion .")", 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": SKIPPING (". $matchVersion .")", 'debug');
}
}
@@ -806,7 +807,7 @@
}
else {
//no intermediary upgrades: just pass back the latest version.
- $this->do_log(__METHOD__ .": no intermediary upgrades", 'debug');
+ $this->logsObj->log_by_class(__METHOD__ .": no intermediary upgrades", 'debug');
$retval[$dbVersion] = $this->versionFileVersion;
}
@@ -860,7 +861,7 @@
$a2p = new cs_arrayToPath($config);
}
catch(exception $e) {
- $this->do_log(__METHOD__ .': encountered exception: '. $e->getMessage());
+ $this->logsObj->log_by_class(__METHOD__ .': encountered exception: '. $e->getMessage());
$this->error_handler($e->getMessage());
}
if(!is_array($this->tempXmlConfig)) {
@@ -870,7 +871,7 @@
$myA2p = new cs_arrayToPath(&$this->tempXmlConfig);
}
catch(exception $e) {
- $this->do_log(__METHOD__ .': encountered exception: '. $e->getMessage());
+ $this->logsObj->log_by_class(__METHOD__ .': encountered exception: '. $e->getMessage());
$this->error_handler($e->getMessage());
}
@@ -934,7 +935,7 @@
$logRes = 'Failed to load';
$logType = 'error';
}
- $this->do_log($logRes .' table ('. $this->config['DB_TABLE'] .') into ' .
+ $this->logsObj->log_by_class($logRes .' table ('. $this->config['DB_TABLE'] .') into ' .
'database::: '. $loadTableResult, $logType);
return($loadTableResult);
@@ -1030,12 +1031,7 @@
//=========================================================================
public function error_handler($details) {
//log the error.
- if(!is_object($this->logsObj)) {
- throw new exception(__METHOD__ .": error while running an internal upgrade::: ". $details);
- }
- if($this->internalUpgradeInProgress === false) {
- $this->do_log($details, 'exception in code');
- }
+ $this->logsObj->log_by_class($details, 'exception in code');
//now throw an exception so other code can catch it.
throw new exception($details);
@@ -1048,24 +1044,19 @@
public function load_initial_version() {
//if there's an INITIAL_VERSION in the upgrade config file, use that.
$this->read_upgrade_config_file();
- $insertData = array();
if(isset($this->config['UPGRADELIST']['INITIALVERSION'])) {
- $parseThis = $this->config['UPGRADELIST']['INITIALVERSION'];
+ $insertData = $this->parse_version_string($this->config['UPGRADELIST']['INITIALVERSION']);
}
else {
- $parseThis = $this->versionFileVersion;
+ $insertData = $this->parse_version_string($this->versionFileVersion);
}
- $versionInfo = $this->parse_version_string($parseThis);
- $insertData = array(
- 'project_name' => $this->projectName,
- 'version_string' => $versionInfo['version_string']
- );
+ $insertData['project_name'] = $this->projectName;
$sql = 'INSERT INTO '. $this->config['DB_TABLE'] . $this->gfObj->string_from_array($insertData, 'insert');
if($this->db->run_insert($sql, $this->sequenceName)) {
$loadRes = true;
- $this->do_log("Created data for '". $this->projectName ."' with version '". $insertData['version_string'] ."'", 'initialize');
+ $this->logsObj->log_by_class("Created data for '". $this->projectName ."' with version '". $insertData['version_string'] ."'", 'initialize');
}
else {
$this->error_handler(__METHOD__ .": failed to load initial version::: ". $e->getMessage());
@@ -1078,15 +1069,11 @@
//=========================================================================
- protected function do_log($message, $type) {
- $this->debugLogs[] = array('project'=>$this->projectName,'upgradeFile'=>$this->config['UPGRADE_CONFIG_FILE'],'message'=>$message,'type'=>$type);
- if($this->internalUpgradeInProgress === true) {
- $this->storedLogs[] = func_get_args();
- }
- else {
- $this->logsObj->log_by_class($message, $type);
- }
- }//end do_log()
+ private function connect_logger($logCategory) {
+ $loggerDb = new cs_phpDB(constant('DBTYPE'));
+ $loggerDb->connect($this->config['DBPARAMS'], true);
+ $this->logsObj = new cs_webdblogger($loggerDb, $logCategory);
+ }//end connect_logger()
//=========================================================================
Deleted: trunk/0.1/exampleUpgrades/upgrade.xml
===================================================================
--- trunk/0.1/exampleUpgrades/upgrade.xml 2009-08-06 14:53:12 UTC (rev 28)
+++ trunk/0.1/exampleUpgrades/upgrade.xml 2009-08-13 15:04:14 UTC (rev 39)
@@ -1,35 +0,0 @@
-<upgrade>
- <system_note>To determine which section in matching to use, heed only the information
- beneath the tag that indicates the current database version (for 5.2.4,
- you would find information under matching for "v5.2.4"). This section
- indicates the version that it should upgrade the database to
- ("target_version"), the name of the script ("script_name"), the class name
- ("class_name"), and the name of the method within that class ("call_method")
- to call in order to perform the upgrade. The method should return TRUE on
- success: anything else would indicate failure. Upgrade failure may leave
- the system in an inconsistent state.
-
- IMPORTANT: in order to facilitate doing multiple version upgrades, the name
- of the class must be UNIQUE to all the other classes. For this reason, the
- class name should be something like "v1_0_0_ALPHA1__to__v1_0_0_ALPHA2".
-
- REMEMBER: the "target_version" should NEVER be higher than the next item
- beneath matching; this will cause horrible logic errors, causing an upgsrade
- to get skipped, or an exception to be thrown, potentially leaving the system
- in an unstable state. Unstable is bad, m'kay?</system_note>
-
- <matching>
- <v1.2.0-ALPHA3>
- <target_version>1.2.0-ALPHA4</target_version>
- <script_name>upgradeTo1.2.0-ALPHA4.php</script_name>
- <class_name>upgrade_to_1_2_0_ALPHA4</class_name>
- <call_method>run_upgrade</call_method>
- </v1.2.0-ALPHA3>
- <v1.2.0-ALPHA6>
- <target_version>1.2.0-ALPHA7</target_version>
- <script_name>upgradeTo1.2.0-ALPHA7.php</script_name>
- <class_name>upgrade_to_1_2_0_ALPHA7</class_name>
- <call_method>run_upgrade</call_method>
- </v1.2.0-ALPHA6>
- </matching>
-</upgrade>
Copied: trunk/0.1/exampleUpgrades/upgrade.xml (from rev 28, trunk/0.1/exampleUpgrades/upgrade.xml)
===================================================================
--- trunk/0.1/exampleUpgrades/upgrade.xml (rev 0)
+++ trunk/0.1/exampleUpgrades/upgrade.xml 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,35 @@
+<upgrade>
+ <system_note>To determine which section in matching to use, heed only the information
+ beneath the tag that indicates the current database version (for 5.2.4,
+ you would find information under matching for "v5.2.4"). This section
+ indicates the version that it should upgrade the database to
+ ("target_version"), the name of the script ("script_name"), the class name
+ ("class_name"), and the name of the method within that class ("call_method")
+ to call in order to perform the upgrade. The method should return TRUE on
+ success: anything else would indicate failure. Upgrade failure may leave
+ the system in an inconsistent state.
+
+ IMPORTANT: in order to facilitate doing multiple version upgrades, the name
+ of the class must be UNIQUE to all the other classes. For this reason, the
+ class name should be something like "v1_0_0_ALPHA1__to__v1_0_0_ALPHA2".
+
+ REMEMBER: the "target_version" should NEVER be higher than the next item
+ beneath matching; this will cause horrible logic errors, causing an upgsrade
+ to get skipped, or an exception to be thrown, potentially leaving the system
+ in an unstable state. Unstable is bad, m'kay?</system_note>
+
+ <matching>
+ <v1.2.0-ALPHA3>
+ <target_version>1.2.0-ALPHA4</target_version>
+ <script_name>upgradeTo1.2.0-ALPHA4.php</script_name>
+ <class_name>upgrade_to_1_2_0_ALPHA4</class_name>
+ <call_method>run_upgrade</call_method>
+ </v1.2.0-ALPHA3>
+ <v1.2.0-ALPHA6>
+ <target_version>1.2.0-ALPHA7</target_version>
+ <script_name>upgradeTo1.2.0-ALPHA7.php</script_name>
+ <class_name>upgrade_to_1_2_0_ALPHA7</class_name>
+ <call_method>run_upgrade</call_method>
+ </v1.2.0-ALPHA6>
+ </matching>
+</upgrade>
Deleted: trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php
===================================================================
--- trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php 2009-08-06 14:53:12 UTC (rev 28)
+++ trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php 2009-08-13 15:04:14 UTC (rev 39)
@@ -1,153 +0,0 @@
-<?php
-
-class upgrade_to_1_2_0_ALPHA4 extends dbAbstract {
-
- private $logsObj;
-
- //=========================================================================
- public function __construct(cs_phpDB &$db) {
- if(!$db->is_connected()) {
- throw new exception(__METHOD__ .": database is not connected");
- }
- $this->db = $db;
-
- $this->logsObj = new logsClass($this->db, 'Upgrade');
-
- $this->gfObj = new cs_globalFunctions;
- $this->gfObj->debugPrintOpt = 1;
- }//end __construct()
- //=========================================================================
-
-
-
- //=========================================================================
- public function run_upgrade() {
-
- $this->db->beginTrans(__METHOD__);
-
-
- $this->run_schema_changes();
- $this->update_tag_icons();
- $this->update_config_file();
-
-
- $this->db->commitTrans(__METHOD__);
-
- return('Upgrade complete');
- }//end run_upgrade()
- //=========================================================================
-
-
-
- //=========================================================================
- private function run_schema_changes() {
-
- $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
- $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA2.sql');
-
- $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
- base64_encode($this->fsObj->read($this->lastSQLFile));
- $this->logsObj->log_by_class($details, 'system');
-
-
-
- $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
- $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA4.sql');
-
- $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
- base64_encode($this->fsObj->read($this->lastSQLFile));
- $this->logsObj->log_by_class($details, 'system');
-
- }//end run_schema_changes()
- //=========================================================================
-
-
-
- //=========================================================================
- private function update_tag_icons() {
-
- $sql = "SELECT tag_name_id, name, icon_name FROM tag_name_table ORDER BY tag_name_id";
- if($this->run_sql($sql) && $this->lastNumrows > 1) {
- $allTags = $this->db->farray_fieldnames('name', 'tag_name_id');
-
- $iconMods = array(
- 'critical' => 'red_x',
- 'bug' => 'bug',
- 'feature request' => 'feature_request',
- 'committed' => 'check_red',
- 'verified' => 'check_yellow',
- 'released' => 'check_green'
- );
-
- $updates = 0;
- foreach($iconMods as $name=>$icon) {
- if(isset($allTags[$name])) {
- //update.
- $sql = "UPDATE tag_name_table SET icon_name='". $icon ."' WHERE tag_name_id=". $allTags[$name]['tag_name_id'];
- }
- else {
- //insert.
- $sql = "INSERT INTO tag_name_table (name, icon_name) VALUES ('". $name ."', '". $icon ."');";
- }
- $this->run_sql($sql);
- $updates += $this->lastNumrows;
- }
- }
- else {
- throw new exception(__METHOD__ .": failed to retrieve tag names");
- }
-
- }//end update_tag_modifiers()
- //=========================================================================
-
-
-
- //=========================================================================
- public function update_config_file() {
- $fs = new cs_fileSystemClass(dirname(__FILE__) .'/../');
- $sampleXmlObj = new XMLParser($fs->read('docs/samples/sample_config.xml'));
- $siteXmlObj = new XMLParser($fs->read(CONFIG_FILE_LOCATION));
-
- $updateXml = new xmlCreator();
- $updateXml->load_xmlparser_data($siteXmlObj);
-
-
- //BACKUP ORIGINAL XML CONFIG...
- $backupFile = 'lib/__BACKUP__'. time() .'__'. CONFIG_FILENAME;
- $fs->create_file($backupFile);
- $fs->openFile($backupFile);
- $fs->write($updateXml->create_xml_string());
-
- $sampleIndexes = $sampleXmlObj->get_tree(TRUE);
- $sampleIndexes = $sampleIndexes['CONFIG'];
-
- $siteConfigIndexes = $siteXmlObj->get_tree(TRUE);
- $siteConfigIndexes = $siteConfigIndexes['CONFIG'];
-
- foreach($sampleIndexes as $indexName=>$indexValue) {
- $path = '/CONFIG/'. $indexName;
- $attributes = $sampleXmlObj->get_attribute($path);
- #debug_print(__METHOD__ .": attributes from sample (/CONFIG/". $indexName ."::: ",1);
- #debug_print($attributes,1);
- debug_print(__METHOD__ .': indexName=('. $indexName .'), indexValue=('. $indexValue .'), original config value=('. $siteConfigIndexes[$indexName] .')');
-
- //add tag if it's not there, update values otherwise.
- $tagValue = $attributes['DEFAULT'];
- if(isset($siteConfigIndexes[$indexName])) {
- $tagValue = $siteConfigIndexes[$indexName];
- }
- elseif($indexName == 'PHPMAILER_HOST' && isset($siteConfigIndexes['CONFIG_EMAIL_SERVER_IP'])) {
- $tagValue = $siteConfigIndexes['CONFIG_EMAIL_SERVER_IP'];
- $updateXml->remove_path('/CONFIG/CONFIG_EMAIL_SERVER_IP');
- }
- $updateXml->add_tag($path, $tagValue, $attributes);
- }
-
- $this->gfObj->debug_print($this->gfObj->cleanString($updateXml->create_xml_string(), 'htmlentity_plus_brackets'));
- $fs->openFile(CONFIG_FILE_LOCATION);
- $fs->write($updateXml->create_xml_string());
- }//end update_config_file()
- //=========================================================================
-}
-
-?>
Copied: trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php (from rev 28, trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php)
===================================================================
--- trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php (rev 0)
+++ trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA4.php 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,153 @@
+<?php
+
+class upgrade_to_1_2_0_ALPHA4 extends dbAbstract {
+
+ private $logsObj;
+
+ //=========================================================================
+ public function __construct(cs_phpDB &$db) {
+ if(!$db->is_connected()) {
+ throw new exception(__METHOD__ .": database is not connected");
+ }
+ $this->db = $db;
+
+ $this->logsObj = new logsClass($this->db, 'Upgrade');
+
+ $this->gfObj = new cs_globalFunctions;
+ $this->gfObj->debugPrintOpt = 1;
+ }//end __construct()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ public function run_upgrade() {
+
+ $this->db->beginTrans(__METHOD__);
+
+
+ $this->run_schema_changes();
+ $this->update_tag_icons();
+ $this->update_config_file();
+
+
+ $this->db->commitTrans(__METHOD__);
+
+ return('Upgrade complete');
+ }//end run_upgrade()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ private function run_schema_changes() {
+
+ $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
+ $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA2.sql');
+
+ $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
+ base64_encode($this->fsObj->read($this->lastSQLFile));
+ $this->logsObj->log_by_class($details, 'system');
+
+
+
+ $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
+ $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA4.sql');
+
+ $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
+ base64_encode($this->fsObj->read($this->lastSQLFile));
+ $this->logsObj->log_by_class($details, 'system');
+
+ }//end run_schema_changes()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ private function update_tag_icons() {
+
+ $sql = "SELECT tag_name_id, name, icon_name FROM tag_name_table ORDER BY tag_name_id";
+ if($this->run_sql($sql) && $this->lastNumrows > 1) {
+ $allTags = $this->db->farray_fieldnames('name', 'tag_name_id');
+
+ $iconMods = array(
+ 'critical' => 'red_x',
+ 'bug' => 'bug',
+ 'feature request' => 'feature_request',
+ 'committed' => 'check_red',
+ 'verified' => 'check_yellow',
+ 'released' => 'check_green'
+ );
+
+ $updates = 0;
+ foreach($iconMods as $name=>$icon) {
+ if(isset($allTags[$name])) {
+ //update.
+ $sql = "UPDATE tag_name_table SET icon_name='". $icon ."' WHERE tag_name_id=". $allTags[$name]['tag_name_id'];
+ }
+ else {
+ //insert.
+ $sql = "INSERT INTO tag_name_table (name, icon_name) VALUES ('". $name ."', '". $icon ."');";
+ }
+ $this->run_sql($sql);
+ $updates += $this->lastNumrows;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": failed to retrieve tag names");
+ }
+
+ }//end update_tag_modifiers()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ public function update_config_file() {
+ $fs = new cs_fileSystemClass(dirname(__FILE__) .'/../');
+ $sampleXmlObj = new XMLParser($fs->read('docs/samples/sample_config.xml'));
+ $siteXmlObj = new XMLParser($fs->read(CONFIG_FILE_LOCATION));
+
+ $updateXml = new xmlCreator();
+ $updateXml->load_xmlparser_data($siteXmlObj);
+
+
+ //BACKUP ORIGINAL XML CONFIG...
+ $backupFile = 'lib/__BACKUP__'. time() .'__'. CONFIG_FILENAME;
+ $fs->create_file($backupFile);
+ $fs->openFile($backupFile);
+ $fs->write($updateXml->create_xml_string());
+
+ $sampleIndexes = $sampleXmlObj->get_tree(TRUE);
+ $sampleIndexes = $sampleIndexes['CONFIG'];
+
+ $siteConfigIndexes = $siteXmlObj->get_tree(TRUE);
+ $siteConfigIndexes = $siteConfigIndexes['CONFIG'];
+
+ foreach($sampleIndexes as $indexName=>$indexValue) {
+ $path = '/CONFIG/'. $indexName;
+ $attributes = $sampleXmlObj->get_attribute($path);
+ #debug_print(__METHOD__ .": attributes from sample (/CONFIG/". $indexName ."::: ",1);
+ #debug_print($attributes,1);
+ debug_print(__METHOD__ .': indexName=('. $indexName .'), indexValue=('. $indexValue .'), original config value=('. $siteConfigIndexes[$indexName] .')');
+
+ //add tag if it's not there, update values otherwise.
+ $tagValue = $attributes['DEFAULT'];
+ if(isset($siteConfigIndexes[$indexName])) {
+ $tagValue = $siteConfigIndexes[$indexName];
+ }
+ elseif($indexName == 'PHPMAILER_HOST' && isset($siteConfigIndexes['CONFIG_EMAIL_SERVER_IP'])) {
+ $tagValue = $siteConfigIndexes['CONFIG_EMAIL_SERVER_IP'];
+ $updateXml->remove_path('/CONFIG/CONFIG_EMAIL_SERVER_IP');
+ }
+ $updateXml->add_tag($path, $tagValue, $attributes);
+ }
+
+ $this->gfObj->debug_print($this->gfObj->cleanString($updateXml->create_xml_string(), 'htmlentity_plus_brackets'));
+ $fs->openFile(CONFIG_FILE_LOCATION);
+ $fs->write($updateXml->create_xml_string());
+ }//end update_config_file()
+ //=========================================================================
+}
+
+?>
Deleted: trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php
===================================================================
--- trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php 2009-08-06 14:53:12 UTC (rev 28)
+++ trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php 2009-08-13 15:04:14 UTC (rev 39)
@@ -1,54 +0,0 @@
-<?php
-
-class upgrade_to_1_2_0_ALPHA7 extends dbAbstract {
-
- private $logsObj;
-
- //=========================================================================
- public function __construct(cs_phpDB &$db) {
- if(!$db->is_connected()) {
- throw new exception(__METHOD__ .": database is not connected");
- }
- $this->db = $db;
-
- $this->logsObj = new logsClass($this->db, 'Upgrade');
-
- $this->gfObj = new cs_globalFunctions;
- $this->gfObj->debugPrintOpt = 1;
- }//end __construct()
- //=========================================================================
-
-
-
- //=========================================================================
- public function run_upgrade() {
-
- $this->db->beginTrans(__METHOD__);
-
-
- $this->run_schema_changes();
-
-
- $this->db->commitTrans(__METHOD__);
-
- return('Upgrade complete');
- }//end run_upgrade()
- //=========================================================================
-
-
-
- //=========================================================================
- private function run_schema_changes() {
-
- $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
- $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA7.sql');
-
- $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
- base64_encode($this->fsObj->read($this->lastSQLFile));
- $this->logsObj->log_by_class($details, 'system');
-
- }//end run_schema_changes()
- //=========================================================================
-}
-
-?>
Copied: trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php (from rev 28, trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php)
===================================================================
--- trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php (rev 0)
+++ trunk/0.1/exampleUpgrades/upgradeTo1.2.0-ALPHA7.php 2009-08-13 15:04:14 UTC (rev 39)
@@ -0,0 +1,54 @@
+<?php
+
+class upgrade_to_1_2_0_ALPHA7 extends dbAbstract {
+
+ private $logsObj;
+
+ //=========================================================================
+ public function __construct(cs_phpDB &$db) {
+ if(!$db->is_connected()) {
+ throw new exception(__METHOD__ .": database is not connected");
+ }
+ $this->db = $db;
+
+ $this->logsObj = new logsClass($this->db, 'Upgrade');
+
+ $this->gfObj = new cs_globalFunctions;
+ $this->gfObj->debugPrintOpt = 1;
+ }//end __construct()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ public function run_upgrade() {
+
+ $this->db->beginTrans(__METHOD__);
+
+
+ $this->run_schema_changes();
+
+
+ $this->db->commitTrans(__METHOD__);
+
+ return('Upgrade complete');
+ }//end run_upgrade()
+ //=========================================================================
+
+
+
+ //=========================================================================
+ private function run_schema_changes() {
+
+ $this->gfObj->debug_print(__METHOD__ .": running SQL file...");
+ $this->run_sql_file(dirname(__FILE__) .'/../docs/sql/upgrades/upgradeTo1.2.0-ALPHA7.sql');
+
+ $details = "Executed SQL file, '". $this->lastSQLFile ."'. Encoded contents::: ".
+ base64_encode($this-...
[truncated message content] |