23 import(
'lib.pkp.classes.db.DBConnection');
24 import(
'lib.pkp.classes.db.DAOResultFactory');
25 import(
'lib.pkp.classes.db.DBResultRange');
26 import(
'lib.pkp.classes.core.DataObject');
28 define(
'SORT_DIRECTION_ASC', 0x00001);
29 define(
'SORT_DIRECTION_DESC', 0x00002);
48 $this->_dataSource = $dataSource;
55 $args = func_get_args();
56 return call_user_func_array(array($this->
getDataSource(),
'Concat'), $args);
64 if ($callHooks ===
true) {
72 if (!isset($dataSource)) {
85 function &
retrieve($sql, $params =
false, $callHooks =
true) {
86 if ($callHooks ===
true) {
87 $trace = debug_backtrace();
100 $result = $dataSource->execute($sql, $params !==
false && !is_array($params) ? array($params) : $params);
101 if ($dataSource->errorNo()) {
115 function &
retrieveCached($sql, $params =
false, $secsToCache = 3600, $callHooks =
true) {
116 if ($callHooks ===
true) {
117 $trace = debug_backtrace();
132 $result = $dataSource->CacheExecute($secsToCache, $sql, $params !==
false && !is_array($params) ? array($params) : $params);
133 if ($dataSource->errorNo()) {
148 function &
retrieveLimit($sql, $params =
false, $numRows =
false, $offset =
false, $callHooks =
true) {
149 if ($callHooks ===
true) {
150 $trace = debug_backtrace();
163 $result = $dataSource->selectLimit($sql, $numRows ===
false ? -1 : $numRows, $offset ===
false ? -1 : $offset, $params !==
false && !is_array($params) ? array($params) : $params);
164 if ($dataSource->errorNo()) {
176 function &
retrieveRange($sql, $params =
false, $dbResultRange =
null, $callHooks =
true) {
177 if ($callHooks ===
true) {
178 $trace = debug_backtrace();
188 if (isset($dbResultRange) && $dbResultRange->isValid()) {
191 if (is_null($dbResultRange->getOffset())) {
192 $result = $dataSource->PageExecute($sql, $dbResultRange->getCount(), $dbResultRange->getPage(), $params);
194 $result = $dataSource->SelectLimit($sql, $dbResultRange->getCount(), $dbResultRange->getOffset(), $params);
196 if ($dataSource->errorNo()) {
201 $result = $this->
retrieve($sql, $params,
false);
214 function update($sql, $params =
false, $callHooks =
true, $dieOnError =
true) {
215 if ($callHooks ===
true) {
216 $trace = debug_backtrace();
229 $dataSource->execute($sql, $params !==
false && !is_array($params) ? array($params) : $params);
230 if ($dieOnError && $dataSource->errorNo()) {
233 return $dataSource->errorNo() == 0 ? true :
false;
243 function replace($table, $arrFields, $keyCols) {
245 $arrFields = array_map(array($dataSource,
'qstr'), $arrFields);
246 return $dataSource->Replace($table, $arrFields, $keyCols,
false);
257 return $dataSource->po_insert_id($table, $id);
266 return $dataSource->Affected_Rows();
276 if (!isset($cacheDir)) {
277 global $ADODB_CACHE_DIR;
281 $ADODB_CACHE_DIR = $cacheDir;
291 $dataSource->CacheFlush();
301 return $dataSource->DBTimeStamp($dt);
311 return $dataSource->DBDate($d);
320 if ($dt ===
null)
return null;
322 return $dataSource->UserTimeStamp($dt,
'Y-m-d H:i:s');
330 if ($d ===
null)
return null;
332 return $dataSource->UserDate($d,
'Y-m-d');
345 $value = (bool) $value;
349 $value = (int) $value;
353 $value = (float) $value;
357 $value = unserialize($value);
360 if ($value !==
null) $value = strtotime($value);
376 switch (gettype($value)) {
403 $type = $this->
getType($value);
409 $value = serialize($value);
415 $value = ($value && $value !==
'false') ? 1 : 0;
419 $value = (int) $value;
423 $value = (float) $value;
426 if ($value !==
null) {
427 if (!is_numeric($value)) $value = strtotime($value);
428 $value = strftime(
'%Y-%m-%d %H:%M:%S', $value);
445 return (empty($value)?
null:(
int) $value);
490 $idFields = array_keys($idArray);
491 $idFields[] =
'locale';
492 $idFields[] =
'setting_name';
495 $translated = $metadata = 1;
496 $settings = !$metadata;
497 $settingFields = array(
499 $translated => array(
501 $metadata => $dataObject->getLocaleMetadataFieldNames()
504 !$translated => array(
506 $metadata => $dataObject->getAdditionalMetadataFieldNames()
511 $updateArray = $idArray;
513 $staleSettings = array();
515 foreach ($settingFields as $isTranslated => $fieldTypes) {
516 foreach ($fieldTypes as $isMetadata => $fieldNames) {
517 foreach ($fieldNames as $fieldName) {
522 if ($dataObject->hasData($fieldName)) {
526 $values = $dataObject->getData($fieldName);
527 if (!is_array($values)) {
536 $noLocale => $dataObject->getData($fieldName)
541 foreach ($values as $locale => $value) {
542 $updateArray[
'locale'] = ($locale === $noLocale ?
'' : $locale);
543 $updateArray[
'setting_name'] = $fieldName;
544 $updateArray[
'setting_type'] =
null;
546 $updateArray[
'setting_value'] = $this->
convertToDB($value, $updateArray[
'setting_type']);
547 $this->
replace($tableName, $updateArray, $idFields);
553 $staleSettings[] = $fieldName;
560 if (count($staleSettings)) {
562 $removeParams = array();
563 foreach ($idArray as $idField => $idValue) {
564 if (!empty($removeWhere)) $removeWhere .=
' AND ';
565 $removeWhere .= $idField.
' = ?';
566 $removeParams[] = $idValue;
568 $removeWhere .= rtrim(
' AND setting_name IN ( '.str_repeat(
'? ,', count($staleSettings)),
',').
')';
569 $removeParams = array_merge($removeParams, $staleSettings);
570 $removeSql =
'DELETE FROM '.$tableName.
' WHERE '.$removeWhere;
571 $this->
update($removeSql, $removeParams);
583 if ($idFieldName !==
null) {
584 $sql =
"SELECT * FROM $tableName WHERE $idFieldName = ?";
585 $params = array($idFieldValue);
587 $sql =
"SELECT * FROM $tableName";
590 $result = $this->
retrieve($sql, $params);
591 while (!$result->EOF) {
592 $row = $result->getRowAssoc(
false);
593 $dataObject->setData(
594 $row[
'setting_name'],
596 $row[
'setting_value'],
599 empty($row[
'locale'])?
null:$row[
'locale']
613 return $conn->getDriver();
622 switch ($direction) {
623 case SORT_DIRECTION_ASC:
625 case SORT_DIRECTION_DESC:
651 $eventData = array($elementId);
652 if ($parentElementId) {
653 $eventData[
'parentElementId'] = $parentElementId;
659 import(
'lib.pkp.classes.core.JSONMessage');
661 $json->setEvent(
'dataChanged', $eventData);
676 function formatDateToDB($date, $defaultNumWeeks =
null, $acceptPastDate =
true) {
678 $todayTimestamp = mktime(0, 0, 0, $today[
'mon'], $today[
'mday'], $today[
'year']);
680 $dateParts = explode(
'-', $date);
683 if (!$acceptPastDate && $todayTimestamp > strtotime($date)) {
685 return date(
'Y-m-d H:i:s', $todayTimestamp);
688 return date(
'Y-m-d H:i:s', mktime(0, 0, 0, $dateParts[1], $dateParts[2], $dateParts[0]));
690 } elseif (isset($defaultNumWeeks)) {
692 $numWeeks = max((
int) $defaultNumWeeks, 2);
693 $newDueDateTimestamp = $todayTimestamp + ($numWeeks * 7 * 24 * 60 * 60);
694 return date(
'Y-m-d H:i:s', $newDueDateTimestamp);
703 throw new Exception(
'DB Error: ' . $dataSource->errorMsg() .
' Query: ' . $sql);