use Org\Mxchange\CoreFramework\Criteria\Local\LocalSearchCriteria;
use Org\Mxchange\CoreFramework\Criteria\Local\LocalUpdateCriteria;
use Org\Mxchange\CoreFramework\Criteria\Storing\StoreableCriteria;
-use Org\Mxchange\CoreFramework\Database\Frontend\DatabaseWrapper;
+use Org\Mxchange\CoreFramework\Database\Frontend\DatabaseFrontend;
use Org\Mxchange\CoreFramework\Database\Backend\BaseDatabaseBackend;
-use Org\Mxchange\CoreFramework\Request\Requestable;
use Org\Mxchange\CoreFramework\Result\Search\SearchableResult;
use Org\Mxchange\CoreFramework\Result\Update\UpdateableResult;
// Import SPL stuff
+use \InvalidArgumentException;
use \SeekableIterator;
/**
*
* @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2020 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.shipsimu.org
*
/**
* Result array
*/
- private $resultArray = array();
+ private $resultArray = [];
/**
* Array of out-dated entries
*/
- private $outDated = array();
+ private $outDated = [];
/**
* Affected rows
*
* @param $resultArray The array holding the result from query
* @return $resultInstance An instance of this class
+ * @throws InvalidArgumentException If a parameter is invalid
*/
public static final function createCachedDatabaseResult (array $resultArray) {
+ // Misses an element?
+ if (count($resultArray) == 0) {
+ // Cannot be empty
+ throw new InvalidArgumentException('Array "resultArray" cannot be empty.');
+ } elseif (!array_key_exists(BaseDatabaseBackend::RESULT_INDEX_ROWS, $resultArray)) {
+ // Yes, then abort here
+ throw new InvalidArgumentException(sprintf('resultArray(%d)=%s has no element "%s".', count($resultArray), print_r($resultArray, TRUE), BaseDatabaseBackend::RESULT_INDEX_ROWS));
+ }
+
// Get a new instance
$resultInstance = new CachedDatabaseResult();
// Mark it as out-dated
$this->outDated[$criteriaKey] = 1;
- } // END - foreach
+ }
}
/**
$this->currentPos++;
$this->currentRow = $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos];
$nextValid = true;
- } // END - if
+ }
// Return the result
return $nextValid;
while (($this->currentPos < $index) && ($this->valid())) {
// Continue on
$this->next();
- } // END - while
+ }
}
/**
if (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos])) {
// Then get it
$current = $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos];
- } // END - if
+ }
// Return the result
return $current;
* @return $isValid Whether the next/rewind entry is valid
*/
public function valid () {
- // By default nothing is valid
- $isValid = false;
-
- // Debug message
- //*NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] this->currentPos=' . $this->currentPos);
-
// Check if all is fine ...
- if (($this->ifStatusIsOkay()) && (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][($this->currentPos + 1)])) && (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][0]))) {
- // All fine!
- $isValid = true;
- } // END - if
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CACHED-DATABASE-RESULT: this->currentPos=' . $this->currentPos);
+ $isValid = ($this->ifStatusIsOkay() && isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos]) && isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][0]));
// Return the result
return $isValid;
* @return $ifStatusOkay Whether the status of the query was okay
*/
public function ifStatusIsOkay () {
- $ifStatusOkay = ((isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS])) && ($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS] === BaseDatabaseBackend::RESULT_OKAY));
- //*NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] ifStatusOkay=' . intval($ifStatusOkay));
+ $ifStatusOkay = (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS]) && $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS] === BaseDatabaseBackend::RESULT_OKAY);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CACHED-DATABASE-RESULT: ifStatusOkay=' . intval($ifStatusOkay));
return $ifStatusOkay;
}
* @return void
*/
public function rewind () {
- $this->currentPos = -1;
- $this->currentRow = array();
+ $this->currentPos = 0;
+ $this->currentRow = [];
}
/**
* Adds an update request to the database result for writing it to the
* database layer
*
- * @param $criteriaInstance An instance of a updateable criteria
+ * @param $updateInstance An instance of a updateable criteria
* @return void
* @throws ResultUpdateException If no result was updated
*/
- public function add2UpdateQueue (LocalUpdateCriteria $criteriaInstance) {
+ public function add2UpdateQueue (LocalUpdateCriteria $updateInstance) {
// Rewind the pointer
$this->rewind();
// Get search criteria
- $searchInstance = $criteriaInstance->getSearchInstance();
+ $searchInstance = $updateInstance->getSearchInstance();
// And start looking for the result
- $foundEntries = 0;
+ $foundEntries = $this->getAffectedRows();
while (($this->valid()) && ($foundEntries < $searchInstance->getLimit())) {
// Get next entry
$this->next();
// Is this entry found?
if ($searchInstance->ifEntryMatches($currentEntry)) {
// Update this entry
- $this->updateCurrentEntryByCriteria($criteriaInstance);
+ $this->updateCurrentEntryByCriteria($updateInstance);
// Count one up
$foundEntries++;
- } // END - if
- } // END - while
+ }
+ }
// If no entry is found/updated throw an exception
if ($foundEntries == 0) {
// Throw an exception here
throw new ResultUpdateException($this, self::EXCEPTION_RESULT_UPDATE_FAILED);
- } // END - if
+ }
// Set affected rows
$this->setAffectedRows($foundEntries);
// Set update instance
- $this->setUpdateInstance($criteriaInstance);
+ $this->setUpdateInstance($updateInstance);
}
/**
* @param $rows Number of affected rows
* @return void
*/
- public final function setAffectedRows ($rows) {
+ public final function setAffectedRows (int $rows) {
$this->affectedRows = $rows;
}
* Adds registration elements to a given dataset instance
*
* @param $criteriaInstance An instance of a StoreableCriteria class
- * @param $requestInstance An instance of a Requestable class
* @return void
*/
- public function addElementsToDataSet (StoreableCriteria $criteriaInstance, Requestable $requestInstance = NULL) {
+ public function addElementsToDataSet (StoreableCriteria $criteriaInstance) {
// Walk only through out-dated columns
foreach ($this->outDated as $key => $dummy) {
// Does this key exist?
if ($this->find($key)) {
// Then update it
$criteriaInstance->addCriteria($key, $this->getFoundValue());
- } // END - if
- } // END - foreach
+ }
+ }
}
/**
// And stop searching
break;
- } // END - if
- } // END - while
+ }
+ }
// Return the result
return $found;
* Solver for result index value with call-back method
*
* @param $databaseColumn Database column where the index might be found
- * @param $wrapperInstance The wrapper instance to ask for array element
+ * @param $frontendInstance The frontend instance to ask for array element
* @para $callBack Call-back object for setting the index;
* 0=object instance,1=method name
* @return void
* @todo Find a caching way without modifying the result array
*/
- public function solveResultIndex ($databaseColumn, DatabaseWrapper $wrapperInstance, array $callBack) {
+ public function solveResultIndex ($databaseColumn, DatabaseFrontend $frontendInstance, array $callBack) {
// By default nothing is found
$indexValue = 0;
if ($this->find($databaseColumn)) {
// Use this value
$indexValue = $this->getFoundValue();
- } elseif ($this->find($wrapperInstance->getIndexKey())) {
+ } elseif ($this->find($frontendInstance->getIndexKey())) {
// Use this value
$indexValue = $this->getFoundValue();
}