void glite_lbu_TimeToDB(time_t t, char **str);
+/**
+ * Convert double into database-specific time string.
+ *
+ * The result string can be used directly in SQL commands.
+ *
+ * \param[in] t the converted time
+ * \param[out] str result allocated string
+ */
+void glite_lbu_TimestampToDB(double t, char **str);
+
+
/**
* Convert database-specific time string to time_t.
*
* \param GLITE_LBU_DB_TYPE_...BLOB/TEXT void *b, unsigned long len
* \param GLITE_LBU_DB_TYPE_[VAR]CHAR char *str
* \param GLITE_LBU_DB_TYPE_DATE/TIME/DATETIME time_t t
- * \param GLITE_LBU_DB_TYPE_TIMESTAMP time_t t
+ * \param GLITE_LBU_DB_TYPE_TIMESTAMP double t
+ * \param GLITE_LBU_DB_TYPE_BOOLEAN int b
* \param GLITE_LBU_DB_TYPE_NULL -
*
* \return number of affected rows, -1 on error
static int transaction_test(glite_lbu_DBContext ctx);
static int FetchRowSimple(glite_lbu_DBContext ctx, MYSQL_RES *result, unsigned long *lengths, char **results);
static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results);
-static void set_time(MYSQL_TIME *mtime, const time_t time);
+static void set_time(MYSQL_TIME *mtime, const double time);
static void glite_lbu_DBCleanup(void);
static void glite_lbu_FreeStmt_int(glite_lbu_Statement stmt);
}
+void glite_lbu_TimestampToDB(double t, char **str) {
+ time_t tsec = t;
+ struct tm *tm = gmtime(&tsec);
+
+ t = t - tsec + tm->tm_sec;
+ asprintf(str,"'%4d-%02d-%02d %02d:%02d:%02.09f'",tm->tm_year+1900,tm->tm_mon+1,
+ tm->tm_mday,tm->tm_hour,tm->tm_min,t);
+}
+
+
time_t glite_lbu_DBToTime(const char *str) {
struct tm tm;
int i, prepare_retry;
glite_lbu_DBType type;
char *pchar;
+ int *pint;
long int *plint;
MYSQL_TIME *ptime;
glite_lbu_DBContext ctx;
*plint = va_arg(ap, long int);
break;
+ case GLITE_LBU_DB_TYPE_BOOLEAN:
+ pint = binds[i].buffer = data[i] = malloc(sizeof(int));
+ *pint = va_arg(ap, int) ? 1 : 0;
+ break;
+
case GLITE_LBU_DB_TYPE_TINYBLOB:
case GLITE_LBU_DB_TYPE_TINYTEXT:
case GLITE_LBU_DB_TYPE_BLOB:
case GLITE_LBU_DB_TYPE_DATE:
case GLITE_LBU_DB_TYPE_TIME:
case GLITE_LBU_DB_TYPE_DATETIME:
- case GLITE_LBU_DB_TYPE_TIMESTAMP:
ptime = binds[i].buffer = data[i] = malloc(sizeof(MYSQL_TIME));
set_time(ptime, va_arg(ap, time_t));
break;
+ case GLITE_LBU_DB_TYPE_TIMESTAMP:
+ ptime = binds[i].buffer = data[i] = malloc(sizeof(MYSQL_TIME));
+ set_time(ptime, va_arg(ap, double));
+ break;
+
case GLITE_LBU_DB_TYPE_NULL:
break;
}
-static void set_time(MYSQL_TIME *mtime, const time_t time) {
+static void set_time(MYSQL_TIME *mtime, const double time) {
struct tm tm;
+ time_t itime;
- gmtime_r(&time, &tm);
+ itime = time;
+ gmtime_r(&itime, &tm);
memset(mtime, 0, sizeof *mtime);
mtime->year = tm.tm_year + 1900;
mtime->month = tm.tm_mon + 1;
mtime->hour = tm.tm_hour;
mtime->minute = tm.tm_min;
mtime->second = tm.tm_sec;
+ mtime->second_part = (time - itime) * 1000;
}