⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodb-session.php

📁 eGroupWare is a multi-user, web-based groupware suite developed on a custom set of PHP-based APIs. C
💻 PHP
📖 第 1 页 / 共 2 页
字号:
	/////////////////////
	// public methods
	/////////////////////

	/*!
		Create the connection to the database.

		If $conn already exists, reuse that connection
	*/
	function open($save_path, $session_name, $persist = null) {
		$conn =& ADODB_Session::_conn();

		if ($conn) {
			return true;
		}

		$database	= ADODB_Session::database();
		$debug		= ADODB_Session::debug();
		$driver		= ADODB_Session::driver();
		$host		= ADODB_Session::host();
		$password	= ADODB_Session::password();
		$user		= ADODB_Session::user();

		if (!is_null($persist)) {
			$persist = (bool) $persist;
			ADODB_Session::persist($persist);
		} else {
			$persist = ADODB_Session::persist();
		}

# these can all be defaulted to in php.ini
#		assert('$database');
#		assert('$driver');
#		assert('$host');

		// cannot use =& below - do not know why...
		$conn = ADONewConnection($driver);

		if ($debug) {
			$conn->debug = true;
//			ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database ");
		}

		if ($persist) {
			$ok = $conn->PConnect($host, $user, $password, $database);
		} else {
			$ok = $conn->Connect($host, $user, $password, $database);
		}

		if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
		else
			ADOConnection::outp('<p>Session: connection failed</p>', false);
		

		return $ok;
	}

	/*!
		Close the connection
	*/
	function close() {
		$conn =& ADODB_Session::_conn();

		if ($conn) {
			$conn->Close();
		}

		return true;
	}

	/*
		Slurp in the session variables and return the serialized string
	*/
	function read($key) {
		$conn	=& ADODB_Session::_conn();
		$data	= ADODB_Session::dataFieldName();
		$filter	= ADODB_Session::filter();
		$table	= ADODB_Session::table();

		if (!$conn) {
			return '';
		}

		assert('$table');

		$qkey = $conn->quote($key);
		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';

		$sql = "SELECT $data FROM $table WHERE $binary sesskey = $qkey AND expiry >= " . time();
		$rs =& $conn->Execute($sql);
		//ADODB_Session::_dumprs($rs);
		if ($rs) {
			if ($rs->EOF) {
				$v = '';
			} else {
				$v = reset($rs->fields);
				$filter = array_reverse($filter);
				foreach ($filter as $f) {
					if (is_object($f)) {
						$v = $f->read($v, ADODB_Session::_sessionKey());
					}
				}
				$v = rawurldecode($v);
			}

			$rs->Close();

			ADODB_Session::_crc(strlen($v) . crc32($v));
			return $v;
		}

		return '';
	}

	/*!
		Write the serialized data to a database.

		If the data has not been modified since the last read(), we do not write.
	*/
	function write($key, $val) {
		$clob			= ADODB_Session::clob();
		$conn			=& ADODB_Session::_conn();
		$crc			= ADODB_Session::_crc();
		$data			= ADODB_Session::dataFieldName();
		$debug			= ADODB_Session::debug();
		$driver			= ADODB_Session::driver();
		$expire_notify	= ADODB_Session::expireNotify();
		$filter			= ADODB_Session::filter();
		$lifetime		= ADODB_Session::lifetime();
		$table			= ADODB_Session::table();

		if (!$conn) {
			return false;
		}

		assert('$table');

		$expiry = time() + $lifetime;

		$qkey = $conn->quote($key);
		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';

		// crc32 optimization since adodb 2.1
		// now we only update expiry date, thx to sebastian thom in adodb 2.32
		if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
			if ($debug) {
				echo '<p>Session: Only updating date - crc32 not changed</p>';
			}
			$sql = "UPDATE $table SET expiry = $expiry WHERE $binary sesskey = $qkey AND expiry >= " . time();
			$rs =& $conn->Execute($sql);
			ADODB_Session::_dumprs($rs);
			if ($rs) {
				$rs->Close();
			}
			return true;
		}
		$val = rawurlencode($val);
		foreach ($filter as $f) {
			if (is_object($f)) {
				$val = $f->write($val, ADODB_Session::_sessionKey());
			}
		}

		$arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => '');
		if ($expire_notify) {
			$var = reset($expire_notify);
			global $$var;
			if (isset($$var)) {
				$arr['expireref'] = $$var;
			}
		}

		if (!$clob) {	// no lobs, simply use replace()
			$arr[$data] = $conn->qstr($val);
			$rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true);
			ADODB_Session::_dumprs($rs);
		} else {
			// what value shall we insert/update for lob row?
			switch ($driver) {
				// empty_clob or empty_lob for oracle dbs
				case 'oracle':
				case 'oci8':
				case 'oci8po':
				case 'oci805':
					$lob_value = sprintf('empty_%s()', strtolower($clob));
					break;

				// null for all other
				default:
					$lob_value = 'null';
					break;
			}

			// do we insert or update? => as for sesskey
			$rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey");
			ADODB_Session::_dumprs($rs);
			if ($rs && reset($rs->fields) > 0) {
				$sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value WHERE  sesskey = $qkey";
			} else {
				$sql = "INSERT INTO $table (expiry, $data, sesskey) VALUES ($expiry, $lob_value, $qkey)";
			}
			if ($rs) {
				$rs->Close();
			}

			$err = '';
			$rs1 =& $conn->Execute($sql);
			ADODB_Session::_dumprs($rs1);
			if (!$rs1) {
				$err = $conn->ErrorMsg()."\n";
			}
			$rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob));
			ADODB_Session::_dumprs($rs2);
			if (!$rs2) {
				$err .= $conn->ErrorMsg()."\n";
			}
			$rs = ($rs && $rs2) ? true : false;
			if ($rs1) {
				$rs1->Close();
			}
			if (is_object($rs2)) {
				$rs2->Close();
			}
		}

		if (!$rs) {
			ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
			return false;
		}  else {
			// bug in access driver (could be odbc?) means that info is not committed
			// properly unless select statement executed in Win2000
			if ($conn->databaseType == 'access') {
				$sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
				$rs =& $conn->Execute($sql);
				ADODB_Session::_dumprs($rs);
				if ($rs) {
					$rs->Close();
				}
			}
		}
		return $rs ? true : false;
	}

	/*!
	*/
	function destroy($key) {
		$conn			=& ADODB_Session::_conn();
		$table			= ADODB_Session::table();
		$expire_notify	= ADODB_Session::expireNotify();

		if (!$conn) {
			return false;
		}

		assert('$table');

		$qkey = $conn->quote($key);
		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';

		if ($expire_notify) {
			reset($expire_notify);
			$fn = next($expire_notify);
			$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
			$sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
			$rs =& $conn->Execute($sql);
			ADODB_Session::_dumprs($rs);
			$conn->SetFetchMode($savem);
			if (!$rs) {
				return false;
			}
			if (!$rs->EOF) {
				$ref = $rs->fields[0];
				$key = $rs->fields[1];
				//assert('$ref');
				//assert('$key');
				$fn($ref, $key);
			}
			$rs->Close();
		}

		$sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
		$rs =& $conn->Execute($sql);
		ADODB_Session::_dumprs($rs);
		if ($rs) {
			$rs->Close();
		}

		return $rs ? true : false;
	}

	/*!
	*/
	function gc($maxlifetime) {
		$conn			=& ADODB_Session::_conn();
		$debug			= ADODB_Session::debug();
		$expire_notify	= ADODB_Session::expireNotify();
		$optimize		= ADODB_Session::optimize();
		$sync_seconds	= ADODB_Session::syncSeconds();
		$table			= ADODB_Session::table();

		if (!$conn) {
			return false;
		}

		assert('$table');

		$time			= time();

		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';

		if ($expire_notify) {
			reset($expire_notify);
			$fn = next($expire_notify);
			$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
			$sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
			$rs =& $conn->Execute($sql);
			ADODB_Session::_dumprs($rs);
			$conn->SetFetchMode($savem);
			if ($rs) {
				$conn->BeginTrans();
				$keys = array();
				while (!$rs->EOF) {
					$ref = $rs->fields[0];
					$key = $rs->fields[1];
					$fn($ref, $key);
					$del = $conn->Execute("DELETE FROM $table WHERE sesskey='$key'");
					$rs->MoveNext();
				}
				$rs->Close();
				
				$conn->CommitTrans();
			}
		} else {
			$sql = "DELETE FROM $table WHERE expiry < $time";
			$rs =& $conn->Execute($sql);
			ADODB_Session::_dumprs($rs);
			if ($rs) {
				$rs->Close();
			}
			if ($debug) {
				ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
			}
		}

		// suggested by Cameron, "GaM3R" <gamr@outworld.cx>
		if ($optimize) {
			$driver = ADODB_Session::driver();

			if (preg_match('/mysql/i', $driver)) {
				$sql = "OPTIMIZE TABLE $table";
			}
			if (preg_match('/postgres/i', $driver)) {
				$sql = "VACUUM $table";
			}
			if (!empty($sql)) {
				$conn->Execute($sql);
			}
		}

		if ($sync_seconds) {
			$sql = 'SELECT ';
			if ($conn->dataProvider === 'oci8') {
				$sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')";
			} else {
				$sql .= $conn->sysTimeStamp;
			}
			$sql .= " FROM $table";

			$rs =& $conn->SelectLimit($sql, 1);
			if ($rs && !$rs->EOF) {
				$dbts = reset($rs->fields);
				$rs->Close();
				$dbt = $conn->UnixTimeStamp($dbts);
				$t = time();

				if (abs($dbt - $t) >= $sync_seconds) {
					global $HTTP_SERVER_VARS;
					$msg = __FILE__ .
						": Server time for webserver {$HTTP_SERVER_VARS['HTTP_HOST']} not in synch with database: " .
						" database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 3600) . ' hours)';
					error_log($msg);
					if ($debug) {
						ADOConnection::outp("<p>$msg</p>");
					}
				}
			}
		}

		return true;
	}

}

ADODB_Session::_init();


// for backwards compatability only
function adodb_sess_open($save_path, $session_name, $persist = true) {
	return ADODB_Session::open($save_path, $session_name, $persist);
}

// for backwards compatability only
function adodb_sess_gc($t)
{	
	return ADODB_Session::gc($t);
}

?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -