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
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
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
00132
00133
00134
00135
00136
00137 #include "StDbTableDescriptor.h"
00138 #include <stdlib.h>
00139 #include <math.h>
00140 #include "stdb_streams.h"
00141 #include <iostream>
00142
00143
00144 template <typename T>
00145 struct StCompilerAlignTest {
00146 char m0;
00147 T m1;
00148 };
00149
00150 #define st_alignof(TYPE) (size_t)&(((StCompilerAlignTest<TYPE>*)0)->m1)
00151
00153
00154 StDbTableDescriptor::StDbTableDescriptor(){ init(); }
00155
00157
00158 StDbTableDescriptor::StDbTableDescriptor(int structID, int schemaID){
00159
00160 init();
00161 mstructID=structID;
00162 mschemaID=schemaID;
00163
00164 };
00165
00167
00168 void
00169 StDbTableDescriptor::init(){
00170
00171 mtableSize=0;
00172 mCur = 0;
00173 mMax = 100;
00174 offsetToNextEmptyByte = 0;
00175 offsetToLast4Bytes = -4;
00176 mnumElements = 0;
00177 lastType=Stdouble;
00178 padsize = 0;
00179 mcols = new tableDescriptor[mMax];
00180 memset(mcols,0,mMax*sizeof(tableDescriptor));
00181 mschemaID=mstructID=0;
00182 misValid=false;
00183 mhasDouble=false;
00184 rowSizeTT = 0;
00185
00186 mAlign[Stchar] = st_alignof(char);
00187 mAlign[Stuchar] = st_alignof(unsigned char);
00188 mAlign[Stshort] = st_alignof(short);
00189 mAlign[Stushort] = st_alignof(unsigned short);
00190 mAlign[Stint] = st_alignof(int);
00191 mAlign[Stuint] = st_alignof(unsigned int);
00192 mAlign[Stlong] = st_alignof(long);
00193 mAlign[Stulong] = st_alignof(unsigned long);
00194 mAlign[Stlonglong] = st_alignof(long long);
00195 mAlign[Stfloat] = st_alignof(float);
00196 mAlign[Stdouble] = st_alignof(double);
00197
00198 maxAlign = mAlign[Stchar];
00199
00200 }
00201
00203
00204 StDbTableDescriptor::StDbTableDescriptor(StDbTableDescriptor& d){
00205
00206 mCur = (int)d.getNumElements()-1;
00207 mMax = d.getCurrentInternalSize();
00208 offsetToNextEmptyByte = 0;
00209 offsetToLast4Bytes = 0;
00210 mcols = d.getTableDescriptor();
00211 mnumElements=d.getNumElements();
00212 mtableSize = d.getTotalSizeInBytes();
00213 mschemaID=d.getSchemaID();
00214 mstructID=d.getStructID();
00215 misValid=d.IsValid();
00216 mhasDouble=d.mhasDouble;
00217 maxAlign=d.maxAlign;
00218 rowSizeTT = d.rowSizeTT;
00219
00220 mAlign[Stchar] = st_alignof(char);
00221 mAlign[Stuchar] = st_alignof(unsigned char);
00222 mAlign[Stshort] = st_alignof(short);
00223 mAlign[Stushort] = st_alignof(unsigned short);
00224 mAlign[Stint] = st_alignof(int);
00225 mAlign[Stuint] = st_alignof(unsigned int);
00226 mAlign[Stlong] = st_alignof(long);
00227 mAlign[Stulong] = st_alignof(unsigned long);
00228 mAlign[Stlonglong] = st_alignof(long long);
00229 mAlign[Stfloat] = st_alignof(float);
00230 mAlign[Stdouble] = st_alignof(double);
00231
00232 }
00233
00235
00236 tableDescriptor*
00237 StDbTableDescriptor::getTableDescriptor() const {
00238
00239 tableDescriptor* dScr = new tableDescriptor[mMax];
00240 memset(dScr,0,(mMax)*sizeof(tableDescriptor));
00241 memcpy(dScr,mcols,(mMax)*sizeof(tableDescriptor));
00242
00243 return dScr;
00244 }
00246
00247 StTableDescriptorI*
00248 StDbTableDescriptor::getCpy(){
00249
00250 StTableDescriptorI* dScr = new StDbTableDescriptor(*this);
00251 return dScr;
00252
00253 }
00255
00256 void
00257 StDbTableDescriptor::fillElement(StDbBuffer* buff, int tableID){
00258
00259
00260
00261 int schemaID;
00262 if(tableID){
00263 if(!(buff->ReadScalar(schemaID,"schemaID") && (schemaID==tableID)) ){
00264
00265 return;
00266 }
00267 }
00268
00269 reSize();
00270 int i = mCur;
00271 char* mtype = 0;
00272 char* mname = 0;
00273 buff->ReadScalar(mname,"name");
00274 if(mname)strcpy(mcols[i].name,mname);
00275 if(mname) delete [] mname;
00276 if(buff->ReadScalar(mtype,"type")){
00277 mcols[i].type = getType(mtype);
00278 if(mtype)delete [] mtype;
00279 char* length=0;
00280 if(buff->ReadScalar(length,"length"))fillSizeAndOffset(length,i);
00281 if(length) delete [] length;
00282 }
00283
00284 if (mcols[i].type==Stlonglong || mcols[i].type==Stdouble ) mhasDouble=true;
00285 if (getAlign(mcols[i].type) > maxAlign) { maxAlign = getAlign(mcols[i].type); }
00286
00287 mCur++;
00288 mnumElements++;
00289
00290
00291
00292 int rowpad;
00293 if ( ( rowpad = offsetToNextEmptyByte%2 ) ) { rowpad = 2 - rowpad; }
00294
00295
00296
00297
00298 mtableSize = int(ceil(float(offsetToNextEmptyByte) / float(maxAlign)) * maxAlign);
00299
00300
00301
00302 misValid=true;
00303
00304 }
00305
00307
00308
00309 void
00310 StDbTableDescriptor::reSize(){
00311
00312
00313
00314 if(mCur<mMax) return;
00315
00316 int newMax = mMax+10;
00317 tableDescriptor* dScr = new tableDescriptor[newMax];
00318 memcpy(dScr,mcols,(mMax)*sizeof(tableDescriptor));
00319 if(mcols)delete [] mcols;
00320 mcols=dScr;
00321 mMax=newMax;
00322
00323 }
00324
00326
00327 void
00328 StDbTableDescriptor::fillLengths(char* length, int elementNum){
00329
00330 int ip = 0;
00331 int i=elementNum;
00332 char* id= strstr(length,",");
00333
00334
00335
00336 int k= (int)(sizeof(mcols[i].dimensionlen)/sizeof(ip));
00337 for(int j=0;j<k;j++)mcols[i].dimensionlen[j]=1;
00338
00339 while (id && ip<3) {
00340 id[0]='\0';
00341 mcols[i].dimensionlen[ip] = atoi(length);
00342 ip++;
00343 id++;
00344 length=id;
00345 id= strstr(length,",");
00346 }
00347 mcols[i].dimensionlen[ip]=atoi(length);
00348
00349 }
00350
00352
00353 void
00354 StDbTableDescriptor::fillSizeAndOffset(char* length, int elementNum){
00355
00356 fillLengths(length,elementNum);
00357 StTypeE type = mcols[elementNum].type;
00358
00359 int j = 0;
00360 mcols[elementNum].size = getSize(mcols[elementNum].type);
00361
00362 int k= (int)(sizeof(mcols[elementNum].dimensionlen)/sizeof(j));
00363 for (j=0; j<k; j++) mcols[elementNum].size *= mcols[elementNum].dimensionlen[j];
00364
00365 int offp = int(ceil(float(offsetToNextEmptyByte) / float(getAlign(type))) * getAlign(type));
00366 mcols[elementNum].offset = offp;
00367 offsetToNextEmptyByte = mcols[elementNum].offset + mcols[elementNum].size;
00368
00369 }
00370
00372
00373 StTypeE
00374 StDbTableDescriptor::getType(char* type) {
00375
00376 StTypeE retVal=Stchar;
00377
00378
00379 const char* typenames[] = {"char","uchar","short","ushort","int","uint","long","ulong","longlong","float","double","ascii","string"};
00380
00381 for(int i=0; i<12;i++){
00382 if(strcmp(type,typenames[i])==0){
00383 retVal=(StTypeE)i;
00384 break;
00385 }
00386 }
00387
00388 return retVal;
00389 }
00390
00392 void StDbTableDescriptor::endRowPadding(){
00393
00394
00395
00396
00397
00398 #ifndef __linux__
00399 if(mhasDouble){
00400 int checkPadding=mtableSize%8;
00401 if(checkPadding>0 && checkPadding<5)mtableSize+=4;
00402 }
00403 #endif
00404
00405 };
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424