implementing a large table over a database
Frank Fock
Frank.Fock____t-online.de
Mon Oct 28 23:42:12 CET 2002
Hi Dave,
Comments inline:
Dave Mason wrote:
> Hi,
> Hope you dont mind a follow-up to this, I'm still getting handle on
> these methods. I prefer the MibTable subclass approach, since the data
> I'm working with is owned by an existing MibTable subclass produced by
> AgentGen. It would be pretty simple to add some new code there. Any
> extra detail about the update() method and Request accessors will help.
> I see the parameter is a Request*, which must have a varbind with the
> table's OID. If the request is for one row only I guess the OID would
> have the row's index appended? In any case, as you say I need to read a
Yes, that's right. But keep in mind that a request may access different
rows in the target table and also other objects in the agent.
> subset of the rows, stuff into memory for the rest of agent++, free the
> memory when done, and repeat till all rows are read. The comments for
> update() say it only gets called once, so I'm not sure how to use it.
The update method gets called at least once, but never after a request
has been finished. So you will have to stuff code to cleanup your cache
in the get_request method (and check there whether the request is about
to be finished).
> When I pre-populate a table, do I need to explitly generate each
> MibTableRow, create the columnar objects, and set the values?
>
Yes. You will have to create all rows completely that will be accessed
by the request. This can be hard to determine if it is a GETBULK
request with several repeaters. In this case it could be easier to
populate the whole table from a given index which is determined by the
minimum index of the objects referenced in the GETBULK request.
> Also, we wrote a simple database with the Gnu gdbm library instead of
> using MySql. libgdbm is not thread safe or reentrant, but I believe I
> should be OK if I protect my database access with start_sync and end_sync?
>
Yes it could be sufficient. But as I pointed out in my other email about
"mutex lock on persistence updates", be sure that the scope of the lock
is sufficient.
Best regards,
Frank
> Thanks again,
> Dave
>
> Frank Fock wrote:
>
>> Hi Dave,
>>
>> There have been several AGENT++ users that integrated
>> database access as part of table implementaions.
>> I recommend that you implement some generic approach
>> in your own MibComplexEntry or MibTable subclass.
>> You should use MibTable, if you users should be able to
>> create rows in the table. In other cases both approaches
>> have pros and cons.
>> If you choose to use MibTable, then you should overwrite
>> its update Method to create a view of a small (required)
>> portion of the table from the database when a request is
>> being processed. You will have to take some precautions
>> regarding synchronization between concurrent requests to
>> the same table.
>>
>> I have not used MySQL in C++ yet, so I cannot help here
>> (may be someone else can?).
>>
>> Best regards,
>> Frank
>>
>> Dave Mason wrote:
>>
>>> Hi all,
>>> I need to implement an alarm log, which will be a child of MibTable,
>>> with rows and columns that will correspond to similar rows and
>>> columns in a database. The tables I have done before are entirely
>>> memory resident because they don't grow continuously, but the log
>>> table will keep growing. I dont want to keep all the rows in memory,
>>> so does anybody have a suggestion as to how to have the table object
>>> read a row, update any new values (for a Set) or just return it (for
>>> a Get), then delete the row from memory before moving to the next
>>> row? In a normal table, the table object creates a row, then the
>>> columnar objects are responsible for getting their values. In this
>>> case, I'd like to operate on the whole row at once with a select or
>>> update statement. Maybe you need to to have a MibTableRow method
>>> read the row into some temporary space, and let the columnar objects
>>> get their data from there? Any tips about that would help a lot.
>>>
>>> Also, I'll probably use some public domain database like mysql, which
>>> I havent used before. Questions about that are beyond the scope of
>>> this list, but any tips on how to integrate it with Agent++ would be
>>> very helpful too.
>>>
>>> Regards,
>>> Dave
>>>
>
>
>
More information about the AGENTPP
mailing list