* You should have received a copy of the GNU General Public License
* 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 = 0x0b0;
+ const EXCEPTION_RESULT_UPDATE_FAILED = 0x0b1;
/**
* Current position in array
*/
private $resultArray = array();
+ /**
+ * Array of out-dated entries
+ */
+ private $outDated = array();
+
+ /**
+ * Affected rows
+ */
+ private $affectedRows = 0;
+
/**
* Protected constructor
*
$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
* @return $result Found result entry
*/
public function searchEntry (LocalSearchCriteria $criteriaInstance) {
- die(__METHOD__.": 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
}
}