X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FDAO.php;h=54b0b484b115c22c8a00c9caf839976ea3de658a;hb=e869b07d94c53b7b185ed890e17332a646c95487;hp=ce8d2cfb97cba3c0a00c3c2bebba370906dff77f;hpb=6d5d1d248bb68161685078f1a629a59842af23b3;p=civicrm-core.git diff --git a/CRM/Core/DAO.php b/CRM/Core/DAO.php index ce8d2cfb97..54b0b484b1 100644 --- a/CRM/Core/DAO.php +++ b/CRM/Core/DAO.php @@ -70,6 +70,8 @@ class CRM_Core_DAO extends DB_DataObject { */ static $_factory = NULL; + static $_checkedSqlFunctionsExist = FALSE; + /** * Class constructor * @@ -194,6 +196,7 @@ class CRM_Core_DAO extends DB_DataObject { */ function initialize() { $this->_connect(); + $this->query("SET NAMES utf8"); } /** @@ -258,7 +261,7 @@ class CRM_Core_DAO extends DB_DataObject { if ($fields) { foreach ($fields as $name => $value) { $table[$value['name']] = $value['type']; - if (CRM_Utils_Array::value('required', $value)) { + if (!empty($value['required'])) { $table[$value['name']] += self::DB_DAO_NOTNULL; } } @@ -926,8 +929,11 @@ FROM civicrm_domain * execute a query and get the single result * * @param string $query query to be executed + * @param array $params + * @param bool $abort + * @param bool $i18nRewrite + * @return string|null the result of the query if any * - * @return string the result of the query * @static * @access public */ @@ -1083,13 +1089,13 @@ FROM civicrm_domain $fieldsToSuffix = array(); $fieldsToReplace = array(); } - if (CRM_Utils_Array::value('prefix', $fieldsFix)) { + if (!empty($fieldsFix['prefix'])) { $fieldsToPrefix = $fieldsFix['prefix']; } - if (CRM_Utils_Array::value('suffix', $fieldsFix)) { + if (!empty($fieldsFix['suffix'])) { $fieldsToSuffix = $fieldsFix['suffix']; } - if (CRM_Utils_Array::value('replace', $fieldsFix)) { + if (!empty($fieldsFix['replace'])) { $fieldsToReplace = $fieldsFix['replace']; } @@ -1293,6 +1299,10 @@ SELECT contact_id //skip the FK if it is not required // if it's contact id we should create even if not required // we'll have a go @ fetching first though + // we WILL create campaigns though for so tests with a campaign pseudoconstant will complete + if($FKClassName === 'CRM_Campaign_DAO_Campaign' && $daoName != $FKClassName) { + $required = TRUE; + } if (!$required && $dbName != 'contact_id') { $fkDAO = new $FKClassName; if($fkDAO->find(TRUE)){ @@ -1346,7 +1356,12 @@ SELECT contact_id case CRM_Utils_Type::T_DATE: case CRM_Utils_Type::T_TIMESTAMP: + case CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME: $object->$dbName = '19700101'; + if($dbName == 'end_date') { + // put this in the future + $object->$dbName = '20200101'; + } break; case CRM_Utils_Type::T_TIME: @@ -1526,11 +1541,11 @@ SELECT contact_id * @param $tableName string the specific table requiring a rebuild; or NULL to rebuild all tables * @see CRM-9716 */ - static function triggerRebuild($tableName = NULL) { + static function triggerRebuild($tableName = NULL, $force = FALSE) { $info = array(); $logging = new CRM_Logging_Schema; - $logging->triggerInfo($info, $tableName); + $logging->triggerInfo($info, $tableName, $force); CRM_Core_I18n_Schema::triggerInfo($info, $tableName); CRM_Contact_BAO_Contact::triggerInfo($info, $tableName); @@ -1544,6 +1559,23 @@ SELECT contact_id self::createTriggers($info); } + /** + * Because sql functions are sometimes lost, esp during db migration, we check here to avoid numerous support requests + * @see http://issues.civicrm.org/jira/browse/CRM-13822 + * TODO: Alternative solutions might be + * * Stop using functions and find another way to strip numeric characters from phones + * * Give better error messages (currently a missing fn fatals with "unknown error") + */ + static function checkSqlFunctionsExist() { + if (!self::$_checkedSqlFunctionsExist) { + self::$_checkedSqlFunctionsExist = TRUE; + $dao = CRM_Core_DAO::executeQuery("SHOW function status WHERE db = database() AND name = 'civicrm_strip_non_numeric'"); + if (!$dao->fetch()) { + self::triggerRebuild(); + } + } + } + /** * Wrapper function to drop triggers * @@ -1778,7 +1810,7 @@ EOS; public function getOptionLabels() { $fields = $this->fields(); if ($fields === NULL) { - throw new exception ('Cannot call getOptionLabels on CRM_Core_DAO'); + throw new Exception ('Cannot call getOptionLabels on CRM_Core_DAO'); } foreach ($fields as $field) { $name = CRM_Utils_Array::value('name', $field); @@ -1807,11 +1839,31 @@ EOS; ); // Validation: enforce uniformity of this param if ($context !== NULL && !isset($contexts[$context])) { - throw new exception("'$context' is not a valid context for buildOptions."); + throw new Exception("'$context' is not a valid context for buildOptions."); } return $contexts; } + /** + * @param $fieldName + * @return bool|array + */ + function getFieldSpec($fieldName) { + $fields = $this->fields(); + $fieldKeys = $this->fieldKeys(); + + // Support "unique names" as well as sql names + $fieldKey = $fieldName; + if (empty($fields[$fieldKey])) { + $fieldKey = CRM_Utils_Array::value($fieldName, $fieldKeys); + } + // If neither worked then this field doesn't exist. Return false. + if (empty($fields[$fieldKey])) { + return FALSE; + } + return $fields[$fieldKey]; + } + /** * SQL version of api function to assign filters to the DAO based on the syntax * $field => array('IN' => array(4,6,9)) @@ -1857,7 +1909,7 @@ EOS; case 'BETWEEN': case 'NOT BETWEEN': if (empty($criteria[0]) || empty($criteria[1])) { - throw new exception("invalid criteria for $operator"); + throw new Exception("invalid criteria for $operator"); } if(!$returnSanitisedArray) { return (sprintf('%s ' . $operator . ' "%s" AND "%s"', $fieldName, CRM_Core_DAO::escapeString($criteria[0]), CRM_Core_DAO::escapeString($criteria[1]))); @@ -1871,7 +1923,7 @@ EOS; case 'IN': case 'NOT IN': if (empty($criteria)) { - throw new exception("invalid criteria for $operator"); + throw new Exception("invalid criteria for $operator"); } $escapedCriteria = array_map(array( 'CRM_Core_DAO',