[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] |