blob: f639b64867fd6f943d15f47f5a9ea97294e7421f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ignite/odbc/utility.h"
#include "ignite/odbc/row.h"
namespace ignite
{
namespace odbc
{
Row::Row(ignite::impl::interop::InteropUnpooledMemory& pageData) :
rowBeginPos(0), pos(rowBeginPos), size(0), pageData(pageData),
stream(&pageData), reader(&stream), columns()
{
if (pageData.Length() >= 4)
{
Reinit();
}
}
Row::~Row()
{
// No-op.
}
bool Row::EnsureColumnDiscovered(uint16_t columnIdx)
{
if (columns.size() >= columnIdx)
return true;
if (columnIdx > GetSize() || columnIdx < 1)
return false;
if (columns.empty())
{
Column newColumn(reader);
if (!newColumn.IsValid())
return false;
columns.push_back(newColumn);
}
while (columns.size() < columnIdx)
{
Column& column = columns.back();
stream.Position(column.GetEndPosition());
Column newColumn(reader);
if (!newColumn.IsValid())
return false;
columns.push_back(newColumn);
}
return true;
}
app::ConversionResult::Type Row::ReadColumnToBuffer(uint16_t columnIdx, app::ApplicationDataBuffer& dataBuf)
{
if (!EnsureColumnDiscovered(columnIdx))
return app::ConversionResult::AI_FAILURE;
Column& column = GetColumn(columnIdx);
return column.ReadToBuffer(reader, dataBuf);
}
bool Row::MoveToNext()
{
int32_t lastColumnIdx = GetSize();
if (!EnsureColumnDiscovered(lastColumnIdx))
return false;
Column& lastColumn = GetColumn(lastColumnIdx);
stream.Position(lastColumn.GetEndPosition());
Reinit();
return true;
}
void Row::Reinit()
{
size = stream.ReadInt32();
rowBeginPos = stream.Position();
columns.clear();
columns.reserve(size);
pos = 0;
}
}
}