Connect an application
libpq is the C client library for connecting to and interacting with PostgreSQL databases. libpq is also the underlying engine used in other PostgreSQL application interfaces. The libpq client library supports the SCRAM-SHA-256 authentication method.
For details and documentation, refer to libpq - C Library for PostgreSQL 11 (on which YugabyteDB is based).
Prerequisites
The tutorial assumes that you have:
- installed YugabyteDB and created a universe. If not, follow the steps in Quick start.
- a 32-bit (x86) or 64-bit (x64) architecture machine.
- gcc 4.1.2 or later, clang 3.4 or later installed.
Install the libpq C driver
The libpq
C driver is included in the YugabyteDB installation. You can use it by setting the LD_LIBRARY_PATH
as follows :
$ export LD_LIBRARY_PATH=<yugabyte-install-dir>/postgres/lib
Alternatively, you can download the PostgreSQL binaries and source from the PostgreSQL Downloads page, and Homebrew users on macOS can install libpq using brew install libpq
.
Create the sample C application
Sample C code
Create a file ybsql_hello_world.c
and copy the contents below:
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
int
main(int argc, char **argv)
{
const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i, j;
/* connection string */
conninfo = "host=127.0.0.1 port=5433 dbname=yugabyte user=yugabyte password=yugabyte";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
/* Create table */
res = PQexec(conn, "CREATE TABLE employee (id int PRIMARY KEY, \
name varchar, age int, \
language varchar)");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "CREATE TABLE failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
PQclear(res);
printf("Created table employee\n");
/* Insert a row */
res = PQexec(conn, "INSERT INTO employee (id, name, age, language) \
VALUES (1, 'John', 35, 'C')");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
PQclear(res);
printf("Inserted data (1, 'John', 35, 'C')\n");
/* Query the row */
res = PQexec(conn, "SELECT name, age, language FROM employee WHERE id = 1");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
/* print out the rows */
nFields = PQnfields(res);
for (i = 0; i < PQntuples(res); i++)
{
printf("Query returned: ");
for (j = 0; j < nFields; j++)
printf("%s ", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}
Run the application
You can compile the file using gcc
or clang
.
To compile the application withgcc
, run the following command:
$ gcc ybsql_hello_world.c -lpq -I<yugabyte-install-dir>/postgres/include -o ybsql_hello_world
Run with:
$ ./ybsql_hello_world
You should see the following output:
Created table employee
Inserted data (1, 'John', 35, 'C')
Query returned: John 35 C