InvOidContext.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 #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 }

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