_getSelfMysql(), 't_event_ranking', array( 'account_id' => myself()->_getAccountId(), ) ); if ($rows){ foreach ($rows as $row) { $sum += $row['value']; } } return $sum; } public static function preload() { if (is_null(self::$dynData)) { self::$dynData = array(); $rows = SqlHelper::ormSelect( myself()->_getSelfMysql(), 't_event_ranking', array( 'account_id' => myself()->_getAccountId(), ) ); foreach ($rows as $row) { $key = self::calcKey($row['x'], $row['y']); self::$dynData[$key] = array( 'value' => $row['value'], 'modifytime' => $row['modifytime'], ); } } } public static function getV($x, $y, $defVal = 0) { $valData = self::internalGetV($x, $y, $defVal); return $valData['value']; } public static function setV($accountId,$x, $y, $defVal) { $key = self::calcKey($x, $y); self::internalSetV($accountId,$x, $y, $defVal); } public static function calcKey($x, $y) { $low32 = (int)$x; $high32 = (int)$y; $key = $low32 + ($high32 << 32); return $key; } private static function internalSetV($accountId,$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_event_ranking', array( 'account_id' => $accountId, 'wave' => $x, 'type' => $y ), array( 'value' => $val, 'modifytime' => myself()->_getNowTime() ), array( 'account_id' => $accountId, 'wave' => $x, 'type' => $y, 'value' => $val, 'createtime' => myself()->_getNowTime(), 'modifytime' => myself()->_getNowTime() ) ); if (self::$dynData) { self::$dynData[$key] = array( 'value' => $val, 'modifytime' => myself()->_getNowTime(), ); } } private static function internalGetV($x, $y, $defVal = 0) { $key = self::calcKey($x, $y); if (!is_null(self::$dynData)) { if (isset(self::$dynData[$key])) { return self::$dynData[$key]; } else { return array( 'value' => $defVal, 'modifytime' => myself()->_getNowTime() ); } } else { ++self::$hitCount; if (self::$hitCount > 5 && is_null(self::$dynData)) { self::preload(); return self::internalGetV($x, $y, $defVal); } else { $row = SqlHelper::ormSelectOne( myself()->_getSelfMysql(), 't_event_ranking', array( 'account_id' => myself()->_getAccountId(), 'wave' => $x, 'type' => $y, ) ); return array( 'value' => $row ? $row['value'] : $defVal, 'modifytime' => $row ? $row['modifytime'] : myself()->_getNowTime(), ); } } } private static $dynData = null; private static $hitCount = 0; }