*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, SeekableIterator {
+class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, UpdateableResult, SeekableIterator {
+ // Exception constants
+ const EXCEPTION_INVALID_DATABASE_RESULT = 0x1c0;
+ const EXCEPTION_RESULT_UPDATE_FAILED = 0x1c1;
+
/**
* Current position in array
*/
*/
private $resultArray = array();
+ /**
+ * Array of out-dated entries
+ */
+ private $outDated = array();
+
+ /**
+ * Affected rows
+ */
+ private $affectedRows = 0;
+
/**
* Protected constructor
*
// Call parent constructor
parent::__construct(__CLASS__);
- // Set part description
- $this->setObjectDescription("Database result");
-
- // Create unique ID number
- $this->generateUniqueId();
-
// Clean up a little
$this->removeNumberFormaters();
$this->removeSystemArray();
$this->resultArray = $resultArray;
}
+ /**
+ * Updates the current entry by given update criteria
+ *
+ * @param $updateInstance An instance of an Updateable criteria
+ * @return void
+ */
+ private function updateCurrentEntryByCriteria (LocalUpdateCriteria $updateInstance) {
+ // Get the current entry key
+ $entryKey = $this->key();
+
+ // Now get the update criteria array and update all entries
+ foreach ($updateInstance->getUpdateCriteria() as $criteriaKey=>$criteriaValue) {
+ // Update data
+ $this->resultArray['rows'][$entryKey][$criteriaKey] = $criteriaValue;
+
+ // Mark it as out-dated
+ $this->outDated[$criteriaKey] = 1;
+ } // END - foreach
+ }
+
/**
* "Iterator" method next() to advance to the next valid entry. This method
* does also check if the result is invalid
$nextValid = false;
// Is the result valid?
- if ($this->resultArray['status'] === "ok") {
- // The status is fine so let's have a look for the next entry
- if ($this->valid()) {
- // Next entry found, so count one up and cache it
- $this->currentPos++;
- $this->currentRow = $this->resultArray['rows'][$this->currentPos];
- $nextValid = true;
- } // END - if
+ if ($this->valid()) {
+ // Next entry found, so count one up and cache it
+ $this->currentPos++;
+ $this->currentRow = $this->resultArray['rows'][$this->currentPos];
+ $nextValid = true;
} // END - if
// Return the result
$isValid = false;
// Check if
- if ((isset($this->resultArray['rows'][($this->currentPos + 1)])) && (isset($this->resultArray['rows'][0]))) {
+ if (($this->ifStatusIsOkay()) && (isset($this->resultArray['rows'][($this->currentPos + 1)])) && (isset($this->resultArray['rows'][0]))) {
// All fine!
$isValid = true;
} // END - if
return $isValid;
}
+ /**
+ * Determines wether the status of the query was fine ("ok")
+ *
+ * @return $ifStatusOkay Wether the status of the query was okay
+ */
+ public function ifStatusIsOkay () {
+ return ((isset($this->resultArray['status'])) && ($this->resultArray['status'] === "ok"));
+ }
+
/**
* Gets the current key of iteration
*
* @return void
*/
public function rewind () {
- $this->currentPos = 0;
+ $this->currentPos = -1;
}
/**
*
* @param $criteriaInstance The criteria to look inside the data set
* @return $result Found result entry
+ * @todo 0% done
*/
public function searchEntry (LocalSearchCriteria $criteriaInstance) {
- die("OK");
+ die(__METHOD__.": Unfinished!");
+ }
+
+ /**
+ * Adds an update request to the database result for writing it to the
+ * database layer
+ *
+ * @param $criteriaInstance An instance of a updateable criteria
+ * @return void
+ * @throws ResultUpdateException If no result was updated
+ */
+ public function add2UpdateQueue (LocalUpdateCriteria $criteriaInstance) {
+ // Rewind the pointer
+ $this->rewind();
+
+ // Get search criteria
+ $searchInstance = $criteriaInstance->getSearchInstance();
+
+ // And start looking for the result
+ $foundEntries = 0;
+ while (($this->valid()) && ($foundEntries < $searchInstance->getLimit())) {
+ // Get next entry
+ $this->next();
+ $currentEntry = $this->current();
+
+ // Is this entry found?
+ if ($searchInstance->ifEntryMatches($currentEntry)) {
+ // Update this entry
+ $this->updateCurrentEntryByCriteria($criteriaInstance);
+
+ // Count one up
+ $foundEntries++;
+ } // END - if
+ } // END - while
+
+ // Set affected rows
+ $this->setAffectedRows($foundEntries);
+
+ // 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 search instance
+ $this->setSearchInstance($searchInstance);
+ }
+
+ /**
+ * Setter for affected rows
+ *
+ * @param $rows Number of affected rows
+ * @return void
+ */
+ public final function setAffectedRows ($rows) {
+ $this->affectedRows = $rows;
+ }
+
+ /**
+ * Getter for affected rows
+ *
+ * @return $rows Number of affected rows
+ */
+ public final function getAffectedRows () {
+ return $this->affectedRows;
+ }
+
+ /**
+ * Checks wether we have out-dated entries or not
+ *
+ * @return $needsUpdate Wether we have out-dated entries
+ */
+ public function ifDataNeedsFlush () {
+ $needsUpdate = (count($this->outDated) > 0);
+ return $needsUpdate;
+ }
+
+ /**
+ * Adds registration elements to a given dataset instance
+ *
+ * @param $criteriaInstance An instance of a storeable criteria
+ * @return void
+ */
+ public function addElementsToDataSet (StoreableCriteria $criteriaInstance) {
+ // Rewind the pointer
+ $this->rewind();
+
+ // Walk through all entries
+ while ($this->valid()) {
+ // Get next entry
+ $this->next();
+ $currentEntry = $this->current();
+
+ // Walk only through out-dated columns
+ foreach ($this->outDated as $key=>$dummy) {
+ // Does this key exist?
+ //* DEBUG: */ echo "outDated: {$key}<br />\n";
+ if (isset($currentEntry[$key])) {
+ // Then update it
+ $criteriaInstance->addCriteria($key, $currentEntry[$key]);
+ } // END - foreach
+ } // END - foreach
+ } // END - while
}
}