GIF89a; Mini Shell

Mini Shell

Direktori : /home/serb/public_html/chat/inc/classes/
Upload File :
Current File : /home/serb/public_html/chat/inc/classes/db_cache.php

<?php
	define('STATEMENT_SELECT', 'select');
	define('STATEMENT_INSERT', 'insert');
	define('STATEMENT_UPDATE', 'update');
	define('STATEMENT_DELETE', 'delete');

	class Statement {
		var $queryArray;
		var $queryStr;
		var $type = STATEMENT_SELECT;
		var $conn = null;

		function Statement( $queryStr, $dosplit=true ) {
			$this->queryArray = $dosplit ? explode('?', $queryStr) : array($queryStr);
			$this->type = strtolower(substr($queryStr, 0, 6));
			$this->queryStr = $queryStr;
			/*
				Check to see if $queryStr is cached. If not
				cached, then create DB connection.
			*/
		}

		//Return max ID value from table
		function getRecordsCount($table_name)
		{
			$selResource = mysql_query('SELECT MAX(id) FROM '.$table_name, $this->conn);
			$selResult = mysql_fetch_array($selResource);
			$maxId = (int)$selResult[0];
			return $maxId;
		}

		//If admin logged, this function return :"./../".$GLOBALS['fc_config']['cachePath'];
		//If user, this function return :$GLOBALS['fc_config']['cachePath'];
		function getCachDir()
		{
			$dir = @dir($GLOBALS['fc_config']['cachePath']);
			if(strpos($dir->handle, 'Resource')!==FALSE)
				return $dir;
			else
				return dir('./../'.$GLOBALS['fc_config']['cachePath']);
		}

		//input: Rooms, Stats, Ignors
		//output: path to cach file
		function getCachFileName($input)
		{
			if( $input == '' ) return null;
			$cacheDir = $this->getCachDir();
			$cachePath = $cacheDir->path;

			$fileName = '';

			//while (false !== ($entry = $cacheDir->read()))
			//{
				switch($input)
				{
					case 'Stats':
						$fileName = $cachePath.$GLOBALS['fc_config']['db']['pref'].'messages_stats_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt';
						break;
					case 'Rooms':
						$fileName = $cachePath.$GLOBALS['fc_config']['db']['pref'].'rooms_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt';
						break;
					case 'Connections':
						$fileName = $cachePath.$GLOBALS['fc_config']['db']['pref'].'connections_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt';
						break;
				}
				if( file_exists($fileName) )
				{
					return $fileName;
				}
				else
				{
					return null;
				}
		}
		//columns: id or *
		//condition: string AFTER WHERE
		// queryParams: params that passed into this->process(...)
		function roomsIsCached($columns, $condition, $queryParams )
		{
			$result = array();
			$roomsFileName = $this->getCachFileName('Rooms');
			if($roomsFileName!=null)
			{
				$rooms = file($roomsFileName);
				for($i=0;$i<count($rooms);$i++)
				{
					$roomsElems = explode("\t", $rooms[$i]);

					if($condition=='id=?')
					{
						if((int) $roomsElems[0] == (int) $queryParams[0])
						{
							if($columns=='*')
							{
								$result_elem = array('id'=>$roomsElems[0], 'updated'=>$roomsElems[1], 'created'=>$roomsElems[2], 'name'=>$roomsElems[3],'password'=>$roomsElems[4], 'ispublic'=>$roomsElems[5], 'ispermanent'=>$roomsElems[6]);
								$result[count($result)] = $result_elem;
							}
							elseif($columns=='id')
							{
								$result_elem = array('id'=>$roomsElems[0]);
								$result[count($result)] = $result_elem;
							}
						}
					}
					elseif($condition=='ispermanent IS NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND)')
					{
						$dateToSub = strtotime($roomsElems[1]);//some bug ???
						$today = getdate();
						$subDate = $today[0]-(int)$queryParams[0];

						if( strpos((string)$roomsElems[6], 'NULL')!==FALSE && $dateToSub<$subDate)
						{
							if($columns=='*')
							{
								$result_elem = array('id'=>$roomsElems[0], 'updated'=>$roomsElems[1], 'created'=>$roomsElems[2], 'name'=>$roomsElems[3], 'password'=>$roomsElems[4], 'ispublic'=>$roomsElems[5], 'ispermanent'=>$roomsElems[6]);
								$result[count($result)] = $result_elem;
							}
							elseif($columns=='id')
							{
								$result_elem = array('id'=>$roomsElems[0]);
								$result[count($result)] = $result_elem;
							}

						}
					}
				}

				return $result;
			}
			else
			{
				//IF rooms file not found,
				//RESTORING ROOMS in cache
				$this->saveRoomsInCache();
				return false;
			}
		}

		//checking if last messages is cached
		//input: params that passed in this->process(...)
		function messageIsCached( $queryParams )
		{
			//creating params array("param name"=>"param value", ...);
			$params = array('toconnid'=>$queryParams[0], 'touserid'=>$queryParams[1],
			        		'toroomid'=>$queryParams[2], 'id'=>$queryParams[3]);
			$stat_arr = array();
			$stats_file_name = $this->getCachFileName('Stats');
			/*
			if($stats_file_name == null)
			{
				$stat_value = $this->getRecordsCount("{$GLOBALS['fc_config']['db']['pref']}messages");
				//RESTORING message_stats file
				$this->saveStatsInCache("MESSAGES_COUNT", $stat_value);
				return false;
			}*/

			$stats_file = @fopen($stats_file_name, 'r');

			if( !$stats_file)
			{
			    $stat_value = $this->getRecordsCount($GLOBALS['fc_config']['db']['pref'].'messages');
				//RESTORING message_stats file
				$this->saveStatsInCache('MESSAGES_COUNT', $stat_value);
				return false;
			}

			while (!feof($stats_file))
			{
			    $stat = fgets($stats_file);
			    $stat_elems = explode('=', $stat);
				if($stat_elems[0] == 'MESSAGES_COUNT')
				{
					$stat_arr['MESSAGES_COUNT'] = $stat_elems[1];
				}
			}
			@fclose($stats_file);
			$params['id'] = (int) $params['id'];
			$stat_arr['MESSAGES_COUNT'] = (int) $stat_arr['MESSAGES_COUNT'];

			//checking all cached files if they have messages with id's: $params["id"] .. $stat_arr["COUNT"]
			// if only one ID not found in cach files(if database have spec. command with this id),
			// this function return's false and we select all messages from database.

			$cacheDir = $this->getCachDir();
			$cachePath = $cacheDir->path;
			$id_start = $params['id'];
			$id_end = $stat_arr['MESSAGES_COUNT'];
			$find_records = 0;
			$result = array();
			if((int) $id_start > (int) $id_end)
			{
				return $result;
			}

			while (false !== ($entry = $cacheDir->read()))
			{
				if(strpos($entry, 'messages_stats_')!==FALSE ||
				   strpos($entry, $GLOBALS['fc_config']['db']['pref'].'rooms_')!==FALSE ||
				   strpos($entry, '.')!==FALSE ||
				   strpos($entry, '..')!==FALSE ||
				   strpos($entry, 'configmain')!==FALSE ||
				   strpos($entry, 'configinst')!==FALSE ||
				   strpos($entry, 'bans')!==FALSE ||
				   strpos($entry, 'ignors')!==FALSE ||
				   strpos($entry, 'users')!==FALSE ||
				   strpos($entry, 'tables_id')!==FALSE ||
			       strpos($entry, $GLOBALS['fc_config']['db']['pref'].'connections_')!==FALSE)
				   continue;



				$entry_elems = explode('_', $entry);

				if($entry_elems[0] == 'pm')
				{
					$is_private = true;
					$userid = (int) $entry_elems[1];
					$touserid = (int) $entry_elems[2];
				}
				else
				{
					$is_private = false;
					$userid = $entry_elems[1];
					$toroomid = $entry_elems[0];
				}




				$cach_file = @file($cachePath.$entry, 'r');


				foreach($cach_file as $line_num => $line)
				{
					$line_elems = explode('#', $line);
					$id = (int) $line_elems[0];
					$created = $line_elems[1];
					$roomid = (int) $line_elems[2];

					if($id_start<=$id && $id<=$id_end)
					{
						$find_records++;
						if($is_private)
						{
							if($touserid != $params['touserid'])
								continue;
						}
						else
						{
							if($toroomid != $params['toroomid'])
								continue;
						}
						array_shift($line_elems);
						array_shift($line_elems);
						array_shift($line_elems);

						$line_elems[count($line_elems)-1] = substr($line_elems[count($line_elems)-1], 0, strlen($line_elems[count($line_elems)-1])-1);

						if($is_private)
							$result_elem = array('id'=>$id, 'created'=>$created, 'touserid'=>$touserid, 'command'=>'msg','userid'=>$userid, 'roomid'=>$roomid, 'txt'=>implode('#', $line_elems));
						else
							$result_elem = array('id'=>$id, 'created'=>$created, 'toroomid'=>$toroomid, 'command'=>'msg','userid'=>$userid, 'roomid'=>$roomid, 'txt'=>implode('#', $line_elems));
						$result[count($result)] = $result_elem;
					}
				}
			}

			//See explain at the top
			if( $stat_arr['COUNT']-$params['id']+1 == $find_records )
			{

				if( !function_exists('cmp') )
				{
					function cmp($elem1, $elem2)
					{
						if($elem1['id']<$elem2['id'])
							return -1;
						elseif($elem1['id']==$elem2['id'])
							return 0;
						elseif($elem1['id']>$elem2['id'])
							return 1;
					}
				}
				usort($result, 'cmp');

				return $result;
			}
			else
				return false;
		}

		//check if connections is cached
		function connectionsIsCached($columns, $condition, $queryParams)
		{
			$result = array();
			$connectionsFileName = $this->getCachFileName('Connections');
			if($connectionsFileName!=null)
			{
				$connections = file($connectionsFileName);
				for($i=0;$i<count($connections);$i++)
				{
					$connectionsElems = explode("\t", $connections[$i]);
					if($condition=='userid IS NOT NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND) AND ip <> ?')
					{
						$dateToSub = strtotime($connectionsElems[1]);//???
						$today = getdate();
						$subDate = $today[0]-(int)$queryParams[0];

						if($connectionsElems[3]!='NULL' && $dateToSub<$subDate && $connectionsElems[9]!=$queryParams[1])
						{
							if($columns=='ip')
							{
								$result_elem = array('id'=>$connectionsElems[0]);
								$result[count($result)] = $result_elem;
							}
							if($columns=='id')
							{
								$result_elem = array('id'=>$connectionsElems[0]);
								$result[count($result)] = $result_elem;
							}
						}
					}
				}
				return $result;
			}
			else
			{
				//RESTORING connections
				$params = array();
				$this->saveConnectionsInCache($params);
				return false;
			}
		}

		//queryParams: params, passed to this->process function
		function saveMessagesInCache($queryParams)
		{
			$cacheDir = $this->getCachDir();
			$cachePath = $cacheDir->path;
			if($this->queryStr=='DELETE FROM  '.$GLOBALS['fc_config']['db']['pref'].'messages WHERE created < DATE_SUB(NOW(),INTERVAL ? SECOND)')
			{
				$intervalSecond = (int)$queryParams[0];
				$deletedFiles = array();
				while (false !== ($entry = $cacheDir->read()))
				{
					if(
						strpos($entry, 'messages_stats')!==FALSE ||
						strpos($entry, $GLOBALS['fc_config']['db']['pref'].'rooms')!==FALSE ||
						strpos($entry, $GLOBALS['fc_config']['db']['pref'].'ignors')!==FALSE ||
						strpos($entry, $GLOBALS['fc_config']['db']['pref'].'connections')!==FALSE ||
						strpos($entry, '.htaccess')!==FALSE ||
						strpos($entry, 'index.htm')!==FALSE
					  )
						continue;
					//reading cache file
					$today = getdate(); //???
					$subDate = $today[0]-(int)$queryParams[0];

					$deletedRecords = array();
					$cachFile = file($cachePath.$entry);
					if(count($cachFile) == 0)
					{
						$deletedFiles[count($deletedFiles)] = $cachePath.$entry;
						continue;
					}
					//foreach ($cachFile as $line_num => $line)
					for($i=0; $i<count($cachFile); $i++)
					{
						$cachFileRecord = explode('#', $cachFile[$i]);
						$created = strtotime($cachFileRecord[1]);

						if($created < $subDate)
						{
							$deletedRecords[count($deletedRecords)] = $i;
						}
					}
					//deleting lines
					if(count($deletedRecords)>0)
						for($i=0; $i<count($deletedRecords); $i++)
						{
							unset($cachFile[$deletedRecords[$i]]);
						}
					if(count($cachFile) == 0)
					{
						$deletedFiles[count($deletedFiles)] = $cachePath.$entry;
						continue;
					}
					//write back
					$cachFileWrite = fopen($cachePath.$entry, 'w');
					for($i=0; $i<count($cachFile); $i++)
						fwrite($cachFileWrite, $cachFile[$i]);
					fclose($cachFileWrite);
				}
				if(count($deletedFiles)>0)
					for($i=0; $i<count($deletedFiles); $i++)
						unlink($deletedFiles[$i]);
			}
			else//if we INSERT new messages
			{
				$isPrivate = ($queryParams[2]!='');

				$id = mysql_insert_id($this->conn);
				$params = array('id'=>$id, 'touserid'=>$queryParams[2], 'toroomid'=>$queryParams[3], 'userid'=>$queryParams[5], 'roomid'=>$queryParams[6], 'txt'=>$queryParams[7]);

				if( $params['roomid']=='' )
					return;

				$today = date('Y-m-d G:i');
				$appended = false;

				while (false !== ($entry = $cacheDir->read()))
				{
				    //echo $entry."<br>\n";
					if((!$isPrivate)?(substr($entry, 0, strrpos($entry, '_')) == $params['toroomid'].'_'.$params['userid']):
                	          		 (substr($entry, 0, strrpos($entry, '_')) == 'pm_'.$params['userid'].'_'.$params['touserid']))
					{
						$file = @fopen($cachePath.$entry, 'a');
						@fwrite($file, $params['id'].'#'.$today.'#'.$params['roomid'].'#'.$params['txt']."\n");
						@fclose($file);
						$appended = true;
						break;
					}
				}
				if(!$appended)
				{
					$to_add = $GLOBALS['fc_config']['cacheFilePrefix'];

					if(!$isPrivate)
						$file = @fopen($cachePath.$params['toroomid'].'_'.$params['userid'].'_'.$to_add.'_1.txt', 'w');
					else
					{
						$file = @fopen($cachePath.'pm_'.$params['userid'].'_'.$params['touserid'].'_'.$to_add.'_1.txt', 'w');
					}

					@fwrite($file, $params['id'].'#'.$today.'#'.$params['roomid'].'#'.$params['txt']."\n");
					@fclose($file);
				}
				$cacheDir->close();
			}
		}
		function saveRoomUpdate()
		{
			$rooms_file_name = $this->getCachFileName('Rooms');
			$connections_file_name = $this->getCachFileName('Connections');

			$rooms_file = file($rooms_file_name);
			$connections_file = file($connections_file_name);
			$records_to_update = array();
			if($rooms_file!=FALSE && $connections_file!=FALSE)
			{
				for($i=0;$i<count($rooms_file);$i++)
				{
					$rooms_elem = explode("\t", $rooms_file[$i]);
					for($j=0;$j<count($connections_file);$j++)
					{
						$connections_elem = explode("\t", $connections_file[$j]);
						if($rooms_elem[0] == $connections_elem[4])
						{
							array_push($records_to_update, $i);
							break;
						}
					}
				}

				for($i=0; $i<count($records_to_update); $i++)
				{
					$rooms_elem = explode("\t", $rooms_file[$records_to_update[$i]]);
					$rooms_elem[1] = date('Y-m-d H:i:s');//some bug ???

					$rooms_file[$records_to_update[$i]] = implode("\t", $rooms_elem);
				}
				$file = fopen($rooms_file_name, 'w');
				for($i=0;$i<count($rooms_file);$i++)
				{
					fwrite($file, $rooms_file[$i]);
				}
				fclose($file);
			}
		}
		function saveRoomsInCache()
		{
			if($this->queryStr == 'UPDATE  '.$GLOBALS['fc_config']['db']['pref'].'rooms, '.$GLOBALS['fc_config']['db']['pref'].'connections SET  '.$GLOBALS['fc_config']['db']['pref'].'rooms.updated=NOW() WHERE  '.$GLOBALS['fc_config']['db']['pref'].'rooms.id =  '.$GLOBALS['fc_config']['db']['pref'].'connections.roomid')
			{

			}
			else
			{
				//RESTORING flashchat_rooms_ .. txt file
				if(($file_name = $this->getCachFileName('Rooms')) != null)
					$file = @fopen($file_name, 'w');
				else
				{
					$today = getdate();//???
					$cacheDir = $this->getCachDir();
					$cachePath = $cacheDir->path;
					$file = @fopen($cachePath.$GLOBALS['fc_config']['db']['pref'].'rooms_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt', 'w');
				}
				if(!$file) return;
				if($result = mysql_query('SELECT * FROM '.$GLOBALS['fc_config']['db']['pref'].'rooms', $this->conn))//$connection) )
					while($row = mysql_fetch_array($result))
						fwrite($file, $row['id']."\t".$row['updated']."\t".$row['created']."\t".$row['name']."\t".$row['password']."\t".$row['ispublic']."\t".($row['ispermanent']==NULL?'NULL':$row['ispermanent'])."\n");
				fclose($file);
			}
		}
		//update row connections
		function updateConn( $whot='*',$queryParams )//update file connection
		{
			$file_name = $this->getCachFileName('Connections');
			$handle = fopen($file_name, 'r');
			$params = $queryParams;
			$total = '';


			while (!feof($handle))
			{
    			$buffer = fgets($handle);

				if( trim($buffer)=='' )
					continue;

				$array = explode("\t",$buffer);
				$today = date('Y-m-d H:i:s');//

				if( $whot=='*' )
				{
					if( strpos($buffer,$params[8])!==false )
					{
						$total = $total.$params[8]."\t".$today."\t".$array[2]."\t".$params[0]."\t".$params[1]."\t".$params[2]."\t".$params[3]."\t".$params[4]."\t".$params[5]."\t".$params[6]."\t".$params[7]."\t1\t1\n";
					}
					else
						$total = $total.$buffer;
				}
			}

			@fclose($handle);
			if( $total!='')
			{
				$file = @fopen($file_name,'w');
				@fwrite($file , $total);
				@fclose($file);
			}
			return $params[8];

		}
		//queryParams: params, passed to this->process function
		function saveConnectionsInCache($queryParams)
		{
			$file_name = $this->getCachFileName('Connections');
			if(($file_name = $this->getCachFileName('Connections')) != null)
				$file = @file($file_name);
			else
			{
				$today = getdate();//???
				$file = array();
				$cacheDir = $this->getCachDir();
				$cachePath = $cacheDir->path;
				$file_name = $cachePath.$GLOBALS['fc_config']['db']['pref'].'connections_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt';
			}

			$fileRecordsCount = count($file);


			if($fileRecordsCount == 0 || strpos($this->queryStr, 'INSERT')!==FALSE )
			{
				//restoring connections
				$writeFile = @fopen($file_name, 'w');
				if($result = mysql_query('SELECT * FROM '.$GLOBALS['fc_config']['db']['pref'].'connections', $this->conn))//$connection) )
					while($row = mysql_fetch_array($result))
						@fwrite($writeFile, $row['id']."\t".$row['updated']."\t".$row['created']."\t".($row['userid']==NULL?'NULL':$row['userid'])."\t".$row['roomid']."\t".$row['state']."\t".$row['color']."\t".$row['start']."\t".$row['lang']."\t".$row['ip']."\t".$row['tzoffset']."\t".$row['chatid']."\t".$row['instance_id']."\n");
				fclose($writeFile);
				$this->saveRoomsInCache();
				return;
			}
			elseif($this->queryStr=='UPDATE '.$GLOBALS['fc_config']['db']['pref'].'connections SET updated=NOW() WHERE id=?')
			{
				for($i=0; $i<$fileRecordsCount; $i++)
				{
					$fileRecord = explode("\t", $file[$i]);

					if($fileRecord[0]==$queryParams[0])
					{
						$today = date('Y-m-d G:i:s');
						$fileRecord[1] = $today;
						$file[$i] = implode("\t", $fileRecord);
						break;
					}
				}
			}
			elseif(strpos($this->queryStr, 'DELETE')!==FALSE)
			{
				$fileRecordsCount = count($file);

				$deletedElements = array();
				for($i=0; $i<$fileRecordsCount; $i++)
				{
					$fileRecord = explode("\t", $file[$i]);
					if($this->queryStr=='DELETE FROM  '.$GLOBALS['fc_config']['db']['pref'].'connections WHERE id = ?')
					{
						if($fileRecord[0] == $queryParams[0])
						{
							unset($file[$i]);
							break;
						}
					}
					elseif($this->queryStr=='DELETE FROM '.$GLOBALS['fc_config']['db']['pref'].'connections WHERE updated < DATE_SUB(NOW(),INTERVAL ? SECOND)')
					{
						$dateToSub = strtotime($fileRecord[1]);
						$today = getdate();//???
						$subDate = $today[0]-(int)$queryParams[0];
						if($dateToSub<$subDate)
							array_push($deletedElements, $i);
					}
				}
				for($i=0; $i<count($deletedElements); $i++)
				{
					unset($file[$deletedElements[$i]]);
				}
			}

			$writeFile = @fopen($file_name, 'w');
			for($i=0; $i<count($file); $i++)
			{
				@fwrite($writeFile, $file[$i]);
			}
			@fclose($writeFile);
		}

		function saveStatsInCache($stat_name, $stat_value)
		{
			$fileName = $this->getCachFileName('Stats');

			if($fileName!=null)
			{
				$file = @fopen($fileName, 'r');
				$file_created = false;
			}
			else
			{
				$today = getdate();
				$cacheDir = $this->getCachDir();
				$cachePath = $cacheDir->path;
				$fileName = $cachePath.$GLOBALS['fc_config']['db']['pref'].'messages_stats_'.$GLOBALS['fc_config']['cacheFilePrefix'].'.txt';
				$file = @fopen($fileName, 'w');
				$file_created = true;
			}
			if(!$file) return;
			//$lines = file($fileName);
			$replaced = false;
			$newLines = array();
			if(!$file_created)
			while(!feof($file))
			{
				$line = fgets($file);
				if($line=='')
					continue;

				$lineElems = explode('=', $line);
				if($lineElems[0] == $stat_name)
				{
					array_push($newLines, $lineElems[0].'='.$stat_value."\n");
					$replaced = true;
				}
				else
					array_push($newLines, $lineElems[0].'='.$lineElems[1]);
			}
			fclose($file);
			if(!$replaced)
				array_push($newLines, $stat_name.'='.$stat_value."\n");

			$file = @fopen($fileName, 'w');
			if($file)
			{
				for($i=0; $i<count($newLines); $i++)
					@fwrite($file, $newLines[$i]);
				@fclose($file);
			}
		}

		function readFromDB( $queryParams )
		{
			$params = $queryParams;
			$fc_conf = $GLOBALS['fc_config'];
			if( !isset($fc_conf['db_conn']) )
			{
				$fc_conf['db_conn'] = mysql_connect($fc_conf['db']['host'], $fc_conf['db']['user'], $fc_conf['db']['pass']);
			}
			$this->conn = $fc_conf['db_conn'];
			if( $this->conn )
			{
				if(mysql_select_db($fc_conf['db']['base'], $this->conn)) {
					$queryStr = '';
					for($i = 0; $i < sizeof($this->queryArray) - 1; $i++)
					{
						$val = '';
						switch(gettype($params[$i]))
						{
							case 'object': $val = "'" . mysql_escape_string($params[$i]->toString()) . "'"; break;
							case 'array': $val = "'" . mysql_escape_string(join(',', $params[$i])) . "'"; break;
							case 'boolean': $val = ($params[$i])?-1:0; break;
							case 'NULL': $val = 'NULL'; break;
							default:
								if($params[$i][0] == "'" && $params[$i][strlen($params[$i]) - 1] == "'")
								{
									$params[$i] = substr($params[$i], 1, -1);
								}
								$val = "'" . mysql_escape_string($params[$i]) . "'";
							break;
						}

						$queryStr .= $this->queryArray[$i].$val;
					}
					$queryStr .= $this->queryArray[$i];
//echo $queryStr . '<br/>';

					if($result = mysql_query($queryStr, $this->conn))
					{
						switch($this->type)
						{
							case STATEMENT_SELECT: return new ResultSet($result);
							case STATEMENT_INSERT:
							    $insert_id = mysql_insert_id($this->conn);
								if(strpos($queryStr, 'INSERT INTO '.$fc_conf['db']['pref'].'messages')!==FALSE)
								{
								   if(strcmp($params[4], 'msg') == 0)// && "{$queryParams[3]}"!="")
								   {
								   		$this->saveMessagesInCache($queryParams);
								   }
								   $stat_value = $insert_id;//$this->getRecordsCount("{$GLOBALS['fc_config']['db']['pref']}messages");
								   $this->saveStatsInCache('MESSAGES_COUNT', $stat_value);
								}
								elseif(strpos($queryStr, $fc_conf['db']['pref'].'rooms')!==FALSE)
								{
									$this->saveRoomsInCache();
								}
								elseif(strpos($queryStr, $fc_conf['db']['pref'].'connections')!==FALSE)
								{
									$this->saveConnectionsInCache($queryParams);
								}

								return $insert_id;
							case STATEMENT_UPDATE:
								$affected_rows = mysql_affected_rows($this->conn);
								if($this->queryStr=='UPDATE '.$fc_conf['db']['pref'].'connections SET updated=NOW(), userid=?, roomid=?, color=?, state=?, start=?, lang=?, ip=?, tzoffset=? WHERE id=?')
								{
									$this->updateConn('*',$queryParams);
								}
								elseif(strpos($this->queryStr, $fc_conf['db']['pref'].'connections')!==FALSE)
								{
									if(strpos($this->queryStr, 'UPDATE '.$fc_conf['db']['pref'].'rooms,'.$GLOBALS['fc_config']['db']['pref'].'connections SET')!==FALSE)
									{
										$this->saveRoomUpdate();
									}
									else
										$this->saveConnectionsInCache($queryParams);
								}
								elseif(strpos($this->queryStr, $fc_conf['db']['pref'].'rooms')!==FALSE)
								{
									$this->saveRoomsInCache();
								}

								return $affected_rows;
							case STATEMENT_DELETE:
								$affected_rows = mysql_affected_rows($this->conn);

								if(strpos($this->queryStr, $fc_conf['db']['pref'].'messages')!==FALSE)
								{
									$this->saveMessagesInCache($queryParams);
								}
								elseif(strpos($this->queryStr, $fc_conf['db']['pref'].'connections')!==FALSE)
								{
									$this->saveConnectionsInCache($queryParams);
								}
								elseif(strpos($this->queryStr, $fc_conf['db']['pref'].'rooms')!==FALSE)
								{
									$this->saveRoomsInCache();
								}
								return $affected_rows;
							default:
								$affected_rows = mysql_affected_rows($this->conn);
								//return true;
								return $affected_rows;
						}
					}
				}
			}
			return true;
		}

		function process(/*...*/)
		{
			if(func_num_args() > 0)
			{
				$params = func_get_args();
			} else
			{
				$params = array();
			}

			$GLOBALS['query_count']++;
			if(strpos($this->queryStr, 'SELECT')!==FALSE)
			{
				$GLOBALS['select_count']++;
			}
			else
			{
			}

			//if we select messages
			if(strpos($this->queryStr, 'SELECT '.$GLOBALS['fc_config']['db']['pref'].'messages.*')!==FALSE)
			{
				if( strpos( $this->queryStr,'msg')!==false )
				{
					if( ($rows=$this->messageIsCached($params)) !== false)
					{
						return new CachedResultSet($rows);
					}
					else
					{
						return $this->readFromDB($params);
					}
				}
				else
					return $this->readFromDB($params);
			}
			elseif($this->queryStr == 'SELECT * '.$GLOBALS['fc_config']['db']['pref'].'rooms')
			{
				if( ($rows=$this->roomsIsCached('*', '', $params)) !== false)
				{
					return new CachedResultSet($rows);
				}
				else
				{
					return $this->readFromDB($params);
				}
			}
			elseif($this->queryStr == 'SELECT id FROM '.$GLOBALS['fc_config']['db']['pref'].'rooms WHERE ispermanent IS NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND)')
			{
				if( ($rows=$this->roomsIsCached('id', 'ispermanent IS NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND)', $params)) !== false)
				{
					return new CachedResultSet($rows);
				}
				else
				{
					return $this->readFromDB($params);
				}
			}
			elseif($this->queryStr == 'SELECT * FROM '.$GLOBALS['fc_config']['db']['pref'].'rooms WHERE id=?')
			{
				if( ($rows=$this->roomsIsCached('*', 'id=?', $params)) !== false)
				{
					return new CachedResultSet($rows);
				}
				else
				{
					return $this->readFromDB($params);
				}
			}
			elseif($this->queryStr == 'SELECT id FROM '.$GLOBALS['fc_config']['db']['pref'].'connections WHERE userid IS NOT NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND) AND ip <> ?')
			{
				if( ($rows=$this->connectionsIsCached('id', 'userid IS NOT NULL AND updated < DATE_SUB(NOW(),INTERVAL ? SECOND) AND ip <> ?', $params)) !== false)
				{
					return new CachedResultSet($rows);
				}
				else
				{
					return $this->readFromDB($params);
				}
			}
			else
			{
				return $this->readFromDB($params);
			}

			/*
				If "insert", then connect insert new data into
				database, and save result in cache.

				If "select", then check to see if cached data
				is present. If yes, get cached data. If not,
				then get data from database.
			*/
		}
	}

	class CachedResultSet
	{
		var $result;
		var $numRows = 0;
		var $currRow = 0;

		function CachedResultSet( $result = null )
		{
			$GLOBALS['cached_select_count']++;
			$this->result = $result;

			if ( $result )
			{
				// determine $this->numRows from cached result
				$this->numRows = count($result);
			}
		}

		function hasNext()
		{
			return ($this->result && $this->numRows > $this->currRow);
		}

		function next()
		{
			if($this->hasNext())
			{
				$this->currRow++;
				// return cached result?
				return $this->result[$this->currRow-1];
			} else {
				return null;
			}
		}
	}

	class ResultSet {
		var $result;
		var $numRows = 0;
		var $currRow = 0;

		function ResultSet($result = null)
		{
			$this->result = $result;
			if($result) $this->numRows = mysql_num_rows($result);
		}

		function hasNext()
		{
			return ($this->result && $this->numRows > $this->currRow);
		}

		function next()
		{
			if($this->hasNext())
			{
				$this->currRow++;
				return mysql_fetch_assoc($this->result);
			}
			else
			{
				return null;
			}
		}
	}
?>

./BlackJoker Mini Shell 1.0