如何从Linux下用C编写的udf返回firebird时间戳

时间:2015-11-04 15:47:08

标签: c linux firebird udf

有人可以告诉我如何从用C编写的udf返回firebird TIMESTAMP类型吗?

更具体地说,是否有相应的C类型映射到Firebird中的TIMESTAMP类型?如果是,哪个标题包含其定义?谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用ISC_TIMESTAMP中定义的ibase.h。您应该可以使用isc_encode_timestamp转换tm time.h,但由于我不是自己使用C或C ++编程,因此我没有更多内容详细信息或准备好的例子。

答案 1 :(得分:0)

使用Mark的建议,这是一个实现:

#include <time.h>
#include <ibase.h>
#include <ib_util.h>


typedef long long int SINT64;


ISC_TIME encode_time(int hours, int minutes, int seconds, int fractions)
{

    return ((hours * 60 + minutes) * 60 + seconds) * ISC_TIME_SECONDS_PRECISION + fractions;
}

ISC_DATE encodeDate(const struct tm* t){
    // Convert a calendar date to a numeric day
    // (the number of days since the base date)

    const int day = t->tm_mday;
    int month = t->tm_mon + 1;
    int year = t->tm_year + 1900;

    if (month > 2)
        month -= 3;
    else
    {
        month += 9;
        year -= 1;
    }

    const int c = year / 100;
    const int ya = year - 100 * c;


    return (ISC_DATE) (((SINT64) 146097 * c) / 4 +
                   (1461 * ya) / 4 +
                   (153 * month + 2) / 5 + day + 1721119 - 2400001);
}



ISC_TIMESTAMP* UTCServerTime(){
    time_t t = time(NULL);

    struct tm utc;
    gmtime_r(&t, &utc);

    ISC_TIMESTAMP* ib_utc = (ISC_TIMESTAMP*)
        ib_util_malloc(sizeof(ISC_TIMESTAMP));

    ib_utc->timestamp_date = encodeDate(&utc);
    ib_utc->timestamp_time = encode_time(utc.tm_hour,utc.tm_min,utc.tm_sec, 0);

    return ib_utc;
}