00001
00011 #include "O3DBIRecord.h"
00012 #include "O3DBIException.h"
00013 #include "O3DBIError.h"
00014 #include <algorithm>
00015
00016
00017
00018
00019 O3DBIRecord::O3DBIRecord()
00020 {
00021
00022 }
00023
00024 O3DBIRecord::O3DBIRecord(const O3DBIRecord& record)
00025 {
00026 _fields = record._fields;
00027 }
00028
00029 O3DBIRecord::O3DBIRecord(TDataFieldsConstIter& first,
00030 TDataFieldsConstIter& last)
00031 {
00032 _fields.reserve(last - first);
00033 std::copy(first, last, _fields.begin());
00034 }
00035
00036 O3DBIRecord::~O3DBIRecord()
00037 {
00038
00039 }
00040
00041
00042
00043
00044 bool O3DBIRecord::operator==(const O3DBIRecord& other) const
00045 {
00046 if (_fields.size() != other._fields.size())
00047 return false;
00048 return std::equal(_fields.begin(), _fields.end(), other._fields.begin());
00049 }
00050
00051 TDataFieldIndex O3DBIRecord::InsertField(const O3DBIDataField& field)
00052 {
00053 _fields.push_back(field);
00054 return (_fields.size() - 1);
00055 }
00056
00057 O3DBIDataField O3DBIRecord::GetField(TDataFieldIndex index) const
00058 {
00059 if (index >= _fields.size())
00060 throw new O3DBIException(O3DBI_INDEX_OUTOFBOUNDS,
00061 O3DBIErrorTxt::pchIndexOutOfBounds, _T("O3DBIRecord::GetField"), this);
00062 return _fields[index];
00063 }
00064
00065 O3DBIDataField& O3DBIRecord::operator[](TDataFieldIndex index)
00066 {
00067 if (index >= _fields.size())
00068 throw new O3DBIException(O3DBI_INDEX_OUTOFBOUNDS,
00069 O3DBIErrorTxt::pchIndexOutOfBounds, _T("O3DBIRecord::operator[]"),
00070 this);
00071 return _fields[index];
00072 }
00073
00074 TO3DBIResult O3DBIRecord::RemoveField(const O3DBIDataField& field)
00075 {
00076 TDataFieldsIter iter = std::find(_fields.begin(), _fields.end(), field);
00077 if (iter != _fields.end())
00078 {
00079 _fields.erase(iter);
00080 return OSUCCESS;
00081 } else {
00082 return OFAILED;
00083 }
00084 }
00085
00086 TO3DBIResult O3DBIRecord::RemoveField(TDataFieldIndex index)
00087 {
00088 if (index >= _fields.size())
00089 throw new O3DBIException(O3DBI_INDEX_OUTOFBOUNDS,
00090 O3DBIErrorTxt::pchIndexOutOfBounds, _T("O3DBIRecord::RemoveField"),
00091 this);
00092 return RemoveField((*this)[index]);
00093 }
00094
00095 TDataFields& O3DBIRecord::GetFields()
00096 {
00097 return _fields;
00098 }
00099
00100 TDataFieldsSize O3DBIRecord::GetFieldCount() const
00101 {
00102 return _fields.size();
00103 }
00104
00105 void O3DBIRecord::CancelModified()
00106 {
00107 TDataFieldsIter iter = _fields.begin();
00108 while (iter != _fields.end())
00109 {
00110 (*iter).CancelModified();
00111 ++iter;
00112 }
00113 }
00114
00115 bool O3DBIRecord::IsModified() const
00116 {
00117 TDataFieldsConstIter iter = _fields.begin();
00118 while (iter != _fields.end() && ! (*iter).IsModified())
00119 ++iter;
00120 return (iter != _fields.end());
00121 }
00122
00123 TO3DBIString O3DBIRecord::ToString() const
00124 {
00125 _TCHAR buffer[512];
00126 int p;
00127 p = ::_stprintf(buffer, _T("O3DBIRecord at: 0x%x\n"), this);
00128 if (_fields.size() == 0)
00129 {
00130 ::_tcscpy(buffer + p, _T("\t<contains no data fields>\n"));
00131 return TO3DBIString(buffer);
00132 }
00133 TO3DBIString str;
00134 str += _T("\t");
00135 TDataFieldsConstIter iter = _fields.begin();
00136 while (iter != _fields.end())
00137 {
00138 str += (*iter).ToString();
00139 ++iter;
00140 }
00141 return str;
00142 }