libdb/lang/cxx/cxx_channel.cpp

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);