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 "eyedb_p.h"
00026 #include "InvOidContext.h"
00027 #include <eyedblib/rpc_be.h>
00028
00029 namespace eyedb {
00030
00031 static LinkedList st_inv_list;
00032 static LinkedList *inv_list;
00033
00034 InvOidContext::InvOidContext(const Oid &_objoid,
00035 const Attribute *attr,
00036 const Oid &_valoid)
00037 {
00038 objoid = _objoid;
00039 valoid = _valoid;;
00040 attr_offset = attr->getPersistentIDR();
00041 attr_num = attr->getNum();
00042 #ifdef TRACE
00043 printf("InvOidContext_1(%s, %d, %d, %s)\n",
00044 objoid.toString(), attr_num, attr_offset, valoid.toString());
00045 #endif
00046 }
00047
00048 InvOidContext::InvOidContext(const Oid &_objoid,
00049 int _attr_num, Offset _attr_offset,
00050 const Oid &_valoid)
00051 {
00052 objoid = _objoid;
00053 valoid = _valoid;;
00054 attr_offset = _attr_offset;
00055 attr_num = _attr_num;
00056 #ifdef TRACE
00057 printf("InvOidContext_2(%s, %d, %d, %s)\n",
00058 objoid.toString(), attr_num, attr_offset, valoid.toString());
00059 #endif
00060 }
00061
00062 void
00063 InvOidContext::code(Data *data, LinkedList &list, Bool toDel,
00064 Size &size)
00065 {
00066 LinkedListCursor c(list);
00067 InvOidContext *ctx;
00068
00069 size = 0;
00070 eyedblib::int32 x = list.getCount();
00071 Offset offset = 0;
00072
00073 *data = 0;
00074 int32_code(data, &offset, &size, &x);
00075
00076 for (int i = 0; c.getNext((void *&)ctx); i++) {
00077 oid_code(data, &offset, &size, ctx->objoid.getOid());
00078 x = ctx->attr_num;
00079 int32_code(data, &offset, &size, &x);
00080 x = ctx->attr_offset;
00081 int32_code(data, &offset, &size, &x);
00082 oid_code(data, &offset, &size, ctx->valoid.getOid());
00083 #ifdef TRACE
00084 printf("coding[%d] -> %s %d %d %s\n",
00085 i, ctx->objoid.toString(), ctx->attr_num, ctx->attr_offset,
00086 ctx->valoid.toString());
00087 #endif
00088 if (toDel)
00089 delete ctx;
00090 }
00091 }
00092
00093 void
00094 InvOidContext::decode(Data data, LinkedList &list)
00095 {
00096 eyedblib::int32 cnt;
00097 Offset offset = 0;
00098
00099 int32_decode(data, &offset, &cnt);
00100
00101 for (int i = 0; i < cnt; i++) {
00102 eyedbsm::Oid objoid, valoid;
00103 eyedblib::int32 attr_num, attr_offset;
00104
00105 oid_decode(data, &offset, &objoid);
00106 int32_decode(data, &offset, &attr_num);
00107 int32_decode(data, &offset, &attr_offset);
00108 oid_decode(data, &offset, &valoid);
00109
00110 #ifdef TRACE
00111 printf("decoding[%d] -> %s %d %d %s\n",
00112 i, Oid(objoid).toString(), attr_num, attr_offset,
00113 Oid(valoid).toString());
00114 #endif
00115 list.insertObject(new InvOidContext(objoid, attr_num,
00116 attr_offset, valoid));
00117 }
00118 }
00119
00120 Bool
00121 InvOidContext::getContext()
00122 {
00123 if (!inv_list) {
00124 inv_list = &st_inv_list;
00125 inv_list->empty();
00126 return True;
00127 }
00128
00129 return False;
00130 }
00131
00132 void
00133 InvOidContext::insert(const Oid &objoid, const Attribute *attr,
00134 const Oid &valoid)
00135 {
00136 inv_list->insertObject(new InvOidContext(objoid, attr, valoid));
00137 }
00138
00139 void
00140 InvOidContext::releaseContext(Bool newctx, Data *inv_data, void *xinv_data)
00141 {
00142 static LinkedList empty_list;
00143
00144 Data rdata;
00145 Size size;
00146
00147 if (newctx) {
00148 code(&rdata, *inv_list, True, size);
00149 inv_list = 0;
00150 }
00151 else {
00152 code(&rdata, empty_list, True, size);
00153 }
00154
00155 if (inv_data) {
00156 *inv_data = rdata;
00157 return;
00158 }
00159
00160 rpc_ServerData *data = (rpc_ServerData *)xinv_data;
00161
00162 if (size <= data->buff_size) {
00163 data->status = rpc_BuffUsed;
00164 memcpy(data->data, rdata, size);
00165 }
00166 else {
00167 data->status = rpc_TempDataUsed;
00168 data->data = rdata;
00169 }
00170
00171 data->size = size;
00172 }
00173 }