00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
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
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
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