00001
00002
00003
00004
00005 #ifndef IBIS_BORD_H
00006 #define IBIS_BORD_H
00007 #include "table.h"
00008 #include "util.h"
00009 #include "part.h"
00010
00014 namespace ibis {
00015 class bord;
00016 }
00017
00028 class FASTBIT_CXX_DLLSPEC ibis::bord : public ibis::table {
00029 public:
00030 bord(const char *tn, const char *td, uint64_t nr,
00031 ibis::table::bufferList &buf,
00032 const ibis::table::typeList &ct,
00033 const ibis::table::stringList &cn,
00034 const ibis::table::stringList *cdesc=0);
00035 virtual ~bord() {clear();}
00036
00037 virtual uint64_t nRows() const {return mypart.nRows();}
00038 virtual uint32_t nColumns() const {return mypart.nColumns();}
00039
00040 virtual ibis::table::stringList columnNames() const;
00041 virtual ibis::table::typeList columnTypes() const;
00042
00043 virtual void describe(std::ostream&) const;
00044 virtual void dumpNames(std::ostream&, const char*) const;
00045 virtual int dump(std::ostream&, const char*) const;
00046 virtual int dump(std::ostream&, uint64_t, const char*) const;
00047 virtual int dump(std::ostream&, uint64_t, uint64_t, const char*) const;
00048 virtual int backup(const char* dir, const char* tname=0,
00049 const char* tdesc=0) const;
00050
00051 virtual int64_t getColumnAsBytes(const char*, char*) const;
00052 virtual int64_t getColumnAsUBytes(const char*, unsigned char*) const;
00053 virtual int64_t getColumnAsShorts(const char*, int16_t*) const;
00054 virtual int64_t getColumnAsUShorts(const char*, uint16_t*) const;
00055 virtual int64_t getColumnAsInts(const char*, int32_t*) const;
00056 virtual int64_t getColumnAsUInts(const char*, uint32_t*) const;
00057 virtual int64_t getColumnAsLongs(const char*, int64_t*) const;
00058 virtual int64_t getColumnAsULongs(const char*, uint64_t*) const;
00059 virtual int64_t getColumnAsFloats(const char*, float*) const;
00060 virtual int64_t getColumnAsDoubles(const char*, double*) const;
00061 virtual int64_t getColumnAsDoubles(const char*,
00062 std::vector<double>&) const;
00063 virtual int64_t getColumnAsStrings(const char*,
00064 std::vector<std::string>&) const;
00065
00066 virtual long getHistogram(const char*, const char*,
00067 double, double, double,
00068 std::vector<uint32_t>&) const;
00069 virtual long getHistogram2D(const char*, const char*,
00070 double, double, double,
00071 const char*,
00072 double, double, double,
00073 std::vector<uint32_t>&) const;
00074 virtual long getHistogram3D(const char*, const char*,
00075 double, double, double,
00076 const char*,
00077 double, double, double,
00078 const char*,
00079 double, double, double,
00080 std::vector<uint32_t>&) const;
00081
00082 virtual void estimate(const char* cond,
00083 uint64_t& nmin, uint64_t& nmax) const;
00084 virtual void estimate(const ibis::qExpr* cond,
00085 uint64_t& nmin, uint64_t& nmax) const;
00086 using table::select;
00087 virtual table* select(const char* sel, const char* cond) const;
00088 virtual table* groupby(const ibis::table::stringList&) const;
00089 virtual table* groupby(const char* str) const;
00090 virtual void orderby(const ibis::table::stringList&);
00091 virtual void orderby(const char* str) {
00092 ibis::table::orderby(str);
00093 }
00094 virtual void reverseRows();
00095
00096 virtual int buildIndex(const char*, const char*) {return -1;}
00097 virtual int buildIndexes(const char*) {return -1;}
00098 virtual const char* indexSpec(const char*) const {return 0;}
00099 virtual void indexSpec(const char*, const char*) {return;}
00100 virtual int getPartitions(std::vector<const ibis::part*> &) const;
00101
00102
00103 class cursor;
00105 virtual ibis::table::cursor* createCursor() const;
00106
00107 int restoreCategoriesAsStrings(const ibis::part&, const char*);
00108 ibis::table* groupby(const ibis::selectClause&) const;
00109 ibis::table* evaluateTerms(const ibis::selectClause&,
00110 const char*) const;
00111
00112 class column;
00113 class text;
00115 class part : public ibis::part {
00116 public:
00117 part(const char *tn, const char *td, uint64_t nr,
00118 const ibis::table::stringList &cn,
00119 const ibis::table::typeList &ct,
00120 ibis::table::bufferList &buf,
00121 const ibis::table::stringList *cdesc=0);
00122
00123 ibis::table* groupby(const ibis::selectClause&) const;
00124 ibis::table* evaluateTerms(const ibis::selectClause&,
00125 const char*) const;
00126 virtual long reorder(const ibis::table::stringList&);
00127 virtual long reorder() {return ibis::part::reorder();}
00128
00129 int dump(std::ostream&, uint32_t, const char*) const;
00130 int dump(std::ostream&, uint32_t, uint32_t, const char*) const;
00131 int backup(const char*, const char*, const char*) const;
00132
00133 void describe(std::ostream&) const;
00134 void dumpNames(std::ostream&, const char*) const;
00135 void reverseRows();
00136 int limit(uint32_t);
00137
00138 template <typename T>
00139 long sortValues(array_t<T>& vals,
00140 const array_t<uint32_t>& indin,
00141 array_t<uint32_t>& indout,
00142 array_t<uint32_t>& starts) const;
00143 template <typename T>
00144 long reorderValues(array_t<T>& vals,
00145 const array_t<uint32_t>& ind) const;
00146 long sortStrings(std::vector<std::string>& vals,
00147 const array_t<uint32_t>& idxin,
00148 array_t<uint32_t>& idxout,
00149 array_t<uint32_t>& starts) const;
00150 long reorderStrings(std::vector<std::string>& vals,
00151 const array_t<uint32_t>& ind) const;
00152
00153 int restoreCategoriesAsStrings(const ibis::part&, const char*);
00154
00155 private:
00156 part();
00157 part(const part&);
00158 part& operator=(const part&);
00159 };
00160
00161 static void copyValue(ibis::TYPE_T type,
00162 void* outbuf, size_t outpos,
00163 const void* inbuf, size_t inpos);
00164
00165 protected:
00166 part mypart;
00167
00169 void clear();
00171 int64_t computeHits(const char* cond) const;
00172
00173 private:
00174
00175 bord(const bord&);
00176 bord& operator=(const bord&);
00177
00178 friend class cursor;
00179 };
00180
00190 class ibis::bord::column : public ibis::column {
00191 public:
00192 column(const ibis::bord::part* tbl, ibis::TYPE_T t,
00193 const char* name, void *buf,
00194 const char* desc="", double low=DBL_MAX, double high=-DBL_MAX);
00195 column(const ibis::bord::part*, const ibis::column&, void *buf);
00196 column(const column& rhs);
00197 virtual ~column();
00198
00199 virtual ibis::fileManager::storage* getRawData() const;
00200
00201 using ibis::column::evaluateRange;
00202 virtual long evaluateRange(const ibis::qContinuousRange& cmp,
00203 const ibis::bitvector& mask,
00204 ibis::bitvector& res) const;
00205 virtual long evaluateRange(const ibis::qDiscreteRange& cmp,
00206 const ibis::bitvector& mask,
00207 ibis::bitvector& res) const;
00208 virtual long stringSearch(const char*, ibis::bitvector&) const;
00209 virtual long stringSearch(const std::vector<std::string>&,
00210 ibis::bitvector&) const;
00211 virtual long stringSearch(const char*) const;
00212 virtual long stringSearch(const std::vector<std::string>&) const;
00213 virtual long keywordSearch(const char*, ibis::bitvector&) const;
00214 virtual long keywordSearch(const char*) const;
00215 virtual long patternSearch(const char*) const;
00216 virtual long patternSearch(const char*, ibis::bitvector &) const;
00217
00218 virtual array_t<signed char>* selectBytes(const ibis::bitvector&) const;
00219 virtual array_t<unsigned char>* selectUBytes(const ibis::bitvector&) const;
00220 virtual array_t<int16_t>* selectShorts(const ibis::bitvector&) const;
00221 virtual array_t<uint16_t>* selectUShorts(const ibis::bitvector&) const;
00222 virtual array_t<int32_t>* selectInts(const ibis::bitvector&) const;
00223 virtual array_t<uint32_t>* selectUInts(const ibis::bitvector&) const;
00224 virtual array_t<int64_t>* selectLongs(const ibis::bitvector&) const;
00225 virtual array_t<uint64_t>* selectULongs(const ibis::bitvector&) const;
00226 virtual array_t<float>* selectFloats(const ibis::bitvector&) const;
00227 virtual array_t<double>* selectDoubles(const ibis::bitvector&) const;
00228 virtual std::vector<std::string>*
00229 selectStrings(const bitvector& mask) const;
00230
00231 virtual void computeMinMax() {
00232 computeMinMax(thePart->currentDataDir(), lower, upper);}
00233 virtual void computeMinMax(const char *dir) {
00234 computeMinMax(dir, lower, upper);}
00235 virtual void computeMinMax(const char *, double &min, double &max) const;
00236 virtual void getString(uint32_t i, std::string &val) const;
00237 virtual int getValuesArray(void* vals) const;
00238
00239 void reverseRows();
00240 int limit(uint32_t nr);
00241
00242 void* getArray() const {return buffer;}
00243 int dump(std::ostream& out, uint32_t i) const;
00244
00245 int restoreCategoriesAsStrings(const ibis::part&);
00246
00247 protected:
00250 void *buffer;
00251
00252 column& operator=(const column&);
00253 };
00254
00255 class FASTBIT_CXX_DLLSPEC ibis::bord::cursor : public ibis::table::cursor {
00256 public:
00257 cursor(const ibis::bord& t);
00258 virtual ~cursor() {};
00259
00260 virtual uint64_t nRows() const {return tab.nRows();}
00261 virtual uint32_t nColumns() const {return tab.nColumns();}
00262 virtual ibis::table::stringList columnNames() const {
00263 return tab.columnNames();}
00264 virtual ibis::table::typeList columnTypes() const {
00265 return tab.columnTypes();}
00266 virtual int fetch();
00267 virtual int fetch(uint64_t);
00268 virtual int fetch(ibis::table::row&);
00269 virtual int fetch(uint64_t, ibis::table::row&);
00270 virtual uint64_t getCurrentRowNumber() const {return curRow;}
00271 virtual int dump(std::ostream& out, const char* del) const;
00272
00273 virtual int getColumnAsByte(const char*, char&) const;
00274 virtual int getColumnAsUByte(const char*, unsigned char&) const;
00275 virtual int getColumnAsShort(const char*, int16_t&) const;
00276 virtual int getColumnAsUShort(const char*, uint16_t&) const;
00277 virtual int getColumnAsInt(const char*, int32_t&) const;
00278 virtual int getColumnAsUInt(const char*, uint32_t&) const;
00279 virtual int getColumnAsLong(const char*, int64_t&) const;
00280 virtual int getColumnAsULong(const char*, uint64_t&) const;
00281 virtual int getColumnAsFloat(const char*, float&) const;
00282 virtual int getColumnAsDouble(const char*, double&) const;
00283 virtual int getColumnAsString(const char*, std::string&) const;
00284
00285 virtual int getColumnAsByte(uint32_t, char&) const;
00286 virtual int getColumnAsUByte(uint32_t, unsigned char&) const;
00287 virtual int getColumnAsShort(uint32_t, int16_t&) const;
00288 virtual int getColumnAsUShort(uint32_t, uint16_t&) const;
00289 virtual int getColumnAsInt(uint32_t, int32_t&) const;
00290 virtual int getColumnAsUInt(uint32_t, uint32_t&) const;
00291 virtual int getColumnAsLong(uint32_t, int64_t&) const;
00292 virtual int getColumnAsULong(uint32_t, uint64_t&) const;
00293 virtual int getColumnAsFloat(uint32_t, float&) const;
00294 virtual int getColumnAsDouble(uint32_t, double&) const;
00295 virtual int getColumnAsString(uint32_t, std::string&) const;
00296
00297 protected:
00298 struct bufferElement {
00299 const char* cname;
00300 ibis::TYPE_T ctype;
00301 void* cval;
00302
00303 bufferElement() : cname(0), ctype(ibis::UNKNOWN_TYPE), cval(0) {}
00304 };
00305 typedef std::map<const char*, uint32_t, ibis::lessi> bufferMap;
00306 std::vector<bufferElement> buffer;
00307 bufferMap bufmap;
00308 const ibis::bord& tab;
00309 int64_t curRow;
00310
00311 void fillRow(ibis::table::row& res) const;
00312 int dumpIJ(std::ostream&, uint32_t, uint32_t) const;
00313
00314 private:
00315 cursor();
00316 cursor(const cursor&);
00317 cursor& operator=(const cursor&);
00318 };
00319
00323 inline void ibis::bord::copyValue(ibis::TYPE_T type,
00324 void* outbuf, size_t outpos,
00325 const void* inbuf, size_t inpos) {
00326 switch (type) {
00327 default:
00328 break;
00329 case ibis::BYTE: {
00330 (*static_cast<array_t<signed char>*>(outbuf))[outpos]
00331 = (*static_cast<const array_t<signed char>*>(inbuf))[inpos];
00332 break;}
00333 case ibis::UBYTE: {
00334 (*static_cast<array_t<unsigned char>*>(outbuf))[outpos]
00335 = (*static_cast<const array_t<unsigned char>*>(inbuf))[inpos];
00336 break;}
00337 case ibis::SHORT: {
00338 (*static_cast<array_t<int16_t>*>(outbuf))[outpos]
00339 = (*static_cast<const array_t<int16_t>*>(inbuf))[inpos];
00340 break;}
00341 case ibis::USHORT: {
00342 (*static_cast<array_t<uint16_t>*>(outbuf))[outpos]
00343 = (*static_cast<const array_t<uint16_t>*>(inbuf))[inpos];
00344 LOGGER(ibis::gVerbose > 5)
00345 << "DEBUG -- copied inbuf[" << inpos << "] (="
00346 << (*static_cast<const array_t<uint16_t>*>(inbuf))[inpos]
00347 << ") to outbuf[" << outpos << "] (="
00348 << (*static_cast<array_t<uint16_t>*>(outbuf))[outpos] << ')';
00349 break;}
00350 case ibis::INT: {
00351 (*static_cast<array_t<int32_t>*>(outbuf))[outpos]
00352 = (*static_cast<const array_t<int32_t>*>(inbuf))[inpos];
00353 break;}
00354 case ibis::UINT: {
00355 (*static_cast<array_t<uint32_t>*>(outbuf))[outpos]
00356 = (*static_cast<const array_t<uint32_t>*>(inbuf))[inpos];
00357 break;}
00358 case ibis::LONG: {
00359 (*static_cast<array_t<int64_t>*>(outbuf))[outpos]
00360 = (*static_cast<const array_t<int64_t>*>(inbuf))[inpos];
00361 break;}
00362 case ibis::ULONG: {
00363 (*static_cast<array_t<uint64_t>*>(outbuf))[outpos]
00364 = (*static_cast<const array_t<uint64_t>*>(inbuf))[inpos];
00365 break;}
00366 case ibis::FLOAT: {
00367 (*static_cast<array_t<float>*>(outbuf))[outpos]
00368 = (*static_cast<const array_t<float>*>(inbuf))[inpos];
00369 break;}
00370 case ibis::DOUBLE: {
00371 (*static_cast<array_t<double>*>(outbuf))[outpos]
00372 = (*static_cast<const array_t<double>*>(inbuf))[inpos];
00373 break;}
00374 case ibis::TEXT:
00375 case ibis::CATEGORY: {
00376 (*static_cast<std::vector<std::string>*>(outbuf))[outpos]
00377 = (*static_cast<const std::vector<std::string>*>(inbuf))[inpos];
00378 break;}
00379 }
00380 }
00381
00382 inline void ibis::bord::describe(std::ostream &out) const {
00383 mypart.describe(out);
00384 }
00385
00386 inline void ibis::bord::dumpNames(std::ostream &out, const char* del) const {
00387 mypart.dumpNames(out, del);
00388 }
00389
00390 inline int ibis::bord::dump(std::ostream &out, const char* del) const {
00391 return mypart.dump(out, mypart.nRows(), del);
00392 }
00393
00394 inline int ibis::bord::dump(std::ostream &out, uint64_t nr,
00395 const char* del) const {
00396 if (nr == static_cast<uint32_t>(nr))
00397 return mypart.dump(out, static_cast<uint32_t>(nr), del);
00398 else
00399 return -5;
00400 }
00401
00402 inline int ibis::bord::dump(std::ostream &out, uint64_t off, uint64_t nr,
00403 const char* del) const {
00404 if (off == static_cast<uint32_t>(off) &&
00405 nr == static_cast<uint32_t>(nr))
00406 return mypart.dump(out, static_cast<uint32_t>(off),
00407 static_cast<uint32_t>(nr), del);
00408 else
00409 return -5;
00410 }
00411
00412 inline int ibis::bord::backup(const char* dir, const char* tname,
00413 const char* tdesc) const {
00414 return mypart.backup(dir, tname, tdesc);
00415 }
00416
00417 inline ibis::table* ibis::bord::groupby(const ibis::selectClause &sc) const {
00418 return mypart.groupby(sc);
00419 }
00420
00421 inline void ibis::bord::orderby(const ibis::table::stringList& keys) {
00422 mypart.reorder(keys);
00423 }
00424
00425 inline void ibis::bord::reverseRows() {
00426 mypart.reverseRows();
00427 }
00428
00429 inline ibis::table::cursor* ibis::bord::createCursor() const {
00430 return new ibis::bord::cursor(*this);
00431 }
00432
00435 inline ibis::table*
00436 ibis::bord::evaluateTerms(const ibis::selectClause& sel,
00437 const char* desc) const {
00438 return mypart.evaluateTerms(sel, desc);
00439 }
00440
00442 inline int
00443 ibis::bord::restoreCategoriesAsStrings(const ibis::part& prt, const char* nm) {
00444 return mypart.restoreCategoriesAsStrings(prt, nm);
00445 }
00446
00448 inline int
00449 ibis::bord::part::restoreCategoriesAsStrings(const ibis::part& prt,
00450 const char* nm) {
00451 if (nm == 0 || *nm == 0)
00452 return -1;
00453 ibis::bord::column *col = static_cast<ibis::bord::column*>(getColumn(nm));
00454 if (col != 0)
00455 return col->restoreCategoriesAsStrings(prt);
00456 else
00457 return -2;
00458 }
00459
00460 inline int ibis::bord::column::dump(std::ostream& out, uint32_t i) const {
00461 int ierr = -1;
00462 if (buffer == 0) {
00463 out << "(no data in memory)";
00464 return ierr;
00465 }
00466
00467 switch (m_type) {
00468 case ibis::BYTE: {
00469 const array_t<signed char>* vals =
00470 static_cast<const array_t<signed char>*>(buffer);
00471 out << (int)((*vals)[i]);
00472 ierr = 0;
00473 break;}
00474 case ibis::UBYTE: {
00475 const array_t<unsigned char>* vals =
00476 static_cast<const array_t<unsigned char>*>(buffer);
00477 out << (unsigned)((*vals)[i]);
00478 ierr = 0;
00479 break;}
00480 case ibis::SHORT: {
00481 const array_t<int16_t>* vals =
00482 static_cast<const array_t<int16_t>*>(buffer);
00483 out << (*vals)[i];
00484 ierr = 0;
00485 break;}
00486 case ibis::USHORT: {
00487 const array_t<uint16_t>* vals =
00488 static_cast<const array_t<uint16_t>*>(buffer);
00489 out << (*vals)[i];
00490 ierr = 0;
00491 break;}
00492 case ibis::INT: {
00493 const array_t<int32_t>* vals =
00494 static_cast<const array_t<int32_t>*>(buffer);
00495 out << (*vals)[i];
00496 ierr = 0;
00497 break;}
00498 case ibis::UINT: {
00499 const array_t<uint32_t>* vals =
00500 static_cast<const array_t<uint32_t>*>(buffer);
00501 out << (*vals)[i];
00502 ierr = 0;
00503 break;}
00504 case ibis::LONG: {
00505 const array_t<int64_t>* vals =
00506 static_cast<const array_t<int64_t>*>(buffer);
00507 out << (*vals)[i];
00508 ierr = 0;
00509 break;}
00510 case ibis::ULONG: {
00511 const array_t<uint64_t>* vals =
00512 static_cast<const array_t<uint64_t>*>(buffer);
00513 out << (*vals)[i];
00514 ierr = 0;
00515 break;}
00516 case ibis::FLOAT: {
00517 const array_t<float>* vals =
00518 static_cast<const array_t<float>*>(buffer);
00519 out << std::setprecision(7) << (*vals)[i];
00520 ierr = 0;
00521 break;}
00522 case ibis::DOUBLE: {
00523 const array_t<double>* vals =
00524 static_cast<const array_t<double>*>(buffer);
00525 out << std::setprecision(15) << (*vals)[i];
00526 ierr = 0;
00527 break;}
00528 case ibis::TEXT:
00529 case ibis::CATEGORY: {
00530 std::string tmp;
00531 getString(i, tmp);
00532 out << '"' << tmp << '"';
00533 ierr = 0;
00534 break;}
00535 default: {
00536 ierr = -2;
00537 break;}
00538 }
00539 return ierr;
00540 }
00541
00542 inline int ibis::bord::cursor::fetch() {
00543 ++ curRow;
00544 return (0 - (curRow >= (int64_t) tab.nRows()));
00545 }
00546
00547 inline int ibis::bord::cursor::fetch(uint64_t irow) {
00548 if (irow < tab.nRows()) {
00549 curRow = static_cast<int64_t>(irow);
00550 return 0;
00551 }
00552 else {
00553 return -1;
00554 }
00555 }
00556
00557 inline int ibis::bord::cursor::fetch(ibis::table::row& res) {
00558 ++ curRow;
00559 if ((uint64_t) curRow < tab.nRows()) {
00560 fillRow(res);
00561 return 0;
00562 }
00563 else {
00564 return -1;
00565 }
00566 }
00567
00568 inline int ibis::bord::cursor::fetch(uint64_t irow, ibis::table::row& res) {
00569 if (irow < tab.nRows()) {
00570 curRow = static_cast<int64_t>(irow);
00571 fillRow(res);
00572 return 0;
00573 }
00574 else {
00575 return -1;
00576 }
00577 }
00578
00579 inline int
00580 ibis::bord::cursor::dumpIJ(std::ostream& out, uint32_t i,
00581 uint32_t j) const {
00582 if (buffer[j].cval == 0) return -1;
00583
00584 switch (buffer[j].ctype) {
00585 case ibis::BYTE: {
00586 const array_t<const signed char>* vals =
00587 static_cast<const array_t<const signed char>*>(buffer[j].cval);
00588 out << (int) ((*vals)[i]);
00589 break;}
00590 case ibis::UBYTE: {
00591 const array_t<const unsigned char>* vals =
00592 static_cast<const array_t<const unsigned char>*>(buffer[j].cval);
00593 out << (unsigned int) ((*vals)[i]);
00594 break;}
00595 case ibis::SHORT: {
00596 const array_t<const int16_t>* vals =
00597 static_cast<const array_t<const int16_t>*>(buffer[j].cval);
00598 out << (*vals)[i];
00599 break;}
00600 case ibis::USHORT: {
00601 const array_t<const uint16_t>* vals =
00602 static_cast<const array_t<const uint16_t>*>(buffer[j].cval);
00603 out << (*vals)[i];
00604 break;}
00605 case ibis::INT: {
00606 const array_t<const int32_t>* vals =
00607 static_cast<const array_t<const int32_t>*>(buffer[j].cval);
00608 out << (*vals)[i];
00609 break;}
00610 case ibis::UINT: {
00611 const array_t<const uint32_t>* vals =
00612 static_cast<const array_t<const uint32_t>*>(buffer[j].cval);
00613 out << (*vals)[i];
00614 break;}
00615 case ibis::LONG: {
00616 const array_t<const int64_t>* vals =
00617 static_cast<const array_t<const int64_t>*>(buffer[j].cval);
00618 out << (*vals)[i];
00619 break;}
00620 case ibis::ULONG: {
00621 const array_t<const uint64_t>* vals =
00622 static_cast<const array_t<const uint64_t>*>(buffer[j].cval);
00623 out << (*vals)[i];
00624 break;}
00625 case ibis::FLOAT: {
00626 const array_t<const float>* vals =
00627 static_cast<const array_t<const float>*>(buffer[j].cval);
00628 out << (*vals)[i];
00629 break;}
00630 case ibis::DOUBLE: {
00631 const array_t<const double>* vals =
00632 static_cast<const array_t<const double>*>(buffer[j].cval);
00633 out << (*vals)[i];
00634 break;}
00635 case ibis::TEXT:
00636 case ibis::CATEGORY: {
00637 const std::vector<std::string>* vals =
00638 static_cast<const std::vector<std::string>*>(buffer[j].cval);
00639 out << '"' << (*vals)[i] << '"';
00640 break;}
00641 default: {
00642 return -2;}
00643 }
00644 return 0;
00645 }
00646
00647 inline int
00648 ibis::bord::cursor::getColumnAsByte(const char* cn, char& val) const {
00649 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00650 return -1;
00651 bufferMap::const_iterator it = bufmap.find(cn);
00652 if (it != bufmap.end())
00653 return getColumnAsByte((*it).second, val);
00654 else
00655 return -2;
00656 }
00657
00658 inline int
00659 ibis::bord::cursor::getColumnAsUByte(const char* cn,
00660 unsigned char& val) const {
00661 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00662 return -1;
00663 bufferMap::const_iterator it = bufmap.find(cn);
00664 if (it != bufmap.end())
00665 return getColumnAsUByte((*it).second, val);
00666 else
00667 return -2;
00668 }
00669
00670 inline int
00671 ibis::bord::cursor::getColumnAsShort(const char* cn, int16_t& val) const {
00672 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00673 return -1;
00674 bufferMap::const_iterator it = bufmap.find(cn);
00675 if (it != bufmap.end())
00676 return getColumnAsShort((*it).second, val);
00677 else
00678 return -2;
00679 }
00680
00681 inline int
00682 ibis::bord::cursor::getColumnAsUShort(const char* cn, uint16_t& val) const {
00683 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00684 return -1;
00685 bufferMap::const_iterator it = bufmap.find(cn);
00686 if (it != bufmap.end())
00687 return getColumnAsUShort((*it).second, val);
00688 else
00689 return -2;
00690 }
00691
00692 inline int
00693 ibis::bord::cursor::getColumnAsInt(const char* cn, int32_t& val) const {
00694 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00695 return -1;
00696 bufferMap::const_iterator it = bufmap.find(cn);
00697 if (it != bufmap.end())
00698 return getColumnAsInt((*it).second, val);
00699 else
00700 return -2;
00701 }
00702
00703 inline int
00704 ibis::bord::cursor::getColumnAsUInt(const char* cn, uint32_t& val) const {
00705 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00706 return -1;
00707 bufferMap::const_iterator it = bufmap.find(cn);
00708 if (it != bufmap.end())
00709 return getColumnAsUInt((*it).second, val);
00710 else
00711 return -2;
00712 }
00713
00714 inline int
00715 ibis::bord::cursor::getColumnAsLong(const char* cn, int64_t& val) const {
00716 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00717 return -1;
00718 bufferMap::const_iterator it = bufmap.find(cn);
00719 if (it != bufmap.end())
00720 return getColumnAsLong((*it).second, val);
00721 else
00722 return -2;
00723 }
00724
00725 inline int
00726 ibis::bord::cursor::getColumnAsULong(const char* cn, uint64_t& val) const {
00727 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00728 return -1;
00729 bufferMap::const_iterator it = bufmap.find(cn);
00730 if (it != bufmap.end())
00731 return getColumnAsULong((*it).second, val);
00732 else
00733 return -2;
00734 }
00735
00736 inline int
00737 ibis::bord::cursor::getColumnAsFloat(const char* cn, float& val) const {
00738 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00739 return -1;
00740 bufferMap::const_iterator it = bufmap.find(cn);
00741 if (it != bufmap.end())
00742 return getColumnAsFloat((*it).second, val);
00743 else
00744 return -2;
00745 }
00746
00747 inline int
00748 ibis::bord::cursor::getColumnAsDouble(const char* cn, double& val) const {
00749 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00750 return -1;
00751 bufferMap::const_iterator it = bufmap.find(cn);
00752 if (it != bufmap.end())
00753 return getColumnAsDouble((*it).second, val);
00754 else
00755 return -2;
00756 }
00757
00758 inline int
00759 ibis::bord::cursor::getColumnAsString(const char* cn,
00760 std::string& val) const {
00761 if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00762 return -1;
00763 bufferMap::const_iterator it = bufmap.find(cn);
00764 if (it != bufmap.end())
00765 return getColumnAsString((*it).second, val);
00766 else
00767 return -2;
00768 }
00769 #endif // IBIS_BORD_H