From: Roland Häder <roland@mxchange.org>
Date: Fri, 14 Nov 2008 01:32:37 +0000 (+0000)
Subject: Setting index is now much nicer (more abstract!)
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=7def3a8992918dd9fe5f55d14d89c9cad4db0cbd;p=shipsimu.git

Setting index is now much nicer (more abstract!)
---

diff --git a/inc/classes/interfaces/result/class_SearchableResult.php b/inc/classes/interfaces/result/class_SearchableResult.php
index c2c7823..c3bf26b 100644
--- a/inc/classes/interfaces/result/class_SearchableResult.php
+++ b/inc/classes/interfaces/result/class_SearchableResult.php
@@ -29,6 +29,15 @@ interface SearchableResult extends FrameworkInterface {
 	 * @return	$result				Found result entry
 	 */
 	function searchEntry (LocalSearchCriteria $criteriaInstance);
+
+	/**
+	 * Solver for result index value with call-back method
+	 *
+	 * @param	$databaseColumn		Database column where the index might be found
+	 * @para	$callBack			Call-back object for setting the index
+	 * @return	void
+	 */
+	function solveResultIndex ($databaseColumn, BaseDatabaseWrapper $wrapperInstance, array $callBack);
 }
 
 // [EOF]
diff --git a/inc/classes/main/criteria/class_SearchCriteria.php b/inc/classes/main/criteria/class_SearchCriteria.php
index c95d853..0e76ede 100644
--- a/inc/classes/main/criteria/class_SearchCriteria.php
+++ b/inc/classes/main/criteria/class_SearchCriteria.php
@@ -73,8 +73,8 @@ class SearchCriteria extends BaseFrameworkSystem implements LocalSearchCriteria
 	 * @param	$criteriaValue	Criteria value
 	 * @return	void
 	 */
-	public function addCriteria ($criteriaKey, $criteriaValue) {
-		$this->searchCriteria[$criteriaKey] = $criteriaValue;
+	public final function addCriteria ($criteriaKey, $criteriaValue) {
+		$this->searchCriteria[(string)$criteriaKey] = (string)$criteriaValue;
 	}
 
 	/**
@@ -84,7 +84,7 @@ class SearchCriteria extends BaseFrameworkSystem implements LocalSearchCriteria
 	 * @param	$configEntry	Configuration entry
 	 * @return	void
 	 */
-	public function addConfiguredCriteria ($criteriaKey, $configEntry) {
+	public final function addConfiguredCriteria ($criteriaKey, $configEntry) {
 		// Add the configuration entry as a criteria
 		$value = $this->getConfigInstance()->readConfig($configEntry);
 		$this->addCriteria($criteriaKey, $value);
@@ -95,6 +95,7 @@ class SearchCriteria extends BaseFrameworkSystem implements LocalSearchCriteria
 	 *
 	 * @param	$limit	Search limit
 	 * @return	void
+	 * @todo	Find a nice casting here. (int) allows until and including 32766.
 	 */
 	public final function setLimit ($limit) {
 		$this->limit = $limit;
@@ -114,6 +115,7 @@ class SearchCriteria extends BaseFrameworkSystem implements LocalSearchCriteria
 	 *
 	 * @param	$skip	Search skip
 	 * @return	void
+	 * @todo	Find a nice casting here. (int) allows until and including 32766.
 	 */
 	public final function setSkip ($skip) {
 		$this->skip = $skip;
diff --git a/inc/classes/main/database/databases/class_LocalFileDatabase.php b/inc/classes/main/database/databases/class_LocalFileDatabase.php
index 96b5c22..29e2e5e 100644
--- a/inc/classes/main/database/databases/class_LocalFileDatabase.php
+++ b/inc/classes/main/database/databases/class_LocalFileDatabase.php
@@ -70,6 +70,11 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
 	 */
 	private $tableInfo = array();
 
+	/**
+	 * Element for index
+	 */
+	private $indexKey = "__idx";
+
 	/**
 	 * The protected constructor. Do never instance from outside! You need to
 	 * set a local file path. The class will then validate it.
@@ -210,6 +215,15 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
 		return $this->fileExtension;
 	}
 
+	/**
+	 * Getter for index key
+	 *
+	 * @return	$indexKey	Index key
+	 */
+	public final function getIndexKey () {
+		return $this->indexKey;
+	}
+
 	/**
 	 * Reads a local data file  and returns it's contents in an array
 	 *
@@ -402,7 +416,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
 							} // END - if
 
 							// Set id number
-							$dataArray['__idx'] = $idx;
+							$dataArray[$this->getIndexKey()] = $idx;
 
 							// Entry found!
 							$resultData['rows'][] = $dataArray;
diff --git a/inc/classes/main/database/wrapper/class_UserDatabaseWrapper.php b/inc/classes/main/database/wrapper/class_UserDatabaseWrapper.php
index 0406bb2..39e1283 100644
--- a/inc/classes/main/database/wrapper/class_UserDatabaseWrapper.php
+++ b/inc/classes/main/database/wrapper/class_UserDatabaseWrapper.php
@@ -63,6 +63,15 @@ class UserDatabaseWrapper extends BaseDatabaseWrapper {
 		return $wrapperInstance;
 	}
 
+	/**
+	 * Getter for index key
+	 *
+	 * @return	$indexKey	Index key
+	 */
+	public final function getIndexKey () {
+		return $this->getDatabaseInstance()->getIndexKey();
+	}
+
 	/**
 	 * Handles inserting the registration data from a registration instance into the database
 	 *
diff --git a/inc/classes/main/filter/verifier/class_UserGuestVerifierFilter.php b/inc/classes/main/filter/verifier/class_UserGuestVerifierFilter.php
index 839b1eb..75e00bd 100644
--- a/inc/classes/main/filter/verifier/class_UserGuestVerifierFilter.php
+++ b/inc/classes/main/filter/verifier/class_UserGuestVerifierFilter.php
@@ -65,7 +65,7 @@ class UserGuestVerifierFilter extends BaseFilter implements Filterable {
 			$requestInstance->requestIsValid(false);
 
 			// Add a message to the response
-			$responseInstance->addFatalMessage('username_unset');
+			$responseInstance->addFatalMessage('username_guest_unset');
 
 			// Abort here
 			return false;
@@ -74,7 +74,7 @@ class UserGuestVerifierFilter extends BaseFilter implements Filterable {
 			$requestInstance->requestIsValid(false);
 
 			// Add a message to the response
-			$responseInstance->addFatalMessage('username_empty');
+			$responseInstance->addFatalMessage('username_guest_empty');
 
 			// Abort here
 			return false;
@@ -83,7 +83,7 @@ class UserGuestVerifierFilter extends BaseFilter implements Filterable {
 			$requestInstance->requestIsValid(false);
 
 			// Add a message to the response
-			$responseInstance->addFatalMessage('username_not_found');
+			$responseInstance->addFatalMessage('username_guest_not_found');
 
 			// Abort here
 			return false;
diff --git a/inc/classes/main/result/class_DatabaseResult.php b/inc/classes/main/result/class_DatabaseResult.php
index 3f8918b..603f8cb 100644
--- a/inc/classes/main/result/class_DatabaseResult.php
+++ b/inc/classes/main/result/class_DatabaseResult.php
@@ -51,6 +51,11 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up
 	 */
 	private $affectedRows = 0;
 
+	/**
+	 * Found value
+	 */
+	private $foundValue = "";
+
 	/**
 	 * Protected constructor
 	 *
@@ -208,12 +213,13 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up
 	}
 
 	/**
-	 * Rewind to the beginning
+	 * Rewind to the beginning and clear array $currentRow
 	 *
 	 * @return	void
 	 */
 	public function rewind () {
 		$this->currentPos = -1;
+		$this->currentRow = array();
 	}
 
 	/**
@@ -291,6 +297,15 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up
 		return $this->affectedRows;
 	}
 
+	/**
+	 * Getter for found value of previous found() call
+	 *
+	 * @return	$foundValue		Found value of previous found() call
+	 */
+	public final function getFoundValue () {
+		return $this->foundValue;
+	}
+
 	/**
 	 * Checks wether we have out-dated entries or not
 	 *
@@ -308,25 +323,80 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up
 	 * @return	void
 	 */
 	public function addElementsToDataSet (StoreableCriteria $criteriaInstance) {
+		// Walk only through out-dated columns
+		foreach ($this->outDated as $key => $dummy) {
+			// Does this key exist?
+			//* DEBUG: */ echo "outDated: {$key}<br />\n";
+			if ($this->find($key)) {
+				// Then update it
+				$criteriaInstance->addCriteria($key, $this->getFoundValue());
+			} // END - if
+		} // END - foreach
+	}
+
+	/**
+	 * Find a key inside the result array
+	 *
+	 * @param	$key	The key we shall find
+	 * @return	$found	Wether the key was found or not
+	 */
+	public function find ($key) {
+		// By default nothing is found
+		$found = false;
+
 		// Rewind the pointer
 		$this->rewind();
 
 		// Walk through all entries
 		while ($this->valid()) {
-			// Get next entry
+			// Advance to next entry
 			$this->next();
+
+			// Get the whole array
 			$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
+			// Is the element there?
+			if (isset($currentEntry[$key])) {
+				// Okay, found!
+				$found = true;
+
+				// So "cache" it
+				$this->foundValue = $currentEntry[$key];
+
+				// 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
+	 * @para	$callBack			Call-back object for setting the index;
+	 * 								0=object instance,1=method name
+	 * @return	void
+4	 * @todo	Find a caching way without modifying the result array
+	 */
+	public function solveResultIndex ($databaseColumn, BaseDatabaseWrapper $wrapperInstance, array $callBack) {
+		// By default nothing is found
+		$indexValue = 0;
+
+		// Is the element in result itself found?
+		if ($this->find($databaseColumn)) {
+			// Use this value
+			$indexValue = $this->getFoundValue();
+		} elseif ($this->find($wrapperInstance->getIndexKey())) {
+			// Use this value
+			$indexValue = $this->getFoundValue();
+		}
+
+		// Set the index
+		call_user_func_array($callBack, array($indexValue));
 	}
 }
 
diff --git a/inc/classes/main/user/class_BaseUser.php b/inc/classes/main/user/class_BaseUser.php
index b3fc24d..0e3dba9 100644
--- a/inc/classes/main/user/class_BaseUser.php
+++ b/inc/classes/main/user/class_BaseUser.php
@@ -134,15 +134,20 @@ class BaseUser extends BaseFrameworkSystem {
 
 			// Add the username as a criteria and set limit to one entry
 			$criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName());
-			$criteriaInstance->setIndexSolution(UserDatabaseWrapper::DB_COLUMN_USERID, array($this, 'setUserId'));
 			$criteriaInstance->setLimit(1);
 
 			// Get a search result
-			$this->setResultInstance($wrapperInstance->doSelectByCriteria($criteriaInstance));
-		} else {
-			// Rewind it
-			$this->getResultInstance()->rewind();
-		}
+			$resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance);
+
+			// Set the index "solver"
+			$resultInstance->solveResultIndex(UserDatabaseWrapper::DB_COLUMN_USERID, $wrapperInstance, array($this, 'setUserId'));
+
+			// And finally set it
+			$this->setResultInstance($resultInstance);
+		} // END - if
+
+		// Rewind it
+		$this->getResultInstance()->rewind();
 
 		// Search for it
 		if ($this->getResultInstance()->next()) {
@@ -173,15 +178,20 @@ class BaseUser extends BaseFrameworkSystem {
 
 			// Add the username as a criteria and set limit to one entry
 			$criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_EMAIL, $this->getEmail());
-			$criteriaInstance->setIndexSolution(UserDatabaseWrapper::DB_COLUMN_USERID, array($this, 'setUserId'));
 			$criteriaInstance->setLimit(1);
 
-			// Get a search resultInstance
-			$this->setResultInstance($wrapperInstance->doSelectByCriteria($criteriaInstance));
-		} else {
-			// Rewind it
-			$this->getResultInstance()->rewind();
-		}
+			// Get a search result
+			$resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance);
+
+			// Set the index "solver"
+			$resultInstance->solveResultIndex(UserDatabaseWrapper::DB_COLUMN_USERID, $wrapperInstance, array($this, 'setUserId'));
+
+			// And finally set it
+			$this->setResultInstance($resultInstance);
+		} // END - if
+
+		// Rewind it
+		$this->getResultInstance()->rewind();
 
 		// Search for it
 		if ($this->getResultInstance()->next()) {
@@ -213,28 +223,36 @@ class BaseUser extends BaseFrameworkSystem {
 		// By default nothing matches... ;)
 		$matches = false;
 
-		// Get a UserDatabaseWrapper instance
-		$wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class');
+		// Is a previous result there?
+		if (is_null($this->getResultInstance())) {
+			// Get a UserDatabaseWrapper instance
+			$wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class');
 
-		// Create a search criteria
-		$criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
+			// Create a search criteria
+			$criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
 
-		// Add the username as a criteria and set limit to one entry
-		$criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName());
-		$criteriaInstance->setIndexSolution(UserDatabaseWrapper::DB_COLUMN_USERID, array($this, 'setUserId'));
-		$criteriaInstance->setLimit(1);
+			// Add the username as a criteria and set limit to one entry
+			$criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName());
+			$criteriaInstance->setLimit(1);
 
-		// Get a search resultInstance
-		$this->setResultInstance($wrapperInstance->doSelectByCriteria($criteriaInstance));
+			// Get a search result
+			$resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance);
 
-		// Search for it
-		if ($this->getResultInstance()->next()) {
-			// Get the current entry (can only be one!)
-			$entry = $this->getResultInstance()->current();
+			// Set the index "solver"
+			$resultInstance->solveResultIndex(UserDatabaseWrapper::DB_COLUMN_USERID, $wrapperInstance, array($this, 'setUserId'));
+
+			// And finally set it
+			$this->setResultInstance($resultInstance);
+		} // END - if
+
+		// Rewind it
+		$this->getResultInstance()->rewind();
 
+		// Search for it
+		if ($this->getResultInstance()->find('pass_hash')) {
 			// So does the hashes match?
 			//* DEBUG: */ echo $requestInstance->getRequestElement('pass_hash')."/".$entry['pass_hash'];
-			$matches = ($requestInstance->getRequestElement('pass_hash') === $entry['pass_hash']);
+			$matches = ($requestInstance->getRequestElement('pass_hash') === $this->getResultInstance()->getFoundValue());
 		} // END - if
 
 		// Return the status
diff --git a/inc/classes/middleware/database/class_DatabaseConnection.php b/inc/classes/middleware/database/class_DatabaseConnection.php
index 736ea4b..6f0a4e1 100644
--- a/inc/classes/middleware/database/class_DatabaseConnection.php
+++ b/inc/classes/middleware/database/class_DatabaseConnection.php
@@ -98,6 +98,15 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re
 		$this->dbLayer = $dbLayer;
 	}
 
+	/**
+	 * Getter for index key
+	 *
+	 * @return	$indexKey	Index key
+	 */
+	public final function getIndexKey () {
+		return $this->dbLayer->getIndexKey();
+	}
+
 	/**
 	 * Runs a "select" statement on the database layer with given table name
 	 * and criteria. If this doesn't fail the result will be returned