IteratorAtom.cc

00001 /* 
00002    EyeDB Object Database Management System
00003    Copyright (C) 1994-2008 SYSRA
00004    
00005    EyeDB is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009    
00010    EyeDB is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014    
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free Software
00017    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
00018 */
00019 
00020 /*
00021    Author: Eric Viara <viara@sysra.com>
00022 */
00023 
00024 
00025 #include "eyedb_p.h"
00026 
00027 namespace eyedb {
00028 
00029   void
00030   decode_atom_array(rpc_ClientData *data, void *_atom_array,
00031                         int count)
00032   {
00033     IteratorAtom *atom_array = (IteratorAtom *)_atom_array;
00034     Offset offset = 0;
00035     Data idr = (Data)data->data;
00036 
00037     IteratorAtom *p = atom_array;
00038 
00039     for (int c = 0; c < count; c++, p++)
00040       p->decode(idr, &offset);
00041 
00042     free(idr);
00043   }
00044 
00045   void
00046   IteratorAtom::code(Data *idr, Offset *offset, Size *alloc_size)
00047   {
00048     eyedblib::int16 t = (eyedblib::int16)type;
00049     int16_code(idr, offset, alloc_size, &t);
00050 
00051     switch(type)
00052       {
00053       case IteratorAtom_INT16:
00054         int16_code(idr, offset, alloc_size, &i16);
00055         break;
00056       
00057       case IteratorAtom_INT32:
00058         int32_code(idr, offset, alloc_size, &i32);
00059         break;
00060       
00061       case IteratorAtom_INT64:
00062         int64_code(idr, offset, alloc_size, &i64);
00063         break;
00064       
00065       case IteratorAtom_CHAR:
00066         char_code(idr, offset, alloc_size, &c);
00067         break;
00068       
00069       case IteratorAtom_DOUBLE:
00070         double_code(idr, offset, alloc_size, &d);
00071         break;
00072       
00073       case IteratorAtom_STRING:
00074         string_code(idr, offset, alloc_size, str);
00075         break;
00076       
00077       case IteratorAtom_OID:
00078         oid_code(idr, offset, alloc_size, &oid);
00079         break;
00080       
00081       case IteratorAtom_IDR:
00082         {
00083           eyedblib::int32 size = (eyedblib::int32)data.size;
00084           int32_code(idr, offset, alloc_size, &size);
00085           buffer_code(idr, offset, alloc_size, data.idr, data.size);
00086           break;
00087         }      
00088 
00089 #ifndef NEW_ITER_ATOM
00090       case IteratorAtom_BOOL:
00091         {
00092           char tc = (char)b;
00093           char_code(idr, offset, alloc_size, &tc);
00094           break;
00095         }
00096       
00097       case IteratorAtom_IDENT:
00098         string_code(idr, offset, alloc_size, ident);
00099         break;
00100       
00101       case IteratorAtom_LISTSEP:
00102         {
00103           char cc = (char)open;
00104           char_code(idr, offset, alloc_size, &cc);
00105         }
00106         break;
00107 #endif
00108 
00109       default:
00110         assert(0);
00111         break;
00112       }
00113   }
00114 
00115   void
00116   IteratorAtom::decode(Data idr, Offset *offset)
00117   {
00118     memset(this, 0, sizeof(IteratorAtom));
00119     eyedblib::int16 t;
00120     int16_decode(idr, offset, &t);
00121     type = (IteratorAtomType)t;
00122 
00123     switch(type)
00124       {
00125       case IteratorAtom_INT16:
00126         int16_decode(idr, offset, &i16);
00127         break;
00128       
00129       case IteratorAtom_INT32:
00130         int32_decode(idr, offset, &i32);
00131         break;
00132       
00133       case IteratorAtom_INT64:
00134         int64_decode(idr, offset, &i64);
00135         break;
00136       
00137       case IteratorAtom_CHAR:
00138         char_decode(idr, offset, &c);
00139         break;
00140       
00141       case IteratorAtom_DOUBLE:
00142         double_decode(idr, offset, &d);
00143         break;
00144       
00145       case IteratorAtom_OID:
00146         oid_decode(idr, offset, &oid);;
00147         break;
00148       
00149       case IteratorAtom_STRING:
00150         {
00151           char *ts;
00152           string_decode(idr, offset, &ts);
00153           str = strdup(ts);
00154         }
00155         break;
00156       
00157       case IteratorAtom_IDR:
00158         {
00159           eyedblib::int32 size;
00160           int32_decode(idr, offset, &size);
00161           data.size = size;
00162           data.idr = (unsigned char *)malloc(data.size);
00163           buffer_decode(idr, offset, data.idr, data.size);
00164         }
00165         break;
00166       
00167 #ifndef NEW_ITER_ATOM
00168       case IteratorAtom_BOOL:
00169         {
00170           char tc;
00171           char_decode(idr, offset, &tc);
00172           b = (Bool)tc;
00173           break;
00174         }
00175       
00176       case IteratorAtom_IDENT:
00177         {
00178           char *ts;
00179           string_decode(idr, offset, &ts);
00180           ident = strdup(ts);
00181         }
00182         break;
00183       
00184       case IteratorAtom_LISTSEP:
00185         {
00186           char cc;
00187           char_decode(idr, offset, &cc);
00188           open = (Bool)cc;
00189         }      
00190         break;
00191 #endif
00192 
00193       default:
00194         assert(0);
00195         break;
00196       }
00197   }
00198 
00199   IteratorAtom::IteratorAtom()
00200   {
00201     memset(this, 0, sizeof(IteratorAtom));
00202   }
00203 
00204   IteratorAtom::IteratorAtom(const IteratorAtom &atom)
00205   {
00206     *this = atom;
00207   }
00208 
00209   void IteratorAtom::print(FILE *fd)
00210   {
00211     fprintf(fd, "%s", getString());
00212       
00213   }
00214 
00215   char *IteratorAtom::getString()
00216   {
00217     if (fmt_str)
00218       return fmt_str;
00219 
00220     switch(type)
00221       {
00222       case IteratorAtom_INT16:
00223         {
00224           char tok[16];
00225           sprintf(tok, "%d", i16);
00226           fmt_str = strdup(tok);
00227           break;
00228         }
00229 
00230       case IteratorAtom_INT32:
00231         {
00232           char tok[16];
00233           sprintf(tok, "%ld", i32);
00234           fmt_str = strdup(tok);
00235           break;
00236         }
00237 
00238       case IteratorAtom_INT64:
00239         {
00240           char tok[16];
00241           sprintf(tok, "%lld", i64);
00242           fmt_str = strdup(tok);
00243           break;
00244         }
00245 
00246       case IteratorAtom_CHAR:
00247         {
00248           char tok[8];
00249           sprintf(tok, "'%c'", c);
00250           fmt_str = strdup(tok);
00251           break;
00252         }
00253 
00254       case IteratorAtom_DOUBLE:
00255         {
00256           char tok[16];
00257           sprintf(tok, "%f", d);
00258           fmt_str = strdup(tok);
00259           break;
00260         }
00261 
00262       case IteratorAtom_STRING:
00263         {
00264           char *tok = (char *)malloc(strlen(str)+3);
00265           sprintf(tok, "\"%s\"", str);
00266           fmt_str = tok;
00267           break;
00268         }
00269 
00270       case IteratorAtom_OID:
00271         fmt_str = strdup(OidGetString(&oid));
00272         break;
00273 
00274       case IteratorAtom_IDR:
00275         {
00276           char tok[64];
00277           sprintf(tok, "buffer 0x%x, size %d", data.idr, data.size);
00278           fmt_str = strdup(tok);
00279           break;
00280         }
00281 
00282 #ifndef NEW_ITER_ATOM
00283       case IteratorAtom_NULL:
00284         fmt_str = strdup(NullString);
00285         break;
00286 
00287       case IteratorAtom_NIL:
00288         fmt_str = strdup(NilString);
00289         break;
00290 
00291       case IteratorAtom_BOOL:
00292         fmt_str = (b ? strdup("true") : strdup("false"));
00293         break;
00294 
00295       case IteratorAtom_IDENT:
00296         fmt_str = strdup(ident);
00297         break;
00298 
00299       case IteratorAtom_LISTSEP:
00300         fmt_str = strdup(open ? "(" : ")");
00301         break;
00302 #endif
00303 
00304       default:
00305         assert(0);
00306         return 0;
00307       }
00308 
00309     return fmt_str;
00310   }
00311 
00312   int IteratorAtom::getSize() const
00313   {
00314     switch(type)
00315       {
00316       case IteratorAtom_INT16:
00317         return sizeof(eyedblib::int16);
00318 
00319       case IteratorAtom_INT32:
00320         return sizeof(eyedblib::int32);
00321 
00322       case IteratorAtom_INT64:
00323         return sizeof(eyedblib::int64);
00324 
00325       case IteratorAtom_CHAR:
00326         return sizeof(char);
00327 
00328       case IteratorAtom_DOUBLE:
00329         return sizeof(double);
00330 
00331       case IteratorAtom_STRING:
00332         return sizeof(eyedblib::int32) + strlen(str) + 1;
00333 
00334       case IteratorAtom_OID:
00335         return sizeof(Oid);
00336 
00337       case IteratorAtom_IDR:
00338         return sizeof(eyedblib::int32) + data.size;
00339 
00340 #ifndef NEW_ITER_ATOM
00341       case IteratorAtom_NULL:
00342         return 0;
00343 
00344       case IteratorAtom_NIL:
00345         return 0;
00346 
00347       case IteratorAtom_BOOL:
00348         return sizeof(char);
00349 
00350       case IteratorAtom_IDENT:
00351         return sizeof(eyedblib::int32) + strlen(ident) + 1;
00352 
00353       case IteratorAtom_LISTSEP:
00354         return sizeof(char);
00355 #endif
00356       case 0:
00357         return 0;
00358 
00359       default:
00360         assert(0);
00361         return 0;
00362       }
00363   }
00364 
00365   IteratorAtom & IteratorAtom::operator =(const IteratorAtom &atom)
00366   {
00367     garbage();
00368 
00369     memcpy(this, &atom, sizeof(IteratorAtom));
00370 
00371     fmt_str = 0;
00372 
00373     if (type == IteratorAtom_STRING)
00374       str = strdup(atom.str);
00375 #ifndef NEW_ITER_ATOM
00376     else if (type == IteratorAtom_IDENT)
00377       ident = strdup(atom.ident);
00378 #endif
00379     else if (type == IteratorAtom_IDR) {
00380       data.size = atom.data.size;
00381       data.idr = (unsigned char *)malloc(data.size);
00382       memcpy(data.idr, atom.data.idr, data.size);
00383     }
00384 
00385     return *this;
00386   }
00387 
00388   Value *
00389   IteratorAtom::toValue() const
00390   {
00391     Value *value = NULL;
00392 
00393     switch(type)
00394       {
00395       case IteratorAtom_INT16:
00396         value = new Value(i16);
00397         break;
00398       
00399       case IteratorAtom_INT32:
00400         value = new Value(i32);
00401         break;
00402       
00403       case IteratorAtom_INT64:
00404         value = new Value(i64);
00405         break;
00406       
00407       case IteratorAtom_CHAR:
00408         value = new Value(c);
00409         break;
00410       
00411       case IteratorAtom_DOUBLE:
00412         value = new Value(d);
00413         break;
00414       
00415       case IteratorAtom_STRING:
00416         value = new Value(str);
00417         break;
00418       
00419       case IteratorAtom_OID:
00420         value = new Value(oid);
00421         break;
00422       
00423       case IteratorAtom_IDR:
00424         {
00425           // MIND : memory leaks!!!!
00426           Data idr = (unsigned char *)malloc(data.size);
00427           memcpy(idr, data.idr, data.size);
00428           value = new Value(idr, data.size);
00429         }
00430         break;
00431 
00432 #ifndef NEW_ITER_ATOM
00433       case IteratorAtom_NULL:
00434         value = new Value(True, True);
00435         break;
00436       
00437       case IteratorAtom_NIL:
00438         value = new Value();
00439         break;
00440       
00441       case IteratorAtom_BOOL:
00442         value = new Value(b);
00443         break;
00444       
00445       case IteratorAtom_IDENT:
00446         value = new Value(str, True);
00447         break;
00448       
00449       case IteratorAtom_LISTSEP:
00450         break;
00451 #endif
00452 
00453       default:
00454         assert(0);
00455         break;
00456       }
00457 
00458     return value;
00459   }
00460 
00461   void IteratorAtom::garbage()
00462   {
00463     free(fmt_str);
00464     if (type == IteratorAtom_STRING)
00465       free(str);
00466 #ifndef NEW_ITER_ATOM
00467     else if (type == IteratorAtom_IDENT)
00468       free(ident);
00469 #endif
00470     else if (type == IteratorAtom_IDR)
00471       free(data.idr);
00472 
00473     fmt_str = 0;
00474     type = (IteratorAtomType)0;
00475   }
00476 
00477   IteratorAtom::~IteratorAtom()
00478   {
00479     garbage();
00480   }
00481 }

Generated on Mon Dec 22 18:15:56 2008 for eyedb by  doxygen 1.5.3