Handle<Value> create_ndb(const Arguments &args) {
  REQUIRE_ARGS_LENGTH(3);  

  typedef NativeCFunctionCall_2_<Ndb *, Ndb_cluster_connection *, const char *> MCALL;
  MCALL * mcallptr = new MCALL(& async_create_ndb, args);
  mcallptr->wrapReturnValueAs(& NdbEnvelope);
  mcallptr->runAsync();
  return Undefined();
}
// prepareScan wrapper
Handle<Value> prepareScan_wrapper(const Arguments &args) {
  DEBUG_MARKER(UDEB_DEBUG);
  REQUIRE_ARGS_LENGTH(1);
  typedef NativeMethodCall_0_<NdbScanOperation *, DBScanHelper> MCALL;
  MCALL * mcallptr = new MCALL(& DBScanHelper::prepareScan, args);
  mcallptr->wrapReturnValueAs(getNdbScanOperationEnvelope());
  mcallptr->errorHandler = getNdbErrorIfNull<NdbScanOperation *, DBScanHelper>;
  mcallptr->runAsync();
  
  return Undefined();
}
Handle<Value> startTransaction(const Arguments &args) {  
  REQUIRE_ARGS_LENGTH(4);  
  typedef NativeMethodCall_3_<NdbTransaction *, Ndb, 
                              const NdbDictionary::Table *, 
                              const char *, uint32_t> MCALL;

  MCALL * mcallptr = new MCALL(& Ndb::startTransaction, args);
  DEBUG_PRINT("startTransaction %p", mcallptr->native_obj);
  mcallptr->wrapReturnValueAs(getNdbTransactionEnvelope());
  mcallptr->errorHandler = getNdbErrorIfNull<NdbTransaction *, Ndb>;
  mcallptr->runAsync();
  
  return Undefined();
}
Handle<Value> newDBSessionImpl(const Arguments & args) {
  DEBUG_MARKER(UDEB_DETAIL);
  HandleScope scope;
  
  PROHIBIT_CONSTRUCTOR_CALL();
  REQUIRE_ARGS_LENGTH(5);

  typedef NativeCFunctionCall_4_<DBSessionImpl *, Ndb_cluster_connection *,
                                 AsyncNdbContext *, const char *, int> MCALL;
  MCALL * mcallptr = new MCALL(& asyncNewDBSessionImpl, args);
  mcallptr->wrapReturnValueAs(& DBSessionImplEnvelope);
  mcallptr->runAsync();
  return Undefined();
}