*/
class CRM_Core_DAOTest extends CiviUnitTestCase {
+ const ABORTED_SQL = "_aborted_sql_";
+
public function testGetReferenceColumns() {
// choose CRM_Core_DAO_Email as an arbitrary example
$emailRefs = CRM_Core_DAO_Email::getReferenceColumns();
$cases = array();
// $cases[] = array('Input-SQL', 'Input-Params', 'Expected-SQL');
+ $cases[0] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('', 'String')), 'UPDATE civicrm_foo SET bar = \'\'');
+ $cases[1] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('the text', 'String')), 'UPDATE civicrm_foo SET bar = \'the text\'');
+ $cases[2] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array(NULL, 'String')), self::ABORTED_SQL);
+ $cases[3] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('null', 'String')), 'UPDATE civicrm_foo SET bar = NULL');
+
+ $cases[3] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('', 'Float')), self::ABORTED_SQL);
+ $cases[4] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('1.23', 'Float')), 'UPDATE civicrm_foo SET bar = 1.23');
+ $cases[5] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array(NULL, 'Float')), self::ABORTED_SQL);
+ $cases[6] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('null', 'Float')), self::ABORTED_SQL);
+
+ $cases[11] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('', 'Money')), self::ABORTED_SQL);
+ $cases[12] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('1.23', 'Money')), 'UPDATE civicrm_foo SET bar = 1.23');
+ $cases[13] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array(NULL, 'Money')), self::ABORTED_SQL);
+ $cases[14] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('null', 'Money')), self::ABORTED_SQL);
+
+ $cases[15] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('', 'Int')), self::ABORTED_SQL);
+ $cases[16] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('123', 'Int')), 'UPDATE civicrm_foo SET bar = 123');
+ $cases[17] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array(NULL, 'Int')), self::ABORTED_SQL);
+ $cases[18] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('null', 'Int')), self::ABORTED_SQL);
+
+ $cases[19] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('', 'Timestamp')), 'UPDATE civicrm_foo SET bar = null');
+ $cases[20] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('20150102030405', 'Timestamp')), 'UPDATE civicrm_foo SET bar = 20150102030405');
+ $cases[21] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array(NULL, 'Timestamp')), 'UPDATE civicrm_foo SET bar = null');
+ $cases[22] = array('UPDATE civicrm_foo SET bar = %1', array(1 => array('null', 'Timestamp')), self::ABORTED_SQL);
+
// CASE: No params
- $cases[] = array(
+ $cases[1000] = array(
'SELECT * FROM whatever',
array(),
'SELECT * FROM whatever',
);
// CASE: Integer param
- $cases[] = array(
+ $cases[1001] = array(
'SELECT * FROM whatever WHERE id = %1',
array(
1 => array(10, 'Integer'),
);
// CASE: String param
- $cases[] = array(
+ $cases[1002] = array(
'SELECT * FROM whatever WHERE name = %1',
array(
1 => array('Alice', 'String'),
);
// CASE: Two params
- $cases[] = array(
+ $cases[1003] = array(
'SELECT * FROM whatever WHERE name = %1 AND title = %2',
array(
1 => array('Alice', 'String'),
);
// CASE: Two params with special character (%1)
- $cases[] = array(
+ $cases[1004] = array(
'SELECT * FROM whatever WHERE name = %1 AND title = %2',
array(
1 => array('Alice %2', 'String'),
);
// CASE: Two params with special character ($1)
- $cases[] = array(
+ $cases[1005] = array(
'SELECT * FROM whatever WHERE name = %1 AND title = %2',
array(
1 => array('Alice $1', 'String'),
* @param $expectSql
*/
public function testComposeQuery($inputSql, $inputParams, $expectSql) {
- $actualSql = CRM_Core_DAO::composeQuery($inputSql, $inputParams);
+ $scope = CRM_Core_TemporaryErrorScope::useException();
+ try {
+ $actualSql = CRM_Core_DAO::composeQuery($inputSql, $inputParams);
+ }
+ catch (Exception $e) {
+ $actualSql = self::ABORTED_SQL;
+ }
$this->assertEquals($expectSql, $actualSql);
}
list($inputSql, $inputParams, $expectSql) = $cases[0];
$actualSql = CRM_Core_DAO::composeQuery($inputSql, $inputParams);
$this->assertFalse(($expectSql == $actualSql));
+ unset($scope);
}
/**
CRM_Core_DAO::executeQuery("DROP TABLE $tempName");
}
+ /**
+ * CRM-19930: Test toArray() function with $format param
+ */
+ public function testDAOtoArray() {
+ $format = 'user[%s]';
+ $params = array(
+ 'first_name' => 'Testy',
+ 'last_name' => 'McScallion',
+ 'contact_type' => 'Individual',
+ );
+
+ $dao = CRM_Contact_BAO_Contact::add($params);
+ $query = "SELECT contact_type, display_name FROM civicrm_contact WHERE id={$dao->id}";
+ $toArray = array(
+ 'contact_type' => 'Individual',
+ 'display_name' => 'Testy McScallion',
+ );
+ $modifiedKeyArray = array();
+ foreach ($toArray as $k => $v) {
+ $modifiedKeyArray[sprintf($format, $k)] = $v;
+ }
+
+ $dao = CRM_Core_DAO::executeQuery($query);
+ while ($dao->fetch()) {
+ $daoToArray = $dao->toArray();
+ $this->checkArrayEquals($toArray, $daoToArray);
+ $daoToArray = $dao->toArray($format);
+ $this->checkArrayEquals($modifiedKeyArray, $daoToArray);
+ }
+ }
+
+ /**
+ * CRM-17748: Test internal DAO options
+ */
+ public function testDBOptions() {
+ $contactIDs = array();
+ for ($i = 0; $i < 10; $i++) {
+ $contactIDs[] = $this->individualCreate(array(
+ 'first_name' => 'Alan' . substr(sha1(rand()), 0, 7),
+ 'last_name' => 'Smith' . substr(sha1(rand()), 0, 4),
+ ));
+ }
+
+ // Test option 'result_buffering'
+ $this->_testMemoryUsageForUnbufferedQuery();
+
+ // cleanup
+ foreach ($contactIDs as $contactID) {
+ $this->callAPISuccess('Contact', 'delete', array('id' => $contactID));
+ }
+ }
+
+ /**
+ * Helper function to test result of buffered and unbuffered query
+ */
+ public function _testMemoryUsageForUnbufferedQuery() {
+ $sql = "SELECT * FROM civicrm_contact WHERE first_name LIKE 'Alan%' AND last_name LIKE 'Smith%' ";
+
+ $dao = CRM_Core_DAO::executeQuery($sql);
+ $contactsFetchedFromBufferedQuery = $dao->fetchAll();
+ $dao->free();
+
+ $dao = CRM_Core_DAO::executeUnbufferedQuery($sql);
+ $contactsFetchedFromUnbufferedQuery = $dao->fetchAll();
+ $dao->free();
+
+ $this->checkArrayEquals($contactsFetchedFromBufferedQuery, $contactsFetchedFromUnbufferedQuery);
+ }
+
}