summaryrefslogtreecommitdiff
path: root/src/interfaces/libpq++/examples/testlibpq5.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/libpq++/examples/testlibpq5.cc')
-rw-r--r--src/interfaces/libpq++/examples/testlibpq5.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/interfaces/libpq++/examples/testlibpq5.cc b/src/interfaces/libpq++/examples/testlibpq5.cc
new file mode 100644
index 00000000000..8c299fe73be
--- /dev/null
+++ b/src/interfaces/libpq++/examples/testlibpq5.cc
@@ -0,0 +1,102 @@
+/*
+ * testlibpq5.cc
+ * Test the C++ version of LIBPQ, the POSTGRES frontend library.
+ * tests the binary cursor interface
+ *
+ *
+ *
+ populate a database by doing the following (use testlibpq5.sql):
+
+CREATE TABLE test1 (i int4, d float4, p polygon);
+
+INSERT INTO test1 values (1, 3.567, '(3.0, 4.0, 1.0, 2.0)'::polygon);
+
+INSERT INTO test1 values (2, 89.05, '(4.0, 3.0, 2.0, 1.0)'::polygon);
+
+ the expected output is:
+
+tuple 0: got
+ i = (4 bytes) 1,
+ d = (4 bytes) 3.567000,
+ p = (4 bytes) 2 points boundbox = (hi=3.000000/4.000000, lo = 1.000000,2.000000)
+tuple 1: got
+ i = (4 bytes) 2,
+ d = (4 bytes) 89.050003,
+ p = (4 bytes) 2 points boundbox = (hi=4.000000/3.000000, lo = 2.000000,1.000000)
+
+ *
+ */
+#include <iostream.h>
+#include <libpq++.h>
+#include <stdlib.h>
+extern "C" {
+#include "postgres.h" // for Postgres types
+#include "utils/geo-decls.h" // for the POLYGON type
+}
+
+main()
+{
+ // Begin, by connecting to the backend using hardwired constants
+ // and a test database created by the user prior to the invokation
+ // of this test program. Connect using cursor interface.
+ char* dbName = getenv("USER"); // change this to the name of your test database
+ PgCursor data(dbName, "mycursor");
+
+ // check to see that the backend connection was successfully made
+ if ( data.ConnectionBad() ) {
+ cerr << "Connection to database '" << dbName << "' failed." << endl
+ << data.ErrorMessage();
+ exit(1);
+ }
+
+ // Declare a binary cursor for all the tuples in database 'test1'
+ if ( !data.Declare("select * from test1", 1) ) {
+ cerr << "DECLARE CURSOR command failed" << endl;
+ exit(1);
+ }
+
+ // fetch all instances from the current cursor
+ if ( !data.Fetch() ) {
+ cerr << "FETCH ALL command didn't return tuples properly" << endl;
+ exit(1);
+ }
+
+ // Find the field numbers for the columns 'i', 'd', and 'p'
+ int i_fnum = data.FieldNum("i");
+ int d_fnum = data.FieldNum("d");
+ int p_fnum = data.FieldNum("p");
+
+/*
+ for (i=0;i<3;i++) {
+ printf("type[%d] = %d, size[%d] = %d\n",
+ i, data.FieldType(i),
+ i, data.FieldSize(i));
+ }
+*/
+
+ // Print out the information about the extracted tuple
+ for (int i=0; i < data.Tuples(); i++) {
+ // we hard-wire this to the 3 fields we know about
+ int* ival = (int*)data.GetValue(i,i_fnum);
+ float* dval = (float*)data.GetValue(i,d_fnum);
+ int plen = data.GetLength(i,p_fnum);
+
+ // Allocate correct memory space for the Polygon struct and copy
+ // the extracted data into it.
+ // plen doesn't include the length field so need to increment by VARHDSZ
+ POLYGON* pval = (POLYGON*) malloc(plen + VARHDRSZ);
+ pval->size = plen;
+ memmove((char*)&pval->npts, data.GetValue(i,p_fnum), plen);
+
+ // Display Polygon Information
+ cout << "tuple " << i << ": got" << endl
+ << " i = (" << data.GetLength(i,i_fnum) << " bytes) " << *ival << "," << endl
+ << " d = (" << data.GetLength(i,d_fnum) << " bytes) " << *dval << "," << endl
+ << " p = (" << data.GetLength(i,d_fnum) << " bytes) " << pval->npts << " points"
+ << "\tboundbox = (hi=" << pval->boundbox.xh << "/" << pval->boundbox.yh << ","
+ << "lo = " << pval->boundbox.xl << "," << pval->boundbox.yl << ")" << endl;
+
+ // Deallocate memory allocated for the Polygon structure
+ free(pval);
+ }
+}