示例#1
0
void clearhead(headtyp *hp)
/* Eliminerar alla länkar från listan */
{
   linktyp *ep;

   while ( !empty(hp) )
   {
      ep = firstlink(hp);
      elimlink(&ep);
   }
}
示例#2
0
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);
}
示例#3
0
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;
}  
示例#4
0
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);
  }
}