[odb-users] How to cache the queried object pointer?

Justin Huang yohuang at nvidia.com
Mon Nov 4 23:56:24 EST 2019


It is weird that there was no Module_ports table when I loaded the sqlite3 DB.



-----Original Message-----
From: Justin Huang 
Sent: Tuesday, November 5, 2019 10:47 AM
To: odb-users at codesynthesis.com
Subject: RE: [odb-users] How to cache the queried object pointer?

Hi Boris,

Thanks. It works.

But I saw a weird issue when I use i.load() to query data members.

Below I have a Module class, Instance class and Port class. I persisted the ports() and instances() of Module object, and confirmed that they were persisted in sqlite3 DB.

I tried to use i.load() pointer to access ports(), the returned ports() size is 0, but size of instances() is not 0.

        session s;
        db = std::unique_ptr<odb::database>(create_database (argc, argv));

        // load modules
        {
            odb::transaction t (db->begin());

            typedef odb::result<Module> result;
            result all_modules (db->query<Module> ());

            int count = 0;
            for (result::iterator i(all_modules.begin()); i != all_modules.end(); ++i) {
                std::shared_ptr<Module> p (i.load());
                std::cout << "loading module: " << p->name() << std::endl;
                std::cout << "ports size: "            << p->ports().size() << std::endl;
                std::cout << "instances size: "    << p->instances().size() << std::endl;
                for (auto port: p->ports())
                    std::cout << "loading module port: " << port->name() << std::endl;
             
                for (auto inst: p->instances())
                    std::cout << "loading module inst: " << inst->name() << std::endl;
            }

Any suggestions to debug this?

Thanks.

-------------------------------------------------------
# Module, Port, Instance class declaration
-------------------------------------------------------
#pragma db object
class Module: public NamedHessObject
{
public:
    Module(std::string name);
   ~Module();

    std::vector<Port*>&               ports();
    std::vector<Instance*>&       instances();
    std::vector<Connection*>& connections();
    std::string                                as_string();
    static Module*                       find_by_name(std::string name);

public:
    #pragma db transient
    static std::map<std::string, Module*> modules_;
    static size_t count;

private:
    friend class odb::access;
    Module();

private:
    std::vector<Port*>               ports_;
    std::vector<Instance*>       instances_;
    std::vector<Connection*> connections_; }; // class Module

#pragma db object
class Instance: public NamedHessObject
{
public:
    Instance(std::string name);
   ~Instance();

    Module*                 module();
    void                         module(Module* module);

    Module*                 owner();
    void                         owner(Module* owner);

    std::vector<PortRef *>& portrefs();
    std::string                          as_string();

public:
    static size_t count;

private:
    friend class odb::access;
    Instance();

private:
    Module*                           owner_;  // owner module
    Module*                           module_; // instantiated module
    std::vector<PortRef *>  portrefs_;
}; // class Instance

#pragma db object
class Port: public NamedHessObject
{
public:
    Port(std::string name);
    Port();
   ~Port();

    std::string                direction();
    void                           direction(std::string direction);

    Module*                    owner();
    void                             owner(Module* owner);

    Interface*                 interface();
    void                            interface(Interface* interface);

    std::vector<Connection *>& connections();
    std::string                                  as_string();

public:
    static size_t count;

private:
    friend class odb::access;

private:
    std::string                 direction_;
    Module*                   owner_;       // module this port belongs to.
    Interface*                interface_;   // instantiated interface.
    std::vector<Connection *> connections_; // channels connected to this port inside the owner_ module }; // class Port



-----Original Message-----
From: Boris Kolpackov <boris at codesynthesis.com>
Sent: Friday, November 1, 2019 11:07 PM
To: Justin Huang <yohuang at nvidia.com>
Cc: odb-users at codesynthesis.com
Subject: Re: [odb-users] How to cache the queried object pointer?

Justin Huang <yohuang at nvidia.com> writes:

>            typedef odb::result<Module> result;
>            result all_modules (db->query<Module> ());
> 
>            int count = 0;
>            for (result::iterator i(all_modules.begin()); i != all_modules.end(); ++i) {
>                 auto ptr = i.operator->();
>                 modules.push_back(ptr);

You should use result::iterator::load() (i.load()) to load an object from a query result. See Section 4.4, "Query Result" for details.
-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------



More information about the odb-users mailing list