xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / inc / state.inc.php (7ec42548e6adaa2513f9dd406113a84ea945b87c) (2,782B) (mode 100644) [raw]
<?php
require_once($INC . "/sql.inc.php");
require_once($INC . "/cache.inc.php");
require_once($INC . "/prof.inc.php");

$rg_state_error = "";

if (!isset($rg_state_debug))
	$rg_state_debug = FALSE;

function rg_state_set_error($str)
{
	global $rg_state_error;
	$rg_state_error = $str;
	rg_log($str);
}

function rg_state_error()
{
	global $rg_state_error;
	return $rg_state_error;
}

/*
 * Get state
 * Returns FALSE on error
 */
function rg_state_get($db, $var)
{
	global $rg_state_debug;

	rg_prof_start('state_get');
	if ($rg_state_debug)
		rg_log_enter('state_get: var=' . $var);

	$ret = FALSE;
	while (1) {
		// Try cache first
		$r = rg_cache_get('state::' . $var);
		if ($r !== FALSE) {
			$ret = $r;
			break;
		}

		// So, we get an error from the cache daemon.
		// The only way is to go to database directly.

		// Let's see if the 'state' table is present
		$r = rg_sql_rel_exists($db, 'state');
		if ($r === FALSE)
			break;
		if ($r === 0) {
			$ret = '';
			break;
		}

		$sql = 'SELECT * FROM state';
		$res = rg_sql_query($db, $sql);
		if ($res === FALSE) {
			rg_state_set_error(rg_sql_error());
			break;
		}

		$rows = rg_sql_num_rows($res);
		if ($rows == 0) {
			$ret = '';
		} else {
			$rows = array();
			while (($row = rg_sql_fetch_array($res))) {
				$v = $row['var'];
				$rows[$v] = $row['value'];
			}
			rg_cache_set('state', $rows, RG_SOCKET_NO_WAIT);

			if (isset($rows[$var]))
				$ret = $rows[$var];
			else
				$ret = '';
		}
		rg_sql_free_result($res);
		break;
	}

	if ($rg_state_debug)
		rg_log_exit();
	rg_prof_end('state_get');
	return $ret;
}

/*
 * Return a state as uint
 */
function rg_state_get_uint($db, $var)
{
	$r = rg_state_get($db, $var);
	if ($r === FALSE)
		return FALSE;

	if (empty($r))
		return 0;

	return intval($r);
}

/*
 * Set state
 */
function rg_state_set($db, $var, $value)
{
	global $rg_state_debug;

	rg_prof_start("state_set");
	if ($rg_state_debug)
		rg_log_enter("state_set: $var = $value");

	$ret = FALSE;
	while (1) {
		$params = array('var' => $var, 'value' => $value);
		$sql = 'UPDATE state SET value = @@value@@'
			. ' WHERE var = @@var@@';
		$res = rg_sql_query_params($db, $sql, $params);
		if ($res === FALSE) {
			rg_state_set_error('cannot update var');
			break;
		}
		$rows = rg_sql_affected_rows($res);
		rg_sql_free_result($res);

		if ($rows == 0) {
			$sql = 'INSERT INTO state (var, value)'
				. ' VALUES (@@var@@, @@value@@)';
			$res = rg_sql_query_params($db, $sql, $params);
			if ($res === FALSE) {
				rg_state_set_error('cannot insert into state table');
				break;
			}
			rg_sql_free_result($res);
		}

		rg_cache_set("state::" . $var, $value, RG_SOCKET_NO_WAIT);

		$ret = TRUE;
		break;
	}

	if ($rg_state_debug)
		rg_log_exit();
	rg_prof_end("state_set");
	return $ret;
}

?>
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master