testlibpq5.cc
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * testlibpq5.cc
  3.  *  Test the C++ version of LIBPQ, the POSTGRES frontend library.
  4.  *   tests the binary cursor interface
  5.  *
  6.  *
  7.  *
  8.  populate a database by doing the following (use testlibpq5.sql):
  9.  
  10. CREATE TABLE test1 (i int4, d float4, p polygon);
  11. INSERT INTO test1 values (1, 3.567, '(3.0, 4.0, 1.0, 2.0)'::polygon);
  12. INSERT INTO test1 values (2, 89.05, '(4.0, 3.0, 2.0, 1.0)'::polygon);
  13.  the expected output is:
  14. tuple 0: got
  15.  i = (4 bytes) 1,
  16.  d = (4 bytes) 3.567000,
  17.  p = (4 bytes) 2 points         boundbox = (hi=3.000000/4.000000, lo = 1.000000,2.000000)
  18. tuple 1: got
  19.  i = (4 bytes) 2,
  20.  d = (4 bytes) 89.050003,
  21.  p = (4 bytes) 2 points         boundbox = (hi=4.000000/3.000000, lo = 2.000000,1.000000)
  22.  *
  23.  */
  24. #include <iostream.h>
  25. #include <libpq++.H>
  26. #include <stdlib.h>
  27. extern "C" {
  28. #include "postgres.h" // for Postgres types
  29. #include "utils/geo_decls.h" // for the POLYGON type
  30. }
  31. main()
  32. {
  33.   // Begin, by connecting to the backend using hardwired constants
  34.   // and a test database created by the user prior to the invokation
  35.   // of this test program.  Connect using cursor interface.
  36.   char* dbName = "dbname=template1"; // change this to the name of your test database
  37.   PgCursor data(dbName, "mycursor");
  38.   // check to see that the backend connection was successfully made
  39.   if ( data.ConnectionBad() ) {
  40.     cerr << "Connection to database '" << dbName << "' failed." << endl
  41.          << data.ErrorMessage();
  42.     exit(1);
  43.   }
  44.   // Declare a binary cursor for all the tuples in database 'test1'
  45.   if ( !data.Declare("select * from test1", 1) ) {
  46.     cerr << "DECLARE CURSOR command failed" << endl;
  47.     exit(1);
  48.   }
  49.   // fetch all instances from the current cursor
  50.   if ( !data.Fetch() ) {
  51.     cerr << "FETCH ALL command didn't return tuples properly" << endl;
  52.     exit(1);
  53.   }
  54.  
  55.   // Find the field numbers for the columns 'i', 'd', and 'p'
  56.   int i_fnum = data.FieldNum("i");
  57.   int d_fnum = data.FieldNum("d");
  58.   int p_fnum = data.FieldNum("p");
  59.   
  60. /*
  61.   for (i=0;i<3;i++) {
  62.       printf("type[%d] = %d, size[%d] = %dn",
  63.      i, data.FieldType(i), 
  64.      i, data.FieldSize(i));
  65.   }
  66. */
  67.   // Print out the information about the extracted tuple
  68.   for (int i=0; i < data.Tuples(); i++) {
  69.     // we hard-wire this to the 3 fields we know about
  70.     int* ival = (int*)data.GetValue(i,i_fnum);
  71.     float* dval = (float*)data.GetValue(i,d_fnum);
  72.     int plen = data.GetLength(i,p_fnum);
  73.     // Allocate correct memory space for the Polygon struct and copy
  74.     // the extracted data into it.
  75.     // plen doesn't include the length field so need to increment by VARHDSZ
  76.     POLYGON* pval = (POLYGON*) malloc(plen + VARHDRSZ); 
  77.     pval->size = plen;
  78.     memmove((char*)&pval->npts, data.GetValue(i,p_fnum), plen);
  79.     
  80.     // Display Polygon Information
  81.     cout << "tuple " << i << ": got" << endl
  82.          << " i = (" << data.GetLength(i,i_fnum) << " bytes) " << *ival << "," << endl
  83.          << " d = (" << data.GetLength(i,d_fnum) << " bytes) " << *dval << "," << endl
  84.          << " p = (" << data.GetLength(i,d_fnum) << " bytes) " << pval->npts << " points"
  85.          << "tboundbox = (hi=" << pval->boundbox.high.x << "/" << pval->boundbox.high.y << ","
  86.          << "lo = " << pval->boundbox.low.x << "," << pval->boundbox.low.y << ")" << endl;
  87.    
  88.     // Deallocate memory allocated for the Polygon structure
  89.     free(pval);
  90.   }
  91. }