[odb-users] Segfault after adding relations

kontakt at msnoch.pl kontakt at msnoch.pl
Thu Sep 29 15:49:00 EDT 2011


 Hi

 Well, i figured out that i had cycles in my relations - that caused
 an error. Now eveyrthing works fine but i'm wondering how can I
 speedup my app. Db which I use is having table whith ~500.000 records
 of bus arrivals which are storing as boost::shared_ptr, relation
 to Line and Stop; Stop - Arrival is bidirectional so, stop is
 storing QVector of weak_ptr to arrivals. The problem is, when I
 try to find stop via street name. If Stop doesn't have pointer
 vector it works really fast, but when it is - it takes minutes.
 Do you know what can be wrong?

 Michał

 PS. I'm using PostgreSQL


 [code]
         session s;
         transaction t(db->begin());

         result start(db->query<Stop>("name ilike 'Opera'"));

         for(result::iterator i(start.begin()); i!= start.end(); ++i)
         {

             cout << "Found " << i->name().toStdString() << 
 i->street().toStdString() << endl;

         }

         t.commit();
         cout << "Route Done (" << start.size() << ")" << endl;
 [/code]

 On Thu, 29 Sep 2011 10:54:17 +0200, Boris Kolpackov wrote:
> Hi Michal,
>
> kontakt at msnoch.pl <kontakt at msnoch.pl> writes:
>
>>         transaction t(db->begin());
>>
>>         result start(db->query<Stop>(query::name == p_from ||
>> query::street == p_from));
>>
>>         for(result::iterator i(start.begin()); i!= start.end(); ++i)
>>         {
>>
>>             cout << "Found " << i->test().toStdString() << endl;
>>
>>         }
>>
>>         t.commit();
>>         cout << "Route Done (" << start.size() << ")" << endl;
>
> The only problem that I see is the use of the result object after
> the transaction has been committed (last line). Quoting the manual,
> Section 4.4, second paragraph:
>
> "The result instance is only usable within the transaction it was
>  created in. Trying to manipulate the result after the transaction
>  has terminated leads to undefined behavior."
>
> If after fixing this you still get the segfault, I will also need
> either the code fragment that persists the Stop/Line objects in the
> database or your database dump (if it is big, please send it off-
> list).
>
> Boris



More information about the odb-users mailing list