00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <string>
00035 #include <iostream>
00036
00037 #include "StDbFieldI.h"
00038 #include "StRecord.h"
00039 #include "StDataException.h"
00040
00041 using namespace TxLogging;
00042 using namespace std;
00043
00044 StRecord::StRecord() : fFields()
00045 {
00046 }
00047
00048
00049 StRecord::StRecord(const FieldList &fields) : fFields(fields) {
00050
00051
00052 if ( fields.empty() ) {
00053 throw StDataException("Attempted to create an empty record",
00054 StDataException::RECORD);
00055 }
00056
00057 }
00058
00059
00060
00061 StRecord::StRecord(const StRecord &r) : fFields() {
00062 copy(r);
00063 }
00064
00065
00066 StRecord::~StRecord() {
00067 if (!fFields.empty()) { }
00068 }
00069
00070
00071
00072 const StRecord& StRecord::operator=(const StRecord& r){
00073 if ( this != &r ) {
00074 copy(r);
00075 }
00076 return *this;
00077 }
00078
00079
00080
00081 void StRecord::copy(const StRecord& r) {
00082 if (!fFields.empty()) clearList();
00083
00084
00085 for ( FieldList::const_iterator iter = r.getFields().begin();
00086 iter != r.getFields().end();
00087 iter++ ) {
00088 fFields.push_back(new StDbFieldI(**iter));
00089 }
00090 }
00091
00092
00093
00094 void StRecord::clearList() {
00095 for (FieldList::iterator iter = fFields.begin();
00096 iter != fFields.end();
00097 iter++) {
00098 delete *iter;
00099 }
00100 fFields.clear();
00101 }
00102
00103
00104
00105 const char*StRecord::toString() const {
00106 static std::string recordStr;
00107 recordStr="";
00108
00109 for (FieldList::const_iterator iter = fFields.begin();
00110 iter != fFields.end();
00111 ++iter) {
00112 recordStr += string("|") + (*iter)->fieldAsString();
00113 }
00114 recordStr += "|";
00115 return recordStr.c_str() ;
00116 }
00117
00118
00119 const FieldList& StRecord::getFields() const {
00120 return fFields;
00121 }
00122
00123
00124 FieldList& StRecord::getFields() {
00125 return fFields;
00126 }
00127
00128
00129 StDbFieldI* StRecord::getField(const char *name) const
00130 {
00131 StDbFieldI* field = 0;
00132 for (FieldList::const_iterator iter = fFields.begin();
00133 !field && (iter != fFields.end()) ;
00134 iter++) {
00135 if (string(name) == (*iter)->getName()) field = *iter;
00136 }
00137 return field;
00138 }
00139
00140
00141
00142 StDbFieldI* StRecord::getField(unsigned int col) const
00143 {
00144 return
00145 ( col > 0 && col <= fFields.size() ) ? fFields[col-1] : 0;
00146 }
00147
00148 const RecordList &StRecord::getRecords() const{
00149 return fRecords;
00150 }
00151
00152
00153 RecordList &StRecord::getRecords() {
00154 return fRecords;
00155 }
00156
00157
00158 void StRecord::removeField(const char *name) {
00159 for (FieldList::iterator iter = fFields.begin();
00160 iter != fFields.end();
00161 iter++) {
00162 if (string(name) == (*iter)->getName()) {
00163 fFields.erase(iter);
00164 break;
00165 }
00166 }
00167 }
00168
00169
00170
00171 void StRecord::removeField(int col)
00172 {
00173 int i;
00174 FieldList::iterator iter;
00175
00176 for (iter = fFields.begin(), i=0; iter != fFields.end(); i++, iter++)
00177 {
00178 if ( i == col ) {
00179 fFields.erase(iter);
00180 break;
00181 }
00182 }
00183 }
00184
00185
00186 void StRecord::printHeader() const
00187 {
00188 FieldList::const_iterator it = fFields.begin();
00189 for (; it != fFields.end(); ++it) {
00190 cout << (*it)->getName() << " | " ;
00191 }
00192 cout << endl;
00193 for (; it != fFields.end(); ++it) {
00194 cout << (*it)->getTypeAsString() << " | " ;
00195 }
00196 cout << endl;
00197 }
00198
00199
00200 void StRecord::print() const
00201 {
00202 FieldList::const_iterator it = fFields.begin();
00203 for (; it != fFields.end(); ++it) {
00204 cout << (*it)->getValueAsString() << " | " ;
00205 }
00206 cout << endl;
00207 }