mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
104 lines
2.6 KiB
C++
104 lines
2.6 KiB
C++
/*-
|
|
* See the file LICENSE for redistribution information.
|
|
*
|
|
* Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
#include "db_config.h"
|
|
|
|
#include "db_int.h"
|
|
|
|
#include "db_cxx.h"
|
|
#include "dbinc/cxx_int.h"
|
|
|
|
// Helper macro for simple methods that pass through to the
|
|
// underlying C method. It may return an error or raise an exception.
|
|
// Note this macro expects that input _argspec is an argument
|
|
// list element (e.g., "char *arg") and that _arglist is the arguments
|
|
// that should be passed through to the C method (e.g., "(dbchannel, arg)")
|
|
//
|
|
#define DB_CHANNEL_METHOD(_name, _delete, _argspec, _arglist, _retok) \
|
|
int DbChannel::_name _argspec \
|
|
{ \
|
|
int ret; \
|
|
DB_CHANNEL *dbchannel = unwrap(this); \
|
|
\
|
|
if (dbchannel == NULL) \
|
|
ret = EINVAL; \
|
|
else \
|
|
ret = dbchannel->_name _arglist; \
|
|
if (_delete) \
|
|
delete this; \
|
|
if (!_retok(ret)) \
|
|
DB_ERROR(dbenv_, "DbChannel::"#_name, ret, \
|
|
ON_ERROR_UNKNOWN); \
|
|
return (ret); \
|
|
}
|
|
|
|
DbChannel::DbChannel()
|
|
: imp_(0)
|
|
{
|
|
}
|
|
|
|
DbChannel::~DbChannel()
|
|
{
|
|
}
|
|
|
|
DB_CHANNEL_METHOD(close, 1, (), (dbchannel, 0), DB_RETOK_STD)
|
|
|
|
int DbChannel::send_msg(Dbt *msg, u_int32_t nmsg, u_int32_t flags)
|
|
{
|
|
DB_CHANNEL *dbchannel = unwrap(this);
|
|
DB_ENV *dbenv = unwrap(dbenv_);
|
|
DBT *dbtlist;
|
|
int i, ret;
|
|
|
|
ret = __os_malloc(dbenv->env, sizeof(DBT) * nmsg, &dbtlist);
|
|
if (ret != 0) {
|
|
DB_ERROR(dbenv_, "DbChannel::send_msg", ret, ON_ERROR_UNKNOWN);
|
|
return (ret);
|
|
}
|
|
|
|
for (i = 0; i < (int)nmsg; i++)
|
|
memcpy(&dbtlist[i], msg[i].get_DBT(), sizeof(DBT));
|
|
|
|
if ((ret = dbchannel->send_msg(dbchannel, dbtlist, nmsg, flags)) != 0)
|
|
DB_ERROR(dbenv_, "DbChannel::send_msg", ret, ON_ERROR_UNKNOWN);
|
|
|
|
__os_free(dbenv->env, dbtlist);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
int DbChannel::send_request(Dbt *request, u_int32_t nrequest,
|
|
Dbt *response, db_timeout_t timeout, u_int32_t flags)
|
|
{
|
|
DB_CHANNEL *dbchannel = unwrap(this);
|
|
DB_ENV *dbenv = unwrap(dbenv_);
|
|
DBT *dbtlist;
|
|
int i, ret;
|
|
|
|
ret = __os_malloc(dbenv->env, sizeof(DBT) * nrequest, &dbtlist);
|
|
if (ret != 0) {
|
|
DB_ERROR(dbenv_, "DbChannel::send_request", ret,
|
|
ON_ERROR_UNKNOWN);
|
|
return (ret);
|
|
}
|
|
|
|
for (i = 0; i < (int)nrequest; i++)
|
|
memcpy(&dbtlist[i], request[i].get_DBT(), sizeof(DBT));
|
|
|
|
if ((ret = dbchannel->send_request(dbchannel, dbtlist, nrequest,
|
|
response->get_DBT(), timeout, flags)) != 0)
|
|
DB_ERROR(dbenv_, "DbChannel::send_request", ret,
|
|
ON_ERROR_UNKNOWN);
|
|
|
|
__os_free(dbenv->env, dbtlist);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
DB_CHANNEL_METHOD(set_timeout, 0, (db_timeout_t timeout),
|
|
(dbchannel, timeout), DB_RETOK_STD);
|