00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MSD_DATA_H__
00014 #include "msd_data.h"
00015 #endif
00016 #include <cstdio>
00017
00018
00020
00022
00023
00024 void MSDSelect::SetCriteria(char* strCVal){
00025 *((msdbStream *) pos) << strCVal;
00026 }
00027 void MSDSelect::SetCriteria(double dfCVal){
00028 *((msdbStream *) pos) << dfCVal;
00029 }
00030 void MSDSelect::SetCriteria(float fCVal){
00031 *((msdbStream *) pos) << fCVal;
00032 }
00033 void MSDSelect::SetCriteria(int iCVal){
00034 *((msdbStream *) pos) << iCVal;
00035 }
00036 void MSDSelect::SetCriteria(unsigned int uiCVal){
00037 *((msdbStream *) pos) << uiCVal;
00038 }
00039 void MSDSelect::SetCriteria(short int shiCVal){
00040 *((msdbStream *) pos) << shiCVal;
00041 }
00042 void MSDSelect::SetCriteria(long int liCVal){
00043 *((msdbStream *) pos) << liCVal;
00044 }
00045
00046 MSDSelect::MSDSelect(){
00047 }
00048
00049 void MSDSelect::InitSql(msdbConnect& r_db, char* stm){
00050 j=0;
00051 buff=50;
00052 pos=NULL;
00053 char bufs[3072];
00054 sprintf(bufs, stm);
00055
00056 try
00057 {
00058 pos= new msdbStream (buff, bufs, r_db);
00059 }
00060 catch(msdbException& p){
00061 cerr<<p.msg<<endl;
00062 cerr<<p.stm_text<<endl;
00063 cerr<<p.var_info<<endl;
00064 }
00065
00066 if (pos == NULL) {
00067 cerr<< "Error: msdbStream can not initialize." << endl;
00068 return;
00069 }
00070 }
00071
00072 void MSDSelect::MakeRecord(){
00073 try
00074 {
00075 desc=pos->describe_select(desc_len);
00076 }
00077 catch(msdbException& p){
00078 cerr<<p.msg<<endl;
00079 cerr<<p.stm_text<<endl;
00080 cerr<<p.var_info<<endl;
00081 }
00082 let collist = listEM( msdEnd);
00083 let colliststr = msdConst("(");
00084
00085
00086 p = new msd_array(desc_len);
00087 for(int n=0;n<desc_len;++n){
00088 switch (desc[n].dbtype){
00089 case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00090 case 2 : {if (desc[n].scale == 129)
00091 (*p)[n] = new msd_float;
00092 else if (desc[n].scale==0)
00093 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1)
00094 (*p)[n] = new msd_int;
00095 else
00096 (*p)[n] = new msd_float;
00097 }
00098 else
00099 (*p)[n] = new msd_int;
00100 } break;
00101
00102 case 3 : {(*p)[n] = new msd_float;} break;
00103 case 4 : {(*p)[n] = new msd_int;} break;
00104 case 5 : {(*p)[n] = new msd_int;} break;
00105 case 6 : {(*p)[n] = new msd_short;} break;
00106 case 7 : {(*p)[n] = new msd_int;} break;
00107 case 12: {(*p)[n] = new msd_datetime;} break;
00108 case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00109
00110 default: {(*p)[n] = new msd_string(desc[n].dbsize+1);}
00111 }
00112 (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00113
00114 colliststr = stringConcat(colliststr, msdConst(" "));
00115 colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00116
00117
00118 }
00119 colliststr = stringConcat(colliststr, msdConst(")"));
00120 collist = readFromString(colliststr);
00121
00122
00123 }
00124
00125
00126 void MSDSelect::GetNext(){
00127 if (!((msdbStream *) pos)->eof())
00128 {
00129 p->getst(*((msdbStream *) pos));
00130
00131 ++j;
00132 }
00133 }
00134
00135 int MSDSelect::GetRowNum(){
00136 return j;
00137 }
00138
00139 int MSDSelect::GetVal(int col, float& f){
00140 f = ((msd_float*)(*p)[col])->msd_item;
00141 return 0;
00142 }
00143
00144 int MSDSelect::GetVal(int col, int& i){
00145 i = ((msd_int*)(*p)[col])->msd_item;
00146 return 0;
00147 }
00148
00149 int MSDSelect::GetVal(int col, char*& val){
00150 val = ((msd_string*)(*p)[col])->msd_item;
00151 return 0;
00152 }
00153
00154
00155 int MSDSelect::GetVal(int col, double& d){
00156 d = ((msd_double*)(*p)[col])->msd_item;
00157 return 0;
00158 }
00159
00161
00163
00164 void genselect(msdbConnect& r_db, char* stm){
00165 MSDSelect mselect;
00166 mselect.InitSql(r_db, stm);
00167 mselect.SetCriteria(1);
00168 mselect.MakeRecord();
00169 while (mselect.GetRowNum()<2)
00170 {
00171 mselect.GetNext();
00172 }
00173 }
00174
00175
00176
00177 void new_exec_query (int bf, msdbConnect& r_db, char* stm, MSDDataSet& rs)
00178 {
00179 r_db.set_max_long_size(MAXBLOBSIZE);
00180
00181 int j=0;
00182 int desc_len;
00183 char* stmnt=(char*)malloc(strlen(stm)+1);
00184 sprintf(stmnt,"%s",stm);
00185
00186 char rowitem[16];
00187
00188
00189
00190 otl_column_desc* desc;
00191 msdbStream ins;
00192 ins.open(bf, stmnt, r_db);
00193 ins<<1;
00194 desc=ins.describe_select(desc_len);
00195
00196 msd_array * p;
00197 p = new msd_array(desc_len);
00198
00199 stringstream rowliststr;
00200 let colliststr = msdConst("(");
00201 let collist = listEM( msdEnd);
00202 rowliststr << "(";
00203 let rowlist = listEM( msdEnd);
00204
00205 for(int n=0;n<desc_len;++n){
00206 switch (desc[n].dbtype){
00207 case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00208 case 2 : {if (desc[n].scale == 129)
00209 (*p)[n] = new msd_float;
00210 else if (desc[n].scale==0)
00211 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1)
00212 (*p)[n] = new msd_int;
00213 else
00214 (*p)[n] = new msd_float;
00215 }
00216 else
00217 (*p)[n] = new msd_int;
00218 } break;
00219
00220 case 3 : {(*p)[n] = new msd_float;} break;
00221 case 4 : {(*p)[n] = new msd_int;} break;
00222 case 5 : {(*p)[n] = new msd_int;} break;
00223 case 6 : {(*p)[n] = new msd_short;} break;
00224 case 7 : {(*p)[n] = new msd_int;} break;
00225 case 12: {(*p)[n] = new msd_datetime;} break;
00226 case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00227
00228 default: {(*p)[n] = new msd_string(desc[n].dbsize+1);}
00229
00230 }
00231 (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00232
00233 colliststr = stringConcat(colliststr, msdConst(" "));
00234 colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00235 }
00236
00237
00238
00239 colliststr = stringConcat(colliststr, msdConst(")"));
00240 collist = readFromString(colliststr);
00241 rs.addEntity( msdSymbol(colset));
00242 rs.setValue( msdSymbol(colset), msdSymbol(cols), collist);
00243
00244 while(!ins.eof()){
00245 sprintf(rowitem,"R%d",j);
00246 let rowname = intern( msdConst(rowitem));
00247 rowliststr << " ";
00248 rowliststr << rowitem;
00249 rs.addEntity(rowname);
00250 rs.setValue(rowname, msdSymbol(rowno), msdConst(j));
00251 p->getst(ins);
00252 for(int n=0;n<desc_len;++n){
00253
00254 cout << "Column name: " << (*p)[n]->msd_sym << " ";
00255 cout << "Value: " << (*p)[n]->getval() << endl;
00256
00257
00258 rs.setValue(rowname, (*p)[n]->msd_sym, (*p)[n]->getval());
00259 }
00260 ++j;
00261 }
00262 j=j-1;
00263 rowliststr << ")";
00264 rowlist = read(rowliststr);
00265
00266
00267 rs.addEntity( msdSymbol(rowset));
00268 rs.setValue( msdSymbol(rowset), msdSymbol(rows), rowlist);
00269 gc(colliststr);
00270
00271 free(stmnt);
00272 }
00273
00274
00276
00277 int msd_exec_query (int bf, msdbConnect& r_db, char* stm, MSDDataSet& rs, char* rs_table, const char* argtype, ...)
00278 {
00279 r_db.set_max_long_size(MAXBLOBSIZE);
00280 int i,j,desc_len;
00281 float f;
00282 double d;
00283
00284 char rowitem[64];
00285 char tblname[64];
00286 char* s;
00287 const char *a=argtype;
00288 va_list ap;
00289 va_start(ap,argtype);
00290 char stmnt[4096];
00291 sprintf(stmnt,"%s",stm);
00292
00293 sprintf(tblname,"%s",rs_table);
00294 let table = intern( msdConst(tblname));
00295 otl_column_desc* desc;
00296 j = rs.getSize()+1;
00297 msdbStream ins;
00298 ins.open(bf, stmnt, r_db);
00299 while(*a)
00300 {
00301 if (*a=='i')
00302 {
00303 i=va_arg(ap,int);
00304 ins<<i;
00305 }
00306 else if (*a=='d')
00307 {
00308 d=va_arg(ap,double);
00309 ins<<d;
00310 }
00311 else if (*a=='s')
00312 {
00313 s=va_arg(ap,char*);
00314 ins<<s;
00315 }
00316 else
00317 {
00318 printf("unsupported format flag");
00319 break;
00320 }
00321 ++a;
00322 }
00323 va_end(ap);
00324 desc=ins.describe_select(desc_len);
00325 msd_array * p;
00326 p = new msd_array(desc_len);
00327 stringstream rowliststr;
00328 let colliststr = msdConst("(");
00329 let collist = listEM( msdEnd);
00330
00331 for(int n=0;n<desc_len;++n){
00332 switch (desc[n].dbtype){
00333 case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00334 case 2 : {if (desc[n].scale == 129)
00335 (*p)[n] = new msd_float;
00336 else if (desc[n].scale==0)
00337 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1)
00338 (*p)[n] = new msd_int;
00339 else
00340 (*p)[n] = new msd_float;
00341 }
00342 else
00343 (*p)[n] = new msd_int;
00344 } break;
00345
00346 case 3 : {(*p)[n] = new msd_float;} break;
00347 case 4 : {(*p)[n] = new msd_int;} break;
00348 case 5 : {(*p)[n] = new msd_int;} break;
00349 case 6 : {(*p)[n] = new msd_short;} break;
00350 case 7 : {(*p)[n] = new msd_int;} break;
00351 case 12: {(*p)[n] = new msd_datetime;} break;
00352 case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00353
00354 default: {(*p)[n] = new msd_string(desc[n].dbsize+1);}
00355 }
00356 (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00357
00358 colliststr = stringConcat(colliststr, msdConst(" "));
00359 colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00360 }
00361 colliststr = stringConcat(colliststr, msdConst(")"));
00362 collist = readFromString(colliststr);
00363
00364 int st=j;
00365 while(!ins.eof()){
00366 sprintf(rowitem,"R%d",j);
00367 let rowname = intern( msdConst(rowitem));
00368
00369
00370 rs.addEntity(rowname);
00371 rs.setValue(rowname, msdSymbol(rowno), msdConst(j));
00372 p->getst(ins);
00373 for(int n=0;n<desc_len;++n){
00374 rs.setValue(rowname, (*p)[n]->msd_sym, (*p)[n]->getval());
00375 }
00376 ++j;
00377 }
00378 j=j-1;
00379
00380 let rowlist = listEM( msdConst(st),msdConst(j),msdEnd);
00381 rs.addEntity(table);
00382 rs.setValue(table, msdSymbol(rows), rowlist);
00383 rs.setValue(table, msdSymbol(cols), collist);
00384
00385 gc(colliststr);
00386
00387 return (0);
00388 }
00389
00390 let msd_make_rowlist(let se){
00391 int s,e;
00392 char rowitem[16];
00393 stringstream rowliststr;
00394 s = iC(nth(0,se));
00395 e = iC(nth(1,se));
00396 rowliststr << "(";
00397 let rowlist = listEM( msdEnd);
00398 int j = s;
00399 while(j<=e){
00400 sprintf(rowitem,"R%d",j);
00401 let rowname = intern( msdConst(rowitem));
00402 rowliststr << " ";
00403 rowliststr << rowitem;
00404 ++j;
00405 }
00406 rowliststr << ")";
00407 rowlist = read(rowliststr);
00408 return rowlist;
00409 }
00410
00411
00412
00414
00415
00416