', any custom extra connection to ds. */ abstract public function login($user=null,$pass=null,$method=null); /** * Query the datasource */ abstract public function query($query,$method,$index=null,$debug=false); /** * Return error details from previous operation */ abstract protected function getErrorMessage(); abstract protected function getErrorNum(); /** * Functions that set and verify object configuration details */ public function setDefaults($defaults) { foreach ($defaults as $key => $details) foreach ($details as $setting => $value) $this->default->{$key}[$setting] = $value; } public function isDefaultKey($key) { return isset($this->default->$key); } public function isDefaultSetting($key,$setting) { return array_key_exists($setting,$this->default->{$key}); } /** * Return a configuration value */ public function getValue($key,$setting,$fatal=true) { if (isset($this->custom->{$key}[$setting])) return $this->custom->{$key}[$setting]; elseif (isset($this->default->{$key}[$setting]) && array_key_exists('default',$this->default->{$key}[$setting])) return $this->default->{$key}[$setting]['default']; else { if ($fatal) debug_dump_backtrace("Error trying to get a non-existant value ($key,$setting)",1); else return null; } } /** * Set a configuration value */ public function setValue($key,$setting,$value) { if (isset($this->custom->{$key}[$setting])) system_message(array( 'title'=>_('Configuration setting already defined.'), 'body'=>sprintf('A call has been made to reset a configuration value (%s,%s,%s)', $key,$setting,$value), 'type'=>'info')); $this->custom->{$key}[$setting] = $value; } /** * Return the untested config items */ public function untested() { $result = array(); foreach ($this->default as $option => $details) foreach ($details as $param => $values) if (isset($values['untested']) && $values['untested']) array_push($result,sprintf('%s.%s',$option,$param)); return $result; } /** * Get the name of this datastore */ public function getName() { return $this->getValue('server','name'); } /** * Functions that enable login and logout of the application */ /** * Return the authentication type for this object */ public function getAuthType() { switch ($this->getValue('login','auth_type')) { case 'config' : case 'session' : return $this->getValue('login','auth_type'); default : die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__, $this->getValue('login','auth_type'))); } } /** * Get the login name of the user logged into this datastore's connection method */ public function getLogin($method=null) { $method = $this->getMethod($method); switch ($this->getAuthType()) { case 'config' : return $this->getValue('login','bind_id'); case 'session' : if (! isset($_SESSION['USER'][$this->index][$method]['name'])) return null; return $_SESSION['USER'][$this->index][$method]['name']; default : die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); } } /** * Set the login details of the user logged into this datastore's connection method */ protected function setLogin($user,$pass,$method=null) { $method = $this->getMethod($method); switch ($this->getAuthType()) { case 'config' : case 'session' : $_SESSION['USER'][$this->index][$method]['name'] = $user; $_SESSION['USER'][$this->index][$method]['pass'] = $pass; return true; default : die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); } } /** * Get the login password of the user logged into this datastore's connection method */ protected function getPassword($method=null) { $method = $this->getMethod($method); switch ($this->getAuthType()) { case 'config' : return $this->getValue('login','bind_pass'); case 'session' : return (isset($_SESSION['USER'][$this->index][$method]['pass'])) ? $_SESSION['USER'][$this->index][$method]['pass'] : null; default : die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); } } /** * Return if this datastore's connection method has been logged into */ public function isLoggedIn($method=null) { $method = $this->getMethod($method); return is_null($this->getLogin($method)) ? false : true; } /** * Logout of this datastore's connection method */ public function logout($method) { $method = $this->getMethod($method); switch ($this->getAuthType()) { case 'config' : return true; case 'session' : if (isset($_SESSION['USER'][$this->index][$method])) unset($_SESSION['USER'][$this->index][$method]); return true; default : die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); } } /** * Functions that return the condition of the datasource */ public function isVisible() { return $this->getValue('server','visible'); } public function isReadOnly() { return $this->getValue('server','read_only'); } public function getIndex() { return $this->index; } /** * Work out which connection method to use. * If a method is passed, then it will be passed back. If no method is passed, then we'll * check to see if the user is logged in. If they are, then 'user' is used, otherwise * 'anon' is used. * * @param int Server ID * @return string Connection Method */ protected function getMethod($method=null) { # Immediately return if method is set. if (! is_null($method)) return $method; if ($this->isLoggedIn('user')) return 'user'; else return 'anon'; } /** * Get a attribute value from a query */ public function getAttrValue($query,$attr,$method=null,$debug=false) { $result = $this->query($query,$method,$attr,$debug); if ($debug) debug_dump(array('query'=>$query,'result'=>$result)); if (count($result) > 1) system_message(array( 'title'=>_('Invalid call to function.'), 'body'=>sprintf('%s should have return 0 or 1 value, but return %s (%s)
(%s)', __METHOD__,count($result),serialize($result),serialize($query)), 'type'=>'info')); else foreach ($result as $key => $value) return $value; } } /** * The list of database sources * * @package leenooksApp * @subpackage DataStore */ class Datastore { # Out DS index id private $index; # List of all the objects private $objects = array(); # Default settings private $default; public function __construct() { $this->default = new StdClass; $this->default->server['id'] = array( 'desc'=>'Server ID', 'default'=>null); $this->default->server['name'] = array( 'desc'=>'Server name', 'default'=>null); # Connectivity Info $this->default->server['host'] = array( 'desc'=>'Host Name', 'default'=>'127.0.0.1'); $this->default->server['port'] = array( 'desc'=>'Port Number', 'default'=>null); # Read or write only access $this->default->server['read_only'] = array( 'desc'=>'Server is in READ ONLY mode', 'default'=>false); $this->default->server['visible'] = array( 'desc'=>'Whether this server is visible', 'default'=>true); # Authentication Information $this->default->login['auth_type'] = array( 'desc'=>'Authentication Type', 'default'=>'session'); /* /* ID to login to this application, this assumes that there is * application authentication on top of authentication required to * access the data source ** $this->default->login['auth_id'] = array( 'desc'=>'User Login ID to login to this DS', 'default'=>null); $this->default->login['auth_pass'] = array( 'desc'=>'User Login Password to login to this DS', 'default'=>null); */ $this->default->login['auth_text'] = array( 'desc'=>'Text to show at the login prompt', 'default'=>'User Name'); $this->default->login['bind_id'] = array( 'desc'=>'User Login ID to bind to this DS', 'default'=>null); $this->default->login['bind_pass'] = array( 'desc'=>'User Login Password to bind to this DS', 'default'=>null); $this->default->login['timeout'] = array( 'desc'=>'Session timout in seconds', 'default'=>session_cache_expire()-1); # Location to custom pages $this->default->custom['pages_prefix'] = array( 'desc'=>'Prefix name for custom pages', 'default'=>null); } /** * Create a new database object */ public function newServer($type) { if (class_exists($type)) { $this->index = count($this->objects)+1; $this->objects[$this->index] = new $type($this->index); $this->objects[$this->index]->setDefaults($this->default); return $this->index; } else { printf('ERROR: Class [%s] doesnt exist',$type); die(); } } /** * Set values for a database object. */ public function setValue($key,$setting,$value) { if (defined('DEBUG_ENABLED') && (DEBUG_ENABLED)) debug_log('Entered with (%s,%s,%s)',3,__FILE__,__LINE__,__METHOD__, $key,$setting,$value); if (! $this->objects[$this->index]->isDefaultKey($key)) error("ERROR: Setting a key [$key] that isnt predefined.",'error',true); if (! $this->objects[$this->index]->isDefaultSetting($key,$setting)) error("ERROR: Setting a index [$key,$setting] that isnt predefined.",'error',true); # Test if its should be an array or not. if (is_array($this->objects[$this->index]->getValue($key,$setting)) && ! is_array($value)) error("Error in configuration file, {$key}['$this->index'] SHOULD be an array of values.",'error',true); if (! is_array($this->objects[$this->index]->getValue($key,$setting)) && is_array($value)) error("Error in configuration file, {$key}['$this->index'] should NOT be an array of values.",'error',true); # Store the value in the object. $this->objects[$this->index]->setValue($key,$setting,$value); } /** * Get a list of all the configured servers. * * @param boolean Only show visible servers. * @return array list of all configured servers. */ public function getServerList($isVisible=true) { static $CACHE; if (! isset($CACHE[$isVisible])) { if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) debug_log('Entered with (%s)',3,__FILE__,__LINE__,__METHOD__,$isVisible); $CACHE[$isVisible] = array(); # Debugging incase objects is not set. if (! $this->objects) { print "
";
				debug_print_backtrace();
				die();
			}

			foreach ($this->objects as $id => $server)
				if (! $isVisible || ($isVisible && $server->getValue('server','visible')))
					$CACHE[$isVisible][$id] = $server;
		}

		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
			debug_log('Entered with (%s), Returning (%s)',3,__FILE__,__LINE__,__METHOD__,
				$isVisible,$CACHE);

		return $CACHE[$isVisible];
	}

	/**
	 * Return an object Instance of a configured database.
	 *
	 * @param int Index
	 * @return object Datastore instance object.
	 */
	public function Instance($index=null) {
		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
			debug_log('Entered with (%s)',3,__FILE__,__LINE__,__METHOD__,$index);

		# If no index defined, then pick the lowest one.
		if (is_null($index))
			$index = min($this->GetServerList())->getIndex();

		if (! isset($this->objects[$index]))
			debug_dump_backtrace("Error: Datastore instance [$index] doesnt exist?",1);

		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
			debug_log('Returning instance of database (%s)',3,__FILE__,__LINE__,__METHOD__,$index);

		return $this->objects[$index];
	}

	/**
	 * Return an object Instance of a configured database.
	 *
	 * @param string Name of the instance to retrieve
	 * @return object Datastore instance object.
	 */
	public function InstanceName($name=null) {
		if (DEBUG_ENABLED)
			debug_log('Entered with (%s)',3,__FILE__,__LINE__,__METHOD__,$name);

		foreach ($this->getServerList(false) as $index)
			if ($this->objects[$index]->getName() == $name)
				return $this->objects[$index];

		# If we get here, then no object with the name exists.
		return null;
	}

	/**
	 * Return an object Instance of a configured database.
	 *
	 * @param string ID of the instance to retrieve
	 * @return object Datastore instance object.
	 */
	public function InstanceId($id=null) {
		if (DEBUG_ENABLED)
			debug_log('Entered with (%s)',3,__FILE__,__LINE__,__METHOD__,$id);

		foreach ($this->getServerList(false) as $index)
			if ($this->objects[$index->getIndex()]->getValue('server','id') == $id)
				return $this->objects[$index->getIndex()];

		# If we get here, then no object with the name exists.
		return null;
	}
}
?>