|
2 | 2 | #include "executeBaton.h"
|
3 | 3 | #include "outParam.h"
|
4 | 4 | #include "nodeOracleException.h"
|
| 5 | +#include "connection.h" |
5 | 6 |
|
6 | 7 | ExecuteBaton::ExecuteBaton(Connection* connection, const char* sql, v8::Local<v8::Array>* values, v8::Handle<v8::Function>* callback) {
|
7 | 8 | this->connection = connection;
|
@@ -38,23 +39,70 @@ ExecuteBaton::~ExecuteBaton() {
|
38 | 39 | if(error) delete error;
|
39 | 40 | }
|
40 | 41 |
|
| 42 | +double CallDateMethod(v8::Local<v8::Date> date, const char* methodName) { |
| 43 | + Handle<Value> args[0]; |
| 44 | + Local<Value> result = Local<Function>::Cast(date->Get(String::New(methodName)))->Call(date, 0, args); |
| 45 | + return Local<Number>::Cast(result)->Value(); |
| 46 | +} |
| 47 | + |
| 48 | +oracle::occi::Date* V8DateToOcciDate(oracle::occi::Environment* env, v8::Local<v8::Date> val) { |
| 49 | + int year = CallDateMethod(val, "getFullYear"); |
| 50 | + int month = CallDateMethod(val, "getMonth") + 1; |
| 51 | + int day = CallDateMethod(val, "getDate"); |
| 52 | + int hours = CallDateMethod(val, "getHours"); |
| 53 | + int minutes = CallDateMethod(val, "getMinutes"); |
| 54 | + int seconds = CallDateMethod(val, "getSeconds"); |
| 55 | + oracle::occi::Date* d = new oracle::occi::Date(env, year, month, day, hours, minutes, seconds); |
| 56 | + return d; |
| 57 | +} |
| 58 | + |
41 | 59 | void ExecuteBaton::CopyValuesToBaton(ExecuteBaton* baton, v8::Local<v8::Array>* values) {
|
42 | 60 | for(uint32_t i=0; i<(*values)->Length(); i++) {
|
43 | 61 | v8::Local<v8::Value> val = (*values)->Get(i);
|
44 | 62 |
|
45 | 63 | value_t *value = new value_t();
|
46 |
| - if(val->IsString()) { |
| 64 | + |
| 65 | + // null |
| 66 | + if(val->IsNull()) { |
| 67 | + value->type = VALUE_TYPE_NULL; |
| 68 | + value->value = NULL; |
| 69 | + baton->values.push_back(value); |
| 70 | + } |
| 71 | + |
| 72 | + // string |
| 73 | + else if(val->IsString()) { |
47 | 74 | v8::String::AsciiValue asciiVal(val);
|
48 | 75 | value->type = VALUE_TYPE_STRING;
|
49 | 76 | value->value = new std::string(*asciiVal);
|
50 | 77 | baton->values.push_back(value);
|
51 |
| - } else if(val->IsObject() && val->ToObject()->FindInstanceInPrototypeChain(OutParam::constructorTemplate) != v8::Null()) { |
| 78 | + } |
| 79 | + |
| 80 | + // date |
| 81 | + else if(val->IsDate()) { |
| 82 | + value->type = VALUE_TYPE_DATE; |
| 83 | + value->value = V8DateToOcciDate(baton->connection->getEnvironment(), v8::Date::Cast(*val)); |
| 84 | + baton->values.push_back(value); |
| 85 | + } |
| 86 | + |
| 87 | + // number |
| 88 | + else if(val->IsNumber()) { |
| 89 | + value->type = VALUE_TYPE_NUMBER; |
| 90 | + double d = v8::Number::Cast(*val)->Value(); |
| 91 | + value->value = new oracle::occi::Number(d); |
| 92 | + baton->values.push_back(value); |
| 93 | + } |
| 94 | + |
| 95 | + // output |
| 96 | + else if(val->IsObject() && val->ToObject()->FindInstanceInPrototypeChain(OutParam::constructorTemplate) != v8::Null()) { |
52 | 97 | value->type = VALUE_TYPE_OUTPUT;
|
53 | 98 | value->value = NULL;
|
54 | 99 | baton->values.push_back(value);
|
55 |
| - } else { |
| 100 | + } |
| 101 | + |
| 102 | + // unhandled type |
| 103 | + else { |
56 | 104 | std::ostringstream message;
|
57 |
| - message << "Unhandled value type"; |
| 105 | + message << "CopyValuesToBaton: Unhandled value type"; |
58 | 106 | throw NodeOracleException(message.str());
|
59 | 107 | }
|
60 | 108 | }
|
|
0 commit comments