3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2014
37 * This class is a container for legacy upgrade logic which predates
38 * the current 'CRM/Incremental/php/*' structure.
40 class CRM_Upgrade_Incremental_Legacy
{
43 * Compute any messages which should be displayed before upgrade
45 * @param $preUpgradeMessage
50 public static function setPreUpgradeMessage(&$preUpgradeMessage, $currentVer, $latestVer) {
51 $upgrade = new CRM_Upgrade_Form();
52 $template = CRM_Core_Smarty
::singleton();
54 if ((version_compare($currentVer, '3.3.alpha1') < 0 &&
55 version_compare($latestVer, '3.3.alpha1') >= 0
57 (version_compare($currentVer, '3.4.alpha1') < 0 &&
58 version_compare($latestVer, '3.4.alpha1') >= 0
63 FROM civicrm_mailing_job
64 WHERE status NOT IN ( 'Complete', 'Canceled' ) AND is_test = 0 LIMIT 1";
65 $mjId = CRM_Core_DAO
::singleValueQuery($query);
67 $preUpgradeMessage = ts("There are one or more Scheduled or In Progress mailings in your install. Scheduled mailings will not be sent and In Progress mailings will not finish if you continue with the upgrade. We strongly recommend that all Scheduled and In Progress mailings be completed or cancelled and then upgrade your CiviCRM install.");
71 //turning some tables to monolingual during 3.4.beta3, CRM-7869
72 $upgradeTo = str_replace('4.0.', '3.4.', $latestVer);
73 $upgradeFrom = str_replace('4.0.', '3.4.', $currentVer);
75 // check for changed message templates
76 self
::checkMessageTemplate($template, $preUpgradeMessage, $upgradeTo, $upgradeFrom);
78 $upgrade = new CRM_Upgrade_Form();
79 if ($upgrade->multilingual
&&
80 version_compare($upgradeFrom, '3.4.beta3') == -1 &&
81 version_compare($upgradeTo, '3.4.beta3') >= 0
83 $config = CRM_Core_Config
::singleton();
84 $preUpgradeMessage .= '<br />' . ts("As per <a href='%1'>the related blog post</a>, we are making contact names, addresses and mailings monolingual; the values entered for the default locale (%2) will be preserved and values for other locales removed.", array(1 => 'http://civicrm.org/blogs/shot/multilingual-civicrm-3440-making-some-fields-monolingual', 2 => $config->lcMessages
));
87 if (version_compare($currentVer, '3.4.6') == -1 &&
88 version_compare($latestVer, '3.4.6') >= 0
90 $googleProcessorExists = CRM_Core_DAO
::singleValueQuery("SELECT id FROM civicrm_payment_processor WHERE payment_processor_type = 'Google_Checkout' AND is_active = 1 LIMIT 1;");
92 if ($googleProcessorExists) {
93 $preUpgradeMessage .= '<br />' . ts('To continue using Google Checkout Payment Processor with latest version of CiviCRM, requires updating merchant account settings. Please refer "Set API callback URL and other settings" section of <a href="%1" target="_blank"><strong>Google Checkout Configuration</strong></a> doc.', array(1 => 'http://wiki.civicrm.org/confluence/x/zAJTAg'));
97 // http://issues.civicrm.org/jira/browse/CRM-13572
98 // Depending on how the code was upgraded, some sites may still have copies of old
99 // source files left behind. This is often a forgivable offense, but it's quite
100 // dangerous for CIVI-SA-2013-001.
101 global $civicrm_root;
102 $ofcFile = "$civicrm_root/packages/OpenFlashChart/php-ofc-library/ofc_upload_image.php";
103 if (file_exists($ofcFile)) {
104 if (@unlink
($ofcFile)) {
105 $preUpgradeMessage .= '<br />' . ts('This system included an outdated, insecure script (%1). The file was automatically deleted.', array(
110 $preUpgradeMessage .= '<br />' . ts('This system includes an outdated, insecure script (%1). Please delete it.', array(
116 if (CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::SEARCH_PREFERENCES_NAME
, 'enable_innodb_fts', NULL, FALSE)) {
117 // The FTS indexing feature dynamically manipulates the schema which could
118 // cause conflicts with other layers that manipulate the schema. The
119 // simplest thing is to turn it off and back on.
121 // It may not always be necessary to do this -- but I doubt we're going to test
122 // systematically in future releases. When it is necessary, one could probably
123 // ignore the matter and simply run CRM_Core_InnoDBIndexer::fixSchemaDifferences
124 // after the upgrade. But that's speculative. For now, we'll leave this
125 // advanced feature in the hands of the sysadmin.
126 $preUpgradeMessage .= '<br />' . ts('This database uses InnoDB Full Text Search for optimized searching. The upgrade procedure has not been tested with this feature. You should disable (and later re-enable) the feature by navigating to "Administer => System Settings => Miscellaneous".');
136 public static function checkMessageTemplate(&$template, &$message, $latestVer, $currentVer) {
137 if (version_compare($currentVer, '3.1.alpha1') < 0) {
141 $sql = "SELECT orig.workflow_id as workflow_id,
142 orig.msg_title as title
143 FROM civicrm_msg_template diverted JOIN civicrm_msg_template orig ON (
144 diverted.workflow_id = orig.workflow_id AND
145 orig.is_reserved = 1 AND (
146 diverted.msg_subject != orig.msg_subject OR
147 diverted.msg_text != orig.msg_text OR
148 diverted.msg_html != orig.msg_html
152 $dao = &CRM_Core_DAO
::executeQuery($sql);
153 while ($dao->fetch()) {
154 $workflows[$dao->workflow_id
] = $dao->title
;
157 if (empty($workflows)) {
162 $pathName = dirname(dirname(__FILE__
));
164 foreach ($workflows as $workflow => $title) {
165 $name = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionValue',
171 // check if file exists locally
172 $textFileName = implode(DIRECTORY_SEPARATOR
,
175 "{$latestVer}.msg_template",
181 $htmlFileName = implode(DIRECTORY_SEPARATOR
,
184 "{$latestVer}.msg_template",
190 if (file_exists($textFileName) ||
191 file_exists($htmlFileName)
194 $html .= "<li>{$title}</li>";
199 $html = "<ul>" . $html . "<ul>";
201 $message .= '<br />' . ts("The default copies of the message templates listed below will be updated to handle new features or correct a problem. Your installation has customized versions of these message templates, and you will need to apply the updates manually after running this upgrade. <a href='%1' style='color:white; text-decoration:underline; font-weight:bold;' target='_blank'>Click here</a> for detailed instructions. %2", array(1 => 'http://wiki.civicrm.org/confluence/display/CRMDOC/Message+Templates#MessageTemplates-UpgradesandCustomizedSystemWorkflowTemplates', 2 => $html));
206 * Compute any messages which should be displayed after upgrade
208 * @param $postUpgradeMessage
211 * String, an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs.
214 public static function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
215 if ($rev == '3.2.alpha1') {
216 $postUpgradeMessage .= '<br />' . ts("We have reset the COUNTED flag to false for the event participant status 'Pending from incomplete transaction'. This change ensures that people who have a problem during registration can try again.");
218 if ($rev == '3.2.beta3') {
219 $subTypes = CRM_Contact_BAO_ContactType
::subTypes();
221 if (is_array($subTypes) && !empty($subTypes)) {
222 $config = CRM_Core_Config
::singleton();
223 $subTypeTemplates = array();
225 if (isset($config->customTemplateDir
)) {
226 foreach ($subTypes as $key => $subTypeName) {
227 $customContactSubTypeEdit = $config->customTemplateDir
. "CRM/Contact/Form/Edit/" . $subTypeName . ".tpl";
228 $customContactSubTypeView = $config->customTemplateDir
. "CRM/Contact/Page/View/" . $subTypeName . ".tpl";
229 if (file_exists($customContactSubTypeEdit) ||
file_exists($customContactSubTypeView)) {
230 $subTypeTemplates[$subTypeName] = $subTypeName;
235 foreach ($subTypes as $key => $subTypeName) {
236 $customContactSubTypeEdit = $config->templateDir
. "CRM/Contact/Form/Edit/" . $subTypeName . ".tpl";
237 $customContactSubTypeView = $config->templateDir
. "CRM/Contact/Page/View/" . $subTypeName . ".tpl";
238 if (file_exists($customContactSubTypeEdit) ||
file_exists($customContactSubTypeView)) {
239 $subTypeTemplates[$subTypeName] = $subTypeName;
243 if (!empty($subTypeTemplates)) {
244 $subTypeTemplates = implode(',', $subTypeTemplates);
245 $postUpgradeMessage .= '<br />' . ts('You are using custom template for contact subtypes: %1.', array(1 => $subTypeTemplates)) . '<br />' . ts('You need to move these subtype templates to the SubType directory in %1 and %2 respectively.', array(1 => 'CRM/Contact/Form/Edit', 2 => 'CRM/Contact/Page/View'));
249 if ($rev == '3.2.beta4') {
250 $statuses = array('New', 'Current', 'Grace', 'Expired', 'Pending', 'Cancelled', 'Deceased');
252 SELECT count( id ) as statusCount
253 FROM civicrm_membership_status
254 WHERE name IN ( '" . implode("' , '", $statuses) . "' ) ";
255 $count = CRM_Core_DAO
::singleValueQuery($sql);
256 if ($count < count($statuses)) {
257 $postUpgradeMessage .= '<br />' . ts("One or more Membership Status Rules was disabled during the upgrade because it did not match a recognized status name. if custom membership status rules were added to this site - review the disabled statuses and re-enable any that are still needed (Administer > CiviMember > Membership Status Rules).");
260 if ($rev == '3.4.alpha1') {
261 $renamedBinScripts = array(
262 'ParticipantProcessor.php',
263 'RespondentProcessor.php',
264 'UpdateGreeting.php',
265 'UpdateMembershipRecord.php',
266 'UpdatePledgeRecord.php ',
268 $postUpgradeMessage .= '<br />' . ts('The following files have been renamed to have a ".php" extension instead of a ".php.txt" extension') . ': ' . implode(', ', $renamedBinScripts);
273 * Perform an incremental upgrade
276 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
278 public static function upgrade_2_2_alpha1($rev) {
279 for ($stepID = 1; $stepID <= 4; $stepID++
) {
280 $formName = "CRM_Upgrade_TwoTwo_Form_Step{$stepID}";
281 $form = new $formName();
284 if (!$form->verifyPreDBState($error)) {
285 if (!isset($error)) {
286 $error = "pre-condition failed for current upgrade step $stepID, rev $rev";
288 CRM_Core_Error
::fatal($error);
295 $template = CRM_Core_Smarty
::singleton();
297 $eventFees = array();
298 $query = "SELECT og.id ogid FROM civicrm_option_group og WHERE og.name LIKE %1";
299 $params = array(1 => array('civicrm_event_page.amount%', 'String'));
300 $dao = CRM_Core_DAO
::executeQuery($query, $params);
301 while ($dao->fetch()) {
302 $eventFees[$dao->ogid
] = $dao->ogid
;
304 $template->assign('eventFees', $eventFees);
308 if (!$form->verifyPostDBState($error)) {
309 if (!isset($error)) {
310 $error = "post-condition failed for current upgrade step $stepID, rev $rev";
312 CRM_Core_Error
::fatal($error);
318 * Perform an incremental upgrade
321 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
323 public static function upgrade_2_1_2($rev) {
324 $formName = "CRM_Upgrade_TwoOne_Form_TwoOneTwo";
325 $form = new $formName($rev);
328 if (!$form->verifyPreDBState($error)) {
329 if (!isset($error)) {
330 $error = "pre-condition failed for current upgrade for $rev";
332 CRM_Core_Error
::fatal($error);
337 if (!$form->verifyPostDBState($error)) {
338 if (!isset($error)) {
339 $error = "post-condition failed for current upgrade for $rev";
341 CRM_Core_Error
::fatal($error);
346 * This function should check if if need to skip current sql file
347 * Name of this function will change according to the latest release
350 public static function upgrade_2_2_alpha3($rev) {
351 // skip processing sql file, if fresh install -
352 if (!CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionGroup', 'mail_protocol', 'id', 'name')) {
353 $upgrade = new CRM_Upgrade_Form();
354 $upgrade->processSQL($rev);
360 * Perform an incremental upgrade
363 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
365 public static function upgrade_2_2_beta1($rev) {
366 if (!CRM_Core_DAO
::checkFieldExists('civicrm_pcp_block', 'notify_email')) {
367 $template = CRM_Core_Smarty
::singleton();
368 $template->assign('notifyAbsent', TRUE);
370 $upgrade = new CRM_Upgrade_Form();
371 $upgrade->processSQL($rev);
375 * Perform an incremental upgrade
378 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
380 public static function upgrade_2_2_beta2($rev) {
381 $template = CRM_Core_Smarty
::singleton();
382 if (!CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionValue',
383 'CRM_Contact_Form_Search_Custom_ZipCodeRange', 'id', 'name'
385 $template->assign('customSearchAbsentAll', TRUE);
387 elseif (!CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionValue',
388 'CRM_Contact_Form_Search_Custom_MultipleValues', 'id', 'name'
390 $template->assign('customSearchAbsent', TRUE);
392 $upgrade = new CRM_Upgrade_Form();
393 $upgrade->processSQL($rev);
397 * Perform an incremental upgrade
400 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
402 public static function upgrade_2_2_beta3($rev) {
403 $template = CRM_Core_Smarty
::singleton();
404 if (!CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionGroup', 'custom_data_type', 'id', 'name')) {
405 $template->assign('customDataType', TRUE);
408 $upgrade = new CRM_Upgrade_Form();
409 $upgrade->processSQL($rev);
413 * Perform an incremental upgrade
416 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
418 public static function upgrade_3_0_alpha1($rev) {
420 $threeZero = new CRM_Upgrade_ThreeZero_ThreeZero();
423 if (!$threeZero->verifyPreDBState($error)) {
424 if (!isset($error)) {
425 $error = 'pre-condition failed for current upgrade for 3.0.alpha2';
427 CRM_Core_Error
::fatal($error);
430 $threeZero->upgrade($rev);
434 * Perform an incremental upgrade
437 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
439 public static function upgrade_3_1_alpha1($rev) {
441 $threeOne = new CRM_Upgrade_ThreeOne_ThreeOne();
444 if (!$threeOne->verifyPreDBState($error)) {
445 if (!isset($error)) {
446 $error = 'pre-condition failed for current upgrade for 3.0.alpha2';
448 CRM_Core_Error
::fatal($error);
451 $threeOne->upgrade($rev);
455 * Perform an incremental upgrade
458 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
460 public static function upgrade_2_2_7($rev) {
461 $upgrade = new CRM_Upgrade_Form();
462 $upgrade->processSQL($rev);
463 $sql = "UPDATE civicrm_report_instance
464 SET form_values = REPLACE(form_values,'#',';') ";
465 CRM_Core_DAO
::executeQuery($sql, CRM_Core_DAO
::$_nullArray);
467 // make report component enabled by default
468 $domain = new CRM_Core_DAO_Domain();
469 $domain->selectAdd();
470 $domain->selectAdd('config_backend');
472 if ($domain->config_backend
) {
473 $defaults = unserialize($domain->config_backend
);
475 if (is_array($defaults['enableComponents'])) {
476 $compId = CRM_Core_DAO
::singleValueQuery("SELECT id FROM civicrm_component WHERE name = 'CiviReport'");
478 $defaults['enableComponents'][] = 'CiviReport';
479 $defaults['enableComponentIDs'][] = $compId;
481 CRM_Core_BAO_ConfigSetting
::add($defaults);
488 * Perform an incremental upgrade
491 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
493 public static function upgrade_3_0_2($rev) {
495 $template = CRM_Core_Smarty
::singleton();
496 //check whether upgraded from 2.1.x or 2.2.x
497 $inboundEmailID = CRM_Core_OptionGroup
::getValue('activity_type', 'Inbound Email', 'name');
499 if (!empty($inboundEmailID)) {
500 $template->assign('addInboundEmail', FALSE);
503 $template->assign('addInboundEmail', TRUE);
506 $upgrade = new CRM_Upgrade_Form();
507 $upgrade->processSQL($rev);
511 * Perform an incremental upgrade
514 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
516 public static function upgrade_3_0_4($rev) {
517 //make sure 'Deceased' membership status present in db,CRM-5636
518 $template = CRM_Core_Smarty
::singleton();
520 $addDeceasedStatus = FALSE;
521 $sql = "SELECT max(id) FROM civicrm_membership_status where name = 'Deceased'";
522 if (!CRM_Core_DAO
::singleValueQuery($sql)) {
523 $addDeceasedStatus = TRUE;
525 $template->assign('addDeceasedStatus', $addDeceasedStatus);
527 $upgrade = new CRM_Upgrade_Form();
528 $upgrade->processSQL($rev);
532 * Perform an incremental upgrade
535 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
537 public static function upgrade_3_1_0($rev) {
538 // upgrade all roles who have 'access CiviEvent' permission, to also have
539 // newly added permission 'edit_all_events', CRM-5472
540 $config = CRM_Core_Config
::singleton();
541 if (is_callable(array(
542 $config->userSystem
, 'replacePermission'))) {
543 $config->userSystem
->replacePermission('access CiviEvent', array('access CiviEvent', 'edit all events'));
546 //make sure 'Deceased' membership status present in db,CRM-5636
547 $template = CRM_Core_Smarty
::singleton();
549 $addDeceasedStatus = FALSE;
550 $sql = "SELECT max(id) FROM civicrm_membership_status where name = 'Deceased'";
551 if (!CRM_Core_DAO
::singleValueQuery($sql)) {
552 $addDeceasedStatus = TRUE;
554 $template->assign('addDeceasedStatus', $addDeceasedStatus);
556 $upgrade = new CRM_Upgrade_Form();
557 $upgrade->processSQL($rev);
561 * Perform an incremental upgrade
564 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
566 public static function upgrade_3_1_3($rev) {
567 $threeOne = new CRM_Upgrade_ThreeOne_ThreeOne();
568 $threeOne->upgrade_3_1_3();
570 $upgrade = new CRM_Upgrade_Form();
571 $upgrade->processSQL($rev);
575 * Perform an incremental upgrade
578 * String, the revision to which we are upgrading (Note: When processing a series of upgrades, this is the immediate upgrade - not the final).
580 public static function upgrade_3_1_4($rev) {
581 $threeOne = new CRM_Upgrade_ThreeOne_ThreeOne();
582 $threeOne->upgrade_3_1_4();
584 $upgrade = new CRM_Upgrade_Form();
585 $upgrade->processSQL($rev);