This commit is contained in:
fgerlits 2006-11-29 18:59:52 +00:00
parent 50c781da5d
commit 96f4e38e38
3 changed files with 46 additions and 20 deletions

View File

@ -83,13 +83,22 @@ class Conversion
public: public:
/** /**
* Convert a boost::ptime to a odbc::Timestamp. * Constants to specify whether we round time values up or down.
*/
typedef enum { roundDown,
roundUp,
roundNearest } RoundingType;
/**
* Convert a boost::ptime to a odbc::Timestamp, rounding down.
* *
* @param ptime the boost ptime to convert. * @param ptime the boost ptime to convert.
* @return an odbc::Timestamp, holding the same time. * @return an odbc::Timestamp, holding the same time.
*/ */
static Ptr<odbc::Timestamp>::Ref static Ptr<odbc::Timestamp>::Ref
ptimeToTimestamp(Ptr<const posix_time::ptime>::Ref ptime) throw (); ptimeToTimestamp(Ptr<const posix_time::ptime>::Ref ptime,
RoundingType round = roundDown)
throw ();
/** /**
* Convert an odbc::Timestamp to a boost::ptime. * Convert an odbc::Timestamp to a boost::ptime.

View File

@ -56,18 +56,26 @@ using namespace LiveSupport::Db;
* Convert a boost::ptime to an odbc::Timestamp * Convert a boost::ptime to an odbc::Timestamp
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
Ptr<odbc::Timestamp>::Ref Ptr<odbc::Timestamp>::Ref
Conversion :: ptimeToTimestamp(Ptr<const posix_time::ptime>::Ref ptime) Conversion :: ptimeToTimestamp(Ptr<const posix_time::ptime>::Ref ptime,
RoundingType round)
throw () throw ()
{ {
gregorian::date date = ptime->date(); posix_time::ptime newPtime = *ptime;
posix_time::time_duration hours = ptime->time_of_day(); if (round == roundUp && newPtime.time_of_day().fractional_seconds() != 0) {
newPtime += posix_time::seconds(1);
} else if (round == roundNearest) {
newPtime += posix_time::microseconds(500000);
}
gregorian::date date = newPtime.date();
posix_time::time_duration time = newPtime.time_of_day();
Ptr<odbc::Timestamp>::Ref timestamp(new odbc::Timestamp(date.year(), Ptr<odbc::Timestamp>::Ref timestamp(new odbc::Timestamp(date.year(),
date.month(), date.month(),
date.day(), date.day(),
hours.hours(), time.hours(),
hours.minutes(), time.minutes(),
hours.seconds())); time.seconds()));
return timestamp; return timestamp;
} }

View File

@ -322,12 +322,12 @@ PostgresqlSchedule :: isTimeframeAvailable(
Ptr<Timestamp>::Ref timestamp; Ptr<Timestamp>::Ref timestamp;
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement( Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
isTimeframaAvailableStmt)); isTimeframaAvailableStmt));
timestamp = Conversion::ptimeToTimestamp(from); timestamp = Conversion::ptimeToTimestamp(from, Conversion::roundDown);
pstmt->setTimestamp(1, *timestamp); pstmt->setTimestamp(1, *timestamp);
pstmt->setTimestamp(2, *timestamp); pstmt->setTimestamp(2, *timestamp);
pstmt->setTimestamp(5, *timestamp); pstmt->setTimestamp(5, *timestamp);
timestamp = Conversion::ptimeToTimestamp(to); timestamp = Conversion::ptimeToTimestamp(to, Conversion::roundUp);
pstmt->setTimestamp(3, *timestamp); pstmt->setTimestamp(3, *timestamp);
pstmt->setTimestamp(4, *timestamp); pstmt->setTimestamp(4, *timestamp);
pstmt->setTimestamp(6, *timestamp); pstmt->setTimestamp(6, *timestamp);
@ -370,11 +370,13 @@ PostgresqlSchedule :: schedulePlaylist(
pstmt->setLong(1, id->getId()); pstmt->setLong(1, id->getId());
pstmt->setLong(2, playlist->getId()->getId()); pstmt->setLong(2, playlist->getId()->getId());
timestamp = Conversion::ptimeToTimestamp(playtime); timestamp = Conversion::ptimeToTimestamp(playtime,
Conversion::roundNearest);
pstmt->setTimestamp(3, *timestamp); pstmt->setTimestamp(3, *timestamp);
ends.reset(new ptime((*playtime) + *(playlist->getPlaylength()))); ends.reset(new ptime((*playtime) + *(playlist->getPlaylength())));
timestamp = Conversion::ptimeToTimestamp(ends); timestamp = Conversion::ptimeToTimestamp(ends,
Conversion::roundUp);
pstmt->setTimestamp(4, *timestamp); pstmt->setTimestamp(4, *timestamp);
result = pstmt->executeUpdate() == 1; result = pstmt->executeUpdate() == 1;
@ -416,10 +418,12 @@ PostgresqlSchedule :: storeScheduleEntry(
pstmt->setLong(1, scheduleEntry->getId()->getId()); pstmt->setLong(1, scheduleEntry->getId()->getId());
pstmt->setLong(2, scheduleEntry->getPlaylistId()->getId()); pstmt->setLong(2, scheduleEntry->getPlaylistId()->getId());
timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getStartTime()); timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getStartTime(),
Conversion::roundDown);
pstmt->setTimestamp(3, *timestamp); pstmt->setTimestamp(3, *timestamp);
timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getEndTime()); timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getEndTime(),
Conversion::roundUp);
pstmt->setTimestamp(4, *timestamp); pstmt->setTimestamp(4, *timestamp);
result = pstmt->executeUpdate() == 1; result = pstmt->executeUpdate() == 1;
@ -456,9 +460,11 @@ PostgresqlSchedule :: getScheduleEntries(
Ptr<Timestamp>::Ref timestamp; Ptr<Timestamp>::Ref timestamp;
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement( Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
getScheduleEntriesStmt)); getScheduleEntriesStmt));
timestamp = Conversion::ptimeToTimestamp(fromTime); timestamp = Conversion::ptimeToTimestamp(fromTime,
Conversion::roundDown);
pstmt->setTimestamp(1, *timestamp); pstmt->setTimestamp(1, *timestamp);
timestamp = Conversion::ptimeToTimestamp(toTime); timestamp = Conversion::ptimeToTimestamp(toTime,
Conversion::roundUp);
pstmt->setTimestamp(2, *timestamp); pstmt->setTimestamp(2, *timestamp);
Ptr<ResultSet>::Ref rs(pstmt->executeQuery()); Ptr<ResultSet>::Ref rs(pstmt->executeQuery());
@ -565,7 +571,7 @@ PostgresqlSchedule :: getCurrentlyPlaying(void) throw ()
Ptr<Timestamp>::Ref timestamp; Ptr<Timestamp>::Ref timestamp;
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement( Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
getCurrentlyPlayingStmt)); getCurrentlyPlayingStmt));
timestamp = Conversion::ptimeToTimestamp(now); timestamp = Conversion::ptimeToTimestamp(now, Conversion::roundNearest);
pstmt->setTimestamp(1, *timestamp); pstmt->setTimestamp(1, *timestamp);
pstmt->setTimestamp(2, *timestamp); pstmt->setTimestamp(2, *timestamp);
@ -611,7 +617,8 @@ PostgresqlSchedule :: getNextEntry(Ptr<ptime>::Ref fromTime)
Ptr<Timestamp>::Ref timestamp; Ptr<Timestamp>::Ref timestamp;
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement( Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
getNextEntryStmt)); getNextEntryStmt));
timestamp = Conversion::ptimeToTimestamp(fromTime); timestamp = Conversion::ptimeToTimestamp(fromTime,
Conversion::roundDown);
pstmt->setTimestamp(1, *timestamp); pstmt->setTimestamp(1, *timestamp);
Ptr<ResultSet>::Ref rs(pstmt->executeQuery()); Ptr<ResultSet>::Ref rs(pstmt->executeQuery());
@ -781,10 +788,12 @@ PostgresqlSchedule :: reschedule(Ptr<UniqueId>::Ref entryId,
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement( Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
reschedulePlaylistStmt)); reschedulePlaylistStmt));
timestamp = Conversion::ptimeToTimestamp(playtime); timestamp = Conversion::ptimeToTimestamp(playtime,
Conversion::roundNearest);
pstmt->setTimestamp(1, *timestamp); pstmt->setTimestamp(1, *timestamp);
timestamp = Conversion::ptimeToTimestamp(ends); timestamp = Conversion::ptimeToTimestamp(ends,
Conversion::roundUp);
pstmt->setTimestamp(2, *timestamp); pstmt->setTimestamp(2, *timestamp);
pstmt->setLong(3, entryId->getId()); pstmt->setLong(3, entryId->getId());