// special value for mail bulk inserts to avoid
// potential duplication, assuming a smaller number reduces number of queries
// by some factor, so some tradeoff. CRM-8678
- BULK_MAIL_INSERT_COUNT = 10;
+ BULK_MAIL_INSERT_COUNT = 10,
+ QUERY_FORMAT_WILDCARD = 1,
+ QUERY_FORMAT_NO_QUOTES = 2;
+
/*
* Define entities that shouldn't be created or deleted when creating/ deleting
* test objects - this prevents world regions, countries etc from being added / deleted
$item[1] == 'Memo' ||
$item[1] == 'Link'
) {
- if (isset($item[2]) &&
- $item[2]
- ) {
- $item[0] = "'%{$item[0]}%'";
+ // Support class constants stipulating wildcard characters and/or
+ // non-quoting of strings. Also support legacy code which may be
+ // passing in TRUE or 1 for $item[2], which used to indicate the
+ // use of wildcard characters.
+ if (!empty($item[2])) {
+ if ($item[2] & CRM_Core_DAO::QUERY_FORMAT_WILDCARD || $item[2] === TRUE) {
+ $item[0] = "'%{$item[0]}%'";
+ }
+ elseif (!($item[2] & CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES)) {
+ $item[0] = "'{$item[0]}'";
+ }
}
else {
$item[0] = "'{$item[0]}'";
}
}
- // CRM-11582
- foreach($tr as $key => $value) {
- $key = preg_quote($key);
- $query = preg_replace("/$key\b/", $value, $query);
- }
- return $query;
+ return strtr($query, $tr);
}
static function freeResult($ids = NULL) {
'CRM_Core_DAO_Domain',
);
- require_once (str_replace('_', DIRECTORY_SEPARATOR, $daoName) . ".php");
-
for ($i = 0; $i < $numObjects; ++$i) {
++$counter;
- $object = new $daoName ( );
+ $object = new $daoName();
$fields = &$object->fields();
foreach ($fields as $name => $value) {
continue;
}
- $constant = CRM_Utils_Array::value('pseudoconstant', $value);
- if (!empty($constant)) {
- $constantValues = CRM_Utils_PseudoConstant::getConstant($constant['name']);
- if (!empty($constantValues)) {
- $constantOptions = array_keys($constantValues);
- $object->$dbName = $constantOptions[0];
+ // Pick an option value if needed
+ if ($value['type'] !== CRM_Utils_Type::T_BOOLEAN) {
+ $options = $daoName::buildOptions($dbName, 'create');
+ if ($options) {
+ $object->$dbName = key($options);
+ continue;
}
- continue;
- }
- $enum = CRM_Utils_Array::value('enumValues', $value);
- if (!empty($enum)) {
- $options = explode(',', $enum);
- $object->$dbName = $options[0];
- continue;
}
+
switch ($value['type']) {
case CRM_Utils_Type::T_INT:
case CRM_Utils_Type::T_FLOAT:
$object->$dbName = $counter;
break;
- case CRM_Utils_Type::T_BOOL:
case CRM_Utils_Type::T_BOOLEAN:
if (isset($value['default'])) {
$object->$dbName = $value['default'];
AND {$refSpec->getTypeColumn()} = %2
EOS;
}
- $daoName = CRM_Core_AllCoreTables::getClassForTable($refSpec->getReferenceTable());
+ $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($refSpec->getReferenceTable());
$result = self::executeQuery($sql, $params, TRUE, $daoName);
while ($result->fetch()) {
$obj = new $daoName();
*/
static function getReferencesToTable($tableName) {
$refsFound = array();
- foreach (CRM_Core_AllCoreTables::getClasses() as $daoClassName) {
+ foreach (CRM_Core_DAO_AllCoreTables::getClasses() as $daoClassName) {
$links = $daoClassName::getReferenceColumns();
$daoTableName = $daoClassName::getTableName();
return $default;
}
}
-}
+ /**
+ * Get options for the called BAO object's field.
+ * This function can be overridden by each BAO to add more logic related to context.
+ * The overriding function will generally call the lower-level CRM_Core_PseudoConstant::get
+ *
+ * @param string $fieldName
+ * @param string $context: @see CRM_Core_DAO::buildOptionsContext
+ * @param array $props: whatever is known about this bao object
+ */
+ public static function buildOptions($fieldName, $context = NULL, $props = array()) {
+ // If a given bao does not override this function
+ $baoName = get_called_class();
+ return CRM_Core_PseudoConstant::get($baoName, $fieldName, array(), $context);
+ }
+
+ /**
+ * Populate option labels for this object's fields.
+ *
+ * @throws exception if called directly on the base class
+ */
+ public function getOptionLabels() {
+ $fields = $this->fields();
+ if ($fields === NULL) {
+ throw new exception ('Cannot call getOptionLabels on CRM_Core_DAO');
+ }
+ foreach ($fields as $field) {
+ $name = CRM_Utils_Array::value('name', $field);
+ if ($name && isset($this->$name)) {
+ $label = CRM_Core_PseudoConstant::getLabel(get_class($this), $name, $this->$name);
+ if ($label !== FALSE) {
+ // Append 'label' onto the field name
+ $labelName = $name . '_label';
+ $this->$labelName = $label;
+ }
+ }
+ }
+ }
+
+ /**
+ * Provides documentation and validation for the buildOptions $context param
+ *
+ * @param String $context
+ */
+ public static function buildOptionsContext($context = NULL) {
+ $contexts = array(
+ 'get' => "All options are returned, even if they are disabled. Labels are translated.",
+ 'create' => "Options are filtered appropriately for the object being created/updated. Labels are translated.",
+ 'search' => "Searchable options are returned. Labels are translated.",
+ 'validate' => "All options are returned, even if they are disabled. Machine names are used in place of labels.",
+ );
+ // Validation: enforce uniformity of this param
+ if ($context !== NULL && !isset($contexts[$context])) {
+ throw new exception("'$context' is not a valid context for buildOptions.");
+ }
+ return $contexts;
+ }
+
+ /**
+ * SQL version of api function to assign filters to the DAO based on the syntax
+ * $field => array('IN' => array(4,6,9))
+ * OR
+ * $field => array('LIKE' => array('%me%))
+ * etc
+ *
+ * @param $fieldname string name of fields
+ * @param $filter array filter to be applied indexed by operator
+ * @param $type String type of field (not actually used - nor in api @todo )
+ * @param $alias String alternative field name ('as') @todo- not actually used
+ */
+ public function createSQLFilter($fieldName, $filter, $type, $alias = NULL) {
+ // http://issues.civicrm.org/jira/browse/CRM-9150 - stick with 'simple' operators for now
+ // support for other syntaxes is discussed in ticket but being put off for now
+ $acceptedSQLOperators = array('=', '<=', '>=', '>', '<', 'LIKE', "<>", "!=", "NOT LIKE", 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN');
+ foreach ($filter as $operator => $criteria) {
+ if (in_array($operator, $acceptedSQLOperators)) {
+ switch ($operator) {
+ // unary operators
+ case 'IS NULL':
+ case 'IS NOT NULL':
+ return (sprintf('%s %s', $fieldName, $operator));
+ break;
+
+ // ternary operators
+ case 'BETWEEN':
+ case 'NOT BETWEEN':
+ if (empty($criteria[0]) || empty($criteria[1])) {
+ throw new exception("invalid criteria for $operator");
+ }
+ return (sprintf('%s ' . $operator . ' "%s" AND "%s"', $fieldName, CRM_Core_DAO::escapeString($criteria[0]), CRM_Core_DAO::escapeString($criteria[1])));
+ break;
+
+ // n-ary operators
+ case 'IN':
+ case 'NOT IN':
+ if (empty($criteria)) {
+ throw new exception("invalid criteria for $operator");
+ }
+ $escapedCriteria = array_map(array(
+ 'CRM_Core_DAO',
+ 'escapeString'
+ ), $criteria);
+ return (sprintf('%s %s ("%s")', $fieldName, $operator, implode('", "', $escapedCriteria)));
+ break;
+
+ // binary operators
+
+ default:
+ return(sprintf('%s %s "%s"', $fieldName, $operator, CRM_Core_DAO::escapeString($criteria)));
+ }
+ }
+ }
+ }
+}
\ No newline at end of file