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; }