Esempio n. 1
0
 void Datetime::ociConstruct(sb2 year, ub1 month, ub1 day, ub1 hour, ub1 min, ub1 sec, ub4 fsec)
 {
   log_debug("OCIDateTimeConstruct(" << conn->getEnvHandle() << ')');
   sword ret = OCIDateTimeConstruct(conn->getEnvHandle(), conn->getErrorHandle(),
     datetime, year, month, day, hour, min, sec, fsec * 1000000, 0, 0);
   conn->checkError(ret, "OCIDateTimeConstruct");
 }
void OraclePreparedStatement_setTimestamp(T P, int parameterIndex, time_t time) {
        assert(P);
        struct tm ts = {.tm_isdst = -1};
        ub4   valid;
        int i = checkAndSetParameterIndex(parameterIndex, P->paramCount);

        P->lastError = OCIDescriptorAlloc((dvoid *)P->env, (dvoid **) &(P->params[i].type.date),
                                          (ub4) OCI_DTYPE_TIMESTAMP,
                                          (size_t) 0, (dvoid **) 0);
        if (P->lastError != OCI_SUCCESS && P->lastError != OCI_SUCCESS_WITH_INFO)
                THROW(SQLException, "%s", OraclePreparedStatement_getLastError(P->lastError, P->err));

        gmtime_r(&time, &ts);

        OCIDateTimeConstruct(P->usr,
                             P->err,
                             P->params[i].type.date, //OCIDateTime   *datetime,
                             ts.tm_year+1900, ts.tm_mon+1, ts.tm_mday, ts.tm_hour, ts.tm_min, ts.tm_sec, 0/*fsec*/,
                             (OraText*)0, 0);
        
        if (OCI_SUCCESS != OCIDateTimeCheck(P->usr, P->err, P->params[i].type.date, &valid) || valid != 0)
        {
                THROW(SQLException, "Invalid date/time value");
        }

        P->params[i].length = sizeof(OCIDateTime *);

        P->lastError = OCIBindByPos(P->stmt, &P->params[i].bind, P->err, parameterIndex, &P->params[i].type.date, 
                                    P->params[i].length, SQLT_TIMESTAMP, 0, 0, 0, 0, 0, OCI_DEFAULT);
        if (P->lastError != OCI_SUCCESS && P->lastError != OCI_SUCCESS_WITH_INFO)
                THROW(SQLException, "%s", OraclePreparedStatement_getLastError(P->lastError, P->err));
}


void OraclePreparedStatement_setInt(T P, int parameterIndex, int x) {
        assert(P);
        int i = checkAndSetParameterIndex(parameterIndex, P->paramCount);
        P->params[i].type.integer = x;
        P->params[i].length = sizeof(x);
        P->lastError = OCIBindByPos(P->stmt, &P->params[i].bind, P->err, parameterIndex, &P->params[i].type.integer,
                                    (int)P->params[i].length, SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);
        if (P->lastError != OCI_SUCCESS && P->lastError != OCI_SUCCESS_WITH_INFO)
                THROW(SQLException, "%s", OraclePreparedStatement_getLastError(P->lastError, P->err));
}
Esempio n. 3
0
//-----------------------------------------------------------------------------
// TimestampVar_SetValue()
//   Set the value of the variable.
//-----------------------------------------------------------------------------
static int TimestampVar_SetValue(
    udt_TimestampVar *var,              // variable to set value for
    unsigned pos,                       // array position to set
    PyObject *value)                    // value to set
{
    sword status;
    uword valid;

    // make sure a timestamp is being bound
    if (!PyDateTime_Check(value)) {
        PyErr_SetString(PyExc_TypeError, "expecting timestamp data");
        return -1;
    }

    // store a copy of the value
    status = OCIDateTimeConstruct(var->environment->handle,
            var->environment->errorHandle, var->data[pos],
            (sb2) PyDateTime_GET_YEAR(value),
            PyDateTime_GET_MONTH(value),
            PyDateTime_GET_DAY(value),
            PyDateTime_DATE_GET_HOUR(value),
            PyDateTime_DATE_GET_MINUTE(value),
            PyDateTime_DATE_GET_SECOND(value),
            PyDateTime_DATE_GET_MICROSECOND(value) * 1000, NULL, 0);
    if (Environment_CheckForError(var->environment, status,
            "TimestampVar_SetValue(): create structure") < 0)
        return -1;
    status = OCIDateTimeCheck(var->environment->handle,
            var->environment->errorHandle, var->data[pos], &valid);
    if (Environment_CheckForError(var->environment, status,
            "TimestampVar_SetValue()") < 0)
        return -1;
    if (valid != 0) {
        PyErr_SetString(g_DataErrorException, "invalid date");
        return -1;
    }

    return 0;
}
Esempio n. 4
0
OCIDateTime *oci8_set_ocitimestamp_tz(OCIDateTime *dttm, VALUE val, VALUE svc)
{
    long year;
    long month;
    long day;
    long hour;
    long minute;
    long sec;
    long fsec;
    OraText *tz;
    size_t tzlen;
    char tz_str[32];
    OCISession *seshp = NULL;

    Check_Type(val, T_ARRAY);
    if (RARRAY_LEN(val) != 9) {
        rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
    }
    /* year */
    year = NUM2LONG(RARRAY_PTR(val)[0]);
    if (year < -4712 || 9999 < year) {
        rb_raise(rb_eRuntimeError, "out of year range: %ld", year);
    }
    /* month */
    month = NUM2LONG(RARRAY_PTR(val)[1]);
    if (month < 0 || 12 < month) {
        rb_raise(rb_eRuntimeError, "out of month range: %ld", month);
    }
    /* day */
    day = NUM2LONG(RARRAY_PTR(val)[2]);
    if (day < 0 || 31 < day) {
        rb_raise(rb_eRuntimeError, "out of day range: %ld", day);
    }
    /* hour */
    hour = NUM2LONG(RARRAY_PTR(val)[3]);
    if (hour < 0 || 23 < hour) {
        rb_raise(rb_eRuntimeError, "out of hour range: %ld", hour);
    }
    /* minute */
    minute = NUM2LONG(RARRAY_PTR(val)[4]);
    if (minute < 0 || 60 < minute) {
        rb_raise(rb_eRuntimeError, "out of minute range: %ld", minute);
    }
    /* second */
    sec = NUM2LONG(RARRAY_PTR(val)[5]);
    if (sec < 0 || 60 < sec) {
        rb_raise(rb_eRuntimeError, "out of second range: %ld", sec);
    }
    /* sec_fraction */
    fsec = NUM2LONG(RARRAY_PTR(val)[6]);
    if (fsec < 0 || 1000000000 < fsec) {
        rb_raise(rb_eRuntimeError, "out of sec_fraction range: %ld", fsec);
    }
    /* time zone */
    if (NIL_P(RARRAY_PTR(val)[7]) && NIL_P(RARRAY_PTR(val)[8])) {
        if (!NIL_P(svc)) {
            /* use session timezone. */
            seshp = oci8_get_oci_session(svc);
        }
        tz = NULL;
        tzlen = 0;
    } else {
        snprintf(tz_str, sizeof(tz_str), "%+02ld:%02ld",
                 NUM2LONG(RARRAY_PTR(val)[7]),
                 NUM2LONG(RARRAY_PTR(val)[8]));
        tz_str[sizeof(tz_str) - 1] = '\0';
        tz = (OraText*)tz_str;
        tzlen = strlen(tz_str);
    }
    /* construct */
    chkerr(OCIDateTimeConstruct(seshp ? (void*)seshp : (void*)oci8_envhp, oci8_errhp, dttm,
                                (sb2)year,
                                (ub1)month,
                                (ub1)day,
                                (ub1)hour,
                                (ub1)minute,
                                (ub1)sec,
                                (ub4)fsec,
                                tz, tzlen));
    return dttm;
}