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)); }
//----------------------------------------------------------------------------- // 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; }
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; }