How to know which subrequestId to work with?

Frank Fock Frank.Fock____t-online.de
Thu Apr 11 19:47:58 CEST 2002


Hi Kjersti,

I have considered to include the subrequest ID in the interface of update.
I ended up with the current design, because the MibTable::update should
not operate on a subrequest basis. Rather than, it should update all necessary
data for the whole request in one go and remember the last transaction IDs
to avoid duplicate updates. In addition a timer could be used to avoid additional
updates within a given time interval.

The MibTable::update method is called from the class Mib when processing
a request.

Best regards,
Frank

Kjersti Grønnevik wrote:

> Hi
>
> I have a dynamic table which fetches the requested rows from DB when a new request comes. The cache is emptied when a new request comes.
>
> My problem is that I need the subrequestId to get the right row from DB and I can't seem to find any function that can give the Id?
>
> Any suggenstions will be highly appreciated!
>
> I first worked around this by creating this function and call it:
>
> ----------------------------------------------------------------
> void AptEntry::update(Request* req, int subReqIndex)
> {
>         start_synch();
>         currentSubReqIndex = suReqIndex; // currentSubReqIndex is a global variable so the suReqIndex is                                                   // available in the update(req) function
>         update(req);                       // calls the function, but it is also called elsewhere?
>         lastReqId = req->get_request_id(); // to see if the subRequest is from the same request or a new                                                     //one
>         end_synch();
> }
> -----------------------------------------------------------------
> But this function is never called, and I don't know where to call it from. It will not be called from the table index get_request, and where else to put the call?
>
> I have filled the update(request req); function with my own code and I think it will work(?), but it depends on the currentSubReqIndex.
> -----------------------------------------------------------------
>
> void lvAptEntry::update(Request* req)
> {
> // clear table rows if this is a new request
> unsigned long currentReqId = req->get_request_id();
> if( lastReqId != currentReqId )
> {
>   removeAllAPTEntries();
> }
>
>   Oidx oid = req->get_oid( currentSubReqIndex );
>   Oidx oid_aptId = getPrimaryKeyAsOID( oid ); //extract the index/APT.id from the oid
>
> //use this index to fetch the corresponding row in the APT table in the DB and cache the row data.
>   long aptId = getPrimaryKeyAsLong( oid );
>
> try
> {
>         LVDatabase *db = LVDatabase::getInstance();
>
>         APTEntry aptEntry;
>
>         // GET
>         if(req->get_type() == 160)
>         {
> //use this index and check cache if corresponding row data already has been loaded from DB in this request
>           MibTableRow* existingRow = find_index( oid_aptId );
>
> // if row data exists in cache - the cached row data are available
> // else
>                 if( existingRow == 0 )
>                 {
>                         aptEntry = db->getAPTEntry( aptId ); //get the row from db
>                         if( aptEntry.exists() == true )
>                         {
>                                 addEntry( aptEntry, oid_aptId );  //add the row with the row data from db
>                         }
>                 }
>         }
> // GET NEXT
>         else if(req->get_type() == 161)
>         {
>           Oidx nextOidId = computeNextOID( oid );//Finds out what the next rowIndex would be
>
>         MibTableRow* existNextRow = find_index( nextOidId ); //Checks if the row is already fetched
>
>           if( existNextRow == 0 )// If not fetched, fetch the row from db
>           {
>                 aptEntry = db->getNextAPTEntry( aptId );  //get row from db
>
>                 if( aptEntry.exists() )
>                 {
>                         Oidx oid_nextAptId = getPrimaryKeyAsOID( aptEntry ); //get the rowId
>                         addEntry( aptEntry, oid_nextAptId );  //add the row with the row data from db
>                 }
>                 else
>                 {
>                         Oidx oid_collumnNr = oid.cut_right( 1 );//find which collumn that is asked for
>                         long colNr = oid_collumnNr.last();
>
>                         if( colNr < 31 ) //If not the last column in DB table
>                 {
>                                 aptEntry = db->getNextAPTEntry( (long)-1 );  //get first row from db
>                                 if( aptEntry.exists() )
>                                 {
>                                         Oidx oid_nextAptId = getPrimaryKeyAsOID( aptEntry ); //get the rowId
>                                         addEntry( aptEntry, oid_nextAptId );  //add the row with the row data from db
>                                 }
>                         }
>                 }
>            }
>         }
> }
> catch( exception& e )
> {
>         char catchBuffer[200];
>         sprintf( catchBuffer, "lvAptEntry.update(.) Standard library exception: SQL error %d ", e );
>         Log::addEvent( Log::INFO, catchBuffer, LOC );
> }
> catch( ... )
> {
>         char catchBuffer[200];
>         sprintf( catchBuffer, "lvAptEntry.update(.) Standard library exception: SQL error " );
>         Log::addEvent( Log::INFO, catchBuffer, LOC );
> }
> }
>
> ---------------------------------------
> Oidx lvAptEntry::find_succ(const Oidx& oid, Request* req)
> {
>  MibLeaf* leaf = find_next( oid );
>  if( leaf )
>  {
>         return leaf->get_oid();
>  }
>  else
>  {
>         return Oidx();
>  }
> }
>
> -----------------------------------------------------------------------
> void lvAptEntry::removeAllAPTEntries()
> {
> //remove old rows from MibTable
>         clear();
>         delete_rows.clearAll();
>         notready_rows.clearAll();
> }
> -----------------------------------------------------------------------
>
> Hope this is understandable and thanks so much for great help so far!
>
> Best regards,
> Kjersti

--
Frank Fock - AGENT++
Email: fock____agentpp.com
Fax: +49 7195 177108






More information about the AGENTPP mailing list