OK, so the segfault was all my code :) but still the error message isn't
bubbling up from postgresql in the git trunk :)
On Sun, Jan 1, 2012 at 5:28 PM, Matthew Sherborne <msherbo...@gmail.com>wrote:
> I'm betting it'll be in Transaction.C .. in the destructor or the release
> bit ..
>
> On Sun, Jan 1, 2012 at 5:23 PM, Matthew Sherborne <msherbo...@gmail.com>wrote:
>
>> So .. I used git bisect to find where it broke.
>>
>> I'm getting the segfault in all versions back to 3.1.11.
>>
>> But the failure to capture the transaction starts on this commit:
>> https://github.com/kdeforche/wt/commit/7c6324bce62fc70fe27bd41985d674ec697a89e5
>>
>> so in summary, to reproduce, using a postgres backend, have a field in
>> your table that has a unique primary key on it like:
>>
>> alberto_blog=# \d blog_post
>> Table "public.blog_post"
>> Column | Type | Modifiers
>>
>>
>> ----------+-----------------------------+--------------------------------------------------------
>> id | integer | not null default
>> nextval('blog_post_id_seq'::regclass)
>> version | integer | not null
>> *name* | text | not null
>> title | text | not null
>> dateTime | timestamp without time zone | not null
>> body | text | not null
>> Indexes:
>> "blog_post_pkey" PRIMARY KEY, btree (id)
>> * "blog_post_name" UNIQUE, btree (name)*
>> Referenced by:
>> TABLE "post_tag" CONSTRAINT "fk_post_tag_key2" FOREIGN KEY
>> (blog_post_id) REFERENCES blog_post(id)
>>
>> Then have a record in the db with name 'hi' already.
>>
>> Then this pseudo code triggers the error:
>>
>> class SomeWidget : public Wt::WContainerWidget {
>> private:
>> dbo::ptr<model::BlogPost> _post;
>> public:
>> void save() {
>> dbo::Session s = getDbSession();
>> dbo::Transaction(s);
>> _post = new model::BlogPost();
>> _post->modify()->name = "hi";
>> try {
>> t.commit();
>> catch ( std::exception& e ) {
>> myWText->setText(e.what());
>> }
>> s.add(_post);
>> t.commit();
>> }
>> };
>>
>> Of course the t.commit throws a Wt::Dbo::backend::PostgresExpcetion
>> because of the key conflict.
>>
>> Pre 7c6324bce6 the exception is caught .. and next post that happens a
>> segfault happens when the App dies and EditBlogPost widget dies, and tries
>> to kill the _post instance. It dies calling Session::mapClass. I think the
>> reason is the Session is dead at the point the widget is destroyed.
>>
>> Thanks guys for reading.
>>
>> Kind Regards,
>> Matthew Sherborne
>>
>> On Sun, Jan 1, 2012 at 3:22 PM, Matthew Sherborne
>> <msherbo...@gmail.com>wrote:
>>
>>> So I have a widget class:
>>>
>>> EditBlogPost
>>>
>>> it has a member variable:
>>>
>>> Wt::Dbo::ptr<model::BlogPost> _post;
>>>
>>> When someone hits the save button and there's a postgresql exception
>>> raise (key conflict in my case):
>>>
>>> try {
>>> t.commit();
>>> catch ( std::exception& e ) {
>>> myWText->setText(e.what());
>>> }
>>>
>>> the exception is never caught .. the whole thread dies with:
>>>
>>> Warning: Wt::Dbo:Session died with 1 active objects
>>>
>>> if I have _post as a private member .. the next http post happens and
>>> automagically segfaults trying to get session mapping or something.
>>>
>>> if I leave _post as a function local .. it doesn't segfault .. but still
>>> my catch is never reached.
>>>
>>> ----
>>>
>>> In 3.2.0 .. the catch is reached and no evil weird errors.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>
------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual
desktops for less than the cost of PCs and save 60% on VDI infrastructure
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
witty-interest mailing list
witty-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/witty-interest