⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timestamp.c

📁 ORACLE编程的好东西,纯C写的OCI封装.很好用,支持数据池.
💻 C
📖 第 1 页 / 共 2 页
字号:
    OCI_ReleaseMetaString(ostr1);
    OCI_ReleaseMetaString(ostr2);

    /* set null string terminator */

    str[osize1/sizeof(mtext)] = 0;

#else

    OCI_NOT_USED(ostr1);
    OCI_NOT_USED(ostr2);
    OCI_NOT_USED(osize1);
    OCI_NOT_USED(osize2);
    OCI_NOT_USED(precision);

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampGetDate
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampGetDate(OCI_Timestamp *tmsp, int *year, int *month,
                                     int *day)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);

    OCI_CHECK_PTR(OCI_IPC_INT, year,  FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, month, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, day,   FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

    *year  = 0;
    *month = 0;
    *day   = 0;

#if OCI_VERSION_COMPILE >= OCI_9

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeGetDate((dvoid *) OCILib.env, tmsp->err, tmsp->handle,
                           (sb2 *) year, (ub1 *) month, (ub1 *) day)
    )

#else

    OCI_NOT_USED(year);
    OCI_NOT_USED(month);
    OCI_NOT_USED(day);

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampGetTime
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampGetTime(OCI_Timestamp *tmsp, int *hour, int *min,
                                    int *sec, int *fsec)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);

    OCI_CHECK_PTR(OCI_IPC_INT, hour, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, min,  FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, sec,  FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, fsec, FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

    *hour = 0;
    *min  = 0;
    *sec  = 0;
    *fsec = 0;

#if OCI_VERSION_COMPILE >= OCI_9

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeGetTime((dvoid *) OCILib.env, tmsp->err, tmsp->handle,
                           (ub1*) hour, (ub1*) min, (ub1*) sec, (ub4*) fsec)
    )

#else

    OCI_NOT_USED(hour);
    OCI_NOT_USED(min);
    OCI_NOT_USED(sec);
    OCI_NOT_USED(fsec);

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampGetDateTime
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampGetDateTime(OCI_Timestamp *tmsp, int *year, 
                                         int *month, int *day, int *hour, 
                                         int *min, int *sec, int *fsec)
{
    return (OCI_TimestampGetDate(tmsp, year, month, day) &&
            OCI_TimestampGetTime(tmsp, hour, min, sec, fsec));
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampGetTimeZoneName
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampGetTimeZoneName(OCI_Timestamp *tmsp, int size,
                                             mtext *str)
{
    boolean res = TRUE;
    void *ostr  = NULL;
    int osize   = size*sizeof(mtext);

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);
    OCI_CHECK_PTR(OCI_IPC_STRING, str, FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

#if OCI_VERSION_COMPILE >= OCI_9

    ostr = OCI_GetInputMetaString(str, &osize);

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeGetTimeZoneName((dvoid *) OCILib.env, tmsp->err, tmsp->handle,
                                   (ub1*) ostr, (ub4*) &osize)
    )

    OCI_GetOutputMetaString(ostr, str, &osize);

    OCI_ReleaseMetaString(ostr);

    /* set null string terminator */

    str[osize/sizeof(mtext)] = 0;

#else

    OCI_NOT_USED(str);
    OCI_NOT_USED(size);
    OCI_NOT_USED(ostr);
    OCI_NOT_USED(osize);

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampGetTimeZoneOffset
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampGetTimeZoneOffset(OCI_Timestamp *tmsp,
                                              int *hour, int *min)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, hour, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INT, min, FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

#if OCI_VERSION_COMPILE >= OCI_9

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeGetTimeZoneOffset((dvoid *) OCILib.env, tmsp->err,
                                     tmsp->handle, (sb1*) hour, (sb1*) min)
    )

#else

    OCI_NOT_USED(hour);
    OCI_NOT_USED(min);

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampIntervalAdd
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampIntervalAdd(OCI_Timestamp *tmsp, OCI_Interval *itv)
{
    boolean res  = TRUE;
    ub4 old_type = OCI_TIMESTAMP_TZ;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INTERVAL, itv,  FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);


#if OCI_VERSION_COMPILE >= OCI_9

    /* OCIDateTimeIntervalAdd()  fails if timestamps is not OCI_TIMESTAMP_TZ */

    if ((res == TRUE) && (tmsp->type != OCI_TIMESTAMP_TZ))    
    {
        OCI_Timestamp *tmp = OCI_TimestampCreate(tmsp->con, OCI_TIMESTAMP_TZ);

        old_type = tmsp->type;

        res = OCI_TimestampAssign(tmp, tmsp) && OCI_TimestampConvert(tmp, tmsp);

        OCI_TimestampFree(tmp);
    }

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeIntervalAdd((dvoid *) OCILib.env, tmsp->err, tmsp->handle,
                               itv->handle, tmsp->handle)
    )

    /* restoring old timestamp type */

    if ((res == TRUE) && (old_type != OCI_TIMESTAMP_TZ))    
    {
        OCI_Timestamp *tmp = OCI_TimestampCreate(tmsp->con, old_type);

        res = OCI_TimestampAssign(tmp, tmsp) && OCI_TimestampConvert(tmp, tmsp);

        OCI_TimestampFree(tmp);
    }

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampIntervalSub
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampIntervalSub(OCI_Timestamp *tmsp,
                                         OCI_Interval *itv)
{
    boolean res  = TRUE;
    ub4 old_type = OCI_TIMESTAMP_TZ;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INTERVAL, itv,  FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

#if OCI_VERSION_COMPILE >= OCI_9

    /* OCIDateTimeIntervalSub() fails if timestamps is not OCI_TIMESTAMP_TZ */

    if ((res == TRUE) && (tmsp->type != OCI_TIMESTAMP_TZ))    
    {
        OCI_Timestamp *tmp = OCI_TimestampCreate(tmsp->con, OCI_TIMESTAMP_TZ);

        old_type = tmsp->type;

        res = OCI_TimestampConvert(tmp, tmsp) && OCI_TimestampAssign(tmp, tmsp);

        OCI_TimestampFree(tmp);
    }

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeIntervalSub((dvoid *) OCILib.env, tmsp->err, tmsp->handle, 
                               itv->handle, tmsp->handle)
    )

    /* restoring old timestamp type */

    if ((res == TRUE)  && (old_type != OCI_TIMESTAMP_TZ))    
    {
        OCI_Timestamp *tmp = OCI_TimestampCreate(tmsp->con, old_type);

        res = OCI_TimestampConvert(tmp, tmsp) && OCI_TimestampAssign(tmp, tmsp);

        OCI_TimestampFree(tmp);
    }

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampSubtract
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampSubtract(OCI_Timestamp *tmsp, OCI_Timestamp *tmsp2,
                                     OCI_Interval *itv)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp,  FALSE);
    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp2, FALSE);
    OCI_CHECK_PTR(OCI_IPC_INTERVAL, itv,   FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

#if OCI_VERSION_COMPILE >= OCI_9

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeSubtract((dvoid *) OCILib.env, tmsp->err, tmsp->handle,
                             tmsp2->handle, itv->handle)
    )

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampSysTimeStamp
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampSysTimeStamp(OCI_Timestamp *tmsp)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);
 
    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

#if OCI_VERSION_COMPILE >= OCI_9

    OCI_CALL4
    (
        res, tmsp->err, tmsp->con,
        
        OCIDateTimeSysTimeStamp((dvoid *) OCILib.env, tmsp->err, tmsp->handle)
    )

#endif

   OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampToCTime
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampToCTime(OCI_Timestamp *tmsp, struct tm *ptm,
                                     time_t *pt)
{
    boolean res = TRUE;
    time_t time = -1;
    int msec    = 0;
    struct tm t;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

    res = OCI_TimestampGetDateTime(tmsp, &t.tm_year, &t.tm_mon, &t.tm_mday,
                                         &t.tm_hour, &t.tm_min, &t.tm_sec, 
                                         &msec);

    if (res == TRUE)
    {
        t.tm_wday  = 0;
        t.tm_yday  = 0;
        t.tm_isdst = -1;

        time = mktime(&t);

        if (ptm != NULL)
            memcpy(ptm, &t, sizeof(t));

        if (pt != NULL)
            *pt = time;
    }

    OCI_RESULT(res);

    return (time != -1);
}

/* ------------------------------------------------------------------------ *
 * OCI_TimestampFromCTime
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_TimestampFromCTime(OCI_Timestamp *tmsp, struct tm *ptm,
                                       time_t t)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_TIMESTAMP, tmsp, FALSE);

    OCI_CHECK_TIMESTAMP_ENABLED(tmsp->con, FALSE);

    if (ptm == NULL && t == 0)
        return FALSE;

    if (ptm == NULL)
        ptm = localtime(&t);

    res =  OCI_TimestampConstruct(tmsp, 
                                  ptm->tm_year + 1900,
                                  ptm->tm_mon  + 1,
                                  ptm->tm_mday,
                                  ptm->tm_hour,
                                  ptm->tm_min,
                                  ptm->tm_sec,
                                  (int) 0,
                                  (const mtext *) NULL);

   OCI_RESULT(res);

   return res;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -