api.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 <unistd.h>
00026 #include <stdlib.h>
00027 #include <pthread.h>
00028 #include <assert.h>
00029 #include <errno.h>
00030 
00031 #include "base_p.h"
00032 #include "eyedb/internals/ObjectHeader.h"
00033 #include "eyedb/Exception.h"
00034 #include "eyedb/TransactionParams.h"
00035 #include "api_lib.h"
00036 
00037 #include "kernel.h"
00038 #include "misc.h"
00039 #include "SchemaInfo.h"
00040 #include "Argument_code.h"
00041 #include "code.h"
00042 #include "eyedb/internals/kern_const.h"
00043 
00044 #define IDB_MAXARGS 16
00045 
00046 namespace eyedbsm {
00047   extern unsigned int import_xid;
00048 }
00049 
00050 namespace eyedb {
00051 
00052   extern void setBackendInterrupt(Bool);
00053 
00054 #define status_copy(D, S) \
00055 { \
00056    (D).err = (S).err; \
00057    if ((S).err) strcpy((D).err_msg, (S).err_msg); \
00058 }
00059 
00060 #define start_rpc()
00061 
00062   static RPCStatusRec status_r;
00063 
00064 #define SERVER_CRASH_MSG \
00065  "EyeDB server has probably crashed. " \
00066  "Contact your system administrator.\n"
00067 
00068 #undef SERVER_CRASH_MSG
00069 
00070 #define SERVER_CRASH_MSG \
00071  "the EyeDB server has probably crashed or timed out."
00072 
00073   /*      fprintf(stderr, \
00074           "eyedb fatal error: server failure [" #RPC ". code #%d].\n" \
00075           SERVER_CRASH_MSG, r); \
00076 
00077           return rpcStatusMake(IDB_SERVER_FAILURE, \
00078           "[" #RPC ", code #%d].\n" SERVER_CRASH_MSG, r); \
00079 
00080   */
00081 
00082 #define RPC_RPCMAKE(CH, RPC, UA) \
00083 { \
00084   int r; \
00085   r = rpc_rpcMake(CH, 0, RPC, UA); \
00086  \
00087   if (r) \
00088     { \
00089       if (errno) perror("server"); \
00090       return rpcStatusMake(IDB_SERVER_FAILURE, SERVER_CRASH_MSG); \
00091     } \
00092 }
00093 
00094 #define STATUS_RETURN(S) \
00095 return (((S).err == IDB_SUCCESS) ? RPCSuccess : &(S))
00096 
00097 #define RDBHID_GET(DBH) \
00098 ((DBH)->ldbctx.local ? (DBH)->ldbctx.rdbhid : (DBH)->u.rdbhid)
00099 
00100 #define CHECK_DBH(DBH, OP) \
00101 if (!(DBH)) return rpcStatusMake(IDB_ERROR, "operation " OP ": database must be opened")
00102 
00103 #define DBH_IS_LOCAL(DBH) ((DBH)->ldbctx.local)
00104 
00105 const int CONN_COUNT = 3; // 20/03/06: can be more for multi-threading
00106 
00107 RPCStatus
00108 connOpen(const char *hostname, const char *portname,
00109          ConnHandle **pch, int flags, std::string &errmsg)
00110 {
00111   *pch = rpc_new(ConnHandle);
00112 
00113   if (!rpc_connOpen(getRpcClient(), hostname, portname,
00114                     &((*pch)->ch), RPC_PROTOCOL_MAGIC, CONN_COUNT, 0,
00115                     errmsg))
00116     return RPCSuccess;
00117   else {
00118     free(*pch);
00119     *pch = 0;
00120     return rpcStatusMake(IDB_CONNECTION_FAILURE,
00121                          "portname '%s'", portname);
00122   }
00123 }
00124 
00125 RPCStatus
00126 connClose(ConnHandle *ch)
00127 {
00128   if (ch->ch && !rpc_connClose(ch->ch))
00129     {
00130       free(ch);
00131       return RPCSuccess;
00132     }
00133   else
00134     return rpcStatusMake(IDB_CONNECTION_FAILURE, "cannot close connection");
00135 }
00136 
00137 /* remote procedure calls */
00138 RPCStatus
00139 dbOpen(ConnHandle *ch, const char *dbmdb,
00140            const char *userauth, const char *passwdauth,
00141            const char *dbname, int dbid, int flags, int oh_maph,
00142            unsigned int oh_mapwide, int *puid, void *db,
00143            char **rname, int *rdbid, unsigned int *pversion,
00144            DbHandle **dbh)
00145 {
00146   ClientArg ua[IDB_MAXARGS], *pua = ua;
00147       
00148   pua++->a_string = (char *)dbmdb;
00149   pua++->a_string = (char *)userauth;
00150   pua++->a_string = (char *)passwdauth;
00151   pua++->a_string = (char *)dbname;
00152   pua++->a_int    = dbid;
00153   /* LOCAL_REMOTE */
00154   pua++->a_int    = flags;
00155   pua++->a_int    = oh_maph;
00156   pua++->a_int    = oh_mapwide;
00157   
00158   if (flags & _DBOpenLocal)
00159     {
00160       RPC_RPCMAKE(ch->ch, DBOPENLOCAL_RPC, ua);
00161 
00162       status_copy(status_r, ua[14].a_status);
00163 
00164       if (status_r.err == IDB_SUCCESS)
00165         {
00166           DbHandle *tdbh;
00167           RPCStatus status;
00168           rpcDB_LocalDBContext *ldbctx = &ua[12].a_ldbctx;
00169 
00170           /*      se_import_xid = ldbctx->rdbhid;*/
00171           eyedbsm::import_xid = ldbctx->xid;
00172 
00173           /*printf("se_import_xid = %d (%s)\n", se_import_xid, dbname);*/
00174 
00175           status = IDB_dbOpen(ch, dbmdb, userauth, passwdauth, dbname, dbid,
00176                               flags & ~_DBOpenLocal, oh_maph,
00177                               oh_mapwide, 0, puid, db, rname,
00178                               rdbid, pversion, &tdbh);
00179 
00180           if (status == RPCSuccess)
00181             {
00182               *dbh = rpc_new(DbHandle);
00183               (*dbh)->ch = (ConnHandle *)ch;
00184 #ifndef LOCKMTX
00185               if ((ldbctx->semid[0] = sem_openSX(ldbctx->semkey[0]))<0 || 
00186                   (ldbctx->semid[1] = sem_openSX(ldbctx->semkey[1]))<0)
00187                 return rpcStatusMake(IDB_ERROR, "");
00188 #endif
00189 
00190               (*dbh)->ldbctx = *ldbctx;
00191               (*dbh)->u.dbh = tdbh;
00192               (*dbh)->flags = flags & ~_DBOpenLocal;
00193               (*dbh)->sch_oid = ua[13].a_oid;
00194             }
00195           return status;
00196         }
00197       STATUS_RETURN(status_r);
00198     }
00199   else
00200     {
00201       RPC_RPCMAKE(ch->ch, DBOPEN_RPC, ua);
00202 
00203       status_copy(status_r, ua[14].a_status);
00204 
00205       if (status_r.err == IDB_SUCCESS)
00206         {
00207           *dbh = rpc_new(DbHandle);
00208           (*dbh)->u.rdbhid = ua[11].a_int;
00209           (*dbh)->ch = (ConnHandle *)ch;
00210           (*dbh)->flags = flags & ~_DBOpenLocal;
00211           (*dbh)->sch_oid = ua[13].a_oid;       
00212           *puid = ua[8].a_int;
00213           *rname = ua[9].a_string;
00214           *rdbid = ua[10].a_int;
00215           *pversion = ua[12].a_int;
00216         }
00217       STATUS_RETURN(status_r);
00218     }
00219 }
00220 
00221 RPCStatus
00222 dbClose(const DbHandle *dbh)
00223 {
00224   ClientArg ua[IDB_MAXARGS], *pua = ua;
00225 
00226   CHECK_DBH(dbh, "dbClose");
00227 
00228   if (DBH_IS_LOCAL(dbh))
00229     {
00230       pua++->a_int = dbh->ldbctx.rdbhid;
00231       IDB_dbCloseLocal((DbHandle *)dbh->u.dbh);
00232     }
00233   else
00234     pua++->a_int = dbh->u.rdbhid;
00235 
00236   RPC_RPCMAKE(dbh->ch->ch, DBCLOSE_RPC, ua);
00237 
00238   status_copy(status_r, ua[1].a_status);
00239   
00240   STATUS_RETURN(status_r);
00241 }
00242 
00243 RPCStatus
00244 backendInterrupt(ConnHandle *ch, int info)
00245 {
00246   ClientArg ua[IDB_MAXARGS], *pua = ua;
00247   int r;
00248 
00249   setBackendInterrupt(True);
00250 
00251   pua++->a_int = info;
00252 
00253   r = rpc_rpcMake(ch->ch, 1, BACKEND_INTERRUPT_RPC, ua);
00254 
00255   status_copy(status_r, ua[1].a_status);
00256   
00257   STATUS_RETURN(status_r);
00258 }
00259 
00260 RPCStatus
00261 getServerOutOfBandData(ConnHandle *ch, int * type, Data * data,
00262                            unsigned int *size)
00263 {
00264   if (!ch) 
00265     return IDB_getServerOutOfBandData(0, type, data, size, 0);
00266   else {
00267     ClientArg ua[IDB_MAXARGS], *pua = ua;
00268     int r, offset;
00269 
00270     pua++->a_int = *type;
00271     pua->a_data.data = 0; /* force RPC to allocate buffer */
00272     pua++->a_data.size   = 0;
00273   
00274     r = rpc_rpcMake(ch->ch, 2, GET_SERVER_OUTOFBAND_DATA_RPC, ua);
00275     
00276     *type = ua[0].a_int;
00277     
00278     if (!r) {
00279       *data = (unsigned char *)ua[1].a_data.data;
00280       *size = ua[1].a_data.size;
00281     }
00282     else {
00283       *data = 0;
00284       *size = 0;
00285     }
00286     
00287     status_copy(status_r, ua[2].a_status);
00288     STATUS_RETURN(status_r);
00289   }
00290 }
00291 
00292 RPCStatus
00293 transactionBegin(DbHandle *dbh, 
00294                      const TransactionParams *params,
00295                      TransactionId *tid)
00296 {
00297   CHECK_DBH(dbh, "transactionBegin");
00298 
00299   if (DBH_IS_LOCAL(dbh))
00300     {
00301       *tid = 0;
00302       return IDB_transactionBegin((DbHandle *)dbh->u.dbh, params, True);
00303     }
00304   else
00305     {
00306       ClientArg ua[IDB_MAXARGS], *pua = ua;
00307 
00308       pua++->a_int = RDBHID_GET(dbh);
00309       pua++->a_int = params->trsmode;
00310       pua++->a_int = params->lockmode;
00311       pua++->a_int = params->recovmode;
00312       pua++->a_int = params->magorder;
00313       pua++->a_int = params->ratioalrt;
00314       pua++->a_int = params->wait_timeout; 
00315 
00316       RPC_RPCMAKE(dbh->ch->ch, TRANSACTION_BEGIN_RPC, ua);
00317       
00318       status_copy(status_r, ua[8].a_status);
00319       
00320       *tid = ua[7].a_int;
00321 
00322       STATUS_RETURN(status_r);
00323     }
00324 }
00325 
00326 RPCStatus
00327 transactionCommit(DbHandle *dbh, TransactionId tid)
00328 {
00329   CHECK_DBH(dbh, "transactionCommit");
00330 
00331   if (DBH_IS_LOCAL(dbh))
00332     return IDB_transactionCommit((DbHandle *)dbh->u.dbh, True);
00333   else
00334     {
00335       ClientArg ua[IDB_MAXARGS], *pua = ua;
00336 
00337       pua++->a_int = RDBHID_GET(dbh);
00338       pua++->a_int = 0;
00339 
00340       RPC_RPCMAKE(dbh->ch->ch, TRANSACTION_COMMIT_RPC, ua);
00341 
00342       status_copy(status_r, ua[2].a_status);
00343       
00344       STATUS_RETURN(status_r);
00345     }
00346 }
00347 
00348 RPCStatus
00349 transactionAbort(DbHandle *dbh, TransactionId tid)
00350 {
00351   CHECK_DBH(dbh, "transactionAbort");
00352 
00353   if (DBH_IS_LOCAL(dbh))
00354     return IDB_transactionAbort((DbHandle *)dbh->u.dbh, True);
00355   else
00356     {
00357       ClientArg ua[IDB_MAXARGS], *pua = ua;
00358 
00359       pua++->a_int = RDBHID_GET(dbh);
00360       pua++->a_int = 0;
00361       
00362       RPC_RPCMAKE(dbh->ch->ch, TRANSACTION_ABORT_RPC, ua);
00363       
00364       status_copy(status_r, ua[2].a_status);
00365       
00366       STATUS_RETURN(status_r);
00367     }
00368 }
00369 
00370 RPCStatus
00371 transactionParamsSet(DbHandle *dbh, const TransactionParams *params)
00372 {
00373   CHECK_DBH(dbh, "transactionParamsSet");
00374 
00375   if (DBH_IS_LOCAL(dbh))
00376     return IDB_transactionParamsSet((DbHandle *)dbh->u.dbh, params);
00377   else
00378     {
00379       ClientArg ua[IDB_MAXARGS], *pua = ua;
00380 
00381       pua++->a_int = RDBHID_GET(dbh);
00382       pua++->a_int = params->trsmode;
00383       pua++->a_int = params->lockmode;
00384       pua++->a_int = params->recovmode;
00385       pua++->a_int = params->magorder;
00386       pua++->a_int = params->ratioalrt;
00387       pua++->a_int = params->wait_timeout; 
00388 
00389       RPC_RPCMAKE(dbh->ch->ch, TRANSACTION_PARAMS_SET_RPC, ua);
00390       
00391       status_copy(status_r, ua[7].a_status);
00392       
00393       STATUS_RETURN(status_r);
00394     }
00395 }
00396 
00397 RPCStatus
00398 transactionParamsGet(DbHandle *dbh, TransactionParams *params)
00399 {
00400   CHECK_DBH(dbh, "transactionParamsGet");
00401 
00402   if (DBH_IS_LOCAL(dbh))
00403     return IDB_transactionParamsGet((DbHandle *)dbh->u.dbh, params);
00404   else
00405     {
00406       ClientArg ua[IDB_MAXARGS], *pua = ua;
00407 
00408       pua++->a_int = RDBHID_GET(dbh);
00409 
00410       RPC_RPCMAKE(dbh->ch->ch, TRANSACTION_PARAMS_GET_RPC, ua);
00411 
00412       params->trsmode = (TransactionMode)ua[1].a_int;
00413       params->lockmode = (TransactionLockMode)ua[2].a_int;
00414       params->recovmode = (RecoveryMode)ua[3].a_int;
00415       params->magorder = ua[4].a_int;
00416       params->ratioalrt = ua[5].a_int;
00417       params->wait_timeout = ua[6].a_int;
00418       
00419       status_copy(status_r, ua[7].a_status);
00420       
00421       STATUS_RETURN(status_r);
00422     }
00423 }
00424 
00425 extern Data code_dbdescription(const DbCreateDescription *, int *);
00426 extern Data code_oids(const eyedbsm::Oid *, unsigned int, int *);
00427 extern Data code_datafiles(void *datafiles, unsigned int datafile_cnt,
00428                                int *);
00429 extern void decode_locarr(Data, void *locarr);
00430 extern void decode_atom_array(rpc_ClientData *, void *, int);
00431 extern void decode_value(void *data, void *value);
00432 extern void decode_datinfo(Data, void *info);
00433 extern void decode_index_stats(Data, void *stats);
00434 extern void decode_index_impl(Data, void *impl);
00435 
00436 RPCStatus
00437 dbmCreate(ConnHandle *ch, const char *dbmdb, const char *passwdauth,
00438               const DbCreateDescription *dbdesc)
00439 {
00440   if (!ch || !ch->ch)
00441     return IDB_dbmCreate(ch, dbmdb, passwdauth, dbdesc);
00442   else
00443     {
00444       Data dbdesc_data;
00445       ClientArg ua[IDB_MAXARGS], *pua = ua;
00446 
00447       pua++->a_string = (char *)dbmdb;
00448       pua++->a_string = (char *)passwdauth;
00449       dbdesc_data = code_dbdescription(dbdesc, &pua->a_data.size);
00450       pua->a_data.data = dbdesc_data;
00451 
00452       RPC_RPCMAKE(ch->ch, DBMCREATE_RPC, ua);
00453 
00454       free(dbdesc_data);
00455       status_copy(status_r, ua[3].a_status);
00456   
00457       STATUS_RETURN(status_r);
00458     }
00459 }
00460 
00461 RPCStatus
00462 dbmUpdate(ConnHandle *ch, const char *dbmdb,
00463               const char *username, const char *passwd)
00464 {
00465   if (!ch || !ch->ch)
00466     return IDB_dbmUpdate(ch, dbmdb, username, passwd);
00467   else
00468     {
00469       ClientArg ua[IDB_MAXARGS], *pua = ua;
00470 
00471       pua++->a_string = (char *)dbmdb;
00472       pua++->a_string = (char *)username;
00473       pua++->a_string = (char *)passwd;
00474 
00475       RPC_RPCMAKE(ch->ch, DBMUPDATE_RPC, ua);
00476 
00477       status_copy(status_r, ua[3].a_status);
00478   
00479       STATUS_RETURN(status_r);
00480     }
00481 }
00482 
00483 RPCStatus
00484 dbCreate(ConnHandle *ch, const char *dbmdb,
00485              const char *userauth, const char *passwdauth,
00486              const char *dbname, const DbCreateDescription *dbdesc)
00487 {
00488   if (!ch || !ch->ch)
00489     return IDB_dbCreate(ch, dbmdb, userauth, passwdauth, dbname, dbdesc);
00490   else
00491     {
00492       ClientArg ua[IDB_MAXARGS], *pua = ua;
00493       Data dbdesc_data;
00494 
00495       pua++->a_string = (char *)dbmdb;
00496       pua++->a_string = (char *)userauth;
00497       pua++->a_string = (char *)passwdauth;
00498       pua++->a_string = (char *)dbname;
00499       dbdesc_data = code_dbdescription(dbdesc, &pua->a_data.size);
00500       pua->a_data.data = dbdesc_data;
00501 
00502       RPC_RPCMAKE(ch->ch, DBCREATE_RPC, ua);
00503 
00504       free(dbdesc_data);
00505       status_copy(status_r, ua[5].a_status);
00506       
00507       STATUS_RETURN(status_r);
00508     }
00509 }
00510 
00511 RPCStatus
00512 dbDelete(ConnHandle *ch, const char *dbmdb,
00513              const char *userauth, const char *passwdauth,
00514              const char *dbname)
00515 {
00516   if (!ch || !ch->ch)
00517     return IDB_dbDelete(ch, dbmdb, userauth, passwdauth, dbname);
00518   else
00519     {
00520       ClientArg ua[IDB_MAXARGS], *pua = ua;
00521 
00522       pua++->a_string = (char *)dbmdb;
00523       pua++->a_string = (char *)userauth;
00524       pua++->a_string = (char *)passwdauth;
00525       pua++->a_string = (char *)dbname;
00526       
00527       RPC_RPCMAKE(ch->ch, DBDELETE_RPC, ua);
00528 
00529       status_copy(status_r, ua[4].a_status);
00530   
00531       STATUS_RETURN(status_r);
00532     }
00533 }
00534 
00535 RPCStatus
00536 dbInfo(ConnHandle *ch, const char *dbmdb,
00537            const char *userauth, const char *passwdauth, const char *dbname,
00538            int *rdbid, DbCreateDescription *pdbdesc)
00539 {
00540   if (!ch || !ch->ch)
00541     return IDB_dbInfo(ch, dbmdb, userauth, passwdauth, dbname,
00542                       rdbid, pdbdesc);
00543   else
00544     {
00545       ClientArg ua[IDB_MAXARGS], *pua = ua;
00546 
00547       pua++->a_string = (char *)dbmdb;
00548       pua++->a_string = (char *)userauth;
00549       pua++->a_string = (char *)passwdauth;
00550       pua++->a_string = (char *)dbname;
00551       pua++;
00552       pua++->a_data.data = 0;
00553       
00554       RPC_RPCMAKE(ch->ch, DBINFO_RPC, ua);
00555 
00556       if (rdbid)
00557         *rdbid = ua[4].a_int;
00558       status_copy(status_r, ua[6].a_status);
00559 
00560       if (!status_r.err)
00561         decode_dbdescription((unsigned char *)ua[5].a_data.data, 0, pdbdesc);
00562       
00563       free(ua[5].a_data.data); // 1/10/05
00564       STATUS_RETURN(status_r);
00565     }
00566 }
00567 
00568 RPCStatus
00569 dbMove(ConnHandle *ch, const char *dbmdb,
00570            const char *userauth, const char *passwdauth,
00571            const char *dbname, const DbCreateDescription *dbdesc)
00572 {
00573   if (!ch || !ch->ch)
00574     return IDB_dbMove(ch, dbmdb, userauth, passwdauth, dbname, dbdesc);
00575   else
00576     {
00577       ClientArg ua[IDB_MAXARGS], *pua = ua;
00578       Data dbdesc_data;
00579 
00580       pua++->a_string = (char *)dbmdb;
00581       pua++->a_string = (char *)userauth;
00582       pua++->a_string = (char *)passwdauth;
00583       pua++->a_string = (char *)dbname;
00584       dbdesc_data = code_dbdescription(dbdesc, &pua->a_data.size);
00585       pua->a_data.data = dbdesc_data;
00586 
00587       RPC_RPCMAKE(ch->ch, DBMOVE_RPC, ua);
00588       free(dbdesc_data);
00589 
00590       status_copy(status_r, ua[5].a_status);
00591   
00592       STATUS_RETURN(status_r);
00593     }
00594 }
00595 
00596 RPCStatus
00597 dbCopy(ConnHandle *ch, const char *dbmdb,
00598            const char *userauth, const char *passwdauth, const char *dbname,
00599            const char *newname, Bool newdbid,
00600            const DbCreateDescription *dbdesc)
00601 {
00602   if (!ch || !ch->ch)
00603     return IDB_dbCopy(ch, dbmdb, userauth, passwdauth, dbname,
00604                       newname, newdbid, dbdesc);
00605   else
00606     {
00607       ClientArg ua[IDB_MAXARGS], *pua = ua;
00608       Data dbdesc_data;
00609 
00610       pua++->a_string = (char *)dbmdb;
00611       pua++->a_string = (char *)userauth;
00612       pua++->a_string = (char *)passwdauth;
00613       pua++->a_string = (char *)dbname;
00614       pua++->a_string = (char *)newname;
00615       pua++->a_int    = (int)newdbid;
00616       dbdesc_data = code_dbdescription(dbdesc, &pua->a_data.size);
00617       pua->a_data.data = dbdesc_data;
00618 
00619       RPC_RPCMAKE(ch->ch, DBCOPY_RPC, ua);
00620 
00621       free(dbdesc_data);
00622 
00623       status_copy(status_r, ua[7].a_status);
00624   
00625       STATUS_RETURN(status_r);
00626     }
00627 }
00628 
00629 RPCStatus
00630 dbRename(ConnHandle *ch, const char *dbmdb,
00631              const char *userauth, const char *passwdauth,
00632              const char *dbname, const char *newname)
00633 {
00634   if (!ch || !ch->ch)
00635     return IDB_dbRename(ch, dbmdb, userauth, passwdauth,
00636                         dbname, newname);
00637   else
00638     {
00639       ClientArg ua[IDB_MAXARGS], *pua = ua;
00640 
00641       pua++->a_string = (char *)dbmdb;
00642       pua++->a_string = (char *)userauth;
00643       pua++->a_string = (char *)passwdauth;
00644       pua++->a_string = (char *)dbname;
00645       pua++->a_string = (char *)newname;
00646 
00647       RPC_RPCMAKE(ch->ch, DBRENAME_RPC, ua);
00648 
00649       status_copy(status_r, ua[5].a_status);
00650   
00651       STATUS_RETURN(status_r);
00652     }
00653 }
00654 
00655 RPCStatus
00656 userAdd(ConnHandle *ch, const char *dbmdb,
00657             const char *userauth, const char *passwdauth,
00658             const char *user, const char *passwd, int user_type)
00659 {
00660   if (!ch || !ch->ch)
00661     return IDB_userAdd(ch, dbmdb, userauth, passwdauth,
00662                        user, passwd, user_type);
00663   else
00664     {
00665       ClientArg ua[IDB_MAXARGS], *pua = ua;
00666 
00667       pua++->a_string = (char *)dbmdb;
00668       pua++->a_string = (char *)userauth;
00669       pua++->a_string = (char *)passwdauth;
00670       pua++->a_string = (char *)user;
00671       pua++->a_string = (char *)(passwd ? passwd : "");
00672       pua++->a_int    = user_type;
00673 
00674       RPC_RPCMAKE(ch->ch, USER_ADD_RPC, ua);
00675 
00676       status_copy(status_r, ua[6].a_status);
00677   
00678       STATUS_RETURN(status_r);
00679     }
00680 }
00681 
00682 RPCStatus
00683 userDelete(ConnHandle *ch, const char *dbmdb,
00684                const char *userauth, const char *passwdauth,
00685                const char *user)
00686 {
00687   if (!ch || !ch->ch)
00688     return IDB_userDelete(ch, dbmdb, userauth, passwdauth, user);
00689   else 
00690     {
00691       ClientArg ua[IDB_MAXARGS], *pua = ua;
00692 
00693       pua++->a_string = (char *)dbmdb;
00694       pua++->a_string = (char *)userauth;
00695       pua++->a_string = (char *)passwdauth;
00696       pua++->a_string = (char *)user;
00697 
00698       RPC_RPCMAKE(ch->ch, USER_DELETE_RPC, ua);
00699 
00700       status_copy(status_r, ua[4].a_status);
00701   
00702       STATUS_RETURN(status_r);
00703     }
00704 }
00705 
00706 RPCStatus
00707 userPasswdSet(ConnHandle *ch, const char *dbmdb,
00708                   const char *userauth, const char *passwdauth,
00709                   const char *user, const char *passwd)
00710 {
00711   if (!ch || !ch->ch)
00712     return IDB_userPasswdSet(ch, dbmdb, userauth, passwdauth,
00713                              user, passwd);
00714   else
00715     {
00716       ClientArg ua[IDB_MAXARGS], *pua = ua;
00717 
00718       pua++->a_string = (char *)dbmdb;
00719       pua++->a_string = (char *)userauth;
00720       pua++->a_string = (char *)passwdauth;
00721       pua++->a_string = (char *)user;
00722       pua++->a_string = (char *)passwd;
00723 
00724       RPC_RPCMAKE(ch->ch, USER_PASSWD_SET_RPC, ua);
00725 
00726       status_copy(status_r, ua[5].a_status);
00727   
00728       STATUS_RETURN(status_r);
00729     }
00730 }
00731 
00732 RPCStatus
00733 passwdSet(ConnHandle *ch, const char *dbmdb,
00734               const char *user, const char *passwd,
00735               const char *newpasswd)
00736 {
00737   if (!ch || !ch->ch)
00738     return IDB_passwdSet(ch, dbmdb, user, passwd, newpasswd);
00739   else
00740     {
00741       ClientArg ua[IDB_MAXARGS], *pua = ua;
00742 
00743       start_rpc();
00744 
00745       pua++->a_string = (char *)dbmdb;
00746       pua++->a_string = (char *)user;
00747       pua++->a_string = (char *)passwd;
00748       pua++->a_string = (char *)newpasswd;
00749 
00750       RPC_RPCMAKE(ch->ch, PASSWD_SET_RPC, ua);
00751 
00752       status_copy(status_r, ua[4].a_status);
00753   
00754       STATUS_RETURN(status_r);
00755     }
00756 }
00757 
00758 RPCStatus
00759 defaultDBAccessSet(ConnHandle *ch, const char *dbmdb,
00760                        const char *userauth, const char *passwdauth,
00761                        const char *dbname, int mode)
00762 {
00763   if (!ch || !ch->ch)
00764     return IDB_defaultDBAccessSet(ch, dbmdb, userauth, passwdauth,
00765                                   dbname, mode);
00766   else
00767     {
00768       ClientArg ua[IDB_MAXARGS], *pua = ua;
00769 
00770       start_rpc();
00771 
00772       pua++->a_string = (char *)dbmdb;
00773       pua++->a_string = (char *)userauth;
00774       pua++->a_string = (char *)passwdauth;
00775       pua++->a_string = (char *)dbname;
00776       pua++->a_int    = mode;
00777 
00778       RPC_RPCMAKE(ch->ch, DEFAULT_DBACCESS_SET_RPC, ua);
00779 
00780       status_copy(status_r, ua[5].a_status);
00781   
00782       STATUS_RETURN(status_r);
00783     }
00784 }
00785 
00786 RPCStatus
00787 userDBAccessSet(ConnHandle *ch, const char *dbmdb,
00788                     const char *userauth, const char *passwdauth,
00789                     const char *dbname, const char *user, int mode)
00790 {
00791   if (!ch || !ch->ch)
00792     return IDB_userDBAccessSet(ch, dbmdb, userauth, passwdauth,
00793                                dbname, user, mode);
00794   else
00795     {
00796       ClientArg ua[IDB_MAXARGS], *pua = ua;
00797 
00798       start_rpc();
00799 
00800       pua++->a_string = (char *)dbmdb;
00801       pua++->a_string = (char *)userauth;
00802       pua++->a_string = (char *)passwdauth;
00803       pua++->a_string = (char *)dbname;
00804       pua++->a_string = (char *)user;
00805       pua++->a_int    = mode;
00806 
00807       RPC_RPCMAKE(ch->ch, USER_DBACCESS_SET_RPC, ua);
00808 
00809       status_copy(status_r, ua[6].a_status);
00810   
00811       STATUS_RETURN(status_r);
00812     }
00813 }
00814 
00815 RPCStatus
00816 userSysAccessSet(ConnHandle *ch, const char *dbmdb,
00817                      const char *userauth, const char *passwdauth,
00818                      const char *user, int mode)
00819 {
00820   if (!ch || !ch->ch)
00821     return IDB_userSysAccessSet(ch, dbmdb, userauth, passwdauth, user, mode);
00822   else
00823     {
00824       ClientArg ua[IDB_MAXARGS], *pua = ua;
00825 
00826       start_rpc();
00827 
00828       pua++->a_string = (char *)dbmdb;
00829       pua++->a_string = (char *)userauth;
00830       pua++->a_string = (char *)passwdauth;
00831       pua++->a_string = (char *)user;
00832       pua++->a_int    = mode;
00833 
00834       RPC_RPCMAKE(ch->ch, USER_SYSACCESS_SET_RPC, ua);
00835 
00836       status_copy(status_r, ua[5].a_status);
00837   
00838       STATUS_RETURN(status_r);
00839     }
00840 }
00841 
00842 /* typed object */
00843 RPCStatus
00844 objectCreate(DbHandle *dbh, short dspid, const Data idr, eyedbsm::Oid *oid)
00845 {
00846   start_rpc();
00847 
00848   CHECK_DBH(dbh, "objectCreate");
00849 
00850   if (DBH_IS_LOCAL(dbh))
00851     {
00852       Data inv_data;
00853       RPCStatus rpc_status = IDB_objectCreate((DbHandle *)dbh->u.dbh, dspid, idr,
00854                                               oid, 0, &inv_data, 0);
00855       if (!rpc_status)
00856         object_epilogue(dbh->db, oid, inv_data, True);
00857       return rpc_status;
00858     }
00859   else
00860     {
00861       ClientArg ua[IDB_MAXARGS], *pua = ua;
00862       ObjectHeader hdr;
00863       Offset offset = 0;
00864 
00865       if (!object_header_decode(idr, &offset, &hdr))
00866         return rpcStatusMake(IDB_INVALID_OBJECT_HEADER,
00867                                  "objectCreate: invalid object_header");
00868 
00869       pua++->a_int = RDBHID_GET(dbh);
00870       pua++->a_int = dspid;
00871       pua->a_data.data = (const Data)idr;
00872       pua++->a_data.size = hdr.size;      
00873       pua++->a_oid    = *oid;
00874       pua->a_data.data = 0; /* inv_data */
00875       pua++->a_data.size = 0;
00876 
00877       RPC_RPCMAKE(dbh->ch->ch, OBJECT_CREATE_RPC, ua);
00878 
00879       *oid = ua[3].a_oid;
00880 
00881       status_copy(status_r, ua[5].a_status);
00882 
00883       if (!status_r.err)
00884         object_epilogue(dbh->db, oid, (unsigned char *)ua[4].a_data.data, True);
00885 
00886       STATUS_RETURN(status_r);
00887     }
00888 }
00889 
00890 RPCStatus
00891 objectDelete(DbHandle *dbh, const eyedbsm::Oid *oid, unsigned int flags)
00892 {
00893   CHECK_DBH(dbh, "objectDelete");
00894 
00895   if (DBH_IS_LOCAL(dbh))
00896     {
00897       Data inv_data;
00898       RPCStatus rpc_status = IDB_objectDelete((DbHandle *)dbh->u.dbh, oid,
00899                                               flags, &inv_data, 0);
00900       if (!rpc_status)
00901         object_epilogue(dbh->db, oid, inv_data, False);
00902       return rpc_status;
00903     }
00904   else
00905     {
00906       ClientArg ua[IDB_MAXARGS], *pua = ua;
00907 
00908       start_rpc();
00909 
00910       pua++->a_int = RDBHID_GET(dbh);
00911       pua++->a_oid = *oid;
00912       pua++->a_int = flags;
00913       pua->a_data.data = 0; /* inv_data */
00914       pua++->a_data.size = 0;
00915       
00916       RPC_RPCMAKE(dbh->ch->ch, OBJECT_DELETE_RPC, ua);
00917 
00918       status_copy(status_r, ua[4].a_status);
00919       
00920       if (!status_r.err)
00921         object_epilogue(dbh->db, oid, (unsigned char *)ua[3].a_data.data, False);
00922 
00923       STATUS_RETURN(status_r);
00924     }
00925 }
00926 
00927 RPCStatus
00928 objectRead(DbHandle *dbh, Data idr, Data *pidr,
00929                short *pdspid, const eyedbsm::Oid *oid, ObjectHeader *phdr,
00930                LockMode lockmode, void **pcl)
00931 {
00932   CHECK_DBH(dbh, "objectRead");
00933 
00934   if (DBH_IS_LOCAL(dbh))
00935     return IDB_objectReadLocal((DbHandle *)dbh->u.dbh, idr, pidr, pdspid, oid, phdr, lockmode, pcl);
00936   else
00937     {
00938       ClientArg ua[IDB_MAXARGS], *pua = ua;
00939       ObjectHeader hdr;
00940       char buf[IDB_OBJ_HEAD_SIZE];
00941 
00942       start_rpc();
00943 
00944       if (idr)
00945         {
00946           object_header_decode_head(idr, &hdr);
00947           memcpy(buf, idr, IDB_OBJ_HEAD_SIZE);
00948         }
00949       else
00950         {
00951           memset(buf, 0, IDB_OBJ_HEAD_SIZE);
00952           hdr.size = 0;
00953         }
00954 
00955       pua++->a_int = RDBHID_GET(dbh);
00956       pua->a_data.data = buf;
00957       pua++->a_data.size = IDB_OBJ_HEAD_SIZE;
00958       pua++; /* dspid */
00959       pua++->a_oid = *oid;
00960       pua++->a_int = lockmode;
00961 
00962       pua->a_data.data = idr;
00963       pua++->a_data.size = hdr.size;
00964 
00965       RPC_RPCMAKE(dbh->ch->ch, OBJECT_READ_RPC, ua);
00966 
00967       status_copy(status_r, ua[6].a_status);
00968       
00969       if (!idr && !status_r.err)
00970         *pidr = (unsigned char *)ua[5].a_data.data;
00971       if (!status_r.err && pdspid)
00972         *pdspid = ua[2].a_int;
00973 
00974       STATUS_RETURN(status_r);
00975     }
00976 }
00977 
00978 RPCStatus
00979 objectWrite(DbHandle *dbh, const Data idr, const eyedbsm::Oid *oid)
00980 {
00981   CHECK_DBH(dbh, "objectWrite");
00982 
00983   if (DBH_IS_LOCAL(dbh))
00984     {
00985       Data inv_data;
00986       RPCStatus rpc_status = IDB_objectWrite((DbHandle *)dbh->u.dbh, idr, oid, 0,
00987                                              &inv_data, 0);
00988       if (!rpc_status)
00989         object_epilogue(dbh->db, oid, inv_data, False);
00990       return rpc_status;
00991     }
00992   else
00993     {
00994       ClientArg ua[IDB_MAXARGS], *pua = ua;
00995       Offset offset = 0;
00996       ObjectHeader hdr;
00997 
00998       start_rpc();
00999 
01000       if (!object_header_decode(idr, &offset, &hdr))
01001         return rpcStatusMake(IDB_INVALID_OBJECT_HEADER,
01002                                  "objectCreate: invalid object_header");
01003 
01004       pua++->a_int = RDBHID_GET(dbh);
01005 
01006       pua->a_data.data = (const Data)idr;
01007       pua++->a_data.size = hdr.size;
01008       pua++->a_oid = *oid;
01009       pua->a_data.data = 0; /* inv_data */
01010       pua++->a_data.size = 0;
01011       
01012       RPC_RPCMAKE(dbh->ch->ch, OBJECT_WRITE_RPC, ua);
01013 
01014       status_copy(status_r, ua[4].a_status);
01015 
01016       if (!status_r.err)
01017         object_epilogue(dbh->db, oid, (unsigned char *)ua[3].a_data.data, False);
01018 
01019       STATUS_RETURN(status_r);
01020     }
01021 }
01022 
01023 RPCStatus
01024 objectHeaderRead(DbHandle *dbh, const eyedbsm::Oid *oid, ObjectHeader *hdr)
01025 {
01026   CHECK_DBH(dbh, "objectHeaderRead");
01027 
01028   if (DBH_IS_LOCAL(dbh))
01029     return IDB_objectHeaderRead((DbHandle *)dbh->u.dbh, oid, hdr);
01030   else
01031     {
01032       ClientArg ua[IDB_MAXARGS], *pua = ua;
01033 
01034       start_rpc();
01035 
01036       pua++->a_int = RDBHID_GET(dbh);
01037       pua++->a_oid = *oid;
01038 
01039       RPC_RPCMAKE(dbh->ch->ch, OBJECT_HEADER_READ_RPC, ua);
01040 
01041       status_copy(status_r, ua[8].a_status);
01042 
01043       if (status_r.err == IDB_SUCCESS)
01044         {
01045           hdr->magic   = IDB_OBJ_HEAD_MAGIC;
01046           hdr->type    = ua[2].a_int;
01047           hdr->size    = ua[3].a_int;
01048           hdr->ctime   = ua[4].a_int;
01049           hdr->mtime   = ua[5].a_int;
01050           hdr->oid_cl = ua[6].a_oid;
01051           hdr->oid_prot = ua[7].a_oid;
01052           hdr->xinfo   = 0;
01053         }
01054 
01055       STATUS_RETURN(status_r);
01056     }
01057 }
01058 
01059 RPCStatus
01060 objectSizeModify(DbHandle *dbh, unsigned int size, const eyedbsm::Oid *oid)
01061 {
01062   CHECK_DBH(dbh, "objectSizeModify");
01063 
01064   if (DBH_IS_LOCAL(dbh))
01065     return IDB_objectSizeModify((DbHandle *)dbh->u.dbh, size, oid);
01066   else
01067     {
01068       ClientArg ua[IDB_MAXARGS], *pua = ua;
01069 
01070       start_rpc();
01071 
01072       pua++->a_int = RDBHID_GET(dbh);
01073       pua++->a_int = size;
01074       pua++->a_oid = *oid;
01075       
01076       RPC_RPCMAKE(dbh->ch->ch, OBJECT_SIZE_MODIFY_RPC, ua);
01077 
01078       status_copy(status_r, ua[3].a_status);
01079 
01080       STATUS_RETURN(status_r);
01081     }
01082 }
01083 
01084 RPCStatus
01085 objectCheck(DbHandle *dbh, const eyedbsm::Oid *oid, int *state,
01086                 eyedbsm::Oid *cloid)
01087 {
01088   CHECK_DBH(dbh, "objectCheck");
01089 
01090   if (DBH_IS_LOCAL(dbh))
01091     return IDB_objectCheck((DbHandle *)dbh->u.dbh, oid, state, cloid);
01092   else
01093     {
01094       ClientArg ua[IDB_MAXARGS], *pua = ua;
01095 
01096       start_rpc();
01097 
01098       pua++->a_int = RDBHID_GET(dbh);
01099       pua++->a_oid = *oid;
01100       
01101       RPC_RPCMAKE(dbh->ch->ch, OBJECT_CHECK_RPC, ua);
01102 
01103       *state = ua[2].a_int;
01104       *cloid = ua[3].a_oid;
01105 
01106       status_copy(status_r, ua[4].a_status);
01107 
01108       STATUS_RETURN(status_r);
01109     }
01110 }
01111 
01112 RPCStatus
01113 objectProtectionSet(DbHandle *dbh, const eyedbsm::Oid *obj_oid,
01114                         const eyedbsm::Oid *prot_oid)
01115 {
01116   CHECK_DBH(dbh, "objectProtectionSet");
01117 
01118   if (DBH_IS_LOCAL(dbh))
01119     return IDB_objectProtectionSet((DbHandle *)dbh->u.dbh, obj_oid, prot_oid);
01120   else
01121     {
01122       ClientArg ua[IDB_MAXARGS], *pua = ua;
01123 
01124       start_rpc();
01125 
01126       pua++->a_int = RDBHID_GET(dbh);
01127       pua++->a_oid = *obj_oid;
01128       pua++->a_oid = *prot_oid;
01129       
01130       RPC_RPCMAKE(dbh->ch->ch, OBJECT_PROTECTION_SET_RPC, ua);
01131 
01132       status_copy(status_r, ua[3].a_status);
01133 
01134       STATUS_RETURN(status_r);
01135     }
01136 }
01137 
01138 RPCStatus
01139 objectProtectionGet(DbHandle *dbh, const eyedbsm::Oid *obj_oid,
01140                         eyedbsm::Oid *prot_oid)
01141 {
01142   CHECK_DBH(dbh, "objectProtectionGet");
01143 
01144   if (DBH_IS_LOCAL(dbh))
01145     return IDB_objectProtectionGet((DbHandle *)dbh->u.dbh, obj_oid, prot_oid);
01146   else
01147     {
01148       ClientArg ua[IDB_MAXARGS], *pua = ua;
01149 
01150       start_rpc();
01151 
01152       pua++->a_int = RDBHID_GET(dbh);
01153       pua++->a_oid = *obj_oid;
01154       
01155       RPC_RPCMAKE(dbh->ch->ch, OBJECT_PROTECTION_GET_RPC, ua);
01156 
01157       *prot_oid = ua[2].a_oid;
01158 
01159       status_copy(status_r, ua[3].a_status);
01160 
01161       STATUS_RETURN(status_r);
01162     }
01163 }
01164 
01165 
01166 RPCStatus
01167 oidMake(DbHandle *dbh, short dspid, const Data idr, unsigned int size,
01168             eyedbsm::Oid *oid)
01169 {
01170   /*
01171     #ifdef E_XDR
01172     ObjectHeader hdr;
01173     #endif
01174   */
01175 
01176   CHECK_DBH(dbh, "oidMake");
01177 
01178   /*
01179     #ifdef E_XDR
01180     memcpy(&hdr, idr, IDB_OBJ_HEAD_SIZE);
01181     Offset offset = 0;
01182     Size sz = IDB_OBJ_HEAD_SIZE;
01183     object_header_code((Data *)&idr, &offset, &sz, &hdr);
01184     #endif
01185   */
01186 
01187   if (DBH_IS_LOCAL(dbh)) {
01188 #ifdef E_XDR
01189     ObjectHeader hdr;
01190     Offset offset = 0;
01191     object_header_decode(idr, &offset, &hdr);
01192     return IDB_oidMake((DbHandle *)dbh->u.dbh, &hdr, dspid, size, oid);
01193 #else
01194     return IDB_oidMake((DbHandle *)dbh->u.dbh, (ObjectHeader *)idr, dspid, size, oid);
01195 #endif
01196   }
01197   else
01198     {
01199       ClientArg ua[IDB_MAXARGS], *pua = ua;
01200 
01201       start_rpc();
01202 
01203       /* XDR TBD : should code HDR */
01204 
01205       pua++->a_int = RDBHID_GET(dbh);
01206       pua++->a_int = dspid;
01207       pua->a_data.data = (const Data)idr;
01208       pua++->a_data.size = IDB_OBJ_HEAD_SIZE;
01209       pua++->a_int = size;
01210       
01211       RPC_RPCMAKE(dbh->ch->ch, OID_MAKE_RPC, ua);
01212 
01213       *oid = ua[4].a_oid;
01214 
01215       status_copy(status_r, ua[5].a_status);
01216 
01217       STATUS_RETURN(status_r);
01218     }
01219 }
01220 
01221 /* raw data object */
01222 RPCStatus
01223 dataCreate(DbHandle *dbh, short dspid, unsigned int size, const Data idr, eyedbsm::Oid *oid)
01224 {
01225   CHECK_DBH(dbh, "dataCreate");
01226 
01227   if (DBH_IS_LOCAL(dbh))
01228     return IDB_dataCreate((DbHandle *)dbh->u.dbh, dspid, size, idr, oid, 0);
01229   else
01230     {
01231       ClientArg ua[IDB_MAXARGS], *pua = ua;
01232 
01233       start_rpc();
01234 
01235       pua++->a_int       = RDBHID_GET(dbh);
01236       pua++->a_int       = dspid;
01237       pua->a_data.size   = size;
01238       pua++->a_data.data = idr;
01239       
01240       RPC_RPCMAKE(dbh->ch->ch, DATA_CREATE_RPC, ua);
01241 
01242       *oid = ua[3].a_oid;
01243 
01244       status_copy(status_r, ua[4].a_status);
01245 
01246       STATUS_RETURN(status_r);
01247     }
01248 }
01249 
01250 RPCStatus
01251 dataDelete(DbHandle *dbh, const eyedbsm::Oid *oid)
01252 {
01253   CHECK_DBH(dbh, "dataDelete");
01254 
01255   if (DBH_IS_LOCAL(dbh))
01256     return IDB_dataDelete((DbHandle *)dbh->u.dbh, oid);
01257   else
01258     {
01259       ClientArg ua[IDB_MAXARGS], *pua = ua;
01260 
01261       start_rpc();
01262 
01263       pua++->a_int = RDBHID_GET(dbh);
01264       pua++->a_oid       = *oid;
01265       
01266       RPC_RPCMAKE(dbh->ch->ch, DATA_DELETE_RPC, ua);
01267 
01268       status_copy(status_r, ua[2].a_status);
01269       
01270       STATUS_RETURN(status_r);
01271     }
01272 }
01273 
01274 RPCStatus
01275 dataRead(DbHandle *dbh, int offset, unsigned int size, Data idr, short *pdspid, const eyedbsm::Oid *oid)
01276 {
01277   CHECK_DBH(dbh, "dataRead");
01278 
01279   if (DBH_IS_LOCAL(dbh))
01280     return IDB_dataRead((DbHandle *)dbh->u.dbh, offset, size, idr, pdspid, oid, 0);
01281   else
01282     {
01283       ClientArg ua[IDB_MAXARGS], *pua = ua;
01284 
01285       start_rpc();
01286 
01287       pua++->a_int       = RDBHID_GET(dbh);
01288       pua++->a_int       = offset;
01289       pua++->a_int       = size;
01290       pua++; /* pdspid */
01291       pua++->a_oid       = *oid;
01292       pua->a_data.size   = size;
01293       pua++->a_data.data = idr;
01294       
01295       RPC_RPCMAKE(dbh->ch->ch, DATA_READ_RPC, ua);
01296 
01297       status_copy(status_r, ua[6].a_status);
01298       if (pdspid) *pdspid = ua[3].a_int;
01299 
01300       STATUS_RETURN(status_r);
01301     }
01302 }
01303 
01304 RPCStatus
01305 dataWrite(DbHandle *dbh, int offset, unsigned int size, const Data idr, const eyedbsm::Oid *oid)
01306 {
01307   CHECK_DBH(dbh, "dataWrite");
01308   
01309   if (DBH_IS_LOCAL(dbh))
01310     return IDB_dataWrite((DbHandle *)dbh->u.dbh, offset, size, idr, oid, 0);
01311   else
01312     {
01313       ClientArg ua[IDB_MAXARGS], *pua = ua;
01314 
01315       start_rpc();
01316 
01317       pua++->a_int       = RDBHID_GET(dbh);
01318       pua++->a_int       = offset;
01319       pua->a_data.size   = size;
01320       pua++->a_data.data = idr;
01321       pua++->a_oid       = *oid;
01322       
01323       RPC_RPCMAKE(dbh->ch->ch, DATA_WRITE_RPC, ua);
01324 
01325       status_copy(status_r, ua[4].a_status);
01326   
01327       STATUS_RETURN(status_r);
01328     }
01329 }
01330 
01331 RPCStatus
01332 dataSizeGet(DbHandle *dbh, const eyedbsm::Oid *oid, unsigned int *size)
01333 {
01334   CHECK_DBH(dbh, "dataSizeGet");
01335 
01336   if (DBH_IS_LOCAL(dbh))
01337     return IDB_dataSizeGet((DbHandle *)dbh->u.dbh, oid, size);
01338   else
01339     {
01340       ClientArg ua[IDB_MAXARGS], *pua = ua;
01341 
01342       start_rpc();
01343 
01344       pua++->a_int       = RDBHID_GET(dbh);
01345       pua++->a_oid       = *oid;
01346       
01347       RPC_RPCMAKE(dbh->ch->ch, DATA_SIZE_GET_RPC, ua);
01348 
01349       *size = ua[2].a_int;
01350       status_copy(status_r, ua[3].a_status);
01351 
01352       STATUS_RETURN(status_r);
01353     }
01354 }
01355 
01356 RPCStatus
01357 dataSizeModify(DbHandle *dbh, unsigned int size, const eyedbsm::Oid *oid)
01358 {
01359   CHECK_DBH(dbh, "dataSizeModify");
01360 
01361   if (DBH_IS_LOCAL(dbh))
01362     return IDB_dataSizeModify((DbHandle *)dbh->u.dbh, size, oid);
01363   else
01364     {
01365       ClientArg ua[IDB_MAXARGS], *pua = ua;
01366 
01367       start_rpc();
01368 
01369       pua++->a_int       = RDBHID_GET(dbh);
01370       pua++->a_int       = size;
01371       pua++->a_oid       = *oid;
01372       
01373       RPC_RPCMAKE(dbh->ch->ch, DATA_SIZE_MODIFY_RPC, ua);
01374 
01375       status_copy(status_r, ua[3].a_status);
01376 
01377       STATUS_RETURN(status_r);
01378     }
01379 }
01380 
01381 RPCStatus
01382 VDdataCreate(DbHandle *dbh, short dspid, const eyedbsm::Oid *actual_oid_cl,
01383                  const eyedbsm::Oid *oid_cl, int num,
01384                  int count, int size, const Data data,
01385                  const eyedbsm::Oid *agr_oid, eyedbsm::Oid *data_oid,
01386                  Data idx_data, Size idx_size)
01387 {
01388   CHECK_DBH(dbh, "VDdataCreate");
01389 
01390   if (DBH_IS_LOCAL(dbh))
01391     return IDB_VDdataCreate((DbHandle *)dbh->u.dbh, dspid, actual_oid_cl, oid_cl,
01392                             num, count, size, data,
01393                             agr_oid, data_oid, idx_data, idx_size, 0, 0);
01394   else
01395     {
01396       ClientArg ua[IDB_MAXARGS], *pua = ua;
01397 
01398       start_rpc();
01399 
01400       pua++->a_int       = RDBHID_GET(dbh);
01401       pua++->a_int       = dspid;
01402       pua++->a_oid       = *actual_oid_cl;
01403       pua++->a_oid       = *oid_cl;
01404       pua++->a_int       = num;
01405       pua++->a_int       = count;
01406       pua->a_data.size   = size;
01407       pua++->a_data.data = data;
01408       pua->a_data.size   = idx_size;
01409       pua++->a_data.data = idx_data;
01410       pua++->a_oid       = *agr_oid;
01411       
01412       RPC_RPCMAKE(dbh->ch->ch, VDDATA_CREATE_RPC, ua);
01413 
01414       *data_oid = ua[9].a_oid;
01415 
01416       status_copy(status_r, ua[10].a_status);
01417 
01418       STATUS_RETURN(status_r);
01419     }
01420 }
01421 
01422 RPCStatus
01423 VDdataDelete(DbHandle *dbh, const eyedbsm::Oid *actual_oid_cl,
01424                  const eyedbsm::Oid *oid_cl, int num,
01425                  const eyedbsm::Oid *agr_oid, const eyedbsm::Oid *data_oid,
01426                  Data idx_data, Size idx_size)
01427 {
01428   CHECK_DBH(dbh, "VDdataDelete");
01429 
01430   if (DBH_IS_LOCAL(dbh))
01431     return IDB_VDdataDelete((DbHandle *)dbh->u.dbh, actual_oid_cl, oid_cl,
01432                             num, agr_oid, data_oid, idx_data, idx_size, 0);
01433   else
01434     {
01435       ClientArg ua[IDB_MAXARGS], *pua = ua;
01436 
01437       start_rpc();
01438 
01439       pua++->a_int       = RDBHID_GET(dbh);
01440       pua++->a_oid       = *actual_oid_cl;
01441       pua++->a_oid       = *oid_cl;
01442       pua++->a_int       = num;
01443       pua++->a_oid       = *agr_oid;
01444       pua++->a_oid       = *data_oid;
01445       pua->a_data.size   = idx_size;
01446       pua++->a_data.data = idx_data;
01447 
01448       RPC_RPCMAKE(dbh->ch->ch, VDDATA_DELETE_RPC, ua);
01449 
01450       status_copy(status_r, ua[7].a_status);
01451 
01452       STATUS_RETURN(status_r);
01453     }
01454 }
01455 
01456 RPCStatus
01457 VDdataWrite(DbHandle *dbh, const eyedbsm::Oid *actual_oid_cl,
01458                 const eyedbsm::Oid *oid_cl, int num,
01459                 int count, unsigned int size, const Data data,
01460                 const eyedbsm::Oid *agr_oid,
01461                 const eyedbsm::Oid *data_oid,
01462                 Data idx_data, Size idx_size)
01463 {
01464   CHECK_DBH(dbh, "VDdataWrite");
01465 
01466   if (DBH_IS_LOCAL(dbh))
01467     return IDB_VDdataWrite((DbHandle *)dbh->u.dbh, actual_oid_cl, oid_cl, num,
01468                            count, size, data,
01469                            agr_oid, data_oid, idx_data, idx_size, 0, 0);
01470   else
01471     {
01472       ClientArg ua[IDB_MAXARGS], *pua = ua;
01473 
01474       start_rpc();
01475 
01476       pua++->a_int       = RDBHID_GET(dbh);
01477       pua++->a_oid       = *actual_oid_cl;
01478       pua++->a_oid       = *oid_cl;
01479       pua++->a_int       = num;
01480       pua++->a_int       = count;
01481       pua->a_data.size   = size;
01482       pua++->a_data.data = data;
01483       pua->a_data.size   = idx_size;
01484       pua++->a_data.data = idx_data;
01485       pua++->a_oid       = *agr_oid;
01486       pua++->a_oid       = *data_oid;
01487       
01488       RPC_RPCMAKE(dbh->ch->ch, VDDATA_WRITE_RPC, ua);
01489 
01490       status_copy(status_r, ua[9].a_status);
01491 
01492       STATUS_RETURN(status_r);
01493     }
01494 }
01495 
01496 RPCStatus
01497 schemaComplete(DbHandle *dbh, const char *schname)
01498 {
01499   CHECK_DBH(dbh, "schemaComplete");
01500 
01501   if (DBH_IS_LOCAL(dbh))
01502     return IDB_schemaComplete((DbHandle *)dbh->u.dbh, schname);
01503   else
01504     {
01505       ClientArg ua[IDB_MAXARGS], *pua = ua;
01506 
01507       start_rpc();
01508 
01509       pua++->a_int    = RDBHID_GET(dbh);
01510       pua++->a_string = (char *)schname;
01511       
01512       RPC_RPCMAKE(dbh->ch->ch, SCHEMA_COMPLETE_RPC, ua);
01513 
01514       status_copy(status_r, ua[2].a_status);
01515 
01516       STATUS_RETURN(status_r);
01517     }
01518 }
01519 
01520 /* agreg item indexes */
01521 RPCStatus
01522 attributeIndexCreate(DbHandle *dbh, const eyedbsm::Oid *cloid, int num,
01523                          int mode, eyedbsm::Oid *multi_idx_oid,
01524                          Data idx_data, Size idx_size)
01525 {
01526   CHECK_DBH(dbh, "attributeIndexCreate");
01527 
01528   if (DBH_IS_LOCAL(dbh))
01529     return IDB_attributeIndexCreate((DbHandle *)dbh->u.dbh, cloid, num, mode,
01530                                     multi_idx_oid, idx_data, idx_size, 0);
01531   else
01532     {
01533       ClientArg ua[IDB_MAXARGS], *pua = ua;
01534 
01535       start_rpc();
01536 
01537       pua++->a_int       = RDBHID_GET(dbh);
01538       pua++->a_oid       = *cloid;
01539       pua++->a_int       = num;
01540       pua++->a_int       = mode;
01541       pua++->a_oid       = *multi_idx_oid;
01542       pua->a_data.data   = idx_data;
01543       pua++->a_data.size  = idx_size;
01544       
01545       RPC_RPCMAKE(dbh->ch->ch, ATTRIBUTE_INDEX_CREATE_RPC, ua);
01546 
01547       status_copy(status_r, ua[6].a_status);
01548 
01549       STATUS_RETURN(status_r);
01550     }
01551 }
01552 
01553 RPCStatus
01554 attributeIndexRemove(DbHandle *dbh, const eyedbsm::Oid *cloid, int num,
01555                          int mode, Data idx_data, Size idx_size)
01556 {
01557   CHECK_DBH(dbh, "attributeIndexRemove");
01558 
01559   if (DBH_IS_LOCAL(dbh))
01560     return IDB_attributeIndexRemove((DbHandle *)dbh->u.dbh, cloid, num, mode,
01561                                     idx_data, idx_size, 0);
01562   else
01563     {
01564       ClientArg ua[IDB_MAXARGS], *pua = ua;
01565 
01566       start_rpc();
01567 
01568       pua++->a_int       = RDBHID_GET(dbh);
01569       pua++->a_oid       = *cloid;
01570       pua++->a_int       = num;
01571       pua++->a_int       = mode;
01572       pua->a_data.data   = idx_data;
01573       pua++->a_data.size  = idx_size;
01574       
01575       RPC_RPCMAKE(dbh->ch->ch, ATTRIBUTE_INDEX_REMOVE_RPC, ua);
01576 
01577       status_copy(status_r, ua[5].a_status);
01578 
01579       STATUS_RETURN(status_r);
01580     }
01581 }
01582 
01583 RPCStatus
01584 indexCreate(DbHandle * dbh, bool index_move, const eyedbsm::Oid * objoid)
01585 {
01586   if (DBH_IS_LOCAL(dbh))
01587     return IDB_indexCreate((DbHandle *)dbh->u.dbh, index_move, objoid);
01588   else
01589     {
01590       ClientArg ua[IDB_MAXARGS], *pua = ua;
01591       int r, offset;
01592       pua++->a_int = RDBHID_GET(dbh);
01593       pua++->a_int = index_move;
01594       pua++->a_oid = *objoid;
01595 
01596       RPC_RPCMAKE(dbh->ch->ch, INDEX_CREATE_RPC, ua);
01597 
01598 
01599       status_copy(status_r, ua[3].a_status);
01600       STATUS_RETURN(status_r);
01601     }
01602 }
01603 
01604 RPCStatus
01605 indexRemove(DbHandle * dbh, const eyedbsm::Oid * objoid, int reentrant)
01606 {
01607   if (DBH_IS_LOCAL(dbh))
01608     return IDB_indexRemove((DbHandle *)dbh->u.dbh, objoid, reentrant);
01609   else
01610     {
01611       ClientArg ua[IDB_MAXARGS], *pua = ua;
01612       int r, offset;
01613       pua++->a_int = RDBHID_GET(dbh);
01614       pua++->a_oid = *objoid;
01615       pua++->a_int = reentrant;
01616 
01617       RPC_RPCMAKE(dbh->ch->ch, INDEX_REMOVE_RPC, ua);
01618 
01619       status_copy(status_r, ua[3].a_status);
01620       STATUS_RETURN(status_r);
01621     }
01622 }
01623 
01624 RPCStatus
01625 constraintCreate(DbHandle * dbh, const eyedbsm::Oid * objoid)
01626 {
01627   if (DBH_IS_LOCAL(dbh))
01628     return IDB_constraintCreate((DbHandle *)dbh->u.dbh, objoid);
01629   else
01630     {
01631       ClientArg ua[IDB_MAXARGS], *pua = ua;
01632       int r, offset;
01633       pua++->a_int = RDBHID_GET(dbh);
01634       pua++->a_oid = *objoid;
01635 
01636       RPC_RPCMAKE(dbh->ch->ch, CONSTRAINT_CREATE_RPC, ua);
01637 
01638 
01639       status_copy(status_r, ua[2].a_status);
01640       STATUS_RETURN(status_r);
01641     }
01642 }
01643 
01644 RPCStatus
01645 constraintDelete(DbHandle * dbh, const eyedbsm::Oid * objoid, int reentrant)
01646 {
01647   if (DBH_IS_LOCAL(dbh))
01648     return IDB_constraintDelete((DbHandle *)dbh->u.dbh, objoid, reentrant);
01649   else
01650     {
01651       ClientArg ua[IDB_MAXARGS], *pua = ua;
01652       int r, offset;
01653       pua++->a_int = RDBHID_GET(dbh);
01654       pua++->a_oid = *objoid;
01655       pua++->a_int = reentrant;
01656 
01657       RPC_RPCMAKE(dbh->ch->ch, CONSTRAINT_DELETE_RPC, ua);
01658 
01659       status_copy(status_r, ua[3].a_status);
01660       STATUS_RETURN(status_r);
01661     }
01662 }
01663 
01664 /* collections */
01665 RPCStatus
01666 collectionGetByInd(DbHandle *dbh, const eyedbsm::Oid *oid, int ind,
01667                        int *found, Data buf, int size)
01668 {
01669   CHECK_DBH(dbh, "collectionGetByInd");
01670 
01671   if (DBH_IS_LOCAL(dbh))
01672     return IDB_collectionGetByInd((DbHandle *)dbh->u.dbh, oid, ind, found, buf, (void *)0);
01673   else
01674     {
01675       ClientArg ua[IDB_MAXARGS], *pua = ua;
01676 
01677       start_rpc();
01678 
01679       pua++->a_int       = RDBHID_GET(dbh);
01680       pua++->a_oid       = *oid;
01681       pua++->a_int       = ind;
01682       pua++;               /* found */
01683       pua->a_data.data   = buf;
01684       pua++->a_data.size = size;
01685 
01686       RPC_RPCMAKE(dbh->ch->ch, COLLECTION_GET_BY_IND_RPC, ua);
01687 
01688       *found = ua[3].a_int;
01689       status_copy(status_r, ua[5].a_status);
01690 
01691       STATUS_RETURN(status_r);
01692     }
01693 }
01694 
01695 RPCStatus
01696 collectionGetByValue(DbHandle *dbh, const eyedbsm::Oid *oid, Data val,
01697                          int size, int *found, int *ind)
01698 {
01699   CHECK_DBH(dbh, "collectionGetByValue");
01700 
01701   if (DBH_IS_LOCAL(dbh))
01702     return IDB_collectionGetByValue((DbHandle *)dbh->u.dbh, oid, val, found, ind);
01703   else
01704     {
01705       ClientArg ua[IDB_MAXARGS], *pua = ua;
01706 
01707       start_rpc();
01708 
01709       pua++->a_int       = RDBHID_GET(dbh);
01710       pua++->a_oid       = *oid;
01711       pua->a_data.data   = val;
01712       pua++->a_data.size = size;
01713       
01714       RPC_RPCMAKE(dbh->ch->ch, COLLECTION_GET_BY_VALUE_RPC, ua);
01715 
01716       *found = ua[3].a_int;
01717       *ind   = ua[4].a_int;
01718       status_copy(status_r, ua[5].a_status);
01719 
01720       STATUS_RETURN(status_r);
01721     }
01722 }
01723 
01724 RPCStatus
01725 collectionGetByOid(DbHandle *dbh, const eyedbsm::Oid *oid,
01726                        const eyedbsm::Oid *loid, int *found, int *ind)
01727 {
01728   unsigned char data[sizeof(*loid)];
01729   oid_code(data, (Data)loid);
01730   return collectionGetByValue(dbh, oid, data,
01731                                   sizeof(eyedbsm::Oid), found, ind);
01732 
01733   return collectionGetByValue(dbh, oid, (Data)loid,
01734                                   sizeof(eyedbsm::Oid), found, ind);
01735 }
01736 
01737 /* object lock */
01738 
01739 RPCStatus
01740 setObjectLock(DbHandle * dbh, const eyedbsm::Oid * oid, int lockmode, int * rlockmode)
01741 {
01742   CHECK_DBH(dbh, "setObjectLock");
01743 
01744   if (DBH_IS_LOCAL(dbh))
01745     return IDB_setObjectLock((DbHandle *)dbh->u.dbh, oid, lockmode, rlockmode);
01746   else
01747     {
01748       ClientArg ua[IDB_MAXARGS], *pua = ua;
01749       int r, offset;
01750       start_rpc();
01751 
01752       pua++->a_int       = RDBHID_GET(dbh);
01753       pua++->a_int = RDBHID_GET(dbh);
01754       pua++->a_oid = *oid;
01755       pua++->a_int = lockmode;
01756       pua++;
01757 
01758       RPC_RPCMAKE(dbh->ch->ch, SET_OBJECT_LOCK_RPC, ua);
01759 
01760       *rlockmode = ua[4].a_int;
01761 
01762       status_copy(status_r, ua[4].a_status);
01763       STATUS_RETURN(status_r);
01764     }
01765 }
01766 
01767 RPCStatus
01768 getObjectLock(DbHandle * dbh, const eyedbsm::Oid * oid, int * lockmode)
01769 {
01770   CHECK_DBH(dbh, "getObjectLock");
01771 
01772   if (DBH_IS_LOCAL(dbh))
01773     return IDB_getObjectLock((DbHandle *)dbh->u.dbh, oid, lockmode);
01774   else
01775     {
01776       ClientArg ua[IDB_MAXARGS], *pua = ua;
01777       int r, offset;
01778       start_rpc();
01779 
01780       pua++->a_int       = RDBHID_GET(dbh);
01781       pua++->a_int = RDBHID_GET(dbh);
01782       pua++->a_oid = *oid;
01783       pua++;
01784 
01785       RPC_RPCMAKE(dbh->ch->ch, GET_OBJECT_LOCK_RPC, ua);
01786 
01787       *lockmode = ua[3].a_int;
01788 
01789       status_copy(status_r, ua[3].a_status);
01790       STATUS_RETURN(status_r);
01791     }
01792 }
01793 
01794 /* queries */
01795 #if 0
01796 RPCStatus
01797 queryLangCreate(DbHandle *dbh, const char *str, int *qid,
01798                     void *pschinfo, int *count)
01799 {
01800   CHECK_DBH(dbh, "queryLangCreate");
01801 
01802   if (DBH_IS_LOCAL(dbh))
01803     return IDB_queryLangCreate((DbHandle *)dbh->u.dbh, str, qid, count, pschinfo,
01804                                (void *)0, (void *)0);
01805   else
01806     {
01807       ClientArg ua[IDB_MAXARGS], *pua = ua;
01808 
01809       start_rpc();
01810 
01811       pua++->a_int       = RDBHID_GET(dbh);
01812       pua->a_data.data   = (const Data)str;
01813       pua++->a_data.size = strlen(str)+1;
01814       pua++; /* qid */
01815       pua++; /* count */
01816       pua->a_data.size   = 0;
01817       pua++->a_data.data = 0; /* force RPC to allocate buffer */
01818       
01819       RPC_RPCMAKE(dbh->ch->ch, QUERY_LANG_CREATE_RPC, ua);
01820 
01821       *qid   = ua[2].a_int;
01822       *count = ua[3].a_int;
01823       status_copy(status_r, ua[5].a_status);
01824       if (!status_r.err)
01825         decode_sch_info((unsigned char *)ua[4].a_data.data, pschinfo);
01826 
01827       free(ua[4].a_data.data);
01828 
01829       STATUS_RETURN(status_r);
01830     }
01831 }
01832 
01833 RPCStatus
01834 queryDatabaseCreate(DbHandle *dbh, int *qid)
01835 {
01836   CHECK_DBH(dbh, "queryDatabaseCreate");
01837 
01838   if (DBH_IS_LOCAL(dbh))
01839     return IDB_queryDatabaseCreate((DbHandle *)dbh->u.dbh, qid);
01840   else
01841     {
01842       ClientArg ua[IDB_MAXARGS], *pua = ua;
01843 
01844       start_rpc();
01845 
01846       pua++->a_int       = RDBHID_GET(dbh);
01847       
01848       RPC_RPCMAKE(dbh->ch->ch, QUERY_DATABASE_CREATE_RPC, ua);
01849 
01850       *qid   = ua[1].a_int;
01851       status_copy(status_r, ua[2].a_status);
01852 
01853       STATUS_RETURN(status_r);
01854     }
01855 }
01856 
01857 RPCStatus
01858 queryClassCreate(DbHandle *dbh, const eyedbsm::Oid *cloid, int *qid)
01859 {
01860   CHECK_DBH(dbh, "queryClassCreate");
01861 
01862   if (DBH_IS_LOCAL(dbh))
01863     return IDB_queryClassCreate((DbHandle *)dbh->u.dbh, cloid, qid);
01864   else
01865     {
01866       ClientArg ua[IDB_MAXARGS], *pua = ua;
01867 
01868       start_rpc();
01869 
01870       pua++->a_int = RDBHID_GET(dbh);
01871       pua++->a_oid = *cloid;
01872       
01873       RPC_RPCMAKE(dbh->ch->ch, QUERY_CLASS_CREATE_RPC, ua);
01874 
01875       *qid   = ua[2].a_int;
01876       status_copy(status_r, ua[3].a_status);
01877 
01878       STATUS_RETURN(status_r);
01879     }
01880 }
01881 #endif
01882 
01883 RPCStatus
01884 queryCollectionCreate(DbHandle *dbh, const eyedbsm::Oid *oid, Bool index,
01885                           int *qid)
01886 {
01887   CHECK_DBH(dbh, "queryCollectionCreate");
01888 
01889   if (DBH_IS_LOCAL(dbh))
01890     return IDB_queryCollectionCreate((DbHandle *)dbh->u.dbh, oid, (int)index, qid);
01891   else
01892     {
01893       ClientArg ua[IDB_MAXARGS], *pua = ua;
01894 
01895       start_rpc();
01896 
01897       pua++->a_int    = RDBHID_GET(dbh);
01898       pua++->a_oid    = *oid;
01899       pua++->a_int    = (int)index;
01900       
01901       RPC_RPCMAKE(dbh->ch->ch, QUERY_COLLECTION_CREATE_RPC, ua);
01902 
01903       *qid   = ua[3].a_int;
01904       status_copy(status_r, ua[4].a_status);
01905 
01906       STATUS_RETURN(status_r);
01907     }
01908 }
01909 
01910 RPCStatus
01911 queryAttributeCreate(DbHandle *dbh, const eyedbsm::Oid *cloid, int num,
01912                          int ind, Data start, Data end, int sexcl,
01913                          int eexcl, int x_size, int *qid)
01914 {
01915   CHECK_DBH(dbh, "queryAttributeCreate");
01916 
01917   if (DBH_IS_LOCAL(dbh))
01918     return IDB_queryAttributeCreate((DbHandle *)dbh->u.dbh, cloid, num, ind,
01919                                     start, end, sexcl, eexcl, x_size,
01920                                     qid);
01921   else
01922     {
01923       ClientArg ua[IDB_MAXARGS], *pua = ua;
01924 
01925       start_rpc();
01926 
01927       pua++->a_int       = RDBHID_GET(dbh);
01928       pua++->a_oid       = *cloid;
01929       pua++->a_int       = num;
01930       pua++->a_int       = ind;
01931       pua->a_data.data   = start;
01932       pua++->a_data.size = x_size;
01933       pua->a_data.data   = end;
01934       pua++->a_data.size = x_size;
01935       pua++->a_int       = sexcl;
01936       pua++->a_int       = eexcl;
01937       
01938       RPC_RPCMAKE(dbh->ch->ch, QUERY_ATTRIBUTE_CREATE_RPC, ua);
01939 
01940       *qid   = ua[8].a_int;
01941       status_copy(status_r, ua[9].a_status);
01942 
01943       STATUS_RETURN(status_r);
01944     }
01945 }
01946 
01947 RPCStatus
01948 queryDelete(DbHandle *dbh, int qid)
01949 {
01950   CHECK_DBH(dbh, "queryDelete");
01951 
01952   if (DBH_IS_LOCAL(dbh))
01953     return IDB_queryDelete((DbHandle *)dbh->u.dbh, qid);
01954   else
01955     {
01956       ClientArg ua[IDB_MAXARGS], *pua = ua;
01957 
01958       start_rpc();
01959 
01960       pua++->a_int    = RDBHID_GET(dbh);
01961       pua++->a_int    = qid;
01962       
01963       RPC_RPCMAKE(dbh->ch->ch, QUERY_DELETE_RPC, ua);
01964 
01965       status_copy(status_r, ua[2].a_status);
01966 
01967       STATUS_RETURN(status_r);
01968     }
01969 }
01970 
01971 RPCStatus
01972 queryScanNext(DbHandle *dbh, int qid, int wanted, int *found,
01973                   void *atom_array)
01974 {
01975   CHECK_DBH(dbh, "queryScanNext");
01976 
01977   if (DBH_IS_LOCAL(dbh))
01978     return IDB_queryScanNext((DbHandle *)dbh->u.dbh, qid, wanted, found, atom_array, 0);
01979   else
01980     {
01981       ClientArg ua[IDB_MAXARGS], *pua = ua;
01982       int r;
01983 
01984       start_rpc();
01985 
01986       pua++->a_int       = RDBHID_GET(dbh);
01987       pua++->a_int       = qid;
01988       pua++->a_int       = wanted;
01989       pua++;
01990       pua->a_data.size   = 0;
01991       pua++->a_data.data = 0; /* force RPC to allocate buffer */
01992 
01993       RPC_RPCMAKE(dbh->ch->ch, QUERY_SCAN_NEXT_RPC, ua);
01994 
01995       *found   = ua[3].a_int;
01996       status_copy(status_r, ua[5].a_status);
01997       if (!status_r.err)
01998         decode_atom_array(&ua[4].a_data, atom_array, *found);
01999 
02000       STATUS_RETURN(status_r);
02001     }
02002 }
02003 
02004 /* oql */
02005 
02006 RPCStatus
02007 oqlCreate(ConnHandle *ch, DbHandle * dbh, const char * oql,
02008               int *qid, void *schema_info)
02009 {
02010   CHECK_DBH(dbh, "oqlCreate");
02011 
02012   if (DBH_IS_LOCAL(dbh))
02013     return IDB_oqlCreate((DbHandle *)(dbh ? dbh->u.dbh : 0), oql, qid, schema_info,
02014                          0, 0);
02015   else
02016     {
02017       ClientArg ua[IDB_MAXARGS], *pua = ua;
02018       int r, offset;
02019       start_rpc();
02020 
02021       pua++->a_int = (dbh ? RDBHID_GET(dbh) : 0);
02022       pua->a_data.data   = (const Data)oql;
02023       pua++->a_data.size = strlen(oql)+1;
02024       pua++; /* qid */
02025       pua->a_data.size   = 0;
02026       pua++->a_data.data = 0; /* force RPC to allocate buffer */
02027 
02028       RPC_RPCMAKE(ch->ch, OQL_CREATE_RPC, ua);
02029 
02030       *qid = ua[2].a_int;
02031       status_copy(status_r, ua[4].a_status);
02032       if (!status_r.err)
02033         decode_sch_info((unsigned char *)ua[3].a_data.data, schema_info);
02034 
02035       free(ua[3].a_data.data);
02036 
02037       STATUS_RETURN(status_r);
02038     }
02039 }
02040 
02041 RPCStatus
02042 oqlDelete(ConnHandle *ch, DbHandle * dbh, int qid)
02043 {
02044   CHECK_DBH(dbh, "oqlDelete");
02045 
02046   if (DBH_IS_LOCAL(dbh))
02047     return IDB_oqlDelete((DbHandle *)(dbh ? dbh->u.dbh : 0), qid);
02048   else
02049     {
02050       ClientArg ua[IDB_MAXARGS], *pua = ua;
02051       int r, offset;
02052       start_rpc();
02053 
02054       pua++->a_int = (dbh ? RDBHID_GET(dbh) : 0);
02055       pua++->a_int = qid;
02056 
02057       RPC_RPCMAKE(ch->ch, OQL_DELETE_RPC, ua);
02058 
02059       status_copy(status_r, ua[2].a_status);
02060       STATUS_RETURN(status_r);
02061     }
02062 }
02063 
02064 RPCStatus
02065 oqlGetResult(ConnHandle *ch, DbHandle * dbh, int qid,
02066                  void *value)
02067 {
02068   CHECK_DBH(dbh, "oqlGetResult");
02069 
02070   if (DBH_IS_LOCAL(dbh))
02071     return IDB_oqlGetResult((DbHandle *)(dbh ? dbh->u.dbh : 0), qid, value, 0);
02072   else
02073     {
02074       ClientArg ua[IDB_MAXARGS], *pua = ua;
02075       int r, offset;
02076       start_rpc();
02077 
02078       pua++->a_int = (dbh ? RDBHID_GET(dbh) : 0);
02079       pua++->a_int = qid;
02080       pua->a_data.data = 0; /* force RPC to allocate buffer */
02081       pua++->a_data.size   = 0;
02082 
02083       RPC_RPCMAKE(ch->ch, OQL_GETRESULT_RPC, ua);
02084 
02085       status_copy(status_r, ua[3].a_status);
02086       if (!status_r.err)
02087         decode_value(&ua[2].a_data, value);
02088 
02089       free(ua[2].a_data.data); /* added the 3/11/99 */
02090 
02091       STATUS_RETURN(status_r);
02092     }
02093 }
02094 
02095 /* executables */
02096 RPCStatus
02097 execExecute(DbHandle *dbh, const char *user, const char *passwd,
02098                 const char *intname,
02099                 const char *name, 
02100                 int exec_type,
02101                 const eyedbsm::Oid *cloid,
02102                 const char *extref,
02103                 const void *sign,
02104                 const eyedbsm::Oid *execoid,
02105                 const eyedbsm::Oid *objoid,
02106                 void *o,
02107                 const void *argarray,
02108                 void *argret)
02109 {
02110   CHECK_DBH(dbh, "execExecute");
02111 
02112   if (DBH_IS_LOCAL(dbh))
02113     return IDB_execExecute((DbHandle *)dbh->u.dbh, user, passwd, intname,
02114                            name, exec_type, cloid,
02115                            extref, sign, 0, execoid, objoid, o,
02116                            argarray, 0, argret, 0);
02117   else
02118     {
02119       ClientArg ua[IDB_MAXARGS], *pua = ua;
02120       int r, offset;
02121       unsigned char *sign_data;
02122       unsigned char *argarray_data;
02123       start_rpc();
02124 
02125       code_signature(&ua[8], sign);
02126       code_arg_array(&ua[11], argarray);
02127 
02128       sign_data = (unsigned char *)ua[8].a_data.data;
02129       argarray_data = (unsigned char *)ua[11].a_data.data;
02130 
02131       pua++->a_int       = RDBHID_GET(dbh);
02132       pua++->a_string    = (char *)user;
02133       pua++->a_string    = (char *)passwd;
02134       pua++->a_string    = (char *)intname;
02135       pua++->a_string    = (char *)name;
02136       pua++->a_int       = exec_type;
02137       pua++->a_oid       = *cloid;
02138       pua++->a_string    = (char *)extref;
02139       pua++;             /* ua[8] <= sign */
02140       pua++->a_oid       = *execoid;
02141       pua++->a_oid       = *objoid;
02142       pua++;             /* ua[11] <= argarray */
02143       pua->a_data.size   = 0;
02144       pua++->a_data.data = 0; /* force RPC to allocate buffer */
02145 
02146       RPC_RPCMAKE(dbh->ch->ch, EXECUTABLE_EXECUTE_RPC, ua);
02147 
02148       status_copy(status_r, ua[13].a_status);
02149 
02150       if (!status_r.err)
02151         {
02152           offset = decode_arg_array(dbh->db, &ua[12].a_data, (void **)argarray,
02153                                         False);
02154           decode_argument(dbh->db, &ua[12].a_data, argret, offset);
02155         }
02156 
02157       /* added the 15/01/99;*/
02158       free(ua[12].a_data.data);
02159 
02160       free(sign_data);
02161       free(argarray_data);
02162 
02163       STATUS_RETURN(status_r);
02164     }
02165 }
02166 
02167 RPCStatus
02168 execCheck(DbHandle *dbh, const char *intname, const eyedbsm::Oid *oid,
02169               const char *extref)
02170 {
02171   CHECK_DBH(dbh, "execCheck");
02172 
02173   if (DBH_IS_LOCAL(dbh))
02174     return IDB_execCheck((DbHandle *)dbh->u.dbh, intname, oid, extref);
02175   else
02176     {
02177       ClientArg ua[IDB_MAXARGS], *pua = ua;
02178       int r;
02179 
02180       start_rpc();
02181 
02182       pua++->a_int       = RDBHID_GET(dbh);
02183       pua++->a_string    = (char *)intname;
02184       pua++->a_oid       = *oid;
02185       pua++->a_string    = (char *)extref;
02186 
02187       RPC_RPCMAKE(dbh->ch->ch, EXECUTABLE_CHECK_RPC, ua);
02188 
02189       status_copy(status_r, ua[4].a_status);
02190 
02191       STATUS_RETURN(status_r);
02192     }
02193 }
02194 
02195 extern RPCStatus
02196 execSetExtRefPath(ConnHandle *ch, const char *user,
02197                       const char *passwd, const char *path)
02198 {
02199   if (!ch)
02200     return IDB_execSetExtRefPath(user, passwd, path);
02201   else
02202     {
02203       ClientArg ua[IDB_MAXARGS], *pua = ua;
02204       int r;
02205 
02206       start_rpc();
02207 
02208       pua++->a_string    = (char *)user;
02209       pua++->a_string    = (char *)passwd;
02210       pua++->a_string    = (char *)path;
02211 
02212       RPC_RPCMAKE(ch->ch, EXECUTABLE_SET_EXTREF_PATH_RPC, ua);
02213 
02214       status_copy(status_r, ua[3].a_status);
02215 
02216       STATUS_RETURN(status_r);
02217     }
02218 }
02219 
02220 extern RPCStatus
02221 execGetExtRefPath(ConnHandle *ch, const char *user,
02222                       const char *passwd, char path[], unsigned int pathlen)
02223 {
02224   if (!ch)
02225     return IDB_execGetExtRefPath(user, passwd, path, pathlen);
02226   else
02227     {
02228       ClientArg ua[IDB_MAXARGS], *pua = ua;
02229       int r, min;
02230 
02231       start_rpc();
02232 
02233       pua++->a_string    = (char *)user;
02234       pua++->a_string    = (char *)passwd;
02235       pua->a_data.size   = 0;
02236       pua++->a_data.data = 0; /* force RPC to allocate buffer */
02237 
02238       RPC_RPCMAKE(ch->ch, EXECUTABLE_GET_EXTREF_PATH_RPC, ua);
02239 
02240       min = (pathlen < ua[2].a_data.size ? pathlen : ua[2].a_data.size);
02241       memcpy(path, ua[2].a_data.data, min);
02242       path[min] = 0;
02243 
02244       free(ua[2].a_data.data); // 1/10/05
02245 
02246       status_copy(status_r, ua[3].a_status);
02247 
02248       STATUS_RETURN(status_r);
02249     }
02250 }
02251 
02252 RPCStatus
02253 checkAuth(ConnHandle *ch, const char *file)
02254 {
02255   if (!ch)
02256     return IDB_checkAuth(file);
02257   else
02258    {
02259       ClientArg ua[IDB_MAXARGS], *pua = ua;
02260       int r, offset;
02261       pua++->a_string = (char *)file;
02262 
02263       RPC_RPCMAKE(ch->ch, CHECK_AUTH_RPC, ua);
02264 
02265       status_copy(status_r, ua[1].a_status);
02266       STATUS_RETURN(status_r);
02267     }
02268 }
02269 
02270 
02271 RPCStatus
02272 set_conn_info(ConnHandle *ch, const char *hostname,
02273               int uid, const char *username, const char *progname,
02274               int *sv_pid, int *sv_uid, int sv_version, char **challenge)
02275 {
02276   if (!ch)
02277     return IDB_setConnInfo(hostname, uid, username, progname, getpid(),
02278                            sv_pid, sv_uid, sv_version, challenge);
02279   else {
02280       ClientArg ua[IDB_MAXARGS], *pua = ua;
02281       int r, min;
02282 
02283       start_rpc();
02284 
02285       pua++->a_string = (char *)hostname;
02286       pua++->a_int    = uid;
02287       pua++->a_string = (char *)username;
02288       pua++->a_string = (char *)progname;
02289       pua++->a_int    = getpid();
02290       pua++;            /* sv_pid */
02291       pua++;            /* sv_uid */
02292       pua++->a_int    = sv_version;
02293 
02294       RPC_RPCMAKE(ch->ch, SET_CONN_INFO_RPC, ua);
02295 
02296       *sv_pid = ua[5].a_int;
02297       *sv_uid = ua[6].a_int;
02298       *challenge = ua[8].a_string;
02299 
02300       status_copy(status_r, ua[9].a_status);
02301 
02302       STATUS_RETURN(status_r);
02303     }
02304 }
02305 
02306 RPCStatus
02307 setLogMask(ConnHandle *ch, eyedblib::int64 logmask)
02308 {
02309   if (!ch)
02310     return IDB_setLogMask(logmask);
02311   else
02312     {
02313       ClientArg ua[IDB_MAXARGS], *pua = ua;
02314       int r, offset;
02315       start_rpc();
02316 
02317       pua++->a_int64 = logmask;
02318 
02319       RPC_RPCMAKE(ch->ch, SET_LOG_MASK_RPC, ua);
02320 
02321       status_copy(status_r, ua[1].a_status);
02322       STATUS_RETURN(status_r);
02323     }
02324 }
02325 
02326 RPCStatus
02327 getDefaultDataspace(DbHandle * dbh, int * dspid)
02328 {
02329   if (DBH_IS_LOCAL(dbh))
02330     return IDB_getDefaultDataspace((DbHandle *)dbh->u.dbh, dspid);
02331   else
02332     {
02333       ClientArg ua[IDB_MAXARGS], *pua = ua;
02334       int r, offset;
02335       start_rpc();
02336 
02337       pua++->a_int = RDBHID_GET(dbh);
02338       pua++;
02339 
02340       RPC_RPCMAKE(dbh->ch->ch, GET_DEFAULT_DATASPACE_RPC, ua);
02341 
02342       *dspid = ua[1].a_int;
02343 
02344       status_copy(status_r, ua[2].a_status);
02345       STATUS_RETURN(status_r);
02346     }
02347 }
02348 
02349 RPCStatus
02350 setDefaultDataspace(DbHandle * dbh, int dspid)
02351 {
02352   if (DBH_IS_LOCAL(dbh))
02353     return IDB_setDefaultDataspace((DbHandle *)dbh->u.dbh, dspid);
02354   else
02355     {
02356       ClientArg ua[IDB_MAXARGS], *pua = ua;
02357       int r, offset;
02358       start_rpc();
02359 
02360       pua++->a_int = RDBHID_GET(dbh);
02361       pua++->a_int = dspid;
02362 
02363       RPC_RPCMAKE(dbh->ch->ch, SET_DEFAULT_DATASPACE_RPC, ua);
02364 
02365       status_copy(status_r, ua[2].a_status);
02366       STATUS_RETURN(status_r);
02367     }
02368 }
02369 
02370 RPCStatus
02371 getDefaultIndexDataspace(DbHandle * dbh, const eyedbsm::Oid *oid, int type, int * dspid)
02372 {
02373   if (DBH_IS_LOCAL(dbh))
02374     return IDB_getDefaultIndexDataspace((DbHandle *)dbh->u.dbh, oid, type, dspid);
02375   else
02376     {
02377       ClientArg ua[IDB_MAXARGS], *pua = ua;
02378       int r, offset;
02379       start_rpc();
02380 
02381       pua++->a_int = RDBHID_GET(dbh);
02382       pua++->a_oid = *oid;
02383       pua++->a_int = type;
02384       pua++;
02385 
02386       RPC_RPCMAKE(dbh->ch->ch, GET_DEFAULT_INDEX_DATASPACE_RPC, ua);
02387 
02388       *dspid = ua[3].a_int;
02389 
02390       status_copy(status_r, ua[4].a_status);
02391       STATUS_RETURN(status_r);
02392     }
02393 }
02394 
02395 RPCStatus
02396 dataspaceSetCurrentDatafile(DbHandle * dbh, int dspid, int datid)
02397 {
02398   if (DBH_IS_LOCAL(dbh))
02399     return IDB_dataspaceSetCurrentDatafile((DbHandle *)dbh->u.dbh, dspid, datid);
02400   else
02401     {
02402       ClientArg ua[IDB_MAXARGS], *pua = ua;
02403       int r, offset;
02404       pua++->a_int = RDBHID_GET(dbh);
02405       pua++->a_int = dspid;
02406       pua++->a_int = datid;
02407 
02408       RPC_RPCMAKE(dbh->ch->ch, DATASPACE_SET_CURRENT_DATAFILE_RPC, ua);
02409 
02410 
02411       status_copy(status_r, ua[3].a_status);
02412       STATUS_RETURN(status_r);
02413     }
02414 }
02415 
02416 RPCStatus
02417 dataspaceGetCurrentDatafile(DbHandle * dbh, int dspid, int * datid)
02418 {
02419   if (DBH_IS_LOCAL(dbh))
02420     return IDB_dataspaceGetCurrentDatafile((DbHandle *)dbh->u.dbh, dspid, datid);
02421   else
02422     {
02423       ClientArg ua[IDB_MAXARGS], *pua = ua;
02424       int r, offset;
02425       pua++->a_int = RDBHID_GET(dbh);
02426       pua++->a_int = dspid;
02427       pua++;
02428 
02429       RPC_RPCMAKE(dbh->ch->ch, DATASPACE_GET_CURRENT_DATAFILE_RPC, ua);
02430 
02431       *datid = ua[2].a_int;
02432 
02433       status_copy(status_r, ua[3].a_status);
02434       STATUS_RETURN(status_r);
02435     }
02436 }
02437 
02438 RPCStatus
02439 setDefaultIndexDataspace(DbHandle * dbh, const eyedbsm::Oid *idxoid, int type, int dspid)
02440 {
02441   if (DBH_IS_LOCAL(dbh))
02442     return IDB_setDefaultIndexDataspace((DbHandle *)dbh->u.dbh, idxoid, type, dspid);
02443   else
02444     {
02445       ClientArg ua[IDB_MAXARGS], *pua = ua;
02446       int r, offset;
02447       start_rpc();
02448 
02449       pua++->a_int = RDBHID_GET(dbh);
02450       pua++->a_oid = *idxoid;
02451       pua++->a_int = type;
02452       pua++->a_int = dspid;
02453 
02454       RPC_RPCMAKE(dbh->ch->ch, SET_DEFAULT_INDEX_DATASPACE_RPC, ua);
02455 
02456       status_copy(status_r, ua[4].a_status);
02457       STATUS_RETURN(status_r);
02458     }
02459 }
02460 
02461 RPCStatus
02462 getIndexLocations(DbHandle * dbh, const eyedbsm::Oid * idxoid,
02463                       int type, void * locarr)
02464 {
02465   if (DBH_IS_LOCAL(dbh))
02466     return IDB_getIndexLocations((DbHandle *)dbh->u.dbh, idxoid, type, (unsigned char **)locarr, 0);
02467   else
02468     {
02469       ClientArg ua[IDB_MAXARGS], *pua = ua;
02470       int r, offset;
02471       pua++->a_int = RDBHID_GET(dbh);
02472       pua++->a_oid = *idxoid;
02473       pua++->a_int = type;
02474       pua->a_data.data = 0; /* force RPC to allocate buffer */
02475       pua++->a_data.size   = 0;
02476 
02477       RPC_RPCMAKE(dbh->ch->ch, GET_INDEX_LOCATIONS_RPC, ua);
02478 
02479       if (!status_r.err)
02480         decode_locarr((unsigned char *)ua[3].a_data.data, locarr);
02481 
02482       free(ua[3].a_data.data); // 1/10/05
02483 
02484       status_copy(status_r, ua[4].a_status);
02485       STATUS_RETURN(status_r);
02486     }
02487 }
02488 
02489 
02490 RPCStatus
02491 moveIndex(DbHandle * dbh, const eyedbsm::Oid * idxoid, int type, int dspid)
02492 {
02493   if (DBH_IS_LOCAL(dbh))
02494     return IDB_moveIndex((DbHandle *)dbh->u.dbh, idxoid, type, dspid);
02495   else
02496     {
02497       ClientArg ua[IDB_MAXARGS], *pua = ua;
02498       int r, offset;
02499       pua++->a_int = RDBHID_GET(dbh);
02500       pua++->a_oid = *idxoid;
02501       pua++->a_int = type;
02502       pua++->a_int = dspid;
02503 
02504       RPC_RPCMAKE(dbh->ch->ch, MOVE_INDEX_RPC, ua);
02505 
02506       status_copy(status_r, ua[4].a_status);
02507       STATUS_RETURN(status_r);
02508     }
02509 }
02510 
02511 RPCStatus
02512 getInstanceClassLocations(DbHandle * dbh, const eyedbsm::Oid * clsoid,
02513                               int subclasses, Data * locarr)
02514 {
02515   if (DBH_IS_LOCAL(dbh))
02516     return IDB_getInstanceClassLocations((DbHandle *)dbh->u.dbh, clsoid, subclasses, locarr, 0);
02517   else
02518     {
02519       ClientArg ua[IDB_MAXARGS], *pua = ua;
02520       int r, offset;
02521       pua++->a_int = RDBHID_GET(dbh);
02522       pua++->a_oid = *clsoid;
02523       pua++->a_int = subclasses;
02524       pua->a_data.data = 0; /* force RPC to allocate buffer */
02525       pua++->a_data.size   = 0;
02526 
02527       RPC_RPCMAKE(dbh->ch->ch, GET_INSTANCE_CLASS_LOCATIONS_RPC, ua);
02528 
02529       if (!status_r.err)
02530         decode_locarr((unsigned char *)ua[3].a_data.data, locarr);
02531 
02532       free(ua[3].a_data.data); // 1/10/05
02533 
02534       status_copy(status_r, ua[4].a_status);
02535       STATUS_RETURN(status_r);
02536     }
02537 }
02538 
02539 RPCStatus
02540 moveInstanceClass(DbHandle * dbh, const eyedbsm::Oid * clsoid,
02541                       int subclasses, int dspid)
02542 {
02543   if (DBH_IS_LOCAL(dbh))
02544     return IDB_moveInstanceClass((DbHandle *)dbh->u.dbh, clsoid, subclasses, dspid);
02545   else
02546     {
02547       ClientArg ua[IDB_MAXARGS], *pua = ua;
02548       int r, offset;
02549       pua++->a_int = RDBHID_GET(dbh);
02550       pua++->a_oid = *clsoid;
02551       pua++->a_int = subclasses;
02552       pua++->a_int = dspid;
02553 
02554       RPC_RPCMAKE(dbh->ch->ch, MOVE_INSTANCE_CLASS_RPC, ua);
02555 
02556       status_copy(status_r, ua[4].a_status);
02557       STATUS_RETURN(status_r);
02558     }
02559 }
02560 
02561 RPCStatus
02562 getObjectsLocations(DbHandle * dbh, const eyedbsm::Oid *oids, unsigned int oid_cnt, void * locarr)
02563 {
02564   if (DBH_IS_LOCAL(dbh))
02565     return IDB_getObjectsLocations((DbHandle *)dbh->u.dbh, oids, oid_cnt, 0, (unsigned char **)locarr, 0);
02566   else
02567     {
02568       ClientArg ua[IDB_MAXARGS], *pua = ua;
02569       int r, offset;
02570       Data oid_data;
02571 
02572       pua++->a_int = RDBHID_GET(dbh);
02573       oid_data = code_oids(oids, oid_cnt, &pua->a_data.size);
02574       pua++->a_data.data = oid_data;
02575       pua->a_data.data = 0; /* force RPC to allocate buffer */
02576       pua++->a_data.size   = 0;
02577 
02578       RPC_RPCMAKE(dbh->ch->ch, GET_OBJECTS_LOCATIONS_RPC, ua);
02579 
02580       status_copy(status_r, ua[3].a_status);
02581       if (!status_r.err)
02582         decode_locarr((unsigned char *)ua[2].a_data.data, locarr);
02583 
02584       free(oid_data);
02585       free(ua[2].a_data.data); // 1/10/05
02586 
02587       STATUS_RETURN(status_r);
02588     }
02589 }
02590 
02591 RPCStatus
02592 moveObjects(DbHandle * dbh, const eyedbsm::Oid * oids, unsigned int oid_cnt,
02593                 int dspid)
02594 {
02595   if (DBH_IS_LOCAL(dbh))
02596     return IDB_moveObjects((DbHandle *)dbh->u.dbh, oids, oid_cnt, dspid, 0);
02597   else
02598     {
02599       ClientArg ua[IDB_MAXARGS], *pua = ua;
02600       Data oids_data;
02601 
02602       int r, offset;
02603       pua++->a_int = RDBHID_GET(dbh);
02604       oids_data = code_oids(oids, oid_cnt, &pua->a_data.size);
02605       pua++->a_data.data = oids_data;
02606       pua++->a_int = dspid;
02607 
02608       RPC_RPCMAKE(dbh->ch->ch, MOVE_OBJECTS_RPC, ua);
02609 
02610       free(oids_data);
02611       status_copy(status_r, ua[3].a_status);
02612       STATUS_RETURN(status_r);
02613     }
02614 }
02615 
02616 RPCStatus
02617 getAttributeLocations(DbHandle * dbh, const eyedbsm::Oid * clsoid, int attrnum, Data * locarr)
02618 {
02619   if (DBH_IS_LOCAL(dbh))
02620     return IDB_getAttributeLocations((DbHandle *)dbh->u.dbh, clsoid, attrnum, locarr, 0);
02621   else
02622     {
02623       ClientArg ua[IDB_MAXARGS], *pua = ua;
02624       int r, offset;
02625       pua++->a_int = RDBHID_GET(dbh);
02626       pua++->a_oid = *clsoid;
02627       pua++->a_int = attrnum;
02628       pua->a_data.data = 0; /* force RPC to allocate buffer */
02629       pua++->a_data.size   = 0;
02630 
02631       RPC_RPCMAKE(dbh->ch->ch, GET_ATTRIBUTE_LOCATIONS_RPC, ua);
02632 
02633       *locarr = (unsigned char *)ua[3].a_data.data;
02634 
02635       status_copy(status_r, ua[4].a_status);
02636       STATUS_RETURN(status_r);
02637     }
02638 }
02639 
02640 RPCStatus
02641 moveAttribute(DbHandle * dbh, const eyedbsm::Oid * clsoid, int attrnum, int dspid)
02642 {
02643   if (DBH_IS_LOCAL(dbh))
02644     return IDB_moveAttribute((DbHandle *)dbh->u.dbh, clsoid, attrnum, dspid);
02645   else
02646     {
02647       ClientArg ua[IDB_MAXARGS], *pua = ua;
02648       int r, offset;
02649       pua++->a_int = RDBHID_GET(dbh);
02650       pua++->a_oid = *clsoid;
02651       pua++->a_int = attrnum;
02652       pua++->a_int = dspid;
02653 
02654       RPC_RPCMAKE(dbh->ch->ch, MOVE_ATTRIBUTE_RPC, ua);
02655 
02656 
02657       status_copy(status_r, ua[4].a_status);
02658       STATUS_RETURN(status_r);
02659     }
02660 }
02661 
02662 RPCStatus
02663 createDatafile(DbHandle * dbh, const char * datfile, const char * name, int maxsize, int slotsize, int dtype)
02664 {
02665   if (DBH_IS_LOCAL(dbh))
02666     return IDB_createDatafile((DbHandle *)dbh->u.dbh, datfile, name, maxsize, slotsize, dtype);
02667   else
02668     {
02669       ClientArg ua[IDB_MAXARGS], *pua = ua;
02670       int r, offset;
02671       pua++->a_int = RDBHID_GET(dbh);
02672       pua++->a_string = (char *)datfile;
02673       pua++->a_string = (char *)name;
02674       pua++->a_int = maxsize;
02675       pua++->a_int = slotsize;
02676       pua++->a_int = dtype;
02677 
02678       RPC_RPCMAKE(dbh->ch->ch, CREATE_DATAFILE_RPC, ua);
02679 
02680       status_copy(status_r, ua[6].a_status);
02681       STATUS_RETURN(status_r);
02682     }
02683 }
02684 
02685 RPCStatus
02686 deleteDatafile(DbHandle * dbh, int datid)
02687 {
02688   if (DBH_IS_LOCAL(dbh))
02689     return IDB_deleteDatafile((DbHandle *)dbh->u.dbh, datid);
02690   else
02691     {
02692       ClientArg ua[IDB_MAXARGS], *pua = ua;
02693       int r, offset;
02694       pua++->a_int = RDBHID_GET(dbh);
02695       pua++->a_int = datid;
02696 
02697       RPC_RPCMAKE(dbh->ch->ch, DELETE_DATAFILE_RPC, ua);
02698 
02699 
02700       status_copy(status_r, ua[2].a_status);
02701       STATUS_RETURN(status_r);
02702     }
02703 }
02704 
02705 RPCStatus
02706 moveDatafile(DbHandle * dbh, int datid, const char * datafile)
02707 {
02708   if (DBH_IS_LOCAL(dbh))
02709     return IDB_moveDatafile((DbHandle *)dbh->u.dbh, datid, datafile);
02710   else
02711     {
02712       ClientArg ua[IDB_MAXARGS], *pua = ua;
02713       int r, offset;
02714       pua++->a_int = RDBHID_GET(dbh);
02715       pua++->a_int = datid;
02716       pua++->a_string = (char *)datafile;
02717 
02718       RPC_RPCMAKE(dbh->ch->ch, MOVE_DATAFILE_RPC, ua);
02719 
02720 
02721       status_copy(status_r, ua[3].a_status);
02722       STATUS_RETURN(status_r);
02723     }
02724 }
02725 
02726 RPCStatus
02727 defragmentDatafile(DbHandle * dbh, int datid)
02728 {
02729   if (DBH_IS_LOCAL(dbh))
02730     return IDB_defragmentDatafile((DbHandle *)dbh->u.dbh, datid);
02731   else
02732     {
02733       ClientArg ua[IDB_MAXARGS], *pua = ua;
02734       int r, offset;
02735       pua++->a_int = RDBHID_GET(dbh);
02736       pua++->a_int = datid;
02737 
02738       RPC_RPCMAKE(dbh->ch->ch, DEFRAGMENT_DATAFILE_RPC, ua);
02739 
02740 
02741       status_copy(status_r, ua[2].a_status);
02742       STATUS_RETURN(status_r);
02743     }
02744 }
02745 
02746 RPCStatus
02747 resizeDatafile(DbHandle * dbh, int datid, unsigned int size)
02748 {
02749   if (DBH_IS_LOCAL(dbh))
02750     return IDB_resizeDatafile((DbHandle *)dbh->u.dbh, datid, size);
02751   else
02752     {
02753       ClientArg ua[IDB_MAXARGS], *pua = ua;
02754       int r, offset;
02755       pua++->a_int = RDBHID_GET(dbh);
02756       pua++->a_int = datid;
02757       pua++->a_int = size;
02758 
02759       RPC_RPCMAKE(dbh->ch->ch, RESIZE_DATAFILE_RPC, ua);
02760 
02761 
02762       status_copy(status_r, ua[3].a_status);
02763       STATUS_RETURN(status_r);
02764     }
02765 }
02766 
02767 RPCStatus
02768 getDatafileInfo(DbHandle * dbh, int datid, void * info)
02769 {
02770   if (DBH_IS_LOCAL(dbh))
02771     return IDB_getDatafileInfo((DbHandle *)dbh->u.dbh, datid, (unsigned char **)info, 0);
02772   else
02773     {
02774       ClientArg ua[IDB_MAXARGS], *pua = ua;
02775       int r, offset;
02776       pua++->a_int = RDBHID_GET(dbh);
02777       pua++->a_int = datid;
02778       pua->a_data.data = 0; /* force RPC to allocate buffer */
02779       pua++->a_data.size   = 0;
02780 
02781       RPC_RPCMAKE(dbh->ch->ch, GET_DATAFILEI_NFO_RPC, ua);
02782 
02783       if (!status_r.err)
02784         decode_datinfo((unsigned char *)ua[2].a_data.data, info);
02785 
02786       free(ua[2].a_data.data); // 1/10/05
02787       status_copy(status_r, ua[3].a_status);
02788       STATUS_RETURN(status_r);
02789     }
02790 }
02791 
02792 RPCStatus
02793 renameDatafile(DbHandle * dbh, int datid, const char * name)
02794 {
02795   if (DBH_IS_LOCAL(dbh))
02796     return IDB_renameDatafile((DbHandle *)dbh->u.dbh, datid, name);
02797   else
02798     {
02799       ClientArg ua[IDB_MAXARGS], *pua = ua;
02800       int r, offset;
02801       pua++->a_int = RDBHID_GET(dbh);
02802       pua++->a_int = datid;
02803       pua++->a_string = (char *)name;
02804 
02805       RPC_RPCMAKE(dbh->ch->ch, RENAME_DATAFILE_RPC, ua);
02806 
02807 
02808       status_copy(status_r, ua[3].a_status);
02809       STATUS_RETURN(status_r);
02810     }
02811 }
02812 
02813 RPCStatus
02814 createDataspace(DbHandle * dbh, const char * dspname, void *datafiles,
02815                     unsigned int datafile_cnt)
02816 {
02817   if (DBH_IS_LOCAL(dbh))
02818     return IDB_createDataspace((DbHandle *)dbh->u.dbh, dspname, datafiles, datafile_cnt, 0);
02819   else
02820     {
02821       ClientArg ua[IDB_MAXARGS], *pua = ua;
02822       int r, offset;
02823       Data datfile_data;
02824 
02825       pua++->a_int = RDBHID_GET(dbh);
02826       pua++->a_string = (char *)dspname;
02827       datfile_data = code_datafiles(datafiles, datafile_cnt,
02828                                         &pua->a_data.size);
02829       pua++->a_data.data = datfile_data;
02830 
02831       RPC_RPCMAKE(dbh->ch->ch, CREATE_DATASPACE_RPC, ua);
02832 
02833       status_copy(status_r, ua[3].a_status);
02834 
02835       free(datfile_data);
02836       STATUS_RETURN(status_r);
02837     }
02838 }
02839 
02840 RPCStatus
02841 updateDataspace(DbHandle * dbh, int dspid,  void *datafiles,
02842                     unsigned int datafile_cnt)
02843 {
02844   if (DBH_IS_LOCAL(dbh))
02845     return IDB_updateDataspace((DbHandle *)dbh->u.dbh, dspid, datafiles, datafile_cnt, 0);
02846   else
02847     {
02848       ClientArg ua[IDB_MAXARGS], *pua = ua;
02849       int r, offset;
02850       Data datfile_data;
02851 
02852       pua++->a_int = RDBHID_GET(dbh);
02853       pua++->a_int = dspid;
02854       datfile_data = code_datafiles(datafiles, datafile_cnt,
02855                                         &pua->a_data.size);
02856       pua++->a_data.data = datfile_data;
02857 
02858       RPC_RPCMAKE(dbh->ch->ch, UPDATE_DATASPACE_RPC, ua);
02859 
02860       status_copy(status_r, ua[3].a_status);
02861       free(datfile_data);
02862       STATUS_RETURN(status_r);
02863     }
02864 }
02865 
02866 RPCStatus
02867 deleteDataspace(DbHandle * dbh, int dspid)
02868 {
02869   if (DBH_IS_LOCAL(dbh))
02870     return IDB_deleteDataspace((DbHandle *)dbh->u.dbh, dspid);
02871   else
02872     {
02873       ClientArg ua[IDB_MAXARGS], *pua = ua;
02874       int r, offset;
02875       pua++->a_int = RDBHID_GET(dbh);
02876       pua++->a_int = dspid;
02877 
02878       RPC_RPCMAKE(dbh->ch->ch, DELETE_DATASPACE_RPC, ua);
02879 
02880 
02881       status_copy(status_r, ua[2].a_status);
02882       STATUS_RETURN(status_r);
02883     }
02884 }
02885 
02886 RPCStatus
02887 renameDataspace(DbHandle * dbh, int dspid, const char * name)
02888 {
02889   if (DBH_IS_LOCAL(dbh))
02890     return IDB_renameDataspace((DbHandle *)dbh->u.dbh, dspid, name);
02891   else
02892     {
02893       ClientArg ua[IDB_MAXARGS], *pua = ua;
02894       int r, offset;
02895       pua++->a_int = RDBHID_GET(dbh);
02896       pua++->a_int = dspid;
02897       pua++->a_string = (char *)name;
02898 
02899       RPC_RPCMAKE(dbh->ch->ch, RENAME_DATASPACE_RPC, ua);
02900 
02901       status_copy(status_r, ua[3].a_status);
02902       STATUS_RETURN(status_r);
02903     }
02904 }
02905 
02906 RPCStatus
02907 indexGetCount(DbHandle * dbh, const eyedbsm::Oid * idxoid, int * cnt)
02908 {
02909   if (DBH_IS_LOCAL(dbh))
02910     return IDB_indexGetCount((DbHandle *)dbh->u.dbh, idxoid, cnt);
02911   else
02912     {
02913       ClientArg ua[IDB_MAXARGS], *pua = ua;
02914       int r, offset;
02915       pua++->a_int = RDBHID_GET(dbh);
02916       pua++->a_oid = *idxoid;
02917       pua++;
02918 
02919       RPC_RPCMAKE(dbh->ch->ch, INDEX_GET_COUNT_RPC, ua);
02920 
02921       *cnt = ua[2].a_int;
02922 
02923       status_copy(status_r, ua[3].a_status);
02924       STATUS_RETURN(status_r);
02925     }
02926 }
02927 
02928 RPCStatus
02929 indexGetStats(DbHandle * dbh, const eyedbsm::Oid * idxoid, Data * stats)
02930 {
02931   if (DBH_IS_LOCAL(dbh))
02932     return IDB_indexGetStats((DbHandle *)dbh->u.dbh, idxoid, stats, 0);
02933   else
02934     {
02935       ClientArg ua[IDB_MAXARGS], *pua = ua;
02936       int r, offset;
02937       pua++->a_int = RDBHID_GET(dbh);
02938       pua++->a_oid = *idxoid;
02939       pua->a_data.data = 0; /* force RPC to allocate buffer */
02940       pua++->a_data.size   = 0;
02941 
02942       RPC_RPCMAKE(dbh->ch->ch, INDEX_GET_STATS_RPC, ua);
02943 
02944       status_copy(status_r, ua[3].a_status);
02945 
02946       if (!status_r.err)
02947         decode_index_stats((unsigned char *)ua[2].a_data.data, stats);
02948 
02949       free(ua[2].a_data.data); // 1/10/05
02950       STATUS_RETURN(status_r);
02951     }
02952 }
02953 
02954 RPCStatus
02955 indexSimulStats(DbHandle * dbh, const eyedbsm::Oid * idxoid,
02956                     const Data impl, Size impl_size, Data * stats)
02957 {
02958   if (DBH_IS_LOCAL(dbh))
02959     return IDB_indexSimulStats((DbHandle *)dbh->u.dbh, idxoid, impl, 0, stats, 0);
02960   else
02961     {
02962       ClientArg ua[IDB_MAXARGS], *pua = ua;
02963       int r, offset;
02964       pua++->a_int = RDBHID_GET(dbh);
02965       pua++->a_oid = *idxoid;
02966       pua->a_data.data = (const Data)impl;
02967       pua++->a_data.size = impl_size;
02968       pua->a_data.data = 0; /* force RPC to allocate buffer */
02969       pua++->a_data.size   = 0;
02970 
02971       RPC_RPCMAKE(dbh->ch->ch, INDEX_SIMUL_STATS_RPC, ua);
02972 
02973       status_copy(status_r, ua[4].a_status);
02974       if (!status_r.err)
02975         decode_index_stats((unsigned char *)ua[3].a_data.data, stats);
02976 
02977       free(ua[3].a_data.data); // 1/10/05
02978       STATUS_RETURN(status_r);
02979     }
02980 }
02981 
02982 RPCStatus
02983 collectionGetImplStats(DbHandle * dbh, int idxtype,
02984                            const eyedbsm::Oid * idxoid, Data * stats)
02985 {
02986   if (DBH_IS_LOCAL(dbh))
02987     return IDB_collectionGetImplStats((DbHandle *)dbh->u.dbh, idxtype, idxoid, stats, 0);
02988   else
02989     {
02990       ClientArg ua[IDB_MAXARGS], *pua = ua;
02991       int r, offset;
02992       pua++->a_int = RDBHID_GET(dbh);
02993       pua++->a_int = idxtype;
02994       pua++->a_oid = *idxoid;
02995       pua->a_data.data = 0; /* force RPC to allocate buffer */
02996       pua++->a_data.size   = 0;
02997 
02998       RPC_RPCMAKE(dbh->ch->ch, COLLECTION_GET_IMPLSTATS_RPC, ua);
02999 
03000       status_copy(status_r, ua[4].a_status);
03001       if (!status_r.err)
03002         decode_index_stats((unsigned char *)ua[3].a_data.data, stats);
03003 
03004       free(ua[3].a_data.data); // 1/10/05
03005       STATUS_RETURN(status_r);
03006     }
03007 }
03008 
03009 RPCStatus
03010 collectionSimulImplStats(DbHandle * dbh, int idxtype, const eyedbsm::Oid * idxoid, const Data impl, Size impl_size, Data * stats)
03011 {
03012   if (DBH_IS_LOCAL(dbh))
03013     return IDB_collectionSimulImplStats((DbHandle *)dbh->u.dbh, idxtype, idxoid, impl, 0,
03014                                         stats, 0);
03015   else
03016     {
03017       ClientArg ua[IDB_MAXARGS], *pua = ua;
03018       int r, offset;
03019       pua++->a_int = RDBHID_GET(dbh);
03020       pua++->a_int = idxtype;
03021       pua++->a_oid = *idxoid;
03022       pua->a_data.data = (const Data)impl;
03023       pua++->a_data.size = impl_size;
03024       pua->a_data.data = 0; /* force RPC to allocate buffer */
03025       pua++->a_data.size   = 0;
03026 
03027       RPC_RPCMAKE(dbh->ch->ch, COLLECTION_SIMUL_IMPLSTATS_RPC, ua);
03028 
03029       status_copy(status_r, ua[5].a_status);
03030       if (!status_r.err)
03031         decode_index_stats((unsigned char *)ua[4].a_data.data, stats);
03032 
03033       free(ua[4].a_data.data); // 1/10/05
03034       STATUS_RETURN(status_r);
03035     }
03036 }
03037 
03038 RPCStatus
03039 indexGetImplementation(DbHandle * dbh, const eyedbsm::Oid * idxoid, Data * impl)
03040 {
03041   if (DBH_IS_LOCAL(dbh))
03042     return IDB_indexGetImplementation((DbHandle *)dbh->u.dbh, idxoid, impl, 0);
03043   else
03044     {
03045       ClientArg ua[IDB_MAXARGS], *pua = ua;
03046       int r, offset;
03047       pua++->a_int = RDBHID_GET(dbh);
03048       pua++->a_oid = *idxoid;
03049       pua->a_data.data = 0; /* force RPC to allocate buffer */
03050       pua++->a_data.size   = 0;
03051 
03052       RPC_RPCMAKE(dbh->ch->ch, INDEX_GET_IMPL_RPC, ua);
03053 
03054       status_copy(status_r, ua[3].a_status);
03055       if (!status_r.err)
03056         decode_index_impl((unsigned char *)ua[2].a_data.data, impl);
03057 
03058       free(ua[2].a_data.data); // 1/10/05
03059       STATUS_RETURN(status_r);
03060     }
03061 }
03062 
03063 RPCStatus
03064 collectionGetImplementation(DbHandle * dbh, int idxtype, const eyedbsm::Oid * idxoid, Data * impl)
03065 {
03066   if (DBH_IS_LOCAL(dbh))
03067     return IDB_collectionGetImplementation((DbHandle *)dbh->u.dbh, idxtype, idxoid, impl, 0);
03068   else
03069     {
03070       ClientArg ua[IDB_MAXARGS], *pua = ua;
03071       int r, offset;
03072       pua++->a_int = RDBHID_GET(dbh);
03073       pua++->a_int = idxtype;
03074       pua++->a_oid = *idxoid;
03075       pua->a_data.data = 0; /* force RPC to allocate buffer */
03076       pua++->a_data.size   = 0;
03077 
03078       RPC_RPCMAKE(dbh->ch->ch, COLLECTION_GET_IMPL_RPC, ua);
03079 
03080       status_copy(status_r, ua[4].a_status);
03081       if (!status_r.err)
03082         decode_index_impl((unsigned char *)ua[3].a_data.data, impl);
03083 
03084       free(ua[3].a_data.data); // 1/10/05
03085       STATUS_RETURN(status_r);
03086     }
03087 }
03088 }

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