Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 1 addition & 24 deletions README.build
Original file line number Diff line number Diff line change
@@ -1,26 +1,3 @@
Prerequisites

Building the VoltDB CPP client from source requires the boost c++ development libraries.
Version 1.54+ or better is recommended.

Notes:

On some platforms boost libraries are "tagged" with the feature support (such as -mt for multithreading)
in the file name. If the libraries on your platform are not tagged, you will need to edit the makefile
and remove the -mt tag. Alternatively you can create a soft link to the to the needed libraries using
the tagged name referenced by the makefile.

If your platform's package manager does not provide the required version of boost you can build it from source
using these commands:

wget http://sourceforge.net/projects/boost/files/boost/1.56.0/boost_1_56_0.tar.gz/download
tar -C /usr/local -xf boost_x_y_z.tar.gz
cd /usr/local/boost_x_y_z
./bootstrap.sh --prefix=/usr/local
./b2 --layout=tagged install
ln -s /usr/local/boost_x_y_z /usr/local/boost


Building the client

Running `make` produces the CPP client tarball that is available
Expand All @@ -46,7 +23,7 @@ version of libevent - simply replace the libevent tarball.
Running the tests

The tests require CPPUnit. You can install cppunit on ubuntu with the
command: `apt get install libcppunit-dev`
command: `apt-get install libcppunit-dev`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More likely people need to add sudo to use this command.
Plus, apt get without the dash is a legitimate way to call.
This file was not written using MarkDown. If we do not intend to do so, we shouldn't use `


Once you have built either version of the shared library you can build the
tests using the makefile in Tests and then run the Tests executable that is
Expand Down
53 changes: 39 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,26 @@ The Linux binary was compiled with GCC 4.4.7 on Centos 6.7.
The OSX binary was compiled with Xcode 7.2 on OSX 10.11.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OS X
XCode


The source code is available in the [VoltDB Github repository]
(https://github.com/VoltDB/voltdb-client-cpp).
(https://github.com/VoltDB/voltdb-client-cpp).

New Features in 8.4
==================
- Removed dependency on Boost library (by taking advantage of C++11 features)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Removed dependency on Boost library (by taking advantage of C++11 features)
- Removed the dependency on the Boost library (by taking advantage of C++11 features)


- Added a C wrapper for a few functions to support synchronous execution of Ad-Hoc query.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Added a C wrapper for a few functions to support synchronous execution of Ad-Hoc query.
- Added a C wrapper for a few functions to support synchronous execution of Ad-Hoc queries.

The wrapper can serve as a bridge to any client in most other programming languages.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The wrapper can serve as a bridge to any client in most other programming languages.
The wrapper can serve as a bridge to clients in most other programming languages.


New Features in 7.1
==================
- Add SSL support to C++ client to enable communication between VoltDB server and C++ client over SSL transport.
To enable communication between a VoltDB server with SSL enabled for the external ports and a C++ client, the client
needs to be instantiated using client config (voltdb::ClientConfig) with the ssl field (m_useSSL) set to true. Code
snippet:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No newline after the horizontal rule to be consistent with other release notes.

- Add SSL support to C++ client to enable communication between VoltDB server

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Add SSL support to C++ client to enable communication between VoltDB server
- Added the SSL support to enable communications with a VoltDB server

and C++ client over SSL transport.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
and C++ client over SSL transport.
over SSL transport.


To enable communication between a VoltDB server with SSL enabled for the

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To enable communication between a VoltDB server with SSL enabled for the
To enable communication with an SSL-enabled VoltDB server via

external ports and a C++ client, the client needs to be instantiated using
client config (voltdb::ClientConfig) with the ssl field (m_useSSL) set to true.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
client config (voltdb::ClientConfig) with the ssl field (m_useSSL) set to true.
a client config (`voltdb::ClientConfig`) with the SSL field (`m_useSSL`) set to true.

Code snippet:

```C++
voltdb::ClientConfig config;
...
Expand All @@ -36,9 +48,13 @@ voltdb::Client client = voltdb::Client::create(config);
New Features in 7.0
==================
- Support for Table (synomous to VoltTable on server side) in parameter set.
How to construct table: initialize table with column schema. Generate row to be inserted - initialize the row with same
column schema as that of table, populate the row and add the row to the table. After inserting the populated row to the
table, the row instance can be reused to populate it row with new values and push it table.

How to construct table: initialize table with column schema. Generate row to be

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
How to construct table: initialize table with column schema. Generate row to be
How to construct a table:
- Initialize the table with a column schema.
- Generate a row to be

inserted - initialize the row with same column schema as that of table,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
inserted - initialize the row with same column schema as that of table,
inserted - initialize the row with the same column schema as that of the table,

populate the row and add the row to the table. After inserting the populated
row to the table, the row instance can be reused to populate with new values

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
row to the table, the row instance can be reused to populate with new values
row to the table, the row instance can be reused to be populated with new values

and push to the table.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
and push to the table.
and to push to the table.


```C++
std::vector<voltdb::Column> columns;
columns.push_back(voltdb::Column("col1", voltdb::WIRE_TYPE_BIGINT));
Expand All @@ -54,7 +70,10 @@ table.addRow(row);

New Features in V6.9
==================
- Support for timing out outstanding/pending invocation requests. By default the monitoring of the pending requests for timeout is disabled. To exercise feature, timeout has to be enabled using client config. Default timeout is 10 seconds and can be tweaked through client config.
- Support for timing out outstanding/pending invocation requests. By default
the monitoring of the pending requests for timeout is disabled. To exercise
feature, timeout has to be enabled using client config. Default timeout is 10

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
feature, timeout has to be enabled using client config. Default timeout is 10
this feature, the timeout has to be enabled using a client config. The default timeout is 10

seconds and can be tweaked through client config.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
seconds and can be tweaked through client config.
seconds and can be tweaked through the client config.

```C++
bool enableQueryTimeout = true;
int queryTimeout = 10;
Expand All @@ -65,9 +84,16 @@ voltdb::Client client = voltdb::Client::create(config);

New Features in V6.8
==================
- Update backpressure notification to notify when backpressure on client transitions from on to off
- Fix handling of pending connection logic where client gets disconnected and tries to reconnect, if socket timeout is longer than 10 seconds, it can potentially crash the client
- Update setaffinity logic to not drop the set affinity request in case of backpresure with client configured with enable abandon set to true.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No newline after the horizontal rule to be consistent with other release notes.

- Update backpressure notification to notify when backpressure on client
transitions from on to off

- Fix handling of pending connection logic where client gets disconnected and
tries to reconnect, if socket timeout is longer than 10 seconds, it can
potentially crash the client

- Update setaffinity logic to not drop the set affinity request in case of
backpresure with client configured with enable abandon set to true.

New Features in V6.0
==================
Expand Down Expand Up @@ -146,10 +172,9 @@ clientvoter.cpp \
./libevent_pthread.a \
-lrt \
-pthread \
-lboost_system \
-lboost_thread \
-o voter
```

Note that -lrt should not be included for the mac edition. See the example makefile
for more detail.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This write-up is far from the documentation quality. I think I need this to be reviewed by Andrew @ajgent

9 changes: 4 additions & 5 deletions examples/AsyncHelloWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#define __STDC_LIMIT_MACROS

#include <vector>
#include <boost/shared_ptr.hpp>
#include "Client.h"
#include "Table.h"
#include "TableIterator.h"
Expand All @@ -44,7 +43,7 @@ class CountingCallback : public voltdb::ProcedureCallback {
public:
CountingCallback(int32_t count) : m_count(count) {}

bool callback(voltdb::InvocationResponse response) throw (voltdb::Exception) {
bool callback(voltdb::InvocationResponse response) {
m_count--;

//Print the error response if there was a problem
Expand All @@ -69,7 +68,7 @@ class CountingCallback : public voltdb::ProcedureCallback {
*/
class PrintingCallback : public voltdb::ProcedureCallback {
public:
bool callback(voltdb::InvocationResponse response) throw (voltdb::Exception) {
bool callback(voltdb::InvocationResponse response) {
std::cout << response.toString();
return true;
}
Expand All @@ -93,7 +92,7 @@ int main(int argc, char **argv) {
parameterTypes[2] = voltdb::Parameter(voltdb::WIRE_TYPE_STRING);
voltdb::Procedure procedure("Insert", parameterTypes);

boost::shared_ptr<CountingCallback> callback(new CountingCallback(5));
std::shared_ptr<CountingCallback> callback(new CountingCallback(5));

/*
* Load the database.
Expand Down Expand Up @@ -130,7 +129,7 @@ int main(int argc, char **argv) {
* Retrieve the message
*/
selectProc.params()->addString("Spanish");
client.invoke(selectProc, boost::shared_ptr<PrintingCallback>(new PrintingCallback()));
client.invoke(selectProc, std::shared_ptr<PrintingCallback>(new PrintingCallback()));

/*
* Invoke event loop
Expand Down
43 changes: 42 additions & 1 deletion examples/HelloWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#define __STDC_LIMIT_MACROS

#include <vector>
#include <boost/shared_ptr.hpp>
#include "Client.h"
#include "Table.h"
#include "TableIterator.h"
Expand All @@ -35,6 +34,22 @@
#include "ParameterSet.hpp"
#include "ClientConfig.h"

#include "CAPI.h"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By looking at the examples I found AsyncHelloWorld is completely in C++ and HelloWorld has both C and C++ code.

I think this is not a good practice to give examples. Does it mean that the C++ APIs are designed for the asynchronous mode and C APIs are designed for the syncrhonous mode?

Maybe put the C examples into another file like CExample.cpp?


void print_result(c_stringified_tables* r) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C naming convention is not just using the_snake_case.

Regardless what programming language you are using, it is highly preferred that you use a different naming convention for structs and variables so the readers can easily tell the difference if the source code is not colored by the IDE. For example, in Java, all the class names are in upper camel case, and variables are in lower camel case: JavaClassName oneVariable;.

More often than not, C structs use the upper camel case (CStringifiedTables) just like Java classes do while variables use the snake case (some_table). Having declarations like c_stringified_tables some_table; is very hard to read compared to CStringifiedTable some_table;

That being said, I am requesting the C structs you created in CAPI.h and CAPI.cpp to be renamed using the upper camel case:

void print_result(CStringifiedTables* tables) {

Futhermore, since this is an example that people may refer to to understand how to use the library, I suggest that you give the variable r a more meaningful name so that it is easy to follow in the function code (I gave a suggestion in the example above).

Lastly, the function code needs proper spacing.

for(int tbl_index = 0; tbl_index < r->num_tables; ++tbl_index) {
std::cout<<tbl_index<<" th table:"<<std::endl;
const c_stringified_table& tbl = r->tables[tbl_index];
for(int row_index = 0; row_index < tbl.num_rows; ++row_index) {
for(int col_index = 0; col_index < tbl.num_cols; ++col_index) {
std::cout<<tbl.tuples[row_index][col_index]<<"\t";
}
std::cout<<std::endl;
}
std::cout<<std::endl;
}
}

int main(int argc, char **argv) {
/*
* Instantiate a client and connect to the database.
Expand All @@ -51,6 +66,32 @@ int main(int argc, char **argv) {
parameterTypes[0] = voltdb::Parameter(voltdb::WIRE_TYPE_STRING);
parameterTypes[1] = voltdb::Parameter(voltdb::WIRE_TYPE_STRING);
parameterTypes[2] = voltdb::Parameter(voltdb::WIRE_TYPE_STRING);
{

c_client* client = c_create_client("myusername", "mypassword", "localhost", 21212, false,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_client* client = c_create_client("myusername", "mypassword", "localhost", 21212, false,
VoltClient* client = create_client("myusername", "mypassword", "localhost", 21212, false,

All C++ classes are under the voltdb namespace, so I would think VoltClient is close enough but also different enough compared to voltdb::Client.
As for create_client(), it is clearly not a C++ API. The C++ counterpart is voltdb::Client::create(). So I don't think you have to add a c_.

/*voltdb::HASH_SHA1,*/ false, false, 10, false);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If voltdb::HASH_SHA1 shouldn't be used, then it needs to be removed as it can confuse users.

c_procedure* adhoc = c_create_call();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_procedure* adhoc = c_create_call();
VoltProcedureCall* adhoc = create_adhoc_call();

What you are creating here is a call to a procedure, not a procedure itself. You need to avoid the confusion.
I suggested create_adhoc_call() because you also have create_proc_call().

std::vector<std::string> queries{

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
std::vector<std::string> queries{
std::vector<std::string> queries {

"DROP TABLE foo IF EXISTS;",
"CREATE TABLE foo(i int, j int);",
"INSERT INTO foo VALUES(12, 14);",
"INSERT INTO foo VALUES(18, NULL);",
"INSERT INTO foo VALUES(14, 16);",
"SELECT * FROM foo ORDER BY i;"
};
for (std::string const& s : queries) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (std::string const& s : queries) {
for (std::string const& query : queries) {

For readability.

const char* params[] = {s.c_str(), nullptr};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I don't understand here is that why do you have to a nullptr?

c_invocation_response* response = c_exec_proc(client, adhoc, params);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_invocation_response* response = c_exec_proc(client, adhoc, params);
VoltInvocationResponse* response = exec_proc(client, adhoc, params);

if (c_status_code(response) != 1) { std::cout <<"Failed" << std::endl; return -1; }

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (c_status_code(response) != 1) { std::cout <<"Failed" << std::endl; return -1; }
if (get_status_code(response) != 1) { std::cout <<"Failed" << std::endl; return -1; }

Do not fold so many lines into one.

}
const char* params[] = {queries[5].c_str(), nullptr};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why nullptr here?

c_invocation_response* response = c_exec_proc(client, adhoc, params);
c_stringified_tables* result = c_exec_result(response);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_stringified_tables* result = c_exec_result(response);
c_stringified_tables* result = extract_result(response);

What does "execute result" mean?

print_result(result);
c_destroy_result(result);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_destroy_result(result);
free_result(result);

c_drop_procedure(adhoc);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_drop_procedure(adhoc);
free_proc_call(adhoc);

drop procedure has a very specific meaning in database semantics. You definitely don't mean that here.

c_close(client);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
c_close(client);
close_client(client);

Otherwise, close what? A file?

}
voltdb::Procedure procedure("Insert", parameterTypes);

voltdb::InvocationResponse response;
Expand Down
6 changes: 2 additions & 4 deletions examples/SSLVoter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <time.h>
#include <algorithm>
#include <sys/time.h>
#include <boost/shared_ptr.hpp>
#include "Client.h"
#include "Table.h"
#include "TableIterator.h"
Expand Down Expand Up @@ -72,8 +71,7 @@ int64_t millisec_time() {
class VoterCallback : public voltdb::ProcedureCallback
{
public:
bool callback(voltdb::InvocationResponse response) throw (voltdb::Exception)
{
bool callback(voltdb::InvocationResponse response) {
bool retVal = false;
if (response.failure())
{
Expand Down Expand Up @@ -202,7 +200,7 @@ int main(int argc, char* argv[]) {
parameterTypes.clear();
parameterTypes.resize(3);

boost::shared_ptr<VoterCallback> callback(new VoterCallback());
std::shared_ptr<VoterCallback> callback(new VoterCallback());

while (endTime > currentTime)
{
Expand Down
8 changes: 2 additions & 6 deletions examples/Voter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <time.h>
#include <algorithm>
#include <sys/time.h>
#include <boost/shared_ptr.hpp>
#include "Client.h"
#include "Table.h"
#include "TableIterator.h"
Expand All @@ -42,8 +41,6 @@
#include "ParameterSet.hpp"
#include "ProcedureCallback.hpp"

//#include <boost/date_time/posix_time/posix_time.hpp>

using namespace std;

int64_t minExecutionMilliseconds = 999999999;
Expand Down Expand Up @@ -71,8 +68,7 @@ int64_t millisec_time() {
class VoterCallback : public voltdb::ProcedureCallback
{
public:
bool callback(voltdb::InvocationResponse response) throw (voltdb::Exception)
{
bool callback(voltdb::InvocationResponse response) {
bool retVal = false;
if (response.failure())
{
Expand Down Expand Up @@ -194,7 +190,7 @@ int main(int argc, char* argv[])
parameterTypes.clear();
parameterTypes.resize(3);

boost::shared_ptr<VoterCallback> callback(new VoterCallback());
std::shared_ptr<VoterCallback> callback(new VoterCallback());

while (endTime > currentTime)
{
Expand Down
51 changes: 24 additions & 27 deletions examples/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,45 @@ VOLT_INCLUDEDIR=..
VOLT_LIBDIR=..

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first three lines of this file are all assigning the same value to different names, they can all be collapsed to one single VOLT_LIBS variable which still makes sense in all its references.

VOLT_LIBS=$(VOLT_LIBDIR)
VOLT_INCLUDES=-I$(VOLT_INCLUDEDIR)/include
CC=g++
RM=rm -rf
OPTIMIZATION=-O3
CFLAGS=$(BOOST_INCLUDES) $(VOLT_INCLUDES) -g3 ${OPTIMIZATION}
CFLAGS += -fPIC
CXXFLAGS=$(VOLT_INCLUDES) -std=c++11 -g3 -O3 -fPIC

PLATFORM = $(shell uname)
ifeq ($(PLATFORM),Darwin)
BOOST_INCLUDES=-I/usr/local/include
BOOST_LIBS=-L/usr/local/lib
SYSTEM_LIBS := -lpthread $(BOOST_LIBS) -lboost_system-mt -lboost_thread-mt
THIRD_PARTY_DIR := $(VOLT_LIBS)/third_party_libs/osx
THIRD_PARTY_LIBS := $(THIRD_PARTY_DIR)/libevent.a \
$(THIRD_PARTY_DIR)/libevent_openssl.a \
$(THIRD_PARTY_DIR)/libevent_pthreads.a \
$(THIRD_PARTY_DIR)/libssl.a \
$(THIRD_PARTY_DIR)/libcrypto.a
endif
ifeq ($(PLATFORM),Linux)
THIRD_PARTY_DIR := $(VOLT_LIBS)/third_party_libs/linux
THIRD_PARTY_LIBS := $(THIRD_PARTY_DIR)/libevent.a \
$(THIRD_PARTY_DIR)/libevent_openssl.a \
$(THIRD_PARTY_DIR)/libevent_pthreads.a \
$(THIRD_PARTY_DIR)/libssl.a \
$(THIRD_PARTY_DIR)/libcrypto.a \
-ldl
SYSTEM_LIBS := -lpthread -lrt -lboost_system -lboost_thread
THIRD_PARTY_DIR := $(VOLT_LIBS)/third_party_libs/osx
THIRD_PARTY_LIBS := $(THIRD_PARTY_DIR)/libevent.a \
$(THIRD_PARTY_DIR)/libevent_openssl.a \
$(THIRD_PARTY_DIR)/libevent_pthreads.a \
$(THIRD_PARTY_DIR)/libssl.a \
$(THIRD_PARTY_DIR)/libcrypto.a
SYSTEM_LIBS := -lpthread
else ifeq ($(PLATFORM),Linux)
THIRD_PARTY_DIR := $(VOLT_LIBS)/third_party_libs/linux
THIRD_PARTY_LIBS := $(THIRD_PARTY_DIR)/libevent.a \
$(THIRD_PARTY_DIR)/libevent_openssl.a \
$(THIRD_PARTY_DIR)/libevent_pthreads.a \
$(THIRD_PARTY_DIR)/libssl.a \
$(THIRD_PARTY_DIR)/libcrypto.a \
-ldl
SYSTEM_LIBS := -lpthread -lrt
else
$(error "Unsupported platform $(PLATFORM)")
endif

all: helloworld asynchelloworld voter sslvoter

asynchelloworld: AsyncHelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a
$(CC) $(CFLAGS) AsyncHelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o asynchelloworld
$(CXX) $(CXXFLAGS) AsyncHelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o asynchelloworld

helloworld: HelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a
$(CC) $(CFLAGS) HelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o helloworld
$(CXX) $(CXXFLAGS) HelloWorld.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o helloworld

voter: Voter.cpp $(VOLT_LIBS)/libvoltdbcpp.a
$(CC) $(CFLAGS) Voter.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o voter
$(CXX) $(CXXFLAGS) Voter.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o voter

sslvoter: SSLVoter.cpp $(VOLT_LIBS)/libvoltdbcpp.a
$(CC) $(CFLAGS) SSLVoter.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o sslvoter
$(CXX) $(CXXFLAGS) SSLVoter.cpp $(VOLT_LIBS)/libvoltdbcpp.a $(THIRD_PARTY_LIBS) $(SYSTEM_LIBS) -o sslvoter

clean:
$(RM) asynchelloworld helloworld voter sslvoter *.dSYM *~

Loading