void clearhead(headtyp *hp) /* Eliminerar alla länkar från listan */ { linktyp *ep; while ( !empty(hp) ) { ep = firstlink(hp); elimlink(&ep); } }
void insort(linktyp *lp, headtyp *hp, int (*is_less)(datatyp d1, datatyp d2)) /* Sätter in länken sorterad enligt is_less */ { linktyp *sp, *ep; newlink(&sp); *sp = *lp; infirst(sp, hp); ep = lastlink(hp); // if(ep == NULL) return; while ( is_less(lp->data, ep->data) ) ep = predlink(ep); insucc(lp, ep); elimlink(&sp); }
pwr_tInt32 GetOldestEvents(pwr_tUInt32 *nrOfEvents , pwr_tUInt32 *nrOfKeys) { sKey *tmpData; pwr_tInt32 ret; DBT data, key; DBC *dbcp; pwr_tUInt32 evCount = 0; pwr_tUInt32 tmp = 0; dbcp = NULL; /* Acquire a cursor for the database. */ if ((ret = dataBaseP->cursor(dataBaseP, NULL, &dbcp, 0)) != 0) { errh_Error("error dataBaseP->cursor: %s\n", db_strerror(ret)); return RT_ELOG_UNKNOWN_ERROR; } /* Initialize the key/data return pair. */ memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); /*Get the first event*/ if((ret = dbcp->c_get(dbcp, &key, &data, DB_FIRST)) != 0) { *nrOfEvents = 0; return RT_ELOG_DB_EMPTY; } evCount++; tmpData = (sKey *)key.data; newlink(&lanklank); putlink(*tmpData, lanklank); insort(lanklank, listhead, &compTime); tmp++; while((ret = dbcp->c_get(dbcp, &key, &data, DB_NEXT)) == 0) { evCount++; tmpData = (sKey *)key.data; newlink(&lanklank); putlink(*tmpData, lanklank); insort(lanklank, listhead, &compTime); tmp++; if(nrlinks(listhead) > KEY_ARRAY_SIZE) { tmp--; lanklank = lastlink(listhead); elimlink(&lanklank); } } if(ret != DB_NOTFOUND) { errh_Error("Error dbcp->c_get(DB_NEXT): %s\n", db_strerror(ret)); return RT_ELOG_UNKNOWN_ERROR; } /*Close the cursor*/ if((ret = dbcp->c_close(dbcp)) != 0) { errh_Error("Error dbcp_oldest->c_close(): %s\n", db_strerror(ret)); } *nrOfEvents = evCount; *nrOfKeys = tmp; return RT_ELOG_OK; }
void Store( pwr_tBoolean *firstTime, pwr_tUInt32 *nrOfEvents, pwr_tUInt32 *nrOfKeys ) { char msg[80]; pwr_tInt32 ret = 0; DBT key; sKey skey; /*flush the cache to the DB-file*/ dataBaseP->sync(dataBaseP, 0); /*check if it's time to clean the DB*/ if( *firstTime || ((*nrOfEvents + nrOfInsertsSinceLastTime) > lHelCB.MaxCardinality ) ) { *firstTime = FALSE; if(nrOfInsertsSinceLastTime > 0) { nrOfInsertsSinceLastTime--; *nrOfEvents = *nrOfEvents + 1; } if( *nrOfKeys <= 0) { ret = GetOldestEvents(nrOfEvents, nrOfKeys); nrOfInsertsSinceLastTime = 0; switch(ret) { case RT_ELOG_UNKNOWN_ERROR: errh_Error("RT_ELOG_UNKNOWN_ERROR"); break; case RT_ELOG_OK: break; case RT_ELOG_DB_EMPTY: break; default: errh_Error("Undefined return: %d", ret); break; } } else { lanklank = firstlink(listhead); skey = getlink(lanklank); memset(&key, 0, sizeof(key)); key.data = &skey; key.size = sizeof(sKey); if( (ret = dataBaseP->del(dataBaseP, NULL, &key, 0)) != 0 ) { sprintf(msg, "Error deleting Record in HistDB nrOfKeys = %d Errmess=%s\n", *nrOfKeys, db_strerror(ret)); Log(msg); } else { *nrOfEvents = *nrOfEvents - 1; } elimlink(&lanklank); *nrOfKeys = *nrOfKeys - 1; } } if(*nrOfKeys > 0) { lanklank = firstlink(listhead); if(lanklank != 0) { writeInfo(*nrOfEvents+nrOfInsertsSinceLastTime, 0, &lanklank->data.EventTime); } else { writeInfo(*nrOfEvents+nrOfInsertsSinceLastTime, 0, NULL); } } else { writeInfo(*nrOfEvents+nrOfInsertsSinceLastTime, 0, NULL); } }