[odb-users] Object creator with boost::posix_time::ptime member : exception from boost

rkadeFR contact at rkade.fr
Thu Jun 6 13:02:17 EDT 2013


On 06/06/2013 17:45, rkadeFR wrote:
>
> On 06/06/2013 17:38, Boris Kolpackov wrote:
>> Hi,
>>
>> rkadeFR <contact at rkade.fr> writes:
>>
>>> I have some "0000-00-00 00:00:00" datetime in my DB (I can't change 
>>> that).
>>>
>>> So i put lots of log, and I can only see the private constructor
>>> called, and then... nothing except my exception.
>>>
>>> Can you explain me the way the iterator works?
>> The actual object loading happens when you dereference the iterator.
>> What probably happens in your case is ODB is trying to load one of
>> the objects with the "0000-00-00 00:00:00" value and since it is
>> not valid for Boost ptime, an exception is thrown.
> Something I noticed: my member is a boost::posix_time::ptime
> object, but the exception is about a gregorian::date. I read the code
> of boost, and I assume that pTime includes a gregorian::date object.
>>
>>> And the work around I need to implement in order to avoid the
>>> exception ?
>> The easiest would be to change your database to represent invalid
>> datetimes (that's what I assume "0000-00-00 00:00:00" are used for)
>> as NULL values. ODB will then map such NULL values to the special
>> not_a_date_time value -- nice and clean.
> 1- I can't change the database
> 2- It's used as a negative infinite value :s
>>
>> The alternative would be for us to add extra code to ODB in order
>> to recognize all-zero datetime values and treat them as NULL.
> Can I change the constructor of the object?
> Or the copy?
I tried to change the behavior of the setter on another object. And
I figure out that odb use the setter to fill the members of the objects
through these setters.

But as a setter, it takes already a const boost::posix_time::ptime&
object, which is created before by ODB.

I think the exception is thrown before by ODB than it reaches the
setter method.

void SetDateTime( const boost::posix_time::ptime& dateTime)
     { std::cout << "this is setter date time" << std::endl;
     this->dateTime = dateTime; }

with the pragma... set(SetDateTime).
>
> If I understand, ODB construct an empty object with the private
> cTor, and then fill the member with some copy?
> Can I change the behavior of this copy to handle the exception?
>> Boris
>
>



More information about the odb-users mailing list