Browse Source

ckdb - modify -M to allow more options - days or shifts

master
kanoi 9 years ago
parent
commit
4d7a54d12e
  1. 27
      src/ckdb.c
  2. 5
      src/ckdb.h
  3. 85
      src/ckdb_dbio.c

27
src/ckdb.c

@ -595,7 +595,8 @@ K_TREE *markersummary_pool_root;
K_STORE *markersummary_pool_store; K_STORE *markersummary_pool_store;
// The markerid load start for markersummary // The markerid load start for markersummary
char *mark_start = NULL; char mark_start_type = '\0';
int64_t mark_start = -1;
// WORKMARKERS // WORKMARKERS
K_TREE *workmarkers_root; K_TREE *workmarkers_root;
@ -5996,7 +5997,29 @@ int main(int argc, char **argv)
markersummary_auto = true; markersummary_auto = true;
break; break;
case 'M': case 'M':
mark_start = strdup(optarg); {
bool ok = true;
switch (optarg[0]) {
case 'D': // Days * mark_start
mark_start_type = 'D';
mark_start = atoll(optarg+1);
break;
case 'S': // Shifts * mark_start
mark_start_type = 'S';
mark_start = atoll(optarg+1);
break;
case 'M': // Markerid = mark_start
mark_start_type = 'M';
mark_start = atoll(optarg+1);
break;
default:
ok = false;
break;
}
if (!ok || mark_start <= 0)
quit(1, "Invalid -M must be D, S or"
" M followed by a number>0");
}
break; break;
case 'n': case 'n':
ckp.name = strdup(optarg); ckp.name = strdup(optarg);

5
src/ckdb.h

@ -51,7 +51,7 @@
#define DB_VLOCK "1" #define DB_VLOCK "1"
#define DB_VERSION "1.0.5" #define DB_VERSION "1.0.5"
#define CKDB_VERSION DB_VERSION"-1.987" #define CKDB_VERSION DB_VERSION"-1.988"
#define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__ #define WHERE_FFL_HERE __FILE__, __func__, __LINE__
@ -2428,7 +2428,8 @@ extern K_TREE *markersummary_pool_root;
extern K_STORE *markersummary_pool_store; extern K_STORE *markersummary_pool_store;
// The markerid load start for markersummary // The markerid load start for markersummary
extern char *mark_start; extern char mark_start_type;
extern int64_t mark_start;
// WORKMARKERS // WORKMARKERS
typedef struct workmarkers { typedef struct workmarkers {

85
src/ckdb_dbio.c

@ -7755,17 +7755,86 @@ bool markersummary_fill(PGconn *conn)
{ {
ExecStatusType rescode; ExecStatusType rescode;
PGresult *res; PGresult *res;
K_ITEM *item = NULL, *p_item; K_ITEM *item = NULL, *p_item, *wm_item = NULL;
K_TREE_CTX ctx[1];
char cd_buf[DATE_BUFSIZ];
char *cd = NULL, *what = NULL;
int n, t, i, p_n; int n, t, i, p_n;
MARKERSUMMARY *row, *p_row; MARKERSUMMARY *row, *p_row;
WORKMARKERS *workmarkers;
char *params[1]; char *params[1];
char *field; char *field;
char *sel; char *sel;
int fields = 20, par = 0; int fields = 20, par = 0;
int64_t ms = 0, amt = 0;
bool ok = false; bool ok = false;
tv_t old;
LOGDEBUG("%s(): select", __func__); LOGDEBUG("%s(): select", __func__);
if (mark_start < 0)
mark_start = 0;
else {
amt = ms = mark_start;
switch (mark_start_type) {
case 'D': // mark_start days
setnow(&old);
old.tv_sec -= 60 * 60 * 24 * ms;
K_RLOCK(workmarkers_free);
wm_item = last_in_ktree(workmarkers_root, ctx);
while (wm_item) {
// Newest processed workmarker <= old
DATA_WORKMARKERS(workmarkers, wm_item);
if (CURRENT(&(workmarkers->expirydate)) &&
WMPROCESSED(workmarkers->status) &&
!tv_newer(&old, &(workmarkers->createdate)))
break;
wm_item = prev_in_ktree(ctx);
}
if (!wm_item)
mark_start = 0;
else {
mark_start = workmarkers->markerid;
tv_to_buf(&(workmarkers->createdate),
cd_buf, sizeof(cd_buf));
cd = cd_buf;
what = "days";
}
K_RUNLOCK(workmarkers_free);
break;
case 'S': // mark_start shifts (workmarkers)
K_RLOCK(workmarkers_free);
wm_item = last_in_ktree(workmarkers_root, ctx);
while (wm_item) {
DATA_WORKMARKERS(workmarkers, wm_item);
if (CURRENT(&(workmarkers->expirydate)) &&
WMPROCESSED(workmarkers->status)) {
ms--;
if (ms <= 0)
break;
}
wm_item = prev_in_ktree(ctx);
}
if (!wm_item)
mark_start = 0;
else {
mark_start = workmarkers->markerid;
tv_to_buf(&(workmarkers->createdate),
cd_buf, sizeof(cd_buf));
cd = cd_buf;
what = "shifts";
}
K_RUNLOCK(workmarkers_free);
break;
case 'M': // markerid = mark_start
break;
default:
/* Not possible unless ckdb.c is different
* in which case it will just use mark_start */
break;
}
}
// TODO: limit how far back // TODO: limit how far back
sel = "declare ws cursor for select " sel = "declare ws cursor for select "
"markerid,userid,workername,diffacc,diffsta,diffdup,diffhi," "markerid,userid,workername,diffacc,diffsta,diffdup,diffhi,"
@ -7774,14 +7843,16 @@ bool markersummary_fill(PGconn *conn)
"lastshareacc,lastdiffacc" "lastshareacc,lastdiffacc"
MODIFYDATECONTROL MODIFYDATECONTROL
" from markersummary where markerid>=$1"; " from markersummary where markerid>=$1";
par = 0; par = 0;
if (mark_start) params[par++] = bigint_to_buf(mark_start, NULL, 0);
params[par++] = mark_start;
else
params[par++] = "0";
PARCHK(par, params); PARCHK(par, params);
LOGWARNING("%s(): loading from markerid>=%s", __func__, params[0]); LOGWARNING("%s(): loading from markerid>=%s", __func__, params[0]);
if (cd) {
LOGWARNING(" ... %s = %s >= %"PRId64" %s",
params[0], cd, amt, what);
}
printf(TICK_PREFIX"ms 0\r"); printf(TICK_PREFIX"ms 0\r");
fflush(stdout); fflush(stdout);
@ -8016,6 +8087,10 @@ flail:
res = PQexec(conn, "Commit", CKPQ_READ); res = PQexec(conn, "Commit", CKPQ_READ);
PQclear(res); PQclear(res);
for (i = 0; i < par; i++)
free(params[i]);
par = 0;
if (ok) { if (ok) {
LOGDEBUG("%s(): built", __func__); LOGDEBUG("%s(): built", __func__);
LOGWARNING("%s(): fetched %d markersummary records", __func__, n); LOGWARNING("%s(): fetched %d markersummary records", __func__, n);

Loading…
Cancel
Save