From 5b4a15454c1486d739a10dbc3201eae303bf6458 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 14:26:10 -0800 Subject: [PATCH 01/13] [Optimize] SQL Queries : Remove joins from account table --- public/include/classes/statistics.class.php | 172 +++++++++----------- 1 file changed, 77 insertions(+), 95 deletions(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index 327614d9..cddb7ca7 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -316,7 +316,7 @@ class Statistics extends Base { SELECT ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid, - u.id AS id, + id, u.donate_percent AS donate_percent, u.is_anonymous AS is_anonymous, u.username AS username @@ -350,10 +350,10 @@ class Statistics extends Base { /** * Get amount of shares for a specific user - * @param account_id int User ID + * @param username str username * @return data array invalid and valid share counts **/ - public function getUserShares($account_id) { + public function getUserShares($username) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_SHARES)) { @@ -362,19 +362,17 @@ class Statistics extends Base { // We have no cached value, we return defaults return array('valid' => 0, 'invalid' => 0, 'donate_percent' => 0, 'is_anonymous' => 0); } - if ($data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid - FROM " . $this->share->getTableName() . " AS s, - " . $this->user->getTableName() . " AS u + FROM " . $this->share->getTableName() . " WHERE - u.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND UNIX_TIMESTAMP(s.time) >IFNULL((SELECT MAX(b.time) FROM " . $this->block->getTableName() . " AS b),0) - AND u.id = ?"); - if ($stmt && $stmt->bind_param("i", $account_id) && $stmt->execute() && $result = $stmt->get_result()) - return $this->memcache->setCache(__FUNCTION__ . $account_id, $result->fetch_assoc()); + username = '?.%' + AND UNIX_TIMESTAMP(time) >IFNULL((SELECT MAX(b.time) FROM " . $this->block->getTableName() . " AS b),0)"); + if ($stmt && $stmt->bind_param("i", $username) && $stmt->execute() && $result = $stmt->get_result()) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_assoc()); return $this->sqlError(); } @@ -495,10 +493,10 @@ class Statistics extends Base { /** * Fetch total user hashrate based on shares and archived shares - * @param account_id integer User ID + * @param $username string username * @return data integer Current Hashrate in khash/s **/ - public function getUserHashrate($account_id, $interval=600) { + public function getUserHashrate($username, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -507,60 +505,54 @@ class Statistics extends Base { // We have no cached value, we return defaults return 0; } - if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT IFNULL(IF(our_result='Y', ROUND(SUM(IF(difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), difficulty)) * POW(2, " . $this->config['target_bits'] . ") / ? / 1000), 0), 0) AS hashrate FROM ( SELECT - s.id, s.our_result, IF(s.difficulty = 0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty) AS difficulty + id, our_result, IF(s.difficulty = 0, POW(2, (" . $this->config['difficulty'] . " - 16)), difficulty) AS difficulty FROM - shares AS s, - accounts AS u - WHERE u.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND s.our_result = 'Y' - AND u.id = ? + shares + WHERE username = '?.%' + AND time > DATE_SUB(now(), INTERVAL ? SECOND) + AND our_result = 'Y' UNION SELECT - s.share_id, s.our_result, IF(s.difficulty = 0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty) AS difficulty + share_id, our_result, IF(s.difficulty = 0, POW(2, (" . $this->config['difficulty'] . " - 16)), difficulty) AS difficulty FROM - shares_archive AS s, - accounts AS u - WHERE u.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND s.our_result = 'Y' - AND u.id = ? + shares_archive + WHERE username = '?.%' + AND time > DATE_SUB(now(), INTERVAL ? SECOND) + AND our_result = 'Y' ) AS temp"); - if ($this->checkStmt($stmt) && $stmt->bind_param("iiiii", $interval, $interval, $account_id, $interval, $account_id) && $stmt->execute() && $result = $stmt->get_result() ) - return $this->memcache->setCache(__FUNCTION__ . $account_id, $result->fetch_object()->hashrate); + if ($this->checkStmt($stmt) && $stmt->bind_param("iiiii", $username, $interval, $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->hashrate); return $this->sqlError(); } - public function getUserUnpaidPPSShares($account_id, $last_paid_pps_id) { + public function getUserUnpaidPPSShares($username, $last_paid_pps_id) { $this->debug->append("STA " . __METHOD__, 4); - if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT ROUND(IFNULL(SUM(IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS total - FROM " . $this->share->getTableName() . " AS s - JOIN " . $this->user->getTableName() . " AS a - ON a.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND a.id = ? - AND s.id > ? - WHERE our_result = 'Y'"); - if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $account_id, $last_paid_pps_id) && $stmt->execute() && $result = $stmt->get_result() ) - return $this->memcache->setCache(__FUNCTION__ . $account_id, $result->fetch_object()->total); + FROM " . $this->share->getTableName() . " + WHERE username = '?.%' + AND id > ? + AND our_result = 'Y'"); + if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $username, $last_paid_pps_id) && $stmt->execute() && $result = $stmt->get_result() ) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->total); return $this->sqlError(); } /** * Get average share difficulty across all workers for user - * @param account_id int Account ID + * @param username string username * @param interval int Data interval in seconds * @return double Share difficulty or 0 **/ - public function getUserShareDifficulty($account_id, $interval=600) { + public function getUserShareDifficulty($username, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -569,27 +561,26 @@ class Statistics extends Base { // We have no cached value, we return defaults return 0; } - if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT IFNULL(AVG(IF(difficulty=0, pow(2, (" . $this->config['difficulty'] . " - 16)), difficulty)), 0) AS avgsharediff, COUNT(s.id) AS total - FROM " . $this->share->getTableName() . " AS s JOIN " . $this->user->getTableName() . " AS a - ON a.username = SUBSTRING_INDEX( s.username, '.', 1 ) - WHERE s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND our_result = 'Y' - AND a.id = ?"); - if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $interval, $account_id) && $stmt->execute() && $result = $stmt->get_result() ) - return $this->memcache->setCache(__FUNCTION__ . $account_id, $result->fetch_object()->avgsharediff); + FROM " . $this->share->getTableName() . " AS s + WHERE username = '?.%' + AND time > DATE_SUB(now(), INTERVAL ? SECOND) + AND our_result = 'Y'); + if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->avgsharediff); return $this->sqlError(); } /** * Same as getUserHashrate for Sharerate - * @param account_id integer User ID + * @param username string username * @return data integer Current Sharerate in shares/s **/ - public function getUserSharerate($account_id, $interval=600) { + public function getUserSharerate($username, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -598,54 +589,48 @@ class Statistics extends Base { // We have no cached value, we return defaults return 0; } - if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT IFNULL(COUNT(*) / ?, 0) AS sharerate FROM ( SELECT - s.id + id FROM - shares AS s, - accounts AS u - WHERE u.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND s.our_result = 'Y' - AND u.id = ? + shares + WHERE username = '?.%' + AND time > DATE_SUB(now(), INTERVAL ? SECOND) + AND our_result = 'Y' UNION SELECT - s.share_id + share_id FROM - shares_archive AS s, - accounts AS u - WHERE u.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND s.our_result = 'Y' - AND u.id = ? + shares_archive + WHERE username = '?.%' + AND time > DATE_SUB(now(), INTERVAL ? SECOND) + AND our_result = 'Y' ) AS temp"); - if ($this->checkStmt($stmt) && $stmt->bind_param("iiiii", $interval, $interval, $account_id, $interval, $account_id) && $stmt->execute() && $result = $stmt->get_result() ) - return $this->memcache->setCache(__FUNCTION__ . $account_id, $result->fetch_object()->sharerate); + if ($this->checkStmt($stmt) && $stmt->bind_param("iiiii", $username, $interval, $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->sharerate); return $this->sqlError(); } /** * Get hashrate for a specific worker - * @param worker_id int Worker ID to fetch hashrate for + * @param username string username * @return data int Current hashrate in khash/s **/ - public function getWorkerHashrate($worker_id,$interval=600) { + public function getWorkerHashrate($username,$interval=600) { $this->debug->append("STA " . __METHOD__, 4); - if ($data = $this->memcache->get(__FUNCTION__ . $worker_id)) return $data; + if ($data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT IFNULL(ROUND(SUM(IF(difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), difficulty)) * POW(2, " . $this->config['target_bits'] . ") / 600 / 1000), 0) AS hashrate - FROM " . $this->share->getTableName() . " AS s, - " . $this->user->getTableName() . " AS u - WHERE u.username = SUBSTRING_INDEX( s.username, '.', 1 ) + FROM " . $this->share->getTableName() . " AS + WHERE username = '?.%' AND our_result = 'Y' - AND s.time > DATE_SUB(now(), INTERVAL ? SECOND) - AND u.id = ?"); - if ($this->checkStmt($stmt) && $stmt->bind_param("i", $account_id) && $stmt->execute() && $result = $stmt->get_result() ) - return $this->memcache->setCache(__FUNCTION__ . $worker_id, $result->fetch_object()->hashrate); + AND time > DATE_SUB(now(), INTERVAL ? SECOND)); + if ($this->checkStmt($stmt) && $stmt->bind_param("i", $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) + return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->hashrate); return $this->sqlError(); } @@ -725,43 +710,40 @@ class Statistics extends Base { /** * get Hourly hashrate for a user - * @param account_id int User ID + * @param username string Username * @return data array NOT FINISHED YET **/ - public function getHourlyHashrateByAccount($account_id) { + public function getHourlyHashrateByAccount($username) { $this->debug->append("STA " . __METHOD__, 4); - if ($data = $this->memcache->get(__FUNCTION__ . $account_id)) return $data; + if ($data = $this->memcache->get(__FUNCTION__ . $username)) return $data; $stmt = $this->mysqli->prepare(" SELECT - a.id, - IFNULL(ROUND(SUM(IF(s.difficulty=0, pow(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty)) * POW(2, " . $this->config['target_bits'] . ") / 3600 / 1000), 0) AS hashrate, - HOUR(s.time) AS hour - FROM " . $this->share->getTableName() . " AS s, accounts AS a + IFNULL(ROUND(SUM(IF(difficulty=0, pow(2, (" . $this->config['difficulty'] . " - 16)), difficulty)) * POW(2, " . $this->config['target_bits'] . ") / 3600 / 1000), 0) AS hashrate, + HOUR(time) AS hour + FROM " . $this->share->getTableName() . " WHERE time <= FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(NOW())/(60*60))*(60*60)) AND time >= FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(NOW())/(60*60))*(60*60)) - INTERVAL 24 HOUR AND our_result = 'Y' - AND a.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND a.id = ? + AND username = '?.%' GROUP BY HOUR(time) UNION SELECT share_id, - IFNULL(ROUND(SUM(IF(s.difficulty=0, pow(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty)) * POW(2, " . $this->config['target_bits'] . ") / 3600 / 1000), 0) AS hashrate, - HOUR(s.time) AS hour - FROM " . $this->share->getArchiveTableName() . " AS s, accounts AS a + IFNULL(ROUND(SUM(IF(difficulty=0, pow(2, (" . $this->config['difficulty'] . " - 16)), difficulty)) * POW(2, " . $this->config['target_bits'] . ") / 3600 / 1000), 0) AS hashrate, + HOUR(time) AS hour + FROM " . $this->share->getArchiveTableName() . " WHERE time <= FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(NOW())/(60*60))*(60*60)) AND time >= FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(NOW())/(60*60))*(60*60)) - INTERVAL 24 HOUR AND our_result = 'Y' - AND a.username = SUBSTRING_INDEX( s.username, '.', 1 ) - AND a.id = ? + AND username = '?.%' GROUP BY HOUR(time)"); - if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $account_id, $account_id) && $stmt->execute() && $result = $stmt->get_result()) { + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $username, $username) && $stmt->execute() && $result = $stmt->get_result()) { $iStartHour = date('G'); // Initilize array for ($i = 0; $i < 24; $i++) $aData[($iStartHour + $i) % 24] = 0; // Fill data while ($row = $result->fetch_assoc()) $aData[$row['hour']] = $row['hashrate']; - return $this->memcache->setCache(__FUNCTION__ . $account_id, $aData); + return $this->memcache->setCache(__FUNCTION__ . $username, $aData); } return $this->sqlError(); } From 9b74a1592bbdcb8247ddcd3bc68fd086ebe16b07 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 14:32:19 -0800 Subject: [PATCH 02/13] [FIX] Whoopsie --- public/include/classes/statistics.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index cddb7ca7..fc74cc1e 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -316,7 +316,7 @@ class Statistics extends Base { SELECT ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid, - id, + s.id, u.donate_percent AS donate_percent, u.is_anonymous AS is_anonymous, u.username AS username From 99a1c877225206154d48a93eb7ba78fd6927efce Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 14:37:44 -0800 Subject: [PATCH 03/13] [CLEAN] Clean spacing --- public/include/classes/statistics.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index fc74cc1e..b337a1af 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -368,8 +368,7 @@ class Statistics extends Base { ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid FROM " . $this->share->getTableName() . " - WHERE - username = '?.%' + WHERE username = '?.%' AND UNIX_TIMESTAMP(time) >IFNULL((SELECT MAX(b.time) FROM " . $this->block->getTableName() . " AS b),0)"); if ($stmt && $stmt->bind_param("i", $username) && $stmt->execute() && $result = $stmt->get_result()) return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_assoc()); From 0ef487187f13fe85957e5bce1047a147f27eb753 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:00:22 -0800 Subject: [PATCH 04/13] [Optimize] Switched calls to username from id --- public/include/pages/admin/user.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/include/pages/admin/user.inc.php b/public/include/pages/admin/user.inc.php index f3d28dbb..1040ab7b 100644 --- a/public/include/pages/admin/user.inc.php +++ b/public/include/pages/admin/user.inc.php @@ -57,11 +57,11 @@ if (isset($_REQUEST['filter'])) { foreach ($aUsers as $iKey => $aUser) { $aBalance = $transaction->getBalance($aUser['id']); $aUser['balance'] = $aBalance['confirmed']; - $aUser['hashrate'] = $statistics->getUserHashrate($aUser['id']); + $aUser['hashrate'] = $statistics->getUserHashrate($aUser['username']); if ($config['payout_system'] == 'pps') { - $aUser['sharerate'] = $statistics->getUserSharerate($aUser['id']); - $aUser['difficulty'] = $statistics->getUserShareDifficulty($aUser['id']); + $aUser['sharerate'] = $statistics->getUserSharerate($aUser['username']); + $aUser['difficulty'] = $statistics->getUserShareDifficulty($aUser['username']); $aUser['estimates'] = $statistics->getUserEstimates($aUser['sharerate'], $aUser['difficulty'], $user->getUserDonatePercent($aUser['id']), $user->getUserNoFee($aUser['id']), $statistics->getPPSValue()); } else { $aUser['estimates'] = $statistics->getUserEstimates($aRoundShares, $aUser['shares'], $aUser['donate_percent'], $aUser['no_fees']); From e275676bf6ece42a7e074bded7d752b89157df4e Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:00:37 -0800 Subject: [PATCH 05/13] [FIX] Double whoopsie --- public/include/classes/statistics.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index b337a1af..a3cb190f 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -316,7 +316,7 @@ class Statistics extends Base { SELECT ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid, - s.id, + u.id, u.donate_percent AS donate_percent, u.is_anonymous AS is_anonymous, u.username AS username From 9ba717c08038a8c2cac92327767be2c24ffb6a44 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:00:58 -0800 Subject: [PATCH 06/13] [Optimize] Switched calls to username from id --- public/include/smarty_globals.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/include/smarty_globals.inc.php b/public/include/smarty_globals.inc.php index b858214c..e564b252 100644 --- a/public/include/smarty_globals.inc.php +++ b/public/include/smarty_globals.inc.php @@ -129,10 +129,10 @@ if (@$_SESSION['USERDATA']['id']) { $aGlobal['userdata']['balance'] = $transaction->getBalance($_SESSION['USERDATA']['id']); // Other userdata that we can cache savely - $aGlobal['userdata']['shares'] = $statistics->getUserShares($_SESSION['USERDATA']['id']); - $aGlobal['userdata']['rawhashrate'] = $statistics->getUserHashrate($_SESSION['USERDATA']['id']); + $aGlobal['userdata']['shares'] = $statistics->getUserShares($_SESSION['USERDATA']['username']); + $aGlobal['userdata']['rawhashrate'] = $statistics->getUserHashrate($_SESSION['USERDATA']['username']); $aGlobal['userdata']['hashrate'] = $aGlobal['userdata']['rawhashrate'] * $dPersonalHashrateModifier; - $aGlobal['userdata']['sharerate'] = $statistics->getUserSharerate($_SESSION['USERDATA']['id']); + $aGlobal['userdata']['sharerate'] = $statistics->getUserSharerate($_SESSION['USERDATA']['username']); switch ($config['payout_system']) { case 'prop': From 8f207bfe764361acc6706aadead16deb2e943ee3 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:01:09 -0800 Subject: [PATCH 07/13] [Optimize] Switched calls to username from id --- public/include/pages/api/getuserstatus.inc.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/include/pages/api/getuserstatus.inc.php b/public/include/pages/api/getuserstatus.inc.php index 983ad787..2a717cd6 100644 --- a/public/include/pages/api/getuserstatus.inc.php +++ b/public/include/pages/api/getuserstatus.inc.php @@ -8,16 +8,16 @@ $api->isActive(); // Check user token $user_id = $api->checkAccess($user->checkApiKey($_REQUEST['api_key']), @$_REQUEST['id']); - +$username = $user->getUsername($user_id) // Fetch transaction summary $aTransactionSummary = $transaction->getTransactionSummary($user_id); // Output JSON format $data = array( - 'username' => $user->getUsername($user_id), - 'shares' => $statistics->getUserShares($user_id), - 'hashrate' => $statistics->getUserHashrate($user_id), - 'sharerate' => $statistics->getUserSharerate($user_id) + 'username' => $username, + 'shares' => $statistics->getUserShares($username), + 'hashrate' => $statistics->getUserHashrate($username), + 'sharerate' => $statistics->getUserSharerate($username) ); echo $api->get_json($data); From bdb704fbe2e5a6244886a7a85f852af05c9b1c1b Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:01:22 -0800 Subject: [PATCH 08/13] [Optimize] Switched calls to username from id --- public/include/pages/api/getusersharerate.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/include/pages/api/getusersharerate.inc.php b/public/include/pages/api/getusersharerate.inc.php index 23a4562d..a51db57a 100644 --- a/public/include/pages/api/getusersharerate.inc.php +++ b/public/include/pages/api/getusersharerate.inc.php @@ -8,13 +8,14 @@ $api->isActive(); // Check user token $user_id = $api->checkAccess($user->checkApiKey($_REQUEST['api_key']), @$_REQUEST['id']); +$username = $user->getUsername($user_id) // Fetch settings if ( ! $interval = $setting->getValue('statistics_ajax_data_interval')) $interval = 300; // Gather un-cached data $statistics->setGetCache(false); -$sharerate = $statistics->getUserSharerate($user_id, $interval); +$sharerate = $statistics->getUserSharerate($username, $interval); $statistics->setGetCache(true); // Output JSON format From 49418ccc6bfdd99919f1f15f722f1152fd2813c6 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:01:29 -0800 Subject: [PATCH 09/13] [Optimize] Switched calls to username from id --- public/include/pages/api/getuserhashrate.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/include/pages/api/getuserhashrate.inc.php b/public/include/pages/api/getuserhashrate.inc.php index 2edee628..51e69e85 100644 --- a/public/include/pages/api/getuserhashrate.inc.php +++ b/public/include/pages/api/getuserhashrate.inc.php @@ -8,13 +8,14 @@ $api->isActive(); // Check user token $user_id = $api->checkAccess($user->checkApiKey($_REQUEST['api_key']), @$_REQUEST['id']); +$username = $user->getUsername($user_id) // Fetch some settings if ( ! $interval = $setting->getValue('statistics_ajax_data_interval')) $interval = 300; // Gather un-cached data $statistics->setGetCache(false); -$hashrate = $statistics->getUserHashrate($user_id, $interval); +$hashrate = $statistics->getUserHashrate($username, $interval); $statistics->setGetCache(true); // Output JSON From 056387bc2729014be8e22b72110b41bd9ee7267e Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:01:42 -0800 Subject: [PATCH 10/13] [Optimize] Switched calls to username from id --- public/include/pages/api/gethourlyhashrates.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/include/pages/api/gethourlyhashrates.inc.php b/public/include/pages/api/gethourlyhashrates.inc.php index 54112325..5270059c 100644 --- a/public/include/pages/api/gethourlyhashrates.inc.php +++ b/public/include/pages/api/gethourlyhashrates.inc.php @@ -8,10 +8,11 @@ $api->isActive(); // Check user token $user_id = $api->checkAccess($user->checkApiKey($_REQUEST['api_key']), @$_REQUEST['id']); +$username = $user->getUsername($user_id) // Output JSON format $data = array( - 'mine' => $statistics->getHourlyHashrateByAccount($id), + 'mine' => $statistics->getHourlyHashrateByAccount($username), 'pool' => $statistics->getHourlyHashrateByPool() ); From 7f2268dfb15a06c2a17bc6e788a51a273d281d64 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:02:08 -0800 Subject: [PATCH 11/13] [Optimize] Switched calls to username from id --- public/include/pages/api/getdashboarddata.inc.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/public/include/pages/api/getdashboarddata.inc.php b/public/include/pages/api/getdashboarddata.inc.php index b09a6fae..69d4ed35 100644 --- a/public/include/pages/api/getdashboarddata.inc.php +++ b/public/include/pages/api/getdashboarddata.inc.php @@ -22,6 +22,7 @@ $supress_master = 1; // Check user token and access level permissions $user_id = $api->checkAccess($user->checkApiKey($_REQUEST['api_key']), @$_REQUEST['id']); +$username = $user->getUsername($user_id) // Fetch RPC information if ($bitcoin->can_connect() === true) { @@ -44,20 +45,20 @@ if ( ! $dNetworkHashrateModifier = $setting->getValue('statistics_network_hashra $statistics->setGetCache(false); $dPoolHashrate = $statistics->getCurrentHashrate($interval); if ($dPoolHashrate > $dNetworkHashrate) $dNetworkHashrate = $dPoolHashrate; -$dPersonalHashrate = $statistics->getUserHashrate($user_id, $interval); -$dPersonalSharerate = $statistics->getUserSharerate($user_id, $interval); -$dPersonalShareDifficulty = $statistics->getUserShareDifficulty($user_id, $interval); +$dPersonalHashrate = $statistics->getUserHashrate($username, $interval); +$dPersonalSharerate = $statistics->getUserSharerate($username, $interval); +$dPersonalShareDifficulty = $statistics->getUserShareDifficulty($username, $interval); $statistics->setGetCache(true); // Use caches for this one -$aUserRoundShares = $statistics->getUserShares($user_id); +$aUserRoundShares = $statistics->getUserShares($username); $aRoundShares = $statistics->getRoundShares(); if ($config['payout_system'] != 'pps') { $aEstimates = $statistics->getUserEstimates($aRoundShares, $aUserRoundShares, $user->getUserDonatePercent($user_id), $user->getUserNoFee($user_id)); $dUnpaidShares = 0; } else { - $dUnpaidShares = $statistics->getUserUnpaidPPSShares($user_id, $setting->getValue('pps_last_share_id')); + $dUnpaidShares = $statistics->getUserUnpaidPPSShares($username, $setting->getValue('pps_last_share_id')); $aEstimates = $statistics->getUserEstimates($dPersonalSharerate, $dPersonalShareDifficulty, $user->getUserDonatePercent($user_id), $user->getUserNoFee($user_id), $statistics->getPPSValue()); } From bfaf30fd2c65d9715ab5056457951403d927af63 Mon Sep 17 00:00:00 2001 From: Neozonz Date: Mon, 20 Jan 2014 16:05:41 -0800 Subject: [PATCH 12/13] [FIX] FFS --- public/include/classes/statistics.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index a3cb190f..594db90e 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -316,7 +316,7 @@ class Statistics extends Base { SELECT ROUND(IFNULL(SUM(IF(our_result='Y', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS valid, ROUND(IFNULL(SUM(IF(our_result='N', IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty), 0)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS invalid, - u.id, + u.id AS id, u.donate_percent AS donate_percent, u.is_anonymous AS is_anonymous, u.username AS username From 48cc7f76653b986e66485c48fe02df575e296c5a Mon Sep 17 00:00:00 2001 From: Neozonz Date: Tue, 21 Jan 2014 06:19:59 -0500 Subject: [PATCH 13/13] [FIX] Added back accound_ids for caching [FIX] SQL string termination --- public/include/classes/statistics.class.php | 13 +++++++------ public/include/pages/api/getdashboarddata.inc.php | 8 ++++---- public/include/pages/api/getusersharerate.inc.php | 2 +- public/include/pages/api/getuserstatus.inc.php | 6 +++--- public/include/smarty_globals.inc.php | 6 +++--- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index 594db90e..2a9dd185 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -353,7 +353,7 @@ class Statistics extends Base { * @param username str username * @return data array invalid and valid share counts **/ - public function getUserShares($username) { + public function getUserShares($username, $account_id) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_SHARES)) { @@ -495,7 +495,7 @@ class Statistics extends Base { * @param $username string username * @return data integer Current Hashrate in khash/s **/ - public function getUserHashrate($username, $interval=600) { + public function getUserHashrate($username, $account_id, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -551,7 +551,7 @@ class Statistics extends Base { * @param interval int Data interval in seconds * @return double Share difficulty or 0 **/ - public function getUserShareDifficulty($username, $interval=600) { + public function getUserShareDifficulty($username, $account_id, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -568,7 +568,8 @@ class Statistics extends Base { FROM " . $this->share->getTableName() . " AS s WHERE username = '?.%' AND time > DATE_SUB(now(), INTERVAL ? SECOND) - AND our_result = 'Y'); + AND our_result = 'Y' + "); if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->avgsharediff); return $this->sqlError(); @@ -579,7 +580,7 @@ class Statistics extends Base { * @param username string username * @return data integer Current Sharerate in shares/s **/ - public function getUserSharerate($username, $interval=600) { + public function getUserSharerate($username, $account_id, $interval=600) { $this->debug->append("STA " . __METHOD__, 4); // Dual-caching, try statistics cron first, then fallback to local, then fallbock to SQL if ($data = $this->memcache->get(STATISTICS_ALL_USER_HASHRATES)) { @@ -627,7 +628,7 @@ class Statistics extends Base { FROM " . $this->share->getTableName() . " AS WHERE username = '?.%' AND our_result = 'Y' - AND time > DATE_SUB(now(), INTERVAL ? SECOND)); + AND time > DATE_SUB(now(), INTERVAL ? SECOND)"); if ($this->checkStmt($stmt) && $stmt->bind_param("i", $username, $interval) && $stmt->execute() && $result = $stmt->get_result() ) return $this->memcache->setCache(__FUNCTION__ . $username, $result->fetch_object()->hashrate); return $this->sqlError(); diff --git a/public/include/pages/api/getdashboarddata.inc.php b/public/include/pages/api/getdashboarddata.inc.php index 69d4ed35..3ca71365 100644 --- a/public/include/pages/api/getdashboarddata.inc.php +++ b/public/include/pages/api/getdashboarddata.inc.php @@ -45,13 +45,13 @@ if ( ! $dNetworkHashrateModifier = $setting->getValue('statistics_network_hashra $statistics->setGetCache(false); $dPoolHashrate = $statistics->getCurrentHashrate($interval); if ($dPoolHashrate > $dNetworkHashrate) $dNetworkHashrate = $dPoolHashrate; -$dPersonalHashrate = $statistics->getUserHashrate($username, $interval); -$dPersonalSharerate = $statistics->getUserSharerate($username, $interval); -$dPersonalShareDifficulty = $statistics->getUserShareDifficulty($username, $interval); +$dPersonalHashrate = $statistics->getUserHashrate($username, $user_id, $interval); +$dPersonalSharerate = $statistics->getUserSharerate($username, $user_id, $interval); +$dPersonalShareDifficulty = $statistics->getUserShareDifficulty($username, $user_id, $interval); $statistics->setGetCache(true); // Use caches for this one -$aUserRoundShares = $statistics->getUserShares($username); +$aUserRoundShares = $statistics->getUserShares($username, $user_id); $aRoundShares = $statistics->getRoundShares(); if ($config['payout_system'] != 'pps') { diff --git a/public/include/pages/api/getusersharerate.inc.php b/public/include/pages/api/getusersharerate.inc.php index a51db57a..3549c0f4 100644 --- a/public/include/pages/api/getusersharerate.inc.php +++ b/public/include/pages/api/getusersharerate.inc.php @@ -15,7 +15,7 @@ if ( ! $interval = $setting->getValue('statistics_ajax_data_interval')) $interva // Gather un-cached data $statistics->setGetCache(false); -$sharerate = $statistics->getUserSharerate($username, $interval); +$sharerate = $statistics->getUserSharerate($username, $user_id, $interval); $statistics->setGetCache(true); // Output JSON format diff --git a/public/include/pages/api/getuserstatus.inc.php b/public/include/pages/api/getuserstatus.inc.php index 2a717cd6..23ef53c7 100644 --- a/public/include/pages/api/getuserstatus.inc.php +++ b/public/include/pages/api/getuserstatus.inc.php @@ -15,9 +15,9 @@ $aTransactionSummary = $transaction->getTransactionSummary($user_id); // Output JSON format $data = array( 'username' => $username, - 'shares' => $statistics->getUserShares($username), - 'hashrate' => $statistics->getUserHashrate($username), - 'sharerate' => $statistics->getUserSharerate($username) + 'shares' => $statistics->getUserShares($username, $user_id), + 'hashrate' => $statistics->getUserHashrate($username, $user_id), + 'sharerate' => $statistics->getUserSharerate($username, $user_id) ); echo $api->get_json($data); diff --git a/public/include/smarty_globals.inc.php b/public/include/smarty_globals.inc.php index e564b252..e3637cd3 100644 --- a/public/include/smarty_globals.inc.php +++ b/public/include/smarty_globals.inc.php @@ -129,10 +129,10 @@ if (@$_SESSION['USERDATA']['id']) { $aGlobal['userdata']['balance'] = $transaction->getBalance($_SESSION['USERDATA']['id']); // Other userdata that we can cache savely - $aGlobal['userdata']['shares'] = $statistics->getUserShares($_SESSION['USERDATA']['username']); - $aGlobal['userdata']['rawhashrate'] = $statistics->getUserHashrate($_SESSION['USERDATA']['username']); + $aGlobal['userdata']['shares'] = $statistics->getUserShares($_SESSION['USERDATA']['username'], $_SESSION['USERDATA']['id']); + $aGlobal['userdata']['rawhashrate'] = $statistics->getUserHashrate($_SESSION['USERDATA']['username'], $_SESSION['USERDATA']['id']); $aGlobal['userdata']['hashrate'] = $aGlobal['userdata']['rawhashrate'] * $dPersonalHashrateModifier; - $aGlobal['userdata']['sharerate'] = $statistics->getUserSharerate($_SESSION['USERDATA']['username']); + $aGlobal['userdata']['sharerate'] = $statistics->getUserSharerate($_SESSION['USERDATA']['username'], $_SESSION['USERDATA']['id']); switch ($config['payout_system']) { case 'prop':