23 #include "ocilibcpp/support.hpp"
31 inline BindArray::BindArray(
const ocilib::Statement& statement,
const ostring& name,
unsigned int mode) : BindObject(statement, name, mode), _object(nullptr)
37 void BindArray::SetVector(std::vector<T>& vector,
bool isPlSqlTable,
unsigned int elemSize)
39 _object = core::OnAllocate(
new BindArrayObject<T>(_statement, GetName(), vector, isPlSqlTable, GetMode(), elemSize));
42 inline BindArray::~BindArray() noexcept
44 delete core::OnDeallocate(_object);
48 typename BindResolver<T>::OutputType* BindArray::GetData()
const
50 return static_cast<typename BindResolver<T>::OutputType*
>(*(
dynamic_cast<BindArrayObject<T>*
> (_object)));
53 inline void BindArray::SetInData()
56 if (GetMode() & OCI_BDM_IN || _object->IsHandleObject())
62 inline void BindArray::SetOutData()
64 if (GetMode() & OCI_BDM_OUT)
66 _object->SetOutData();
70 inline unsigned int BindArray::GetSize()
const
72 return _object ? _object->GetSize() : _statement.GetBindArraySize();
75 inline unsigned int BindArray::GetSizeForBindCall()
const
77 return _object ? _object->GetSizeForBindCall() : 0;
82 BindArray::BindArrayObject<T>::BindArrayObject(
const ocilib::Statement& statement,
const ostring& name, ObjectVector& vector,
bool isPlSqlTable,
unsigned int mode,
unsigned int elemSize)
83 : _statement(statement), _name(name), _vector(vector), _data(nullptr), _isPlSqlTable(isPlSqlTable), _mode(mode), _elemCount(BindArrayObject<T>::GetSize()), _elemSize(elemSize)
89 BindArray::BindArrayObject<T>::~BindArrayObject() noexcept
95 void BindArray::BindArrayObject<T>::AllocData()
97 _data = core::OnAllocate(
new NativeType[_elemCount], _elemCount);
99 memset(_data, 0,
sizeof(NativeType) * _elemCount);
103 inline void BindArray::BindArrayObject<ocilib::ostring>::AllocData()
105 const size_t count = _elemSize * _elemCount;
107 _data = core::OnAllocate(
new otext[count], count);
109 memset(_data, 0, count *
sizeof(otext));
113 inline void BindArray::BindArrayObject<ocilib::Raw> ::AllocData()
115 const size_t count = _elemSize * _elemCount;
117 _data = core::OnAllocate(
new unsigned char[count], count);
119 memset(_data, 0, count *
sizeof(
unsigned char));
123 void BindArray::BindArrayObject<T>::FreeData()
const
125 delete[] core::OnDeallocate(_data);
129 void BindArray::BindArrayObject<T>::SetInData()
131 typename ObjectVector::iterator it, it_end;
133 unsigned int index = 0;
134 const unsigned int currElemCount = GetSize();
136 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
138 _data[index] =
static_cast<NativeType
>(*it);
143 inline void BindArray::BindArrayObject<ocilib::ostring>::SetInData()
145 std::vector<ostring>::iterator it, it_end;
147 unsigned int index = 0;
148 const unsigned int currElemCount = GetSize();
150 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
154 memcpy(_data + (_elemSize * index), value.c_str(), (value.size() + 1) *
sizeof(otext));
159 inline void BindArray::BindArrayObject<ocilib::Raw>::SetInData()
161 std::vector<Raw>::iterator it, it_end;
163 unsigned int index = 0;
164 const unsigned int currElemCount = GetSize();
166 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
172 memcpy(_data + (_elemSize * index), &value[0], value.size());
180 void BindArray::BindArrayObject<T>::SetOutData()
182 typename ObjectVector::iterator it, it_end;
184 unsigned int index = 0;
185 const unsigned int currElemCount = GetSize();
187 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
189 *it =
static_cast<NativeType&
>(_data[index]);
194 inline void BindArray::BindArrayObject<ocilib::ostring>::SetOutData()
196 std::vector<ostring>::iterator it, it_end;
200 unsigned int index = 0;
201 const unsigned int currElemCount = GetSize();
203 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
205 otext* currData = _data + (_elemSize *
sizeof(otext) * index);
212 inline void BindArray::BindArrayObject<ocilib::Raw>::SetOutData()
214 std::vector<Raw>::iterator it, it_end;
218 unsigned int index = 0;
219 const unsigned int currElemCount = GetSize();
221 for (it = _vector.begin(), it_end = _vector.end(); it != it_end && index < _elemCount && index < currElemCount; ++it, ++index)
223 unsigned char* currData = _data + (_elemSize * index);
230 ostring BindArray::BindArrayObject<T>::GetName()
const
236 bool BindArray::BindArrayObject<T>::IsHandleObject()
const
238 return BindResolver<T>::IsHandle;
242 unsigned int BindArray::BindArrayObject<T>::GetSize()
const
244 return _isPlSqlTable ?
static_cast<unsigned int>(_vector.size()) : _statement.GetBindArraySize();
248 unsigned int BindArray::BindArrayObject<T>::GetSizeForBindCall()
const
250 return _isPlSqlTable ?
static_cast<unsigned int>(_vector.size()) : 0;
254 BindArray::BindArrayObject<T>::operator ObjectVector& ()
const
260 BindArray::BindArrayObject<T>::operator NativeType* ()
const
Object used for executing SQL or PL/SQL statement and returning the produced results.
OCI_SYM_PUBLIC boolean OCI_API OCI_BindSetDataSizeAtPos(OCI_Bind *bnd, unsigned int position, unsigned int size)
Set the size of the element at the given position in the bind input array.
OCI_SYM_PUBLIC OCI_Bind *OCI_API OCI_GetBind2(OCI_Statement *stmt, const otext *name)
Return a bind handle from its name.
OCI_SYM_PUBLIC unsigned int OCI_API OCI_BindGetDataSizeAtPos(OCI_Bind *bnd, unsigned int position)
Return the actual size of the element at the given position in the bind input array.
struct OCI_Bind OCI_Bind
Internal bind representation.
std::basic_string< otext, std::char_traits< otext >, std::allocator< otext > > ostring
string class wrapping the OCILIB otext * type and OTEXT() macros ( see Character sets )
std::vector< unsigned char > Raw
C++ counterpart of SQL RAW data type.