Ejemplo n.º 1
0
void V8SQLResultSetRowList::itemMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info)
{
    ExceptionState exceptionState(ExceptionState::ExecutionContext, "item", "SQLResultSetRowList", info.Holder(), info.GetIsolate());
    if (!info.Length()) {
        exceptionState.throwDOMException(SyntaxError, ExceptionMessages::notEnoughArguments(1, 0));
        exceptionState.throwIfNeeded();
        return;
    }

    if (!info[0]->IsNumber()) {
        exceptionState.throwTypeError("The index provided is not a number.");
        exceptionState.throwIfNeeded();
        return;
    }

    SQLResultSetRowList* rowList = V8SQLResultSetRowList::toNative(info.Holder());

    unsigned long index = info[0]->IntegerValue();
    if (index >= rowList->length()) {
        exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound<unsigned>("index", index, rowList->length()));
        exceptionState.throwIfNeeded();
        return;
    }

    v8::Local<v8::Object> item = v8::Object::New(info.GetIsolate());
    unsigned numColumns = rowList->columnNames().size();
    unsigned valuesIndex = index * numColumns;

    for (unsigned i = 0; i < numColumns; ++i) {
        const SQLValue& sqlValue = rowList->values()[valuesIndex + i];
        v8::Handle<v8::Value> value;
        switch(sqlValue.type()) {
            case SQLValue::StringValue:
                value = v8String(info.GetIsolate(), sqlValue.string());
                break;
            case SQLValue::NullValue:
                value = v8::Null(info.GetIsolate());
                break;
            case SQLValue::NumberValue:
                value = v8::Number::New(info.GetIsolate(), sqlValue.number());
                break;
            default:
                ASSERT_NOT_REACHED();
        }

        item->Set(v8String(info.GetIsolate(), rowList->columnNames()[i]), value, static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly));
    }

    v8SetReturnValue(info, item);
}
v8::Handle<v8::Value> V8SQLResultSetRowList::itemCallback(const v8::Arguments& args)
{
    INC_STATS("DOM.SQLResultSetRowList.item()");

    if (args.Length() == 0) {
        V8Proxy::throwError(V8Proxy::SyntaxError, "Item index is required.");
        return v8::Undefined();
    }

    if (!args[0]->IsNumber()) {
        V8Proxy::throwError(V8Proxy::TypeError, "Item index must be a number.");
        return v8::Undefined();
    }

    SQLResultSetRowList* rowList = V8SQLResultSetRowList::toNative(args.Holder());

    unsigned long index = args[0]->IntegerValue();
    if (index >= rowList->length()) {
        V8Proxy::throwError(V8Proxy::RangeError, "Item index is out of range.");
        return v8::Undefined();
    }

    v8::Local<v8::Object> item = v8::Object::New();
    unsigned numColumns = rowList->columnNames().size();
    unsigned valuesIndex = index * numColumns;

    for (unsigned i = 0; i < numColumns; ++i) {
        const SQLValue& sqlValue = rowList->values()[valuesIndex + i];
        v8::Handle<v8::Value> value;
        switch(sqlValue.type()) {
            case SQLValue::StringValue:
                value = v8String(sqlValue.string());
                break;
            case SQLValue::NullValue:
                value = v8::Null();
                break;
            case SQLValue::NumberValue:
                value = v8::Number::New(sqlValue.number());
                break;
            default:
                ASSERT_NOT_REACHED();
        }

        item->Set(v8String(rowList->columnNames()[i]), value, static_cast<v8::PropertyAttribute>(v8::DontDelete|v8::ReadOnly));
    }

    return item;
}
void V8SQLResultSetRowList::itemMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
{
    if (!args.Length()) {
        throwError(v8SyntaxError, "Item index is required.", args.GetIsolate());
        return;
    }

    if (!args[0]->IsNumber()) {
        throwTypeError("Item index must be a number.", args.GetIsolate());
        return;
    }

    SQLResultSetRowList* rowList = V8SQLResultSetRowList::toNative(args.Holder());

    unsigned long index = args[0]->IntegerValue();
    if (index >= rowList->length()) {
        throwError(v8RangeError, "Item index is out of range.", args.GetIsolate());
        return;
    }

    v8::Local<v8::Object> item = v8::Object::New();
    unsigned numColumns = rowList->columnNames().size();
    unsigned valuesIndex = index * numColumns;

    for (unsigned i = 0; i < numColumns; ++i) {
        const SQLValue& sqlValue = rowList->values()[valuesIndex + i];
        v8::Handle<v8::Value> value;
        switch(sqlValue.type()) {
            case SQLValue::StringValue:
                value = v8String(sqlValue.string(), args.GetIsolate());
                break;
            case SQLValue::NullValue:
                value = v8::Null(args.GetIsolate());
                break;
            case SQLValue::NumberValue:
                value = v8::Number::New(args.GetIsolate(), sqlValue.number());
                break;
            default:
                ASSERT_NOT_REACHED();
        }

        item->Set(v8String(rowList->columnNames()[i], args.GetIsolate()), value, static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly));
    }

    v8SetReturnValue(args, item);
}