diff --git a/webapp/models/DynData.php b/webapp/models/DynData.php index 730ed4c..1071299 100644 --- a/webapp/models/DynData.php +++ b/webapp/models/DynData.php @@ -7,26 +7,111 @@ use phpcommon\SqlHelper; class DynData extends BaseModel { + public static function preload() + { + if (!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] = $row['val']; + } + } + } + public static function getV($x, $y, $defVal = 0) { - + $key = self::calcKey($x, $y); + if (self::$dynData) { + return getXVal(self::$dynData, $key, $defVal); + } else { + ++self::$hitCount; + if (self::$hitCount > 5) { + 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 $row ? $row['val'] : $defVal; + } + } } 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 calcKey($x, $y) + { + $key = self::calcKey($x, $y); + } + + 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() + ) + ); } private static $dynData = null; + private static $hitCount = 0; }