File indexing completed on 2025-08-03 08:22:03
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <RDBC/TSQLResultSetMetaData.h>
0021 #include <RDBC/TSQLResultSet.h>
0022 #include "MySQLResultSetPrivate.h"
0023
0024 ClassImpQ(TSQLResultSetMetaData)
0025
0026
0027
0028
0029 TSQLResultSetMetaData::TSQLResultSetMetaData( TSQLResultSet* rs,
0030 void* imp ):TSQL(imp)
0031 {
0032
0033
0034 fResultSet = rs;
0035
0036
0037
0038 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0039 Int_t cols = imp->fMYSQL_RES->field_count;
0040
0041 imp->fColumnPrecisions = new Int_t[cols];
0042 imp->fColumnTypes = new Int_t[cols];
0043 imp->fColumnTypeNames = new TString[cols];
0044
0045 for(int i=0; i<cols; i++) {
0046 imp->fColumnPrecisions[i] = max(imp->fMYSQL_RES->fields[i].length, imp->fMYSQL_RES->fields[i].max_length);
0047
0048 switch(imp->fMYSQL_RES->fields[i].type) {
0049 case FIELD_TYPE_DECIMAL:
0050 imp->fColumnTypes[i] = kDECIMAL;
0051 imp->fColumnTypeNames[i] = "decimal";
0052 break;
0053 case FIELD_TYPE_CHAR:
0054 imp->fColumnTypeNames[i] = "tinyint";
0055 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0056 imp->fColumnTypes[i] = kTINYINT;
0057 break;
0058 case FIELD_TYPE_SHORT:
0059 imp->fColumnTypeNames[i] = "smallint";
0060 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0061 imp->fColumnTypes[i] = kSMALLINT;
0062 break;
0063 case FIELD_TYPE_INT24:
0064 imp->fColumnTypeNames[i] = "mediumint";
0065 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0066 imp->fColumnTypes[i] = kINTEGER;
0067 break;
0068 case FIELD_TYPE_LONG:
0069 imp->fColumnTypeNames[i] = "integer";
0070 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0071 imp->fColumnTypes[i] = kINTEGER;
0072 break;
0073 case FIELD_TYPE_LONGLONG:
0074 imp->fColumnTypeNames[i] = "bigint";
0075 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0076 imp->fColumnTypes[i] = ? kINTEGER : kBIGINT;
0077 !! return (stmt->dbc->flag & FLAG_NO_BIGINT)
0078 case FIELD_TYPE_FLOAT:
0079 imp->fColumnTypeNames[i] = "float";
0080 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0081 imp->fColumnTypes[i] = kREAL;
0082 break;
0083 case FIELD_TYPE_DOUBLE:
0084 imp->fColumnTypeNames[i] = "double";
0085 if(imp->fMYSQL_RES->fields[i].flags & UNSIGNED_FLAG) imp->fColumnTypeNames[i] += " unsigned";
0086 imp->fColumnTypes[i] = kDOUBLE;
0087 break;
0088 case FIELD_TYPE_NULL:
0089 imp->fColumnTypeNames[i] = "null";
0090 imp->fColumnTypes[i] = kVARCHAR;
0091 break;
0092 case FIELD_TYPE_YEAR:
0093 imp->fColumnTypeNames[i] = "year";
0094 imp->fColumnTypes[i] = kSMALLINT;
0095 break;
0096 case FIELD_TYPE_TIMESTAMP:
0097 imp->fColumnTypeNames[i] = "timestamp";
0098 imp->fColumnPrecisions[i] = 19;
0099 imp->fColumnTypes[i] = kTIMESTAMP;
0100 break;
0101 case FIELD_TYPE_DATETIME:
0102 imp->fColumnTypeNames[i] = "datetime";
0103 imp->fColumnPrecisions[i] = = 19;
0104 imp->fColumnTypes[i] = kTIMESTAMP;
0105 break;
0106 case FIELD_TYPE_NEWDATE:
0107 case FIELD_TYPE_DATE:
0108 imp->fColumnTypeNames[i] = "date";
0109 imp->fColumnPrecisions[i] = 10;
0110 imp->fColumnTypes[i] = kDATE;
0111 break;
0112 case FIELD_TYPE_TIME:
0113 imp->fColumnTypeNames[i] = "time";
0114 imp->fColumnPrecisions[i] = 8;
0115 imp->fColumnTypes[i] = kTIME;
0116 break;
0117 case FIELD_TYPE_STRING:
0118 imp->fColumnTypeNames[i] = "char";
0119 imp->fColumnTypes[i] = kCHAR;
0120 break;
0121 case FIELD_TYPE_VAR_STRING:
0122 imp->fColumnTypeNames[i] = "varchar";
0123 imp->fColumnTypes[i] = kVARCHAR;
0124 break;
0125 case FIELD_TYPE_TINY_BLOB:
0126 imp->fColumnTypeNames[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? "tinyblob" : "tinytext");
0127 if (stmt->dbc->flag & (FLAG_FIELD_LENGTH | FLAG_SAFE)) imp->fColumnPrecisions[i] = 255;
0128 imp->fColumnTypes[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? kLONGVARBINARY : kLONGVARCHAR;
0129 case FIELD_TYPE_BLOB:
0130 imp->fColumnTypeNames[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? "blob" : "text");
0131 if (stmt->dbc->flag & (FLAG_FIELD_LENGTH | FLAG_SAFE)) imp->fColumnPrecisions[i] = 65535;
0132 imp->fColumnTypes[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? kLONGVARBINARY : kLONGVARCHAR;
0133 case FIELD_TYPE_MEDIUM_BLOB:
0134 imp->fColumnTypeNames[i] = ((imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? "mediumblob" : "mediumtext"));
0135 if (stmt->dbc->flag & (FLAG_FIELD_LENGTH | FLAG_SAFE))imp->fColumnPrecisions[i] = (1L << 24)-1L;
0136 imp->fColumnTypes[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? kLONGVARBINARY : kLONGVARCHAR;
0137 case FIELD_TYPE_LONG_BLOB:
0138 imp->fColumnTypeNames[i] = ((imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? "longblob": "longtext"));
0139 if (stmt->dbc->flag & (FLAG_FIELD_LENGTH | FLAG_SAFE)) imp->fColumnPrecisions[i] = = INT_MAX32;
0140 imp->fColumnTypes[i] = (imp->fMYSQL_RES->fields[i].flags & BINARY_FLAG) ? kLONGVARBINARY : kLONGVARCHAR;
0141 case FIELD_TYPE_ENUM:
0142 imp->fColumnTypeNames[i] = "enum";
0143 imp->fColumnTypes[i] = kCHAR;
0144 break;
0145 case FIELD_TYPE_SET:
0146 imp->fColumnTypeNames[i] = "set";
0147 imp->fColumnTypes[i] = kCHAR;
0148 break;
0149 }
0150 }
0151 }
0152
0153
0154 TSQLResultSetMetaData::~TSQLResultSetMetaData()
0155 {
0156
0157
0158 fResultSet = 0;
0159 fImp = 0;
0160 }
0161
0162
0163 Int_t TSQLResultSetMetaData::GetColumnCount()
0164 {
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0175 return (imp->fMYSQL_RES->field_count);
0176 }
0177
0178
0179 Bool_t TSQLResultSetMetaData::IsAutoIncrement( Int_t column )
0180 {
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0196
0197 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0198 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0199 return kFALSE;
0200 }
0201
0202 return (imp->MYSQL_RES->fields[column-1].flags & AUTO_INCREMENT_FLAG);
0203 }
0204
0205
0206 Bool_t TSQLResultSetMetaData::IsCaseSensitive( Int_t column )
0207 {
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0219
0220 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0221 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0222 return kFALSE;
0223 }
0224
0225 return (imp->MYSQL_RES->fields[column-1].flags & BINARY_FLAG);
0226 }
0227
0228
0229 Bool_t TSQLResultSetMetaData::IsSearchable( Int_t column )
0230 {
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0241
0242 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0243 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0244 return kFALSE;
0245 }
0246
0247 return kTRUE;
0248 }
0249
0250
0251 Bool_t TSQLResultSetMetaData::IsCurrency( Int_t column )
0252 {
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0263
0264 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0265 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0266 return kFALSE;
0267 }
0268
0269 return kFALSE;
0270 }
0271
0272
0273 Bool_t TSQLResultSetMetaData::IsNullable( Int_t column )
0274 {
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0287
0288 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0289 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0290 return kFALSE;
0291 }
0292
0293 return ((imp->MYSQL_RES->fields[column-1].flags & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) != NOT_NULL_FLAG);
0294 }
0295
0296
0297 Bool_t TSQLResultSetMetaData::IsSigned( Int_t column )
0298 {
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0309
0310 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0311 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0312 return kFALSE;
0313 }
0314
0315 retrurn !(imp->MYSQL_RES->fields[column-1].flags & UNSIGNED_FLAG);
0316 }
0317
0318
0319 Int_t TSQLResultSetMetaData::GetColumnDisplaySize( Int_t column )
0320 {
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0332
0333 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0334 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0335 return 0;
0336 }
0337
0338 return imp->fColumnPrecisions[column-1];
0339 }
0340
0341
0342 TString TSQLResultSetMetaData::GetColumnLabel( Int_t column )
0343 {
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0355
0356 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0357 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0358 return "";
0359 }
0360
0361 return imp->MYSQL_RES->fields[column-1].name;
0362 }
0363
0364
0365 TString TSQLResultSetMetaData::GetColumnName( Int_t column )
0366 {
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0377
0378 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0379 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0380 return "";
0381 }
0382
0383 return imp->MYSQL_RES->fields[column-1].name;
0384 }
0385
0386
0387 TString TSQLResultSetMetaData::GetSchemaName( Int_t column )
0388 {
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0399
0400 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0401 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0402 return "";
0403 }
0404
0405 return "";
0406 }
0407
0408
0409 Int_t TSQLResultSetMetaData::GetPrecision( Int_t column )
0410 {
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0421
0422 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0423 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0424 return 0;
0425 }
0426
0427 return imp->fColumnPrecisions[column-1];
0428 }
0429
0430
0431 Int_t TSQLResultSetMetaData::GetScale( Int_t column )
0432 {
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0443
0444 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0445 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0446 return 0;
0447 }
0448
0449 return (imp->MYSQL_RES->fields[column-1].decimals);
0450 }
0451
0452
0453 TString TSQLResultSetMetaData::GetTableName( Int_t column )
0454 {
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0465
0466 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0467 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0468 return ("");
0469 }
0470
0471 return (imp->MYSQL_RES->fields[column-1].table ? imp->MYSQL_RES->fields[column-1].table : "");
0472 }
0473
0474
0475 TString TSQLResultSetMetaData::GetCatalogName( Int_t column )
0476 {
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0487
0488 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0489 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0490 return "";
0491 }
0492
0493 return "";
0494 }
0495
0496
0497 Int_t TSQLResultSetMetaData::GetColumnType( Int_t column )
0498 {
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0536
0537 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0538 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0539 return 0;
0540 }
0541
0542 return imp->fColumnTypes[column-1];
0543 }
0544
0545
0546 TString TSQLResultSetMetaData::GetColumnTypeName( Int_t column )
0547 {
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0561
0562 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0563 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0564 return "";
0565 }
0566
0567 return imp->fColumnTypeNames[column-1];
0568 }
0569
0570
0571 Bool_t TSQLResultSetMetaData::IsReadOnly( Int_t column )
0572 {
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0583
0584 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0585 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0586 return (kTRUE);
0587 }
0588
0589 return (!(imp->MYSQL_RES->fields[column-1].table && imp->MYSQL_RES->fields[column-1].table[0]));
0590 }
0591
0592
0593 Bool_t TSQLResultSetMetaData::IsWritable( Int_t column )
0594 {
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0606
0607 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0608 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0609 return kFALSE;
0610 }
0611
0612 return (imp->MYSQL_RES->fields[column-1].table && imp->MYSQL_RES->fields[column-1].table[0]);
0613 }
0614
0615
0616 Bool_t TSQLResultSetMetaData::IsDefinitelyWritable( Int_t column )
0617 {
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629 MySQLResultSetPrivate* imp = (MySQLResultSetPrivate*)fImp;
0630
0631 if( (UInt_t)(column-1) >= imp->fMYSQL_RES->field_count ) {
0632 Throw(new TSQLException(Form("Invalid column number ( %d > %d )",column,imp->fMYSQL_RES->field_count+1),"S1002",);
0633 return kFALSE;
0634 }
0635
0636 return (imp->MYSQL_RES->fields[column-1].table && imp->MYSQL_RES->fields[column-1].table[0]);
0637 }