diff --git a/pool/base.php b/pool/base.php index 8903293d..97211a63 100644 --- a/pool/base.php +++ b/pool/base.php @@ -229,7 +229,7 @@ function validate() $whoid = ''; if (!isset($_SESSION['ckpkey'])) - return false; + return array(false, NULL); $key = $_SESSION['ckpkey']; if (!isset($_SESSION[$key])) diff --git a/pool/page_reg.php b/pool/page_reg.php index 5a97f3a4..7b7345da 100644 --- a/pool/page_reg.php +++ b/pool/page_reg.php @@ -96,7 +96,7 @@ function show_reg($menu, $name, $u) if ($pass === NULL || safepass($pass) !== true) { $ok = false; - $data['error'] = "Password is unsafe"; + $data['error'] = "Password is unsafe - requires 6 or more chars, including upper+lower+digits"; } elseif ($pass2 === NULL || $pass2 != $pass) { $ok = false; diff --git a/pool/page_workers.php b/pool/page_workers.php index 86e10e6c..83c5da01 100644 --- a/pool/page_workers.php +++ b/pool/page_workers.php @@ -82,10 +82,15 @@ function doworker($data, $user) else { $uhr /= 10000000; - if ($uhr < 100000) - $uhr = (round($uhr)/100).'GHs'; + if ($uhr < 0.01) + $uhr = '0GHs'; else - $uhr = (round($uhr/1000)/100).'THs'; + { + if ($uhr < 100000) + $uhr = number_format(round($uhr)/100,2).'GHs'; + else + $uhr = number_format(round($uhr/1000)/100,2).'THs'; + } } $pg .= "$uhr"; $pg .= "\n"; diff --git a/src/ckdb.c b/src/ckdb.c index 586b729a..bd38d44a 100644 --- a/src/ckdb.c +++ b/src/ckdb.c @@ -1742,6 +1742,7 @@ static int64_t nextid(PGconn *conn, char *idname, int64_t increment, tv_t *cd, char *by, char *code, char *inet) { ExecStatusType rescode; + bool conned = false; PGresult *res; char qry[1024]; char *params[5]; @@ -1757,6 +1758,11 @@ static int64_t nextid(PGconn *conn, char *idname, int64_t increment, "where idname='%s' for update", idname); + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + res = PQexec(conn, qry); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -1811,6 +1817,8 @@ static int64_t nextid(PGconn *conn, char *idname, int64_t increment, free(params[n]); cleanup: PQclear(res); + if (conned) + PQfinish(conn); return lastid; } @@ -2016,6 +2024,7 @@ static bool users_add(PGconn *conn, char *username, char *emailaddress, char *pa tv_t *now, char *by, char *code, char *inet) { ExecStatusType rescode; + bool conned = false; PGresult *res; K_ITEM *item; int n; @@ -2072,6 +2081,11 @@ static bool users_add(PGconn *conn, char *username, char *emailaddress, char *pa "secondaryuserid" HISTORYDATECONTROL ") values (" PQPARAM11 ")"; + if (!conn) { + conn = dbconnect(); + conned = true; + } + res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -2082,6 +2096,8 @@ static bool users_add(PGconn *conn, char *username, char *emailaddress, char *pa ok = true; unparam: PQclear(res); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); unitem: @@ -2245,6 +2261,7 @@ static K_ITEM *workers_add(PGconn *conn, int64_t userid, char *workername, char *code, char *inet, tv_t *cd) { ExecStatusType rescode; + bool conned = false; PGresult *res; K_ITEM *item, *ret = NULL; int n; @@ -2263,6 +2280,11 @@ static K_ITEM *workers_add(PGconn *conn, int64_t userid, char *workername, row = DATA_WORKERS(item); + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + row->workerid = nextid(conn, "workerid", (int64_t)1, cd, by, code, inet); if (row->workerid == 0) goto unitem; @@ -2329,6 +2351,8 @@ unparam: for (n = 0; n < par; n++) free(params[n]); unitem: + if (conned) + PQfinish(conn); K_WLOCK(workers_free); if (!ret) k_add_head(workers_free, item); @@ -2346,6 +2370,7 @@ static bool workers_update(PGconn *conn, K_ITEM *item, char *difficultydefault, char *by, char *code, char *inet, tv_t *cd) { ExecStatusType rescode; + bool conned = false; PGresult *res; int n; WORKERS *row; @@ -2402,6 +2427,11 @@ static bool workers_update(PGconn *conn, K_ITEM *item, char *difficultydefault, params[par++] = tv_to_buf((tv_t *)&default_expiry, NULL, 0); PARCHKVAL(par, 3, params); + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + res = PQexec(conn, "Begin"); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -2457,6 +2487,8 @@ static bool workers_update(PGconn *conn, K_ITEM *item, char *difficultydefault, ok = true; unparam: PQclear(res); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); early: @@ -2853,6 +2885,7 @@ static int64_t workinfo_add(PGconn *conn, char *workinfoidstr, char *poolinstanc char *code, char *inet, tv_t *cd, bool igndup) { ExecStatusType rescode; + bool conned = false; K_TREE_CTX ctx[1]; PGresult *res; K_ITEM *item; @@ -2914,6 +2947,11 @@ static int64_t workinfo_add(PGconn *conn, char *workinfoidstr, char *poolinstanc "prevhash,coinbase1,coinbase2,version,bits,ntime,reward" HISTORYDATECONTROL ") values (" PQPARAM16 ")"; + if (!conn) { + conn = dbconnect(); + conned = true; + } + res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -2925,6 +2963,8 @@ static int64_t workinfo_add(PGconn *conn, char *workinfoidstr, char *poolinstanc unparam: PQclear(res); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); @@ -3271,9 +3311,10 @@ static void zero_sharesummary(SHARESUMMARY *row, tv_t *cd) static K_ITEM *find_sharesummary(int64_t userid, char *workername, int64_t workinfoid); // Memory (and log file) only -static bool shares_add(char *workinfoid, char *username, char *workername, char *clientid, - char *enonce1, char *nonce2, char *nonce, char *diff, char *sdiff, - char *secondaryuserid, char *by, char *code, char *inet, tv_t *cd) +static bool shares_add(PGconn *conn, char *workinfoid, char *username, char *workername, + char *clientid, char *enonce1, char *nonce2, char *nonce, + char *diff, char *sdiff, char *secondaryuserid, char *by, + char *code, char *inet, tv_t *cd) { K_ITEM *s_item, *u_item, *wi_item, *w_item, *ss_item; SHARES *shares; @@ -3311,7 +3352,7 @@ static bool shares_add(char *workinfoid, char *username, char *workername, char if (!wi_item) goto unitem; - w_item = new_default_worker(NULL, false, shares->userid, shares->workername, + w_item = new_default_worker(conn, false, shares->userid, shares->workername, by, code, inet, cd); if (!w_item) goto unitem; @@ -3335,7 +3376,7 @@ static bool shares_add(char *workinfoid, char *username, char *workername, char workerstatus_update(NULL, shares, NULL, NULL); - sharesummary_update(NULL, shares, NULL, NULL, by, code, inet, cd); + sharesummary_update(conn, shares, NULL, NULL, by, code, inet, cd); ok = true; unitem: @@ -3381,9 +3422,10 @@ static cmp_t cmp_shareerrors(K_ITEM *a, K_ITEM *b) // Memory (and log file) only // TODO: handle shareerrors that appear after a workinfoid is aged or doesn't exist? -static bool shareerrors_add(char *workinfoid, char *username, char *workername, - char *clientid, char *errn, char *error, char *secondaryuserid, - char *by, char *code, char *inet, tv_t *cd) +static bool shareerrors_add(PGconn *conn, char *workinfoid, char *username, + char *workername, char *clientid, char *errn, + char *error, char *secondaryuserid, char *by, + char *code, char *inet, tv_t *cd) { K_ITEM *s_item, *u_item, *wi_item, *w_item, *ss_item; SHAREERRORS *shareerrors; @@ -3440,7 +3482,7 @@ static bool shareerrors_add(char *workinfoid, char *username, char *workername, } } - sharesummary_update(NULL, NULL, shareerrors, NULL, by, code, inet, cd); + sharesummary_update(conn, NULL, shareerrors, NULL, by, code, inet, cd); ok = true; unitem: @@ -4042,6 +4084,7 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash, bool igndup, char *id) { ExecStatusType rescode; + bool conned = false; PGresult *res = NULL; K_TREE_CTX ctx[1]; K_ITEM *item, *u_item; @@ -4111,6 +4154,11 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash, "clientid,enonce1,nonce2,nonce,reward,confirmed" HISTORYDATECONTROL ") values (" PQPARAM16 ")"; + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -4127,6 +4175,11 @@ static bool blocks_add(PGconn *conn, char *height, char *blockhash, params[par++] = tv_to_buf((tv_t *)&default_expiry, NULL, 0); PARCHKVAL(par, 3, params); + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + res = PQexec(conn, "Begin"); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -4186,6 +4239,9 @@ unparam: for (n = 0; n < par; n++) free(params[n]); flail: + if (conned) + PQfinish(conn); + K_WLOCK(blocks_free); if (!ok) k_add_head(blocks_free, item); @@ -4365,6 +4421,7 @@ static char *auths_add(PGconn *conn, char *poolinstance, char *username, tv_t *cd, bool igndup) { ExecStatusType rescode; + bool conned = false; PGresult *res; K_TREE_CTX ctx[1]; K_ITEM *a_item, *u_item; @@ -4411,6 +4468,11 @@ static char *auths_add(PGconn *conn, char *poolinstance, char *username, // Update even if DB fails workerstatus_update(row, NULL, NULL, NULL); + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + row->authid = nextid(conn, "authid", (int64_t)1, cd, by, code, inet); if (row->authid == 0) goto unitem; @@ -4444,6 +4506,8 @@ unparam: for (n = 0; n < par; n++) free(params[n]); unitem: + if (conned) + PQfinish(conn); K_WLOCK(auths_free); if (!secuserid) k_add_head(auths_free, a_item); @@ -4595,6 +4659,7 @@ static bool poolstats_add(PGconn *conn, bool store, char *poolinstance, bool igndup) { ExecStatusType rescode; + bool conned = false; PGresult *res; K_TREE_CTX ctx[1]; K_ITEM *p_item; @@ -4652,6 +4717,11 @@ static bool poolstats_add(PGconn *conn, bool store, char *poolinstance, "hashrate5m,hashrate1hr,hashrate24hr" SIMPLEDATECONTROL ") values (" PQPARAM12 ")"; + if (!conn) { + conn = dbconnect(); + conned = true; + } + res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -4666,6 +4736,8 @@ static bool poolstats_add(PGconn *conn, bool store, char *poolinstance, unparam: if (store) { PQclear(res); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); } @@ -4909,6 +4981,7 @@ static cmp_t cmp_userstats_workerstatus(K_ITEM *a, K_ITEM *b) static bool userstats_add_db(PGconn *conn, USERSTATS *row) { ExecStatusType rescode; + bool conned = false; PGresult *res; char *ins; bool ok = false; @@ -4937,6 +5010,11 @@ static bool userstats_add_db(PGconn *conn, USERSTATS *row) "hashrate24hr,summarylevel,summarycount,statsdate" SIMPLEDATECONTROL ") values (" PQPARAM14 ")"; + if (conn == NULL) { + conn = dbconnect(); + conned = true; + } + res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); if (!PGOK(rescode)) { @@ -4947,6 +5025,8 @@ static bool userstats_add_db(PGconn *conn, USERSTATS *row) ok = true; unparam: PQclear(res); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); @@ -5339,7 +5419,7 @@ static bool check_db_version(PGconn *conn) return true; } -static bool getdata() +static bool getdata1() { PGconn *conn = dbconnect(); bool ok = true; @@ -5350,25 +5430,36 @@ static bool getdata() goto matane; if (!(ok = workers_fill(conn))) goto matane; + ok = auths_fill(conn); + +matane: + + PQfinish(conn); + return ok; +} + +static bool getdata2() +{ + PGconn *conn = dbconnect(); + bool ok = true; + + if (!(ok = blocks_fill(conn))) + goto sukamudai; if (!(ok = payments_fill(conn))) - goto matane; + goto sukamudai; if (!(ok = workinfo_fill(conn))) - goto matane; + goto sukamudai; if (!(ok = shares_fill())) - goto matane; + goto sukamudai; if (!(ok = shareerrors_fill())) - goto matane; + goto sukamudai; if (!(ok = sharesummary_fill(conn))) - goto matane; - if (!(ok = blocks_fill(conn))) - goto matane; - if (!(ok = auths_fill(conn))) - goto matane; + goto sukamudai; if (!(ok = poolstats_fill(conn))) - goto matane; + goto sukamudai; ok = userstats_fill(conn); -matane: +sukamudai: PQfinish(conn); return ok; @@ -5623,7 +5714,10 @@ static bool setup_data() workerstatus_store = k_new_store(workerstatus_free); workerstatus_root = new_ktree(); - if (!getdata()) + if (!getdata1()) + return false; + + if (!getdata2()) return false; db_load_complete = true; @@ -5651,14 +5745,13 @@ static bool setup_data() return true; } -static char *cmd_adduser(char *cmd, char *id, tv_t *now, char *by, char *code, char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by, + char *code, char *inet, __maybe_unused tv_t *notcd) { char reply[1024] = ""; size_t siz = sizeof(reply); K_ITEM *i_username, *i_emailaddress, *i_passwordhash; - PGconn *conn; bool ok; LOGDEBUG("%s(): cmd '%s'", __func__, cmd); @@ -5675,12 +5768,10 @@ static char *cmd_adduser(char *cmd, char *id, tv_t *now, char *by, char *code, c if (!i_passwordhash) return strdup(reply); - conn = dbconnect(); ok = users_add(conn, DATA_TRANSFER(i_username)->data, - DATA_TRANSFER(i_emailaddress)->data, - DATA_TRANSFER(i_passwordhash)->data, - now, by, code, inet); - PQfinish(conn); + DATA_TRANSFER(i_emailaddress)->data, + DATA_TRANSFER(i_passwordhash)->data, + now, by, code, inet); if (!ok) { LOGERR("%s.failed.DBE", id); @@ -5691,9 +5782,10 @@ static char *cmd_adduser(char *cmd, char *id, tv_t *now, char *by, char *code, c return strdup(reply); } -static char *cmd_chkpass(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_unused char *by, - __maybe_unused char *code, __maybe_unused char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_chkpass(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { K_ITEM *i_username, *i_passwordhash, *u_item; char reply[1024] = ""; @@ -5729,13 +5821,12 @@ static char *cmd_chkpass(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_ return strdup("ok."); } -static char *cmd_poolstats_do(char *cmd, char *id, char *by, char *code, - char *inet, tv_t *cd, bool igndup) +static char *cmd_poolstats_do(PGconn *conn, char *cmd, char *id, char *by, + char *code, char *inet, tv_t *cd, bool igndup) { char reply[1024] = ""; size_t siz = sizeof(reply); K_TREE_CTX ctx[1]; - PGconn *conn; bool store; // log to logfile @@ -5803,7 +5894,6 @@ static char *cmd_poolstats_do(char *cmd, char *id, char *by, char *code, store = false; } - conn = dbconnect(); ok = poolstats_add(conn, store, DATA_TRANSFER(i_poolinstance)->data, DATA_TRANSFER(i_elapsed)->data, DATA_TRANSFER(i_users)->data, @@ -5813,7 +5903,6 @@ static char *cmd_poolstats_do(char *cmd, char *id, char *by, char *code, DATA_TRANSFER(i_hashrate1hr)->data, DATA_TRANSFER(i_hashrate24hr)->data, by, code, inet, cd, igndup); - PQfinish(conn); if (!ok) { LOGERR("%s.failed.DBE", id); @@ -5824,8 +5913,9 @@ static char *cmd_poolstats_do(char *cmd, char *id, char *by, char *code, return strdup(reply); } -static char *cmd_poolstats(char *cmd, char *id, __maybe_unused tv_t *notnow, - char *by, char *code, char *inet, tv_t *cd) +static char *cmd_poolstats(PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *notnow, char *by, + char *code, char *inet, tv_t *cd) { bool igndup = false; @@ -5836,11 +5926,12 @@ static char *cmd_poolstats(char *cmd, char *id, __maybe_unused tv_t *notnow, return NULL; } - return cmd_poolstats_do(cmd, id, by, code, inet, cd, igndup); + return cmd_poolstats_do(conn, cmd, id, by, code, inet, cd, igndup); } -static char *cmd_userstats(char *cmd, char *id, __maybe_unused tv_t *notnow, - char *by, char *code, char *inet, tv_t *cd) +static char *cmd_userstats(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *notnow, char *by, char *code, + char *inet, tv_t *cd) { char reply[1024] = ""; size_t siz = sizeof(reply); @@ -5917,8 +6008,8 @@ static char *cmd_userstats(char *cmd, char *id, __maybe_unused tv_t *notnow, return strdup(reply); } -static char *cmd_newid(char *cmd, char *id, tv_t *now, char *by, char *code, char *inet, - __maybe_unused tv_t *cd) +static char *cmd_newid(PGconn *conn, char *cmd, char *id, tv_t *now, char *by, + char *code, char *inet, __maybe_unused tv_t *cd) { char reply[1024] = ""; size_t siz = sizeof(reply); @@ -5928,8 +6019,8 @@ static char *cmd_newid(char *cmd, char *id, tv_t *now, char *by, char *code, cha int par; bool ok = false; ExecStatusType rescode; + bool conned = false; PGresult *res; - PGconn *conn; char *ins; int n; @@ -5962,7 +6053,10 @@ static char *cmd_newid(char *cmd, char *id, tv_t *now, char *by, char *code, cha ins = "insert into idcontrol " "(idname,lastid" MODIFYDATECONTROL ") values (" PQPARAM10 ")"; - conn = dbconnect(); + if (!conn) { + conn = dbconnect(); + conned = true; + } res = PQexecParams(conn, ins, par, NULL, (const char **)params, NULL, NULL, 0); rescode = PQresultStatus(res); @@ -5974,7 +6068,8 @@ static char *cmd_newid(char *cmd, char *id, tv_t *now, char *by, char *code, cha ok = true; foil: PQclear(res); - PQfinish(conn); + if (conned) + PQfinish(conn); for (n = 0; n < par; n++) free(params[n]); @@ -5992,9 +6087,10 @@ foil: return strdup(reply); } -static char *cmd_payments(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_unused char *by, - __maybe_unused char *code, __maybe_unused char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { K_ITEM *i_username, look, *u_item, *p_item; K_TREE_CTX ctx[1]; @@ -6047,9 +6143,10 @@ static char *cmd_payments(char *cmd, char *id, __maybe_unused tv_t *now, __maybe return buf; } -static char *cmd_workers(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_unused char *by, - __maybe_unused char *code, __maybe_unused char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { K_ITEM *i_username, *i_stats, wlook, *u_item, *w_item, uslook, *us_item, *ws_item; K_TREE_CTX w_ctx[1], us_ctx[1]; @@ -6184,9 +6281,10 @@ static char *cmd_workers(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_ return buf; } -static char *cmd_allusers(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_unused char *by, - __maybe_unused char *code, __maybe_unused char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_allusers(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { K_TREE *userstats_workername_root = new_ktree(); K_ITEM *us_item, *usw_item, *tmp_item, *u_item; @@ -6289,12 +6387,12 @@ static char *cmd_allusers(char *cmd, char *id, __maybe_unused tv_t *now, __maybe return buf; } -static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, - char *by, char *code, char *inet, tv_t *cd) +static char *cmd_sharelog(PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *notnow, char *by, + char *code, char *inet, tv_t *cd) { char reply[1024] = ""; size_t siz = sizeof(reply); - PGconn *conn; // log to logfile with processing success/failure code @@ -6358,7 +6456,6 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, if (!i_reward) return strdup(reply); - conn = dbconnect(); workinfoid = workinfo_add(conn, DATA_TRANSFER(i_workinfoid)->data, DATA_TRANSFER(i_poolinstance)->data, DATA_TRANSFER(i_transactiontree)->data, @@ -6371,7 +6468,6 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, DATA_TRANSFER(i_ntime)->data, DATA_TRANSFER(i_reward)->data, by, code, inet, cd, igndup); - PQfinish(conn); if (workinfoid == -1) { LOGERR("%s.failed.DBE", id); @@ -6431,17 +6527,17 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, if (!i_secondaryuserid) return strdup(reply); - ok = shares_add(DATA_TRANSFER(i_workinfoid)->data, - DATA_TRANSFER(i_username)->data, - DATA_TRANSFER(i_workername)->data, - DATA_TRANSFER(i_clientid)->data, - DATA_TRANSFER(i_enonce1)->data, - DATA_TRANSFER(i_nonce2)->data, - DATA_TRANSFER(i_nonce)->data, - DATA_TRANSFER(i_diff)->data, - DATA_TRANSFER(i_sdiff)->data, - DATA_TRANSFER(i_secondaryuserid)->data, - by, code, inet, cd); + ok = shares_add(conn, DATA_TRANSFER(i_workinfoid)->data, + DATA_TRANSFER(i_username)->data, + DATA_TRANSFER(i_workername)->data, + DATA_TRANSFER(i_clientid)->data, + DATA_TRANSFER(i_enonce1)->data, + DATA_TRANSFER(i_nonce2)->data, + DATA_TRANSFER(i_nonce)->data, + DATA_TRANSFER(i_diff)->data, + DATA_TRANSFER(i_sdiff)->data, + DATA_TRANSFER(i_secondaryuserid)->data, + by, code, inet, cd); if (!ok) { LOGERR("%s.failed.DATA", id); @@ -6489,14 +6585,14 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, if (!i_secondaryuserid) return strdup(reply); - ok = shareerrors_add(DATA_TRANSFER(i_workinfoid)->data, - DATA_TRANSFER(i_username)->data, - DATA_TRANSFER(i_workername)->data, - DATA_TRANSFER(i_clientid)->data, - DATA_TRANSFER(i_errn)->data, - DATA_TRANSFER(i_error)->data, - DATA_TRANSFER(i_secondaryuserid)->data, - by, code, inet, cd); + ok = shareerrors_add(conn, DATA_TRANSFER(i_workinfoid)->data, + DATA_TRANSFER(i_username)->data, + DATA_TRANSFER(i_workername)->data, + DATA_TRANSFER(i_clientid)->data, + DATA_TRANSFER(i_errn)->data, + DATA_TRANSFER(i_error)->data, + DATA_TRANSFER(i_secondaryuserid)->data, + by, code, inet, cd); if (!ok) { LOGERR("%s.failed.DATA", id); return strdup("failed.DATA"); @@ -6521,7 +6617,7 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, if (!i_poolinstance) return strdup(reply); - ok = workinfo_age(NULL, DATA_TRANSFER(i_workinfoid)->data, + ok = workinfo_age(conn, DATA_TRANSFER(i_workinfoid)->data, DATA_TRANSFER(i_poolinstance)->data, by, code, inet, cd); @@ -6543,12 +6639,11 @@ static char *cmd_sharelog(char *cmd, char *id, __maybe_unused tv_t *notnow, } // TODO: the confirm update: identify block changes from workinfo height? -static char *cmd_blocks_do(char *cmd, char *id, char *by, char *code, char *inet, - tv_t *cd, bool igndup) +static char *cmd_blocks_do(PGconn *conn, char *cmd, char *id, char *by, + char *code, char *inet, tv_t *cd, bool igndup) { char reply[1024] = ""; size_t siz = sizeof(reply); - PGconn *conn; K_ITEM *i_height, *i_blockhash, *i_confirmed, *i_workinfoid, *i_username; K_ITEM *i_workername, *i_clientid, *i_enonce1, *i_nonce2, *i_nonce, *i_reward; char *msg; @@ -6604,7 +6699,6 @@ static char *cmd_blocks_do(char *cmd, char *id, char *by, char *code, char *inet return strdup(reply); msg = "added"; - conn = dbconnect(); ok = blocks_add(conn, DATA_TRANSFER(i_height)->data, DATA_TRANSFER(i_blockhash)->data, DATA_TRANSFER(i_confirmed)->data, @@ -6620,7 +6714,6 @@ static char *cmd_blocks_do(char *cmd, char *id, char *by, char *code, char *inet break; case BLOCKS_CONFIRM: msg = "confirmed"; - conn = dbconnect(); ok = blocks_add(conn, DATA_TRANSFER(i_height)->data, DATA_TRANSFER(i_blockhash)->data, DATA_TRANSFER(i_confirmed)->data, @@ -6634,8 +6727,6 @@ static char *cmd_blocks_do(char *cmd, char *id, char *by, char *code, char *inet return strdup("failed.DATA"); } - PQfinish(conn); - if (!ok) { LOGERR("%s.failed.DBE", id); return strdup("failed.DBE"); @@ -6646,8 +6737,9 @@ static char *cmd_blocks_do(char *cmd, char *id, char *by, char *code, char *inet return strdup(reply); } -static char *cmd_blocks(char *cmd, char *id, __maybe_unused tv_t *notnow, - char *by, char *code, char *inet, tv_t *cd) +static char *cmd_blocks(PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *notnow, char *by, + char *code, char *inet, tv_t *cd) { bool igndup = false; @@ -6658,15 +6750,14 @@ static char *cmd_blocks(char *cmd, char *id, __maybe_unused tv_t *notnow, return NULL; } - return cmd_blocks_do(cmd, id, by, code, inet, cd, igndup); + return cmd_blocks_do(conn, cmd, id, by, code, inet, cd, igndup); } -static char *cmd_auth_do(char *cmd, char *id, __maybe_unused tv_t *now, char *by, +static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by, char *code, char *inet, tv_t *cd, bool igndup) { char reply[1024] = ""; size_t siz = sizeof(reply); - PGconn *conn; K_ITEM *i_poolinstance, *i_username, *i_workername, *i_clientid; K_ITEM *i_enonce1, *i_useragent; char *secuserid; @@ -6697,7 +6788,6 @@ static char *cmd_auth_do(char *cmd, char *id, __maybe_unused tv_t *now, char *by if (!i_useragent) return strdup(reply); - conn = dbconnect(); secuserid = auths_add(conn, DATA_TRANSFER(i_poolinstance)->data, DATA_TRANSFER(i_username)->data, DATA_TRANSFER(i_workername)->data, @@ -6705,7 +6795,6 @@ static char *cmd_auth_do(char *cmd, char *id, __maybe_unused tv_t *now, char *by DATA_TRANSFER(i_enonce1)->data, DATA_TRANSFER(i_useragent)->data, by, code, inet, cd, igndup); - PQfinish(conn); if (!secuserid) { LOGDEBUG("%s.failed.DBE", id); @@ -6717,8 +6806,9 @@ static char *cmd_auth_do(char *cmd, char *id, __maybe_unused tv_t *now, char *by return strdup(reply); } -static char *cmd_auth(char *cmd, char *id, tv_t *now, char *by, - char *code, char *inet, tv_t *cd) +static char *cmd_auth(PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, char *by, + char *code, char *inet, tv_t *cd) { bool igndup = false; @@ -6729,12 +6819,13 @@ static char *cmd_auth(char *cmd, char *id, tv_t *now, char *by, return NULL; } - return cmd_auth_do(cmd, id, now, by, code, inet, cd, igndup); + return cmd_auth_do(conn, cmd, id, by, code, inet, cd, igndup); } -static char *cmd_homepage(char *cmd, char *id, __maybe_unused tv_t *now, __maybe_unused char *by, - __maybe_unused char *code, __maybe_unused char *inet, - __maybe_unused tv_t *notcd) +static char *cmd_homepage(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { K_ITEM *i_username, *u_item, *b_item, *p_item, *us_item, look; double u_hashrate5m, u_hashrate1hr; @@ -6868,9 +6959,10 @@ static char *cmd_homepage(char *cmd, char *id, __maybe_unused tv_t *now, __maybe return buf; } -static char *cmd_dsp(char *cmd, char *id, __maybe_unused tv_t *now, - __maybe_unused char *by, __maybe_unused char *code, - __maybe_unused char *inet, __maybe_unused tv_t *notcd) +static char *cmd_dsp(__maybe_unused PGconn *conn, __maybe_unused char *cmd, + char *id, __maybe_unused tv_t *now, + __maybe_unused char *by, __maybe_unused char *code, + __maybe_unused char *inet, __maybe_unused tv_t *notcd) { __maybe_unused K_ITEM *i_file; __maybe_unused char reply[1024] = ""; @@ -6897,9 +6989,10 @@ static char *cmd_dsp(char *cmd, char *id, __maybe_unused tv_t *now, */ } -static char *cmd_stats(char *cmd, char *id, __maybe_unused tv_t *now, - __maybe_unused char *by, __maybe_unused char *code, - __maybe_unused char *inet, __maybe_unused tv_t *notcd) +static char *cmd_stats(__maybe_unused PGconn *conn, char *cmd, char *id, + __maybe_unused tv_t *now, __maybe_unused char *by, + __maybe_unused char *code, __maybe_unused char *inet, + __maybe_unused tv_t *notcd) { char tmp[1024], *buf; size_t len, off; @@ -6987,7 +7080,7 @@ static struct CMDS { char *cmd_str; bool noid; // doesn't require an id bool createdate; // requires a createdate - char *(*func)(char *, char *, tv_t *, char *, char *, char *, tv_t *); + char *(*func)(PGconn *, char *, char *, tv_t *, char *, char *, char *, tv_t *); char *access; } cmds[] = { { CMD_SHUTDOWN, "shutdown", true, false, NULL, ACCESS_SYSTEM }, @@ -7425,7 +7518,7 @@ static void *summariser(__maybe_unused void *arg) return NULL; } -static void reload_line(char *filename, uint64_t count, char *buf) +static void reload_line(PGconn *conn, char *filename, uint64_t count, char *buf) { char cmd[CMD_SIZ+1], id[ID_SIZ+1]; enum cmd_values cmdnum; @@ -7475,7 +7568,8 @@ static void reload_line(char *filename, uint64_t count, char *buf) case CMD_POOLSTAT: case CMD_USERSTAT: case CMD_BLOCK: - ans = cmds[which_cmds].func(cmd, id, &now, (char *)"code", + ans = cmds[which_cmds].func(conn, cmd, id, &now, + (char *)"code", (char *)__func__, (char *)"127.0.0.1", &cd); if (ans) @@ -7513,6 +7607,7 @@ static void reload_line(char *filename, uint64_t count, char *buf) * when ckdb aborts at the beginning of the reload */ static void reload_from(tv_t *start) { + PGconn *conn = NULL; char buf[DATE_BUFSIZ+1], run[DATE_BUFSIZ+1]; size_t rflen = strlen(restorefrom); char *missingfirst = NULL, *missinglast = NULL; @@ -7540,6 +7635,8 @@ static void reload_from(tv_t *start) snprintf(data, sizeof(data), "reload.%s.s0", run); LOGFILE(data); + conn = dbconnect(); + total = 0; processing = 0; while (!finished) { @@ -7548,7 +7645,7 @@ static void reload_from(tv_t *start) count = 0; while (fgets_unlocked(data, MAX_READ, fp)) - reload_line(filename, ++count, data); + reload_line(conn, filename, ++count, data); if (ferror(fp)) { int err = errno; @@ -7609,6 +7706,8 @@ static void reload_from(tv_t *start) } } + PQfinish(conn); + snprintf(data, sizeof(data), "reload.%s.%"PRIu64, run, total); LOGFILE(data); LOGWARNING("%s(): read %d file%s, total %"PRIu64" line%s", @@ -7734,7 +7833,8 @@ static void *listener(void *arg) if (dup) send_unix_msg(sockd, last_reply); else { - ans = cmds[which_cmds].func(cmd, id, &now, (char *)"code", + ans = cmds[which_cmds].func(NULL, cmd, id, &now, + (char *)"code", (char *)__func__, (char *)"127.0.0.1", &cd); siz = strlen(ans) + strlen(id) + 32;