00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "readdata.h"
00015 #include <map>
00016 #include "trappervector.h"
00017 #include <ostream>
00018
00019 using namespace std;
00020
00021 ReadData::ReadData( const ReadData& other ) : GeneralData(other)
00022 {
00023 s = other.s;
00024
00025
00026
00027
00028
00029
00030
00031
00032 }
00033
00034
00035 ReadData::~ReadData()
00036 {}
00037
00038 void ReadData::print_debug_info()
00039 {
00040 cerr<<"This is class "<<uniqueName()<<endl;
00041 cerr<<"recno: "<<getRecno()<<endl;
00042 cerr<<"row: "<<row()<<endl;
00043 cerr<<"startPos: "<<startPos()<<endl;
00044 cerr<<"endPos: "<<endPos()<<endl;
00045 }
00046
00047 void ReadData::readStream( QDataStream & stream )
00048 {
00049 QIODevice * dev = stream.device();
00050 Q_ASSERT( dev );
00051 stream.readRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 }
00066
00067 void ReadData::writeStream( QDataStream & stream )
00068 {
00069 QIODevice * dev = stream.device();
00070 Q_ASSERT( dev );
00071 if ( ! ( IO_WriteOnly & dev->mode() ) )
00072 {
00073 cerr << "data stream should be writeonly" << endl;
00074 exit(1);
00075 }
00076 stream.writeRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 }
00090
00091 void ReadData::readAttributes( const QXmlAttributes& attr )
00092 {
00093 if ( attr.value("row") != "" ) {
00094 QString rowPosStr = attr.value("row");
00095 s.row = rowPosStr.toLong();
00096 }
00097 if ( attr.value("startPos") != "" ) {
00098 QString startPosStr = attr.value("startPos");
00099 s.startPos = startPosStr.toLong();
00100 }
00101 if ( attr.value("endPos") != "" ) {
00102 QString endPosStr = attr.value("endPos");
00103 s.endPos = endPosStr.toLong();
00104
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 }
00130
00131 void ReadData::writeXml( ostream& stream )
00132 {
00133 stream<<"<ReadData "
00134 <<"row=\""<<s.row<<"\" "
00135 <<"startPos=\""<<s.startPos<<"\" "
00136 <<"endPos=\""<<s.endPos<<"\" "
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 <<">\n";
00152 }
00153
00154 TrDb::IndexMap ReadData::getIndexMap()
00155 {
00156 TrDb::IndexMap iMap;
00157 TrDb::Index i = {
00158 &ReadData::bt_compare_rowPos,
00159 &ReadData::getRowPos,
00160 QString("pos"),
00161 NULL
00162 };
00163 iMap.insert( make_pair( i.name.ascii(), i ) );
00164
00165 TrDb::Index i2 = {
00166 &ReadData::bt_compare_end,
00167 &ReadData::getRowPos,
00168 QString("end"),
00169 NULL
00170 };
00171 iMap.insert( make_pair( i2.name.ascii(), i2 ) );
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 TrDb::Index i4 = {
00182 &ReadData::bt_compare_start,
00183 &ReadData::getRowPos,
00184 QString("start"),
00185 NULL
00186 };
00187 iMap.insert( make_pair( i4.name.ascii(), i4 ) );
00188
00189 return iMap;
00190 }
00191
00192 int ReadData::bt_compare_rowPos( DB * , const DBT *dbt1, const DBT *dbt2)
00193 {
00194
00195
00196 ReadData::StorageData * seqData1 = ( ReadData::StorageData *) dbt1->data;
00197 ReadData::StorageData * seqData2 = ( ReadData::StorageData *) dbt2->data;
00198 if ( seqData1->row > seqData2->row )
00199 return 1;
00200 if ( seqData1->row < seqData2->row )
00201 return -1;
00202 if ( seqData1->endPos == seqData2->endPos )
00203 return 0;
00204 if ( seqData1->endPos > seqData2->endPos )
00205 return 1;
00206 if ( seqData1->endPos < seqData2->endPos )
00207 return -1;
00208
00209
00210 return 0;
00211 }
00212
00213 int ReadData::bt_compare_end( DB * , const DBT *dbt1, const DBT *dbt2)
00214 {
00215
00216
00217 ReadData::StorageData * seqData1 = ( ReadData::StorageData *) dbt1->data;
00218 ReadData::StorageData * seqData2 = ( ReadData::StorageData *) dbt2->data;
00219 if ( seqData1->endPos > seqData2->endPos )
00220 return 1;
00221 if ( seqData1->endPos < seqData2->endPos )
00222 return -1;
00223 if ( seqData1->endPos == seqData2->endPos )
00224 return 0;
00225
00226
00227 return 0;
00228 }
00229
00230 int ReadData::bt_compare_start( DB * , const DBT *dbt1, const DBT *dbt2)
00231 {
00232
00233
00234 ReadData::StorageData * seqData1 = ( ReadData::StorageData *) dbt1->data;
00235 ReadData::StorageData * seqData2 = ( ReadData::StorageData *) dbt2->data;
00236 if ( seqData1->startPos > seqData2->startPos )
00237 return 1;
00238 if ( seqData1->startPos < seqData2->startPos )
00239 return -1;
00240 if ( seqData1->startPos == seqData2->startPos )
00241 return 0;
00242
00243
00244 return 0;
00245 }
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 int ReadData::getRowPos(Db * , const Dbt * ,
00260 const Dbt *pdata, Dbt *skey)
00261 {
00262
00263
00264
00265
00266
00267 memset(skey, 0, sizeof(Dbt));
00268 skey->set_data( pdata->get_data() );
00269 skey->set_size(sizeof( struct ReadData::StorageData ));
00270 return(0);
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296