/*-------------------------------------------------------------------------- Call this once when the server is starting up. --------------------------------------------------------------------------*/ void servscor_init(dp_t *dp, const char *wmqDirectory) { dp_result_t err; char key[dptab_KEY_MAXLEN]; assoctab_t *types; int i; /* Create table to receive reports from clients. */ key[0] = dp_KEY_MYSCORES; err = dptab_createTable(dp->dt, &myscoretab, key, 1, 0, NULL, NULL, scores_cb, dp); if (err != dp_RES_OK && err != dp_RES_ALREADY) { printf("servscor_init: Can't init myscoretab.\n"); exit(1); } wmq = wmq_create(wmqDirectory, 1); if (!wmq) { printf("servscor_init: Can't init wmq in dir:%s.\n", wmqDirectory); exit(1); } err = wmq_seek(wmq, time(NULL), 0); if (err != dp_RES_OK) { printf("servscor_init: wmq_seek returns err:%d.\n", err); exit(1); } /* set serverTag to our IP addr, including port */ err = wmq_setServerTag(wmq, dp->dpio->myAdr, dp->dpio->myAdrLen); if (err != dp_RES_OK) { printf("servscor_init: wmq_setServerTag returns err:%d.\n", err); exit(1); } }
int main() { dp_result_t err; time_t now, t_last, t_start = time(NULL); wmq_t *wmq; wmq_record_t record; char buf[1024]; char *pbuf; unsigned short len; time_t data; long offset_old = 0; time_t t_old = t_start; record.buf = buf; record.buflen = 1024; wmq = wmq_create("wmq", 0); assert(wmq); now = time(0); err = wmq_seek(wmq, now, 0); /* seek to beginning of today */ assert(!err); while (1) { char *pbuf = buf; char sessid[8]; /* inet only: inetadr(4) port(2) karma(2) */ dp_species_t sessType; dp_uid_t uid; dpid_t id; scorerep_t *rep; scorerep_buf_t repbuf; scorerep_player_t *player; int score; int won; err = wmq_get(wmq, &record); assert(err == dp_RES_OK || err == dp_RES_EMPTY); if (err != dp_RES_OK) continue; DPRINT(("wmq2mysql: read %d bytes, time:%08x: %s\n", record.datalen, wmq->t, hexstring(record.buf, record.datalen))); if (record.datalen < 12) { DPRINT(("wmq2mysql: len %d is not big enough for a header!\n", record.datalen)); exit(1); } memcpy(sessid, pbuf, 8); pbuf += 8; sessType = dpMAKESHORT(pbuf[0], pbuf[1]); pbuf += 2; repbuf.len = dpMAKESHORT(pbuf[0], pbuf[1]); pbuf += 2; assert(repbuf.len > 0 && repbuf.len < scorerep_MAX_BUFLEN); memcpy(repbuf.buf, pbuf, repbuf.len); rep = scorerep_create(); if (rep == NULL) { DPRINT(("wmq2mysql: can't create scorerep\n")); exit(1); } err = scorerep_fromBuf(rep, &repbuf); if (err != dp_RES_OK) { DPRINT(("wmq2mysql: scorerep_fromBuf returns err:%d\n", err)); exit(1); } if (!(rep->flags & scorerep_FLAGS_SELFEXIT)) { DPRINT(("wmq2mysql: ignoring non-SELFEXIT score\n")); continue; } uid = rep->uid; id = rep->id; player = (scorerep_player_t *)assoctab_subscript(rep->players, id); if (!player) { DPRINT(("wmq2mysql: no entry for self (id:%d) in SELFEXIT!\n", id)); exit(1); } assert(uid == player->uid); DPRINT(("wmq2mysql: read sessType:%d uid:%d (id:%d)\n", sessType, uid, id)); if (player->bloblen < 3) { DPRINT(("wmq2mysql: report has bloblen:%d, no room for standard score + win byte\n", player->bloblen)); continue; } score = dpMAKESHORT(player->blob[0], player->blob[1]); won = (int)player->blob[2]; DPRINT(("wmq2mysql: read score:%d won:%d\n", score, won)); } wmq_destroy(wmq); return 0; }