MySQL NDB Cluster 8.1 Manual
MySQL NDB Cluster 8.0 Manual
NDB Cluster Internals Manual
Prior to running this example, start a mysql client session on an SQL node connected to the cluster and execute the following statements to create the database and table used by the example:
mysql> CREATE DATABASE ndbapi_examples;
mysql> USE ndbapi_examples;
mysql> CREATE TABLE basic (
> ATTR1 INT NOT NULL PRIMARY KEY,
> ATTR2 INT NOT NULL
> ) ENGINE=NDB;
After running the example, you can check the table using
SELECT * FROM basic
in the
mysql client, or by running the example read
program (see Section 2.5.1.3, “NDB API Basic Reading Example”).
You can also find the source code for this example in the file
storage/ndb/ndbapi-examples/ndbapi_basic/ndbapi_basic_insert.cpp
.
#include <iostream>
#include <cstdlib>
#include <string>
#include <NdbApi.hpp>
class BasicInsert
{
public:
BasicInsert(const char *connectstring)
: m_connection(connectstring), m_ndb(&m_connection, "ndbapi_examples") {}
bool init();
bool do_insert(long long, long long);
private:
Ndb_cluster_connection m_connection;
Ndb m_ndb;
inline bool on_error(const struct NdbError &error,
const std::string &explanation)
{
// prints error in format:
// ERROR <NdbErrorCode>: <NdbError message>
// explanation what went wrong on higher level (in the example code)
std::cout << "ERROR "<< error.code << ": " << error.message << std::endl;
std::cout << explanation << std::endl;
return false;
}
};
int main(int argc, char **argv)
{
if (argc != 4)
{
std::cout << "Usage: "
<< "ndb_ndbapi_basic_insert <connectstring> <key: int> <value: int>"
<< std::endl;
return EXIT_FAILURE;
}
const char *connectstring = argv[1];
const long long key = std::strtoll(argv[2], nullptr, 10);
const long long value = std::strtoll(argv[3], nullptr, 10);
ndb_init();
{
BasicInsert example(connectstring);
if (!example.init()) return EXIT_FAILURE;
// Let's verify inserts
if (example.do_insert(key, value))
std::cout << "Done, check your database:\n"
<< "\t SELECT * FROM ndbapi_examples.basic;\n"
<< "\t or run the example: ndb_ndbapi_basic_read"
<< std::endl;
else return EXIT_FAILURE;
}
ndb_end(0);
return EXIT_SUCCESS;
}
bool BasicInsert::do_insert(long long key, long long value)
{
const NdbDictionary::Dictionary *dict = m_ndb.getDictionary();
const NdbDictionary::Table *table = dict->getTable("basic");
if (table == nullptr)
return on_error(dict->getNdbError(),
"Failed to access 'ndbapi_examples.basic'");
// The insert will be performed within single transaction
NdbTransaction *transaction = m_ndb.startTransaction(table);
if(transaction == nullptr)
return on_error(m_ndb.getNdbError(), "Failed to start transaction");
NdbOperation *operation = transaction->getNdbOperation(table);
if(operation == nullptr)
return on_error(transaction->getNdbError(),
"Failed to start insert operation");
operation->insertTuple();
operation->equal("ATTR1", key);
operation->setValue("ATTR2", value);
if (transaction->execute(NdbTransaction::Commit) != 0)
return on_error(transaction->getNdbError(),
"Failed to execute transaction");
m_ndb.closeTransaction(transaction);
return true;
}
bool BasicInsert::init()
{
if (m_connection.connect() != 0)
{
std::cout << "Cannot connect to cluster management server" << std::endl;
return false;
}
if (m_connection.wait_until_ready(30, 0) != 0)
{
std::cout << "Cluster was not ready within 30 secs" << std::endl;
return false;
}
if (m_ndb.init() != 0)
return on_error(m_ndb.getNdbError(), "Failed to initialize ndb object");
return true;
}