[odb-users] time_point to timestamp - pgsql?

Anurag Gupta anuragg at miltenyi.com
Wed Sep 6 20:30:48 EDT 2023


Hello,
I read somewhere that odb natively supports std::chrono::system_clock::time_point but can't find the reference anywhere. I am trying to save date time using time_point as following:

using datetime = std::chrono::system_clock::time_point;
#pragma db value (datetime) type ("timestamp") // Is this correct?




#pragma db object
someClass {
...
...

private:

      datetime last_modified;

      datetime created_date_time;

...
}

And after generating odb support code (using odb CLI) - here is the code snippet from someClass-odb.cxx:

          // last_modified

    //

    {

      ::datetime const& v =

        o.last_modified;


      bool is_null (false);

      pgsql::value_traits<

          ::datetime,

          pgsql::id_timestamp >::set_image ( //***** HERE I GET THE ERROR

        i.last_modified_value, is_null, v);

      i.last_modified_null = is_null;

    }


    // created_date_and_time

    //

    {

      ::datetime const& v =

        o.created_date_and_time;


      bool is_null (false);

      pgsql::value_traits<

          ::datetime,

          pgsql::id_timestamp >::set_image (

        i.created_date_and_time_value, is_null, v);

      i.created_date_and_time_null = is_null;

    }

Right when building it shows error:

/usr/local/include/odb/pgsql/traits.hxx: In instantiation of ‘static void odb::pgsql::default_value_traits<T, <anonymous> >::set_image(image_type&, bool&, T) [with T = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >; odb::pgsql::database_type_id ID = odb::pgsql::id_timestamp; image_type = long long int]’:
....../build/odb_gen/mbom_classes-odb.cxx:414:44:   required from here  //****** THIS LINE POINTS TO ABOVE SOURCE LINE
/usr/local/include/odb/pgsql/traits.hxx:373:43: error: invalid cast from type ‘std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >’ to type ‘odb::pgsql::default_value_traits<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >, odb::pgsql::id_timestamp>::image_type’ {aka ‘long long int’}
  373 |         i = details::endian_traits::hton (image_type (v));
      |                                           ^~~~~~~~~~~~~~

What am I doing wrong? How can I use std::chrono::system_clock::time_point in my code that can be persisted to PGSQL?

Thank you!
Anurag Gupta





More information about the odb-users mailing list