game2005api/webapp/models/DynData.php
aozhiwei a9da94e47c 1
2021-12-23 10:44:09 +08:00

198 lines
5.3 KiB
PHP

<?php
namespace models;
use mt;
use phpcommon\SqlHelper;
class DynData extends BaseModel {
public static function preload()
{
if (is_null(self::$dynData)) {
self::$dynData = array();
$rows = SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_dyndata',
array(
'account_id' => myself()->_getAccountId(),
)
);
foreach ($rows as $row) {
$key = self::calcKey($row['x'], $row['y']);
self::$dynData[$key] = array(
'val' => $row['val'],
'modifytime' => $row['modifytime'],
);
}
}
}
public static function getV($x, $y, $defVal = 0)
{
$valData = self::internalGetV($x, $y, $defVal);
return $valData['val'];
}
public static function setV($x, $y, $defVal)
{
$key = self::calcKey($x, $y);
self::internalSetV($x, $y, $defVal);
}
public static function incV($x, $y, $val)
{
$key = self::calcKey($x, $y);
$oldVal = self::getV($x, $y);
self::internalSetV($x, $y, $oldVal + $val);
}
public static function decV($x, $y, $val)
{
self::incV($x, $y, 0 - $val);
}
public static function getDailyV($x, $y, $defVal = 0)
{
$valData = self::internalGetV($x, $y, $defVal);
if (myself()->_getDaySeconds($valData['modifytime']) < myself()->_getNowDaySeconds()) {
$valData['val'] = $defVal;
}
return $valData['val'];
}
public static function setDailyV($x, $y, $val)
{
self::setV($x, $y, $val);
}
public static function incDailyV($x, $y, $val)
{
$key = self::calcKey($x, $y);
$oldVal = self::getDailyV($x, $y);
self::internalSetV($x, $y, $oldVal + $val);
}
public static function decDailyV($x, $y, $val)
{
self::incDailyV($x, $y, 0 - $val);
}
public static function getWeeklyV($x, $y, $defVal = 0)
{
$valData = self::internalGetV($x, $y, $defVal);
if (myself()->_getDaySeconds($valData['modifytime']) < myself()->_getMondaySeconds()) {
$valData['val'] = $defVal;
}
return $valData['val'];
}
public static function setWeeklyV($x, $y, $val)
{
self::setV($x, $y, $val);
}
public static function incWeeklyV($x, $y, $val)
{
$key = self::calcKey($x, $y);
$oldVal = self::getWeeklyV($x, $y);
self::internalSetV($x, $y, $oldVal + $val);
}
public static function decWeeklyV($x, $y, $val)
{
self::incWeeklyV($x, $y, 0 - $val);
}
public static function calcKey($x, $y)
{
$low32 = (int)$x;
$high32 = (int)$y;
$key = $low32 + ($high32 << 32);
return $key;
}
private static function internalSetV($x, $y, $val)
{
if (!is_int($x) || !is_int($y)) {
die('internalSet type error');
return;
}
if (abs($x) > 0xFFFFFFFF) {
die('internalSet x error');
return;
}
if (abs($y) > 0xFFFFFFFF) {
die('internalSet y error');
return;
}
$key = self::calcKey($x, $y);
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_dyndata',
array(
'account_id' => myself()->_getAccountId(),
'x' => $x,
'y' => $y
),
array(
'val' => $val,
'modifytime' => myself()->_getNowTime()
),
array(
'account_id' => myself()->_getAccountId(),
'x' => $x,
'y' => $y,
'val' => $val,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)
);
if (self::$dynData) {
self::$dynData[$key] = array(
'val' => $val,
'modifytime' => myself()->_getNowTime(),
);
}
}
private static function internalGetV($x, $y, $defVal = 0)
{
$key = self::calcKey($x, $y);
if (self::$dynData) {
if (isset(self::$dynData[$key])) {
return self::$dynData[$key];
} else {
return array(
'val' => $defVal,
'modifytime' => myself()->_getNowTime()
);
}
} else {
++self::$hitCount;
if (self::$hitCount > 5 && is_null(self::$dynData)) {
self::preload();
return self::getV($x, $y, $defVal);
} else {
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_dyndata',
array(
'account_id' => myself()->_getAccountId(),
'x' => $x,
'y' => $y,
)
);
return array(
'val' => $row ? $row['val'] : $defVal,
'modifytime' => $row ? $row['modifytime'] : myself()->_getNowTime(),
);
}
}
}
private static $dynData = null;
private static $hitCount = 0;
}