code.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 "base_p.h"
00026 #include "eyedb/internals/ObjectHeader.h"
00027 #include "code.h"
00028 #include "eyedb/internals/kern_const.h"
00029 #include <stdlib.h>
00030 #include <eyedblib/rpc_lib.h>
00031 #include <eyedblib/xdr.h>
00032 #include <eyedbsm/xdr.h>
00033 
00034 #define mcp(D, S, N) \
00035 { \
00036   int __n__ = (N); \
00037   char *__d__ = (char *)(D), *__s__ = (char *)(S); \
00038   while(__n__--) \
00039     *__d__++ = *__s__++; \
00040 }
00041 
00042 #define mset(D, V, N) \
00043 { \
00044   int __n__ = (N); \
00045   char *__d__ = (char *)(D); \
00046   while(__n__--) \
00047     *__d__++ = V; \
00048 }
00049 /*#define memcpy mcp*/
00050 
00051 namespace eyedb {
00052 
00053   static int NUM = 1;
00054   void br_code(const char *msg)
00055   {
00056     fprintf(stdout, "BR_CODE: %s\n", msg);
00057     fflush(stdout);
00058   }
00059 
00060   static void
00061   inc_size(Data* idr, Size wsize, Size *alloc_size)
00062   {
00063 #define INC 64
00064     if (!*alloc_size) {
00065       *alloc_size = wsize + INC;
00066       *idr = (Data)malloc(*alloc_size);
00067     }
00068     else if (*alloc_size < wsize) {
00069       *alloc_size = wsize + INC;
00070       *idr = (Data)realloc(*idr, *alloc_size);
00071     }
00072   }
00073 
00074 #define BIG_TRY
00075 
00076   void
00077   char_code(Data* idr, Offset* offset, Size* alloc_size, const char *k)
00078   {
00079     inc_size(idr, (*offset) + sizeof(char), alloc_size);
00080     mcp((*idr) + (*offset), k, sizeof(char));
00081     *offset += sizeof(char);
00082   }
00083 
00084   void
00085   int16_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int16 *k)
00086   {
00087 #ifdef BIG_TRY
00088     xdr_int16_code(idr, offset, alloc_size, k);
00089 #else
00090     inc_size(idr, (*offset) + sizeof(eyedblib::int16), alloc_size);
00091     mcp((*idr) + (*offset), k, sizeof(eyedblib::int16));
00092     *offset += sizeof(eyedblib::int16);
00093 #endif
00094   }
00095 
00096   void
00097   int32_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int32 *k)
00098   {
00099 #ifdef BIG_TRY
00100     xdr_int32_code(idr, offset, alloc_size, k);
00101 #else
00102     inc_size(idr, (*offset) + sizeof(eyedblib::int32), alloc_size);
00103     mcp((*idr) + (*offset), k, sizeof(eyedblib::int32));
00104     *offset += sizeof(eyedblib::int32);
00105 #endif
00106   }
00107 
00108   void
00109   int64_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int64 *k)
00110   {
00111 #ifdef BIG_TRY
00112     xdr_int64_code(idr, offset, alloc_size, k);
00113 #else
00114     inc_size(idr, (*offset) + sizeof(eyedblib::int64), alloc_size);
00115     mcp((*idr) + (*offset), k, sizeof(eyedblib::int64));
00116     *offset += sizeof(eyedblib::int64);
00117 #endif
00118   }
00119 
00120   void
00121   double_code(Data* idr, Offset* offset, Size* alloc_size, const double *k)
00122   {
00123 #ifdef BIG_TRY
00124     xdr_double_code(idr, offset, alloc_size, k);
00125 #else
00126     inc_size(idr, (*offset) + sizeof(double), alloc_size);
00127     mcp((*idr) + (*offset), k, sizeof(double));
00128     *offset += sizeof(double);
00129 #endif
00130   }
00131 
00132   void
00133   string_code(Data* idr, Offset* offset, Size* alloc_size, const char *s)
00134   {
00135 #ifdef BIG_TRY
00136     xdr_string_code(idr, offset, alloc_size, s);
00137 #else
00138     int len = strlen(s)+1;
00139     int32_code(idr, offset, alloc_size, &len);
00140     inc_size(idr, (*offset) + len, alloc_size);
00141     mcp((*idr) + (*offset), s, len);
00142     *offset += len;
00143 #endif
00144   }
00145 
00146   void
00147   bound_string_code(Data* idr, Offset* offset, Size* alloc_size,
00148                     unsigned int len, const char *s)
00149   {
00150 #ifdef BIG_TRY
00151     xdr_bound_string_code(idr, offset, alloc_size, len, s);
00152 #else
00153     int slen = (s ? strlen(s)+1 : 0);
00154     inc_size(idr, (*offset) + len, alloc_size);
00155     mcp((*idr) + (*offset), s, (slen < len ? slen : len));
00156     *offset += len;
00157 #endif
00158   }
00159 
00160   void
00161   buffer_code(Data* idr, Offset* offset, Size* alloc_size,
00162               Data data, Size size)
00163   {
00164     inc_size(idr, (*offset) + size, alloc_size);
00165     memcpy((*idr) + (*offset), data, size);
00166     *offset += size;
00167   }
00168 
00169 #ifdef XDR_TRACE_OID
00170   void
00171   _oid_code(Data* idr, Offset* offset, Size* alloc_size, const eyedbsm::Oid *oid)
00172 #else
00173     void
00174   oid_code(Data* idr, Offset* offset, Size* alloc_size, const eyedbsm::Oid *oid)
00175 #endif
00176   {
00177 #ifdef BIG_TRY
00178     xdr_oid_code(idr, offset, alloc_size, oid);
00179 #else
00180     inc_size(idr, (*offset) + sizeof(eyedbsm::Oid), alloc_size);
00181     mcp((*idr) + (*offset), oid, sizeof(eyedbsm::Oid));
00182     *offset += sizeof(eyedbsm::Oid);
00183 #endif
00184   }
00185 
00186   void
00187   oid_code(Data out_data, const Data in_data) {
00188     eyedbsm::Oid oid;
00189     memcpy(&oid, in_data, sizeof(oid));
00190 
00191     Offset offset = 0;
00192     Size alloc_size = sizeof(oid);
00193     oid_code(&out_data, &offset, &alloc_size, &oid);
00194   }
00195 
00196   void
00197   int16_code(Data out_data, const Data in_data) {
00198     eyedblib::int16 i;
00199     memcpy(&i, in_data, sizeof(i));
00200 
00201     Offset offset = 0;
00202     Size alloc_size = sizeof(i);
00203     int16_code(&out_data, &offset, &alloc_size, &i);
00204   }
00205 
00206   void
00207   int32_code(Data out_data, const Data in_data) {
00208     eyedblib::int32 i;
00209     memcpy(&i, in_data, sizeof(i));
00210 
00211     Offset offset = 0;
00212     Size alloc_size = sizeof(i);
00213     int32_code(&out_data, &offset, &alloc_size, &i);
00214   }
00215 
00216   void
00217   int64_code(Data out_data, const Data in_data) {
00218     eyedblib::int64 i;
00219     memcpy(&i, in_data, sizeof(i));
00220 
00221     Offset offset = 0;
00222     Size alloc_size = sizeof(i);
00223     int64_code(&out_data, &offset, &alloc_size, &i);
00224   }
00225 
00226   void
00227   double_code(Data out_data, const Data in_data) {
00228     eyedblib::float64 d;
00229     memcpy(&d, in_data, sizeof(d));
00230 
00231     Offset offset = 0;
00232     Size alloc_size = sizeof(d);
00233     double_code(&out_data, &offset, &alloc_size, &d);
00234   }
00235 
00236   int
00237   object_header_code(Data* idr, Offset* offset, Size* alloc_size,
00238                      const ObjectHeader *hdr)
00239   {
00240     eyedblib::int32 magic = IDB_OBJ_HEAD_MAGIC;
00241 
00242     inc_size(idr, (*offset) + IDB_OBJ_HEAD_SIZE, alloc_size);
00243     int32_code(idr, offset, alloc_size, &magic);
00244     int32_code(idr, offset, alloc_size, &hdr->type);
00245     int32_code(idr, offset, alloc_size, &hdr->size);
00246     int64_code(idr, offset, alloc_size, &hdr->ctime);
00247     int64_code(idr, offset, alloc_size, &hdr->mtime);
00248     int32_code(idr, offset, alloc_size, &hdr->xinfo);
00249     oid_code(idr, offset, alloc_size, &hdr->oid_cl);
00250     oid_code(idr, offset, alloc_size, &hdr->oid_prot);
00251     return 1;
00252   }
00253 
00254   int
00255   object_header_code_head(Data idr, const ObjectHeader *hdr)
00256   {
00257     Offset offset = 0;
00258     Size alloc_size = IDB_OBJ_HEAD_SIZE;
00259 
00260     return object_header_code(&idr, &offset, &alloc_size, hdr);
00261   }
00262 
00263   void
00264   char_decode(Data idr, Offset* offset, char *k)
00265   {
00266     mcp(k, idr + (*offset), sizeof(char));
00267     *offset += sizeof(char);
00268   }
00269 
00270   void
00271   int16_decode(Data idr, Offset* offset, eyedblib::int16 *k)
00272   {
00273 #ifdef BIG_TRY
00274     xdr_int16_decode(idr, offset, k);
00275 #else
00276     mcp(k, idr + (*offset), sizeof(eyedblib::int16));
00277     *offset += sizeof(eyedblib::int16);
00278 #endif
00279   }
00280 
00281   void
00282   int32_decode(Data idr, Offset* offset, eyedblib::int32 *k)
00283   {
00284 #ifdef BIG_TRY
00285     xdr_int32_decode(idr, offset, k);
00286 #else
00287     mcp(k, idr + (*offset), sizeof(eyedblib::int32));
00288     *offset += sizeof(eyedblib::int32);
00289 #endif
00290   }
00291 
00292   void
00293   int64_decode(Data idr, Offset* offset, eyedblib::int64 *k)
00294   {
00295 #ifdef BIG_TRY
00296     xdr_int64_decode(idr, offset, k);
00297 #else
00298     mcp(k, idr + (*offset), sizeof(eyedblib::int64));
00299     *offset += sizeof(eyedblib::int64);
00300 #endif
00301   }
00302 
00303   void
00304   double_decode(Data idr, Offset* offset, double *k)
00305   {
00306 #ifdef BIG_TRY
00307     xdr_double_decode(idr, offset, k);
00308 #else
00309     mcp(k, idr + (*offset), sizeof(double));
00310     *offset += sizeof(double);
00311 #endif
00312   }
00313 
00314   void
00315   string_decode(Data idr, Offset* offset, char **s)
00316   {
00317 #ifdef BIG_TRY
00318     xdr_string_decode(idr, offset, s);
00319 #else
00320     eyedblib::int32 len;
00321     int32_decode(idr, offset, &len);
00322     *s = (char *)(idr + *offset);
00323     *offset += len;
00324 #endif
00325   }
00326 
00327   void
00328   bound_string_decode(Data idr, Offset* offset, unsigned int len,
00329                       char **s)
00330   {
00331 #ifdef BIG_TRY
00332     xdr_bound_string_decode(idr, offset, len, s);
00333 #else
00334     if (s) *s = (char *)(idr + *offset);
00335     *offset += len;
00336 #endif
00337   }
00338 
00339   void
00340   buffer_decode(Data idr, Offset* offset, Data data, Size size)
00341   {
00342     memcpy(data, idr + (*offset), size);
00343     *offset += size;
00344   }
00345 
00346 #ifdef XDR_TRACE_OID
00347   void
00348   _oid_decode(Data idr, Offset* offset, eyedbsm::Oid *oid)
00349 #else
00350     void
00351   oid_decode(Data idr, Offset* offset, eyedbsm::Oid *oid)
00352 #endif
00353   {
00354 #ifdef BIG_TRY
00355     xdr_oid_decode(idr, offset, oid);
00356 #else
00357     mcp(oid, idr + (*offset), sizeof(eyedbsm::Oid));
00358     *offset += sizeof(eyedbsm::Oid);
00359 #endif
00360   }
00361 
00362   int
00363   object_header_decode(Data idr, Offset* offset, ObjectHeader *hdr)
00364   {
00365 #ifdef BIG_TRY
00366     xdr_object_header_decode(idr, offset, hdr);
00367 #else
00368     int xoffset;
00369 
00370     int32_decode(idr, offset, &hdr->magic);
00371 
00372     if (hdr->magic != IDB_OBJ_HEAD_MAGIC)
00373       return 0;
00374 
00375     xoffset = *offset;
00376     mcp(&hdr->type, idr + xoffset, sizeof(eyedblib::int32));
00377     xoffset += sizeof(eyedblib::int32);
00378     mcp(&hdr->size, idr + xoffset, sizeof(eyedblib::int32));
00379     xoffset += sizeof(eyedblib::int32);
00380     mcp(&hdr->ctime, idr + xoffset, sizeof(eyedblib::int64));
00381     xoffset += sizeof(eyedblib::int64);
00382     mcp(&hdr->mtime, idr + xoffset, sizeof(eyedblib::int64));
00383     xoffset += sizeof(eyedblib::int64);
00384     mcp(&hdr->xinfo, idr + xoffset, sizeof(eyedblib::int32));
00385     xoffset += sizeof(eyedblib::int32);
00386     *offset = xoffset;
00387     oid_decode(idr, offset, &hdr->oid_cl);
00388     oid_decode(idr, offset, &hdr->oid_prot);
00389 #endif
00390 
00391     return 1;
00392   }
00393 
00394   int
00395   object_header_decode_head(Data idr, ObjectHeader *hdr)
00396   {
00397 #ifdef BIG_TRY
00398     return xdr_object_header_decode_head(idr, hdr);
00399 #else
00400     Offset offset = 0;
00401     return object_header_decode(idr, &offset, hdr);
00402 #endif
00403   }
00404 
00405   /* XDR */
00406 
00407 #ifdef E_XDR
00408   void
00409   xdr_char_code(Data* idr, Offset* offset, Size* alloc_size, const char *k)
00410   {
00411     char_code(idr, offset, alloc_size, k);
00412   }
00413 
00414   void
00415   xdr_int16_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int16 *k)
00416   {
00417     inc_size(idr, (*offset) + sizeof(eyedblib::int16), alloc_size);
00418     h2x_16_cpy((*idr) + (*offset), k);
00419     *offset += sizeof(eyedblib::int16);
00420   }
00421 
00422   void
00423   xdr_int32_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int32 *k)
00424   {
00425     inc_size(idr, (*offset) + sizeof(eyedblib::int32), alloc_size);
00426     h2x_32_cpy((*idr) + (*offset), k);
00427     *offset += sizeof(eyedblib::int32);
00428   }
00429 
00430   void
00431   xdr_int64_code(Data* idr, Offset* offset, Size* alloc_size, const eyedblib::int64 *k)
00432   {
00433     inc_size(idr, (*offset) + sizeof(eyedblib::int64), alloc_size);
00434     h2x_64_cpy((*idr) + (*offset), k);
00435     *offset += sizeof(eyedblib::int64);
00436   }
00437 
00438   void
00439   xdr_double_code(Data* idr, Offset* offset, Size* alloc_size, const double *k)
00440   {
00441     inc_size(idr, (*offset) + sizeof(double), alloc_size);
00442     h2x_64_cpy((*idr) + (*offset), k);
00443     *offset += sizeof(double);
00444   }
00445 
00446   void
00447   xdr_string_code(Data* idr, Offset* offset, Size* alloc_size, const char *s)
00448   {
00449     int len = strlen(s)+1;
00450     xdr_int32_code(idr, offset, alloc_size, &len);
00451     inc_size(idr, (*offset) + len, alloc_size);
00452     mcp((*idr) + (*offset), s, len);
00453     *offset += len;
00454   }
00455 
00456   void
00457   xdr_bound_string_code(Data* idr, Offset* offset, Size* alloc_size,
00458                         unsigned int len, const char *s)
00459   {
00460     int slen = (s ? strlen(s)+1 : 0);
00461     inc_size(idr, (*offset) + len, alloc_size);
00462     mcp((*idr) + (*offset), s, (slen < len ? slen : len));
00463     *offset += len;
00464   }
00465 
00466   void
00467   xdr_buffer_code(Data* idr, Offset* offset, Size* alloc_size,
00468                   Data data, Size size)
00469   {
00470     buffer_code(idr, offset, alloc_size, data, size);
00471   }
00472 
00473   void
00474   xdr_oid_code(Data* idr, Offset* offset, Size* alloc_size, const eyedbsm::Oid *oid)
00475   {
00476     inc_size(idr, (*offset) + sizeof(eyedbsm::Oid), alloc_size);
00477 #ifdef XDR_TRACE_OID
00478     fprintf(stdout, "%d: oid_code %s -> ", NUM++, se_getOidString(oid));
00479     fflush(stdout);
00480     if (oid->dbid > 3)
00481       br_code("oid_code");
00482 #endif
00483     eyedbsm::h2x_oid((*idr) + (*offset), oid);
00484     eyedbsm::Oid toid;
00485     memcpy(&toid, (*idr) + (*offset), sizeof(eyedbsm::Oid));
00486 #ifdef XDR_TRACE_OID
00487     fprintf(stdout, "[%s]\n", se_getOidString(&toid));
00488 #endif
00489     *offset += sizeof(eyedbsm::Oid);
00490   }
00491 
00492 #if 0
00493   int
00494   xdr_object_header_code(Data* idr, Offset* offset, Size* alloc_size,
00495                          const ObjectHeader *hdr)
00496   {
00497     return object_header_code(idr, offset, alloc_size, hdr);
00498   }
00499 
00500   int
00501   xdr_object_header_code_head(Data idr, const ObjectHeader *hdr)
00502   {
00503     return object_header_code_head(idr, hdr);
00504   }
00505 #endif
00506 
00507   /* decoding */
00508 #if 0
00509   void
00510   xdr_char_decode(Data idr, Offset* offset, char *k)
00511   {
00512     char_decode(idr, offset, k);
00513   }
00514 #endif
00515 
00516   void
00517   xdr_int16_decode(Data idr, Offset* offset, eyedblib::int16 *k)
00518   {
00519     x2h_16_cpy(k, idr + (*offset));
00520     *offset += sizeof(eyedblib::int16);
00521   }
00522 
00523   void
00524   xdr_int32_decode(Data idr, Offset* offset, eyedblib::int32 *k)
00525   {
00526     x2h_32_cpy(k, idr + (*offset));
00527     *offset += sizeof(eyedblib::int32);
00528   }
00529 
00530   void
00531   xdr_int64_decode(Data idr, Offset* offset, eyedblib::int64 *k)
00532   {
00533     x2h_64_cpy(k, idr + (*offset));
00534     *offset += sizeof(eyedblib::int64);
00535   }
00536 
00537   void
00538   xdr_double_decode(Data idr, Offset* offset, double *k)
00539   {
00540     x2h_f64_cpy(k, idr + (*offset));
00541     *offset += sizeof(double);
00542   }
00543 
00544   void
00545   xdr_string_decode(Data idr, Offset* offset, char **s)
00546   {
00547     eyedblib::int32 len;
00548     xdr_int32_decode(idr, offset, &len);
00549     *s = (char *)(idr + *offset);
00550     *offset += len;
00551   }
00552 
00553   void
00554   xdr_bound_string_decode(Data idr, Offset* offset, unsigned int len,
00555                           char **s)
00556   {
00557     if (s) *s = (char *)(idr + *offset);
00558     *offset += len;
00559   }
00560 
00561   void
00562   xdr_buffer_decode(Data idr, Offset* offset, Data data, Size size)
00563   {
00564     memcpy(data, idr + (*offset), size);
00565     *offset += size;
00566   }
00567 
00568   void
00569   xdr_oid_decode(Data idr, Offset* offset, eyedbsm::Oid *oid)
00570   {
00571     eyedbsm::Oid toid;
00572     memcpy(&toid, idr + (*offset), sizeof(eyedbsm::Oid));
00573 #ifdef XDR_TRACE_OID
00574     fprintf(stdout, "%d: oid_decode [%s] -> ", NUM++, se_getOidString(&toid));
00575 #endif
00576     eyedbsm::x2h_oid(oid, idr + (*offset));
00577 #ifdef XDR_TRACE_OID
00578     fprintf(stdout, "%s\n", se_getOidString(oid));
00579     fflush(stdout);
00580     if (oid->dbid > 3)
00581       br_code("oid_decode");
00582 #endif
00583     *offset += sizeof(eyedbsm::Oid);
00584   }
00585 
00586   int
00587   xdr_object_header_decode(Data idr, Offset* offset, ObjectHeader *hdr)
00588   {
00589     int xoffset;
00590     int32_decode(idr, offset, &hdr->magic);
00591 
00592     if (hdr->magic != IDB_OBJ_HEAD_MAGIC) {
00593       //fprintf(stdout, "MAGIC HEADER: %x\n", hdr->magic);
00594       return 0;
00595     }
00596 
00597     int32_decode(idr, offset, &hdr->type);
00598     int32_decode(idr, offset, &hdr->size);
00599     int64_decode(idr, offset, &hdr->ctime);
00600     int64_decode(idr, offset, &hdr->mtime);
00601     int32_decode(idr, offset, &hdr->xinfo);
00602     oid_decode(idr, offset, &hdr->oid_cl);
00603     oid_decode(idr, offset, &hdr->oid_prot);
00604 
00605     return 1;
00606   }
00607 
00608   int
00609   xdr_object_header_decode_head(Data idr, ObjectHeader *hdr)
00610   {
00611     Offset offset = 0;
00612     Size alloc_size = IDB_OBJ_HEAD_SIZE;
00613 
00614     return xdr_object_header_decode(idr, &offset, hdr);
00615   }
00616 
00617 }
00618 
00619 #endif
00620 

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