app::ConversionResult::Type Column::ReadToBuffer()

in modules/platforms/cpp/odbc/src/column.cpp [328:531]


        app::ConversionResult::Type Column::ReadToBuffer(BinaryReaderImpl& reader, app::ApplicationDataBuffer& dataBuf)
        {
            if (!IsValid())
                return app::ConversionResult::AI_FAILURE;

            if (GetUnreadDataLength() == 0)
            {
                dataBuf.PutNull();

                return app::ConversionResult::AI_NO_DATA;
            }

            InteropInputStream* stream = reader.GetStream();

            if (!stream)
                return app::ConversionResult::AI_FAILURE;

            InteropStreamPositionGuard<InteropInputStream> guard(*stream);

            stream->Position(startPos);

            app::ConversionResult::Type convRes = app::ConversionResult::AI_SUCCESS;

            switch (type)
            {
                case IGNITE_TYPE_BYTE:
                {
                    convRes = dataBuf.PutInt8(reader.ReadInt8());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_SHORT:
                case IGNITE_TYPE_CHAR:
                {
                    convRes = dataBuf.PutInt16(reader.ReadInt16());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_INT:
                {
                    convRes = dataBuf.PutInt32(reader.ReadInt32());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_LONG:
                {
                    convRes = dataBuf.PutInt64(reader.ReadInt64());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_FLOAT:
                {
                    convRes = dataBuf.PutFloat(reader.ReadFloat());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_DOUBLE:
                {
                    convRes = dataBuf.PutDouble(reader.ReadDouble());

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_BOOL:
                {
                    convRes = dataBuf.PutInt8(reader.ReadBool() ? 1 : 0);

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_STRING:
                {
                    std::string str;
                    utility::ReadString(reader, str);

                    int32_t written = 0;
                    convRes = dataBuf.PutString(str.substr(offset), written);

                    IncreaseOffset(written);

                    break;
                }

                case IGNITE_TYPE_UUID:
                {
                    Guid guid = reader.ReadGuid();

                    convRes = dataBuf.PutGuid(guid);

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_HDR_NULL:
                {
                    convRes = dataBuf.PutNull();

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_BINARY:
                case IGNITE_TYPE_OBJECT:
                {
                    int32_t len;

                    if (!GetObjectLength(*stream, len))
                        return app::ConversionResult::AI_FAILURE;

                    std::vector<int8_t> data(len);

                    stream->ReadInt8Array(&data[0], static_cast<int32_t>(data.size()));

                    int32_t written = 0;
                    convRes = dataBuf.PutBinaryData(data.data() + offset,
                        static_cast<size_t>(len - offset), written);

                    IncreaseOffset(written);

                    break;
                }

                case IGNITE_TYPE_DECIMAL:
                {
                    common::Decimal res;

                    utility::ReadDecimal(reader, res);

                    convRes = dataBuf.PutDecimal(res);

                    IncreaseOffset(size);

                    break;
                }

                case IGNITE_TYPE_DATE:
                {
                    Date date = reader.ReadDate();

                    convRes = dataBuf.PutDate(date);

                    break;
                }

                case IGNITE_TYPE_TIMESTAMP:
                {
                    Timestamp ts = reader.ReadTimestamp();

                    convRes = dataBuf.PutTimestamp(ts);

                    break;
                }

                case IGNITE_TYPE_TIME:
                {
                    Time time = reader.ReadTime();

                    convRes = dataBuf.PutTime(time);

                    break;
                }

                case IGNITE_TYPE_ARRAY_BYTE:
                {
                    stream->Position(startPos + offset);
                    int32_t maxRead = std::min(GetUnreadDataLength(), static_cast<int32_t>(dataBuf.GetSize()));
                    std::vector<int8_t> data(maxRead);

                    stream->ReadInt8Array(&data[0], static_cast<int32_t>(data.size()));

                    int32_t written = 0;
                    convRes = dataBuf.PutBinaryData(data.data(), data.size(), written);

                    IncreaseOffset(written);
                    break;
                }

                default:
                    return app::ConversionResult::AI_UNSUPPORTED_CONVERSION;
            }

            return convRes;
        }