Feature #2840 ยป 0001-Support-postgres-TIMESTAMP-WITH-TIME-ZONE.patch
src/Wt/Dbo/backend/Postgres.C | ||
---|---|---|
else {
|
||
v = boost::posix_time::to_iso_extended_string(value);
|
||
v[v.find('T')] = ' ';
|
||
/*
|
||
* Add explicit timezone offset. Postgres will ignore this for a TIMESTAMP
|
||
* column, but will treat the timestamp as UTC in a TIMESTAMP WITH TIME ZONE
|
||
* column -- possibly in a legacy table.
|
||
*/
|
||
v.append("+00");
|
||
}
|
||
setValue(column, v);
|
||
... | ... | |
if (type == SqlDate)
|
||
*value = boost::posix_time::ptime(boost::gregorian::from_string(v),
|
||
boost::posix_time::hours(0));
|
||
else
|
||
*value = boost::posix_time::time_from_string(v);
|
||
else {
|
||
/*
|
||
* Handle timezone offset. Postgres will append a timezone offset [+-]dd
|
||
* if a column is defined as TIMESTAMP WITH TIME ZONE -- possibly
|
||
* in a legacy table. If offset is present, subtract it for UTC output.
|
||
*/
|
||
if (v.size() >= 3 && std::strchr("+-", v[v.size() - 3]))
|
||
*value = boost::posix_time::time_from_string(v.substr(0, v.size() - 3)) -
|
||
boost::posix_time::hours(boost::lexical_cast<int>(v.substr(v.size() - 3)));
|
||
else
|
||
*value = boost::posix_time::time_from_string(v);
|
||
}
|
||
DEBUG(std::cerr << this
|
||
<< " result time_duration " << column << " " << *value << std::endl);
|
test/dbo/DboTest.C | ||
---|---|---|
delete model;
|
||
}
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test22a )
|
||
{
|
||
#ifdef POSTGRES
|
||
DboFixture f;
|
||
dbo::Session *session_ = f.session_;
|
||
Wt::WDateTime datetime1 = Wt::WDateTime(Wt::WDate(2009, 10, 1),
|
||
Wt::WTime(12, 11, 31));
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
session_->execute("SET TIME ZONE \"America/New_York\"");
|
||
dbo::ptr<A> a1(new A());
|
||
a1.modify()->datetime = datetime1;
|
||
session_->add(a1);
|
||
t.commit();
|
||
}
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
dbo::ptr<A> a2 = session_->find<A>();
|
||
BOOST_REQUIRE(a2->datetime == datetime1);
|
||
}
|
||
#endif //POSTGRES
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test22b )
|
||
{
|
||
#ifdef POSTGRES
|
||
DboFixture f;
|
||
dbo::Session *session_ = f.session_;
|
||
Wt::WDateTime datetime1 = Wt::WDateTime(Wt::WDate(2009, 10, 1),
|
||
Wt::WTime(12, 11, 31));
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
session_->execute("SET TIME ZONE \"Europe/Brussels\"");
|
||
dbo::ptr<A> a1(new A());
|
||
a1.modify()->datetime = datetime1;
|
||
session_->add(a1);
|
||
t.commit();
|
||
}
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
dbo::ptr<A> a2 = session_->find<A>();
|
||
BOOST_REQUIRE(a2->datetime == datetime1);
|
||
}
|
||
#endif //POSTGRES
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test22c )
|
||
{
|
||
#ifdef POSTGRES
|
||
DboFixture f;
|
||
dbo::Session *session_ = f.session_;
|
||
Wt::WDateTime datetime1 = Wt::WDateTime(Wt::WDate(2009, 10, 1),
|
||
Wt::WTime(12, 11, 31));
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
session_->execute("ALTER TABLE table_a ALTER COLUMN datetime "
|
||
"SET DATA TYPE TIMESTAMP WITH TIME ZONE" );
|
||
session_->execute("SET TIME ZONE \"America/New_York\"");
|
||
dbo::ptr<A> a1(new A());
|
||
a1.modify()->datetime = datetime1;
|
||
session_->add(a1);
|
||
t.commit();
|
||
}
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
dbo::ptr<A> a2 = session_->find<A>();
|
||
BOOST_REQUIRE(a2->datetime == datetime1);
|
||
}
|
||
#endif //POSTGRES
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test22d )
|
||
{
|
||
#ifdef POSTGRES
|
||
DboFixture f;
|
||
dbo::Session *session_ = f.session_;
|
||
Wt::WDateTime datetime1 = Wt::WDateTime(Wt::WDate(2009, 10, 1),
|
||
Wt::WTime(12, 11, 31));
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
session_->execute("ALTER TABLE table_a ALTER COLUMN datetime "
|
||
"SET DATA TYPE TIMESTAMP WITH TIME ZONE" );
|
||
session_->execute("SET TIME ZONE \"Europe/Brussels\"");
|
||
dbo::ptr<A> a1(new A());
|
||
a1.modify()->datetime = datetime1;
|
||
session_->add(a1);
|
||
t.commit();
|
||
}
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
dbo::ptr<A> a2 = session_->find<A>();
|
||
BOOST_REQUIRE(a2->datetime == datetime1);
|
||
}
|
||
#endif //POSTGRES
|
||
}
|