[odb-users] Proper way to reload QLazySharedPointer objects within a session

Rene Jensen rene at catatonic.dk
Wed Jun 6 08:30:57 EDT 2012


Hi odb-list.

I am trying to map a hierachy of objects into a Qt tree view model. In
order to keep potential problems to a minimum, I decided that whenever
 anything is changed, all data should simple be reloaded.

My database object is trivial:


#pragma db object session
#pragma db object table("my_table_name")
#pragma db object pointer(QSharedPointer)

class MyObject: public ProxyBase
{
public:
    friend class odb::access;

    #pragma db id  auto
    qint32 id;

    #pragma db null
    #pragma db column("super_id")
    QLazySharedPointer<MyObject> supergroup;

    #pragma db value_not_null inverse(supergroup)
    QList<QLazyWeakPointer<MyObject> >   subgroups;
};



... which clearly forms a tree. I recursively load all objects at
startup (again, to minimize chance of complications), and upon any
change, I want to reload everything. First I try to flush:
    foreach (MyObject_LazySharedPointer P, myPool.values()):

    {
        P.unload();
    }


Trouble with duplicated instances forced me to use sessions. Now I
cannot properly reload the tree, even though I call
QLazySharedPointer::reload on all my instances:

        for (MyObject_Result::iterator I (result.begin()); I !=
result.end(); ++I)
        {
            MyObject_LazySharedPointer P = I.load();
            db->reload (P.data());

            myPool[ P->id) ] = P;
            loadRecursively(P); // ... doing the same thing inside
loadRecursively: reload each subgroup...
        }


---------------

A slightly confusing setup, I admit. Here's the question:

    Can database::reload be used to force a reload of an object that
is already owned by a QLazySharedPointer?
    Assuming I can't get rid of all QLazySharedPointers. Is there any
way to force a reload of those objects?

Best regards,
Rene Jensen



More information about the odb-users mailing list