Esempio n. 1
0
int JNITopend::reportDRConflict(int32_t partitionId,
            int64_t remoteSequenceNumber, int64_t remoteUniqueId,
            string tableName, Table* input, Table* output) {
    if (input != NULL && output != NULL) {
        // prepare tablename
        jstring tableNameString = m_jniEnv->NewStringUTF(tableName.c_str());

        // prepare input buffer
        size_t serializeSize = input->getAccurateSizeToSerialize(false);
        char* backingCharArray = new char[serializeSize];
        ReferenceSerializeOutput conflictSerializeOutput(backingCharArray, serializeSize);
        input->serializeToWithoutTotalSize(conflictSerializeOutput);

        jobject inputBuffer = m_jniEnv->NewDirectByteBuffer(
            static_cast<void*>(backingCharArray),
            static_cast<int32_t>(serializeSize));
        if (inputBuffer == NULL) {
            m_jniEnv->ExceptionDescribe();
            throw std::exception();
        }

        // prepare output buffer
        size_t outputSerializeSize = output->getColumnHeaderSizeToSerialize(false) +
                                     sizeof(int32_t) + // tuple count placeholder
                                     output->schema()->getMaxSerializedTupleSize();
        char* outputBackingCharArray = new char[outputSerializeSize];
        ReferenceSerializeOutput outputSerializeOutput(outputBackingCharArray, outputSerializeSize);
        // NOTE passed-in output table should have only schema and no tuples
        output->serializeToWithoutTotalSize(outputSerializeOutput);

        jobject outputBuffer = m_jniEnv->NewDirectByteBuffer(
            static_cast<void*>(outputBackingCharArray),
            static_cast<int32_t>(outputSerializeSize));
        if (outputBuffer == NULL) {
            m_jniEnv->ExceptionDescribe();
            throw std::exception();
        }

        int32_t retval = m_jniEnv->CallStaticIntMethod(
            m_partitionDRGatewayClass,
            m_reportDRConflictMID,
            partitionId,
            remoteSequenceNumber,
            remoteUniqueId,
            tableNameString,
            inputBuffer,
            outputBuffer);

        ReferenceSerializeInputBE filledOutputSerializeInput(outputBackingCharArray, outputSerializeSize);
        output->loadTuplesFrom(filledOutputSerializeInput);

        m_jniEnv->DeleteLocalRef(tableNameString);
        m_jniEnv->DeleteLocalRef(inputBuffer);
        m_jniEnv->DeleteLocalRef(outputBuffer);

        return retval;
    }
    // -1 indicates error in parameters provided, for now
    return -1;
}
Esempio n. 2
0
int JNITopend::reportDRConflict(int32_t partitionId,
            int64_t remoteSequenceNumber, DRConflictType conflict_type,
            string tableName, Table* existingRows, Table* expectedRows,
            Table* newRows, Table* output) {
    assert(existingRows != NULL);
    assert(expectedRows != NULL);
    assert(newRows != NULL);

    // prepare tablename
    jstring tableNameString = m_jniEnv->NewStringUTF(tableName.c_str());

    // prepare input buffer
    jobject existingRowsBuffer;
    jobject expectedRowsBuffer;
    jobject newRowsBuffer;
    char* existingCharArray = serializeTable(m_jniEnv, existingRows, &existingRowsBuffer);
    char* expectedCharArray = serializeTable(m_jniEnv, expectedRows, &expectedRowsBuffer);
    char* newCharArray = serializeTable(m_jniEnv, newRows, &newRowsBuffer);

    // prepare output buffer
    size_t outputSerializeSize = output->getColumnHeaderSizeToSerialize(false) +
                                 sizeof(int32_t) + // tuple count placeholder
                                 output->schema()->getMaxSerializedTupleSize();
    char* outputBackingCharArray = new char[outputSerializeSize];
    ReferenceSerializeOutput outputSerializeOutput(outputBackingCharArray, outputSerializeSize);
    // NOTE passed-in output table should have only schema and no tuples
    output->serializeToWithoutTotalSize(outputSerializeOutput);

    jobject outputBuffer = m_jniEnv->NewDirectByteBuffer(
        static_cast<void*>(outputBackingCharArray),
        static_cast<int32_t>(outputSerializeSize));
    if (outputBuffer == NULL) {
        m_jniEnv->ExceptionDescribe();
        throw std::exception();
    }

    int32_t retval = -1;
    retval = m_jniEnv->CallStaticIntMethod(
        m_partitionDRGatewayClass,
        m_reportDRConflictMID,
        partitionId,
        remoteSequenceNumber,
        conflict_type,
        tableNameString,
        existingRowsBuffer,
        expectedRowsBuffer,
        newRowsBuffer,
        outputBuffer);

    ReferenceSerializeInputBE filledOutputSerializeInput(outputBackingCharArray, outputSerializeSize);
    output->loadTuplesFrom(filledOutputSerializeInput);

    delete [] existingCharArray;
    delete [] expectedCharArray;
    delete [] newCharArray;
    delete [] outputBackingCharArray;
    m_jniEnv->DeleteLocalRef(tableNameString);
    m_jniEnv->DeleteLocalRef(existingRowsBuffer);
    m_jniEnv->DeleteLocalRef(expectedRowsBuffer);
    m_jniEnv->DeleteLocalRef(newRowsBuffer);
    m_jniEnv->DeleteLocalRef(outputBuffer);

    return retval;
}