<?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;
}
?>
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