Update of /cvsroot/playerstage/code/player/server/drivers/vectormap
In directory 
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22171/server/drivers/vectormap

Modified Files:
        dbconn.cc dbconn.h postgis.cc 
Log Message:
applied patch
[ 1889308 ] Player CVS: Big postgis/vectormap patch



Index: dbconn.cc
===================================================================
RCS file: /cvsroot/playerstage/code/player/server/drivers/vectormap/dbconn.cc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** dbconn.cc   7 Dec 2007 04:31:45 -0000       1.4
--- dbconn.cc   15 Feb 2008 08:42:37 -0000      1.5
***************
*** 1,5 ****
! #include <stdio.h>
! #include <stdlib.h>
  #include <iostream>
  #include "dbconn.h"
  #ifdef HAVE_GEOS
--- 1,8 ----
! #include <cstdio>
! #include <cstddef>
! #include <cstdlib>
  #include <iostream>
+ #include <cassert>
+ #include <cctype>
  #include "dbconn.h"
  #ifdef HAVE_GEOS
***************
*** 23,30 ****
  }
  
  VectorMapInfoHolder PostgresConn::GetVectorMapInfo(vector<string> layerNames)
  {
    // Get the extent in the first query
!   string query_string = "SELECT asbinary(extent(geom)) FROM (SELECT geom FROM 
";
  
    for (uint32_t ii=0; ii<layerNames.size(); ++ii)
--- 26,49 ----
  }
  
+ uint32_t PostgresConn::Text2Bin(const char * text, unsigned char * bin, 
uint32_t maxlen)
+ {
+     char numbuff[5];
+     uint32_t i;
+ 
+     for (i = 0; i < maxlen; i++)
+     {
+       if (!(text[0])) break;
+       strcpy(numbuff, "0x");
+       strncat(numbuff, text, 2);
+       bin[i] = strtoul(numbuff, NULL, 0);
+       text += 2;
+     }
+     return i;
+ }
+ 
  VectorMapInfoHolder PostgresConn::GetVectorMapInfo(vector<string> layerNames)
  {
    // Get the extent in the first query
!   string query_string = "SELECT GeometryFromText(astext(extent(geom))) FROM 
(SELECT geom FROM ";
  
    for (uint32_t ii=0; ii<layerNames.size(); ++ii)
***************
*** 41,67 ****
    query_string += ") AS layer_extent;";
  
!   //PGresult* res = PQexec(conn, query_string.c_str());
!   PGresult* res = PQexecParams(conn,
!                                query_string.c_str(),
!                                0,
!                                NULL,
!                                NULL,
!                                NULL,
!                                NULL,
!                                1);
  
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cout << "Error performing select query on database!" << endl;
!     cout << "No extent value found." << endl;
!     cout << "GetVectorMapInfo() failed" << endl;
    }
   
-   uint8_t* wkb_temp = reinterpret_cast<uint8_t*>(PQgetvalue(res, 0, 0));
    uint32_t length = PQgetlength(res, 0, 0);
!   uint8_t* wkb = new uint8_t[length];
!   memcpy(wkb, wkb_temp, length);
    BoundingBox extent = BinaryToBBox(wkb, length);
!   delete[] wkb;
  
    // Get the srid in the second query
--- 60,79 ----
    query_string += ") AS layer_extent;";
  
!   PGresult * res = PQexec(conn, query_string.c_str());
  
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cerr << "Error performing select query on database!" << endl;
!     cerr << "No extent value found." << endl;
!     cerr << "GetVectorMapInfo() failed" << endl;
    }
   
    uint32_t length = PQgetlength(res, 0, 0);
!   uint8_t * wkb = new uint8_t[length];
!   assert(wkb);
!   length = Text2Bin(PQgetvalue(res, 0, 0), wkb, length);
    BoundingBox extent = BinaryToBBox(wkb, length);
!   delete []wkb;
!   PQclear(res);
  
    // Get the srid in the second query
***************
*** 69,75 ****
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cout << "Error performing select query on database!" << endl;
!     cout << "No srid value found." << endl;
!     cout << "GetVectorMapInfo() failed" << endl;
    }
  
--- 81,87 ----
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cerr << "Error performing select query on database!" << endl;
!     cerr << "No srid value found." << endl;
!     cerr << "GetVectorMapInfo() failed" << endl;
    }
  
***************
*** 91,95 ****
  
    // Retrieve the extent of the layer in binary form
!   const char* query_template = "SELECT asbinary(extent(geom)) AS extent FROM 
%s;";
  
    char query_string[MAX_PSQL_STRING];
--- 103,107 ----
  
    // Retrieve the extent of the layer in binary form
!   const char* query_template = "SELECT GeometryFromText(astext(extent(geom))) 
AS extent FROM %s;";
  
    char query_string[MAX_PSQL_STRING];
***************
*** 97,122 ****
    snprintf(query_string, MAX_PSQL_STRING, query_template, layer_name);
  
!   //PGresult* res = PQexec(conn, query_string);
!   PGresult* res = PQexecParams(conn,
!                                query_string,
!                                0,
!                                NULL,
!                                NULL,
!                                NULL,
!                                NULL,
!                                1);
  
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cout << "Error performing select query on database!" << endl;
!     cout << "GetLayerInfo() failed" << endl;
    }
  
    info.name = layer_name;
-   uint32_t length = PQgetlength(res, 0, 0);
-   uint8_t* wkb = new uint8_t[length];
-   memcpy(wkb, PQgetvalue(res, 0, 0), length);
  
    info.extent = BinaryToBBox(wkb, length);
  
    PQclear(res);
--- 109,128 ----
    snprintf(query_string, MAX_PSQL_STRING, query_template, layer_name);
  
!   PGresult* res = PQexec(conn, query_string);
  
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cerr << "Error performing select query on database!" << endl;
!     cerr << "GetLayerInfo() failed" << endl;
    }
  
    info.name = layer_name;
  
+   uint32_t length = PQgetlength(res, 0, 0);
+   uint8_t * wkb = new uint8_t[length];
+   assert(wkb);
+   length = Text2Bin(PQgetvalue(res, 0, 0), wkb, length);
    info.extent = BinaryToBBox(wkb, length);
+   delete []wkb;
  
    PQclear(res);
***************
*** 132,153 ****
  
    // need to get name count, name, wkb count, wkb
!   const char* template_data = "SELECT name, asbinary(geom), attrib FROM %s;";
    char query_data[MAX_PSQL_STRING];
    memset(query_data, 0, sizeof(MAX_PSQL_STRING));
    snprintf(query_data, MAX_PSQL_STRING, template_data, layer_name);
  
!   //res = PQexec(conn, query_data);
!   PGresult* res = PQexecParams(conn,
!                          query_data,
!                          0,
!                          NULL,
!                          NULL,
!                          NULL,
!                          NULL,
!                          1);
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cout << "Error performing select query on database!" << endl;
!     cout << "GetLayerData() data failed, returned NULL" << endl;
    }
  
--- 138,152 ----
  
    // need to get name count, name, wkb count, wkb
!   const char* template_data = "SELECT name, geom, attrib FROM %s ORDER BY 
id;";
    char query_data[MAX_PSQL_STRING];
    memset(query_data, 0, sizeof(MAX_PSQL_STRING));
    snprintf(query_data, MAX_PSQL_STRING, template_data, layer_name);
  
!   PGresult* res = PQexec(conn, query_data);
! 
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
!     cerr << "Error performing select query on database!" << endl;
!     cerr << "GetLayerData() data failed, returned NULL" << endl;
    }
  
***************
*** 157,167 ****
    {
      FeatureDataHolder fd(string(PQgetvalue(res, i, 0)));
-     
-     uint8_t *wkb = reinterpret_cast<uint8_t *>(PQgetvalue(res, i, 1));
      uint32_t length = PQgetlength(res, i, 1);
!     fd.wkb.assign(wkb, &wkb[length]);
!     
      fd.attrib = string(PQgetvalue(res, i, 2));
!     
      data.features.push_back(fd);
    }
--- 156,167 ----
    {
      FeatureDataHolder fd(string(PQgetvalue(res, i, 0)));
      uint32_t length = PQgetlength(res, i, 1);
!     uint8_t * wkb = new uint8_t[length];
!     assert(wkb);
!     length = Text2Bin(PQgetvalue(res, i, 1), wkb, length);
!     fd.wkb.assign(wkb, wkb + length);
!     delete []wkb;
      fd.attrib = string(PQgetvalue(res, i, 2));
! 
      data.features.push_back(fd);
    }
***************
*** 172,175 ****
--- 172,300 ----
  }
  
+ int PostgresConn::WriteLayerData(LayerDataHolder & data)
+ {
+ 
+   const string delcmd = string("DELETE FROM ") + data.name + string(";");
+   const string inscmd = string("INSERT INTO ") + data.name + string(" (id, 
name, geom, attrib) VALUES ($1::integer, $2, $3, $4);");
+   PGresult * res;
+   const player_vectormap_feature_data_t * feature;
+   char numbuff[16];
+   const char * params[4];
+ 
+   res = PQexec(conn, "BEGIN TRANSACTION;");
+   if (!res)
+   {
+     PLAYER_ERROR("Couldn't delete layer features");
+     return -1;
+   }
+   if (PQresultStatus(res) != PGRES_COMMAND_OK)
+   {
+     PLAYER_ERROR1("%s", PQresultErrorMessage(res));
+     PQclear(res);
+     return -1;
+   }
+   PQclear(res);
+   PLAYER_WARN1("[%s]", delcmd.c_str());
+   res = PQexec(conn, delcmd.c_str());
+   if (!res)
+   {
+     PLAYER_ERROR("Couldn't delete layer features");
+     res = PQexec(conn, "ROLLBACK;");
+     if (!res)
+     {
+       PLAYER_ERROR("Couldn't rollback transaction");
+       return -1;
+     }
+     if (PQresultStatus(res) != PGRES_COMMAND_OK) PLAYER_ERROR1("%s", 
PQresultErrorMessage(res));
+     PQclear(res);
+     return -1;
+   }
+   if (PQresultStatus(res) != PGRES_COMMAND_OK)
+   {
+     PLAYER_ERROR1("%s", PQresultErrorMessage(res));
+     PQclear(res);
+     res = PQexec(conn, "ROLLBACK;");
+     if (!res)
+     {
+       PLAYER_ERROR("Couldn't rollback transaction");
+       return -1;
+     }
+     if (PQresultStatus(res) != PGRES_COMMAND_OK) PLAYER_ERROR1("%s", 
PQresultErrorMessage(res));
+     PQclear(res);
+     return -1;
+   }
+   PQclear(res);
+   for (int i = 0; i < (int)(data.features.size()); i++)
+   {
+     feature = data.features[i].Convert();
+     char * wkb_buff = new char[((feature->wkb_count) * 2) + 1];
+     assert(wkb_buff);
+     char * ptr = wkb_buff;
+     for (uint32_t j = 0; j < (feature->wkb_count); j++)
+     {
+       snprintf(ptr, 3, "%02x", feature->wkb[j]);
+       ptr += 2;
+     }
+     for (int j = 0; wkb_buff[j]; j++) wkb_buff[j] = toupper(wkb_buff[j]);
+     snprintf(numbuff, sizeof numbuff, "%d", i + 1);
+     params[0] = numbuff;
+     params[1] = (feature->name[0]) ? feature->name : NULL;
+     params[2] = wkb_buff;
+     params[3] = (feature->attrib[0]) ? feature->attrib : NULL;
+     PLAYER_WARN5("[%s] [%s] [%s] [%s] [%s]", inscmd.c_str(), params[0], 
((params[1]) ? (params[1]) : ""), params[2], ((params[3]) ? (params[3]) : ""));
+     PGresult * res = PQexecParams(conn,
+                                   inscmd.c_str(),
+                                   4,
+                                   NULL,
+                                   params,
+                                   NULL,
+                                   NULL,
+                                   0);
+     delete []wkb_buff;
+     if (!res)
+     {
+       PLAYER_ERROR("Couldn't insert layer feature to the database");
+       res = PQexec(conn, "ROLLBACK;");
+       if (!res)
+       {
+         PLAYER_ERROR("Couldn't rollback transaction");
+         return -1;
+       }
+       if (PQresultStatus(res) != PGRES_COMMAND_OK) PLAYER_ERROR1("%s", 
PQresultErrorMessage(res));
+       PQclear(res);
+       return -1;
+     }
+     if (PQresultStatus(res) != PGRES_COMMAND_OK)
+     {
+       PLAYER_ERROR1("%s", PQresultErrorMessage(res));
+       PQclear(res);
+       res = PQexec(conn, "ROLLBACK;");
+       if (!res)
+       {
+         PLAYER_ERROR("Couldn't rollback transaction");
+         return -1;
+       }
+       if (PQresultStatus(res) != PGRES_COMMAND_OK) PLAYER_ERROR1("%s", 
PQresultErrorMessage(res));
+       PQclear(res);
+       return -1;      
+     }
+     PQclear(res);
+   }
+   res = PQexec(conn, "COMMIT TRANSACTION;");
+   if (!res)
+   {
+     PLAYER_ERROR("Couldn't commit transaction");
+     return -1;
+   }
+   if (PQresultStatus(res) != PGRES_COMMAND_OK)
+   {
+     PLAYER_ERROR1("%s", PQresultErrorMessage(res));
+     PQclear(res);
+     return -1;
+   }
+   PQclear(res);
+   return 0;
+ }
+ 
  BoundingBox PostgresConn::BinaryToBBox(const uint8_t* wkb, uint32_t length)
  {
***************
*** 177,181 ****
    memset(&res, 0, sizeof(BoundingBox));
  #ifdef HAVE_GEOS
!   GEOSGeom polygon = NULL;
    polygon = GEOSGeomFromWKB_buf(wkb, length);
    if (polygon == NULL)
--- 302,306 ----
    memset(&res, 0, sizeof(BoundingBox));
  #ifdef HAVE_GEOS
!   GEOSGeom polygon;
    polygon = GEOSGeomFromWKB_buf(wkb, length);
    if (polygon == NULL)
***************
*** 219,223 ****
    res.x1 = xmax;
    res.y1 = ymax;
! 
  #endif
    return res;
--- 344,348 ----
    res.x1 = xmax;
    res.y1 = ymax;
!   GEOSGeom_destroy(polygon);
  #endif
    return res;
***************
*** 232,236 ****
--- 357,363 ----
    info.extent.y1 = extent.y1;
    info.layers_count = layers.size();
+   if (info.layers) delete [](info.layers);
    info.layers = new player_vectormap_layer_info_t[layers.size()];
+   assert(info.layers);
    for (uint32_t ii=0; ii<layers.size(); ++ii)
    {
***************
*** 242,254 ****
  VectorMapInfoHolder::~VectorMapInfoHolder()
  {
! //   if (info.layers)
! //   {
! //     delete[] info.layers;
! //   }
  }
  
  const player_vectormap_layer_info_t* LayerInfoHolder::Convert()
  {
    layer_info.name = strdup(name.c_str());
    layer_info.name_count = name.size() + 1;
    layer_info.extent.x0 = extent.x0;
--- 369,383 ----
  VectorMapInfoHolder::~VectorMapInfoHolder()
  {
!    if (info.layers)
!    {
!      delete[] info.layers;
!    }
  }
  
  const player_vectormap_layer_info_t* LayerInfoHolder::Convert()
  {
+   if (layer_info.name) free(layer_info.name);
    layer_info.name = strdup(name.c_str());
+   assert(layer_info.name);
    layer_info.name_count = name.size() + 1;
    layer_info.extent.x0 = extent.x0;
***************
*** 261,269 ****
--- 390,404 ----
  const player_vectormap_feature_data_t* FeatureDataHolder::Convert()
  {
+   if (feature_data.name) free(feature_data.name);
    feature_data.name = strdup(name.c_str());
+   assert(feature_data.name);
    feature_data.name_count = name.size() + 1;
+   if (feature_data.wkb) delete [](feature_data.wkb);
    feature_data.wkb = new uint8_t[wkb.size()];
+   assert(feature_data.wkb);
    feature_data.wkb_count = wkb.size();
+   if (feature_data.attrib) free(feature_data.attrib);
    feature_data.attrib = strdup(attrib.c_str());
+   assert(feature_data.attrib);
    feature_data.attrib_count = attrib.size() + 1;
    ///TODO: Make more efficient
***************
*** 277,297 ****
  FeatureDataHolder::~FeatureDataHolder()
  {
! //   if (feature_data.wkb)
! //   {
! //     delete[] feature_data.wkb;
! //   }
  }
  
  const player_vectormap_layer_data_t* LayerDataHolder::Convert()
  {
    layer_data.name = strdup(name.c_str());
    layer_data.name_count = name.size()+1;
    layer_data.features_count = features.size();
!   layer_data.features = new player_vectormap_feature_data_t[features.size()];
!   for (uint32_t ii=0; ii<features.size(); ++ii)
    {
!     layer_data.features[ii] = *(features[ii].Convert());
    }
-   
    return &layer_data;
  }
--- 412,441 ----
  FeatureDataHolder::~FeatureDataHolder()
  {
!    if (feature_data.name) free(feature_data.name);
!    if (feature_data.attrib) free(feature_data.attrib);
!    if (feature_data.wkb)
!    {
!      delete[] feature_data.wkb;
!    }
  }
  
  const player_vectormap_layer_data_t* LayerDataHolder::Convert()
  {
+   if (layer_data.name) free(layer_data.name);
    layer_data.name = strdup(name.c_str());
+   assert(layer_data.name);
    layer_data.name_count = name.size()+1;
    layer_data.features_count = features.size();
!   if (layer_data.features) delete [](layer_data.features);
!   layer_data.features = NULL;
!   if (layer_data.features_count > 0)
    {
!     layer_data.features = new 
player_vectormap_feature_data_t[layer_data.features_count];
!     assert(layer_data.features);
!     for (uint32_t ii=0; ii<layer_data.features_count; ++ii)
!     {
!       layer_data.features[ii] = *(features[ii].Convert());
!     }
    }
    return &layer_data;
  }
***************
*** 299,306 ****
  LayerDataHolder::~LayerDataHolder()
  {
!   free(layer_data.name);
! //   if (layer_data.features)
! //   {
! //     delete[] layer_data.features;
! //   }
  }
--- 443,450 ----
  LayerDataHolder::~LayerDataHolder()
  {
!   if (layer_data.name) free(layer_data.name);
!   if (layer_data.features)
!   {
!      delete[] layer_data.features;
!   }
  }

Index: dbconn.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/server/drivers/vectormap/dbconn.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** dbconn.h    7 Dec 2007 04:31:45 -0000       1.5
--- dbconn.h    15 Feb 2008 08:42:37 -0000      1.6
***************
*** 7,10 ****
--- 7,12 ----
  #include <vector>
  #include <string>
+ #include <cstring>
+ #include <cstddef>
  
  #define MAX_PSQL_STRING 256
***************
*** 20,29 ****
  {
    public:
!     FeatureDataHolder(){};
!     ~FeatureDataHolder();
      FeatureDataHolder(string name)
!     { 
        this->name = name;
!     };
  
      const player_vectormap_feature_data_t* Convert();
--- 22,46 ----
  {
    public:
!     FeatureDataHolder() { memset(&feature_data, 0, sizeof feature_data); }
!     FeatureDataHolder(const FeatureDataHolder & orig)
!     {
!       memset(&feature_data, 0, sizeof feature_data);
!       name = orig.name;
!       wkb = orig.wkb;
!       attrib = orig.attrib;
!     }
!     virtual ~FeatureDataHolder();
      FeatureDataHolder(string name)
!     {
!       memset(&feature_data, 0, sizeof feature_data);
        this->name = name;
!     }
!     FeatureDataHolder(const player_vectormap_feature_data_t * feature)
!     {
!       memset(&feature_data, 0, sizeof feature_data);
!       name = string(feature->name);
!       attrib = string(feature->attrib);
!       wkb.assign(feature->wkb, (feature->wkb) + (feature->wkb_count));
!     }
  
      const player_vectormap_feature_data_t* Convert();
***************
*** 38,50 ****
  {
    public:
!     LayerInfoHolder(){memset(&layer_info,0,sizeof(layer_info));};
      LayerInfoHolder(string name)
      {
        this->name = name;
-       layer_info.name = strdup(name.c_str());
-       layer_info.name_count = name.size() +1;
        memset(&extent, 0, sizeof(extent));
      };
!     ~LayerInfoHolder()
      {
        free(layer_info.name);
--- 55,72 ----
  {
    public:
!     LayerInfoHolder() { memset(&layer_info,0,sizeof(layer_info)); 
memset(&extent, 0, sizeof(extent)); };
!     LayerInfoHolder(const LayerInfoHolder & orig)
!     {
!       memset(&layer_info,0,sizeof(layer_info));
!       name = orig.name;
!       extent = orig.extent;
!     }
      LayerInfoHolder(string name)
      {
+       memset(&layer_info,0,sizeof(layer_info));
        this->name = name;
        memset(&extent, 0, sizeof(extent));
      };
!     virtual ~LayerInfoHolder()
      {
        free(layer_info.name);
***************
*** 61,73 ****
  {
    public:
!     LayerDataHolder(){memset(&layer_data,0,sizeof(layer_data));};
      LayerDataHolder(string name)
      {
        memset(&layer_data,0,sizeof(layer_data));
        this->name = name;
!       layer_data.name = strdup(name.c_str());
!       layer_data.name_count = name.size() +1;
!     };
!     ~LayerDataHolder();
  
      const player_vectormap_layer_data_t* Convert();
--- 83,109 ----
  {
    public:
!     LayerDataHolder() { memset(&layer_data, 0, sizeof layer_data); }
!     LayerDataHolder(const LayerDataHolder & orig)
!     {
!       memset(&layer_data, 0, sizeof layer_data);
!       name = orig.name;
!       features = orig.features;
!     }
      LayerDataHolder(string name)
      {
        memset(&layer_data,0,sizeof(layer_data));
        this->name = name;
!     }
!     LayerDataHolder(const player_vectormap_layer_data_t * layer)
!     {
!       memset(&layer_data, 0, sizeof layer_data);
!       name = string(layer->name);
!       for (uint32_t ii = 0; ii < layer->features_count; ii++)
!       {
!         FeatureDataHolder fd(&(layer->features[ii]));
!         features.push_back(fd);
!       }
!     }
!     virtual ~LayerDataHolder();
  
      const player_vectormap_layer_data_t* Convert();
***************
*** 81,87 ****
  {
    public:
!     VectorMapInfoHolder(){};
!     ~VectorMapInfoHolder();
!     VectorMapInfoHolder(uint32_t srid, BoundingBox extent) { this->srid = 
srid; this->extent = extent; };
  
      const player_vectormap_info_t* Convert();
--- 117,132 ----
  {
    public:
!     VectorMapInfoHolder() { memset(&info, 0, sizeof info); memset(&extent, 0, 
sizeof extent); };
!     VectorMapInfoHolder(const VectorMapInfoHolder & orig)
!     {
!       memset(&info, 0, sizeof info);
!       srid = orig.srid; layers = orig.layers; extent = orig.extent;
!     }
!     virtual ~VectorMapInfoHolder();
!     VectorMapInfoHolder(uint32_t srid, BoundingBox extent)
!     {
!       this->srid = srid; this->extent = extent;
!       memset(&info, 0, sizeof info);
!     };
  
      const player_vectormap_info_t* Convert();
***************
*** 97,112 ****
    public:
      PostgresConn(){ conn = NULL; };
!     ~PostgresConn(){ if (Connected()) Disconnect(); };
      bool Connect(const char* dbname, const char* host, const char* user, 
const char* password, const char* port);
      bool Disconnect();
      bool Connected() { return (conn != NULL) && (PQstatus(conn) != 
CONNECTION_BAD); };
-     const char* ErrorMessage() { return strdup(PQerrorMessage(conn)); };
  
      VectorMapInfoHolder GetVectorMapInfo(vector<string> layerNames);
      LayerInfoHolder GetLayerInfo(const char *layer_name);
      LayerDataHolder GetLayerData(const char *layer_name);
  
    private:
      BoundingBox BinaryToBBox(const uint8_t *binary, uint32_t length);
      PGconn *conn;
  
--- 142,158 ----
    public:
      PostgresConn(){ conn = NULL; };
!     virtual ~PostgresConn(){ if (Connected()) Disconnect(); };
      bool Connect(const char* dbname, const char* host, const char* user, 
const char* password, const char* port);
      bool Disconnect();
      bool Connected() { return (conn != NULL) && (PQstatus(conn) != 
CONNECTION_BAD); };
  
      VectorMapInfoHolder GetVectorMapInfo(vector<string> layerNames);
      LayerInfoHolder GetLayerInfo(const char *layer_name);
      LayerDataHolder GetLayerData(const char *layer_name);
+     int WriteLayerData(LayerDataHolder & data);
  
    private:
      BoundingBox BinaryToBBox(const uint8_t *binary, uint32_t length);
+     uint32_t Text2Bin(const char * text, unsigned char * bin, uint32_t 
maxlen);
      PGconn *conn;
  

Index: postgis.cc
===================================================================
RCS file: /cvsroot/playerstage/code/player/server/drivers/vectormap/postgis.cc,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** postgis.cc  6 Feb 2008 18:46:03 -0000       1.8
--- postgis.cc  15 Feb 2008 08:42:37 -0000      1.9
***************
*** 71,75 ****
    dbname "gis"
    host "192.168.0.2"
!   port "5433"
    user "postgres"
    password "secret"
--- 71,75 ----
    dbname "gis"
    host "192.168.0.2"
!   port "5432"
    user "postgres"
    password "secret"
***************
*** 112,116 ****
  
  #include <sys/types.h> // required by Darwin
! #include <stdlib.h>
  #include <libplayercore/playercore.h>
  #include <libplayercore/error.h>
--- 112,121 ----
  
  #include <sys/types.h> // required by Darwin
! #include <cstdlib>
! #include <cstddef>
! #include <cstdio>
! #include <cstdarg>
! #include <string>
! #include <vector>
  #include <libplayercore/playercore.h>
  #include <libplayercore/error.h>
***************
*** 119,123 ****
  #include <geos_c.h>
  #endif
! #include <stdarg.h>
  
  /** Dummy function passed as a function pointer GEOS when it is initialised. 
GEOS uses this for logging. */
--- 124,129 ----
  #include <geos_c.h>
  #endif
! 
! using namespace std;
  
  /** Dummy function passed as a function pointer GEOS when it is initialised. 
GEOS uses this for logging. */
***************
*** 143,147 ****
              const char* password,
              const char* port,
!             vector<string> layerNames);
      ~PostGIS();
      int Setup();
--- 149,153 ----
              const char* password,
              const char* port,
!             vector<string> & layerNames);
      ~PostGIS();
      int Setup();
***************
*** 210,214 ****
                   const char* password,
                   const char* port,
!                  vector<string> layerNames)
    : Driver(cf, section, true, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, 
PLAYER_VECTORMAP_CODE)
  {
--- 216,220 ----
                   const char* password,
                   const char* port,
!                  vector<string> & layerNames)
    : Driver(cf, section, true, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, 
PLAYER_VECTORMAP_CODE)
  {
***************
*** 220,224 ****
    this->layerNames = layerNames;
    this->conn = NULL;
! 
  }
  
--- 226,234 ----
    this->layerNames = layerNames;
    this->conn = NULL;
! #ifdef HAVE_GEOS
!   PLAYER_MSG0(2, "Initialising GEOS");
!   initGEOS(geosprint, geosprint);
!   PLAYER_MSG0(2, "GEOS Initialised");
! #endif
  }
  
***************
*** 226,229 ****
--- 236,243 ----
  PostGIS::~PostGIS()
  {
+ #ifdef HAVE_GEOS
+   PLAYER_MSG0(2, "Shutting down GEOS");
+   finishGEOS();
+ #endif
    /*if (conn != NULL && conn->Connected())
    {
***************
*** 244,253 ****
    PLAYER_MSG0(2, "PostGIS vectormap initialising");
  
- #ifdef HAVE_GEOS
-   PLAYER_MSG0(2, "Initialising GEOS");
-   initGEOS(geosprint, geosprint);
-   PLAYER_MSG0(2, "GEOS Initialised");
- #endif
- 
    conn = new PostgresConn();
    conn->Connect(dbname, host, user, password, port);
--- 258,261 ----
***************
*** 256,260 ****
    {
      PLAYER_ERROR("Could not connect to Postgres database!");
-     PLAYER_ERROR1("%s",conn->ErrorMessage());
      return(1);
    }
--- 264,267 ----
***************
*** 277,287 ****
    {
      delete conn;
!     //conn == NULL;
    }
!   
! #ifdef HAVE_GEOS
!   PLAYER_MSG0(2, "Shutting down GEOS");
!   finishGEOS();
! #endif
    PLAYER_MSG0(2, "PostGIS vectormap stopped");
    return(0);
--- 284,290 ----
    {
      delete conn;
!     conn = NULL;
    }
! 
    PLAYER_MSG0(2, "PostGIS vectormap stopped");
    return(0);
***************
*** 306,312 ****
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_GET_MAP_INFO,
!                   (void*)response,
!                   0,
!                   NULL);
      return(0);
    }
--- 309,313 ----
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_GET_MAP_INFO,
!                   (void*)response);
      return(0);
    }
***************
*** 323,329 ****
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_GET_LAYER_DATA,
!                   (void*)response,
!                   0,
!                   NULL);
  
      return(0);
--- 324,328 ----
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_GET_LAYER_DATA,
!                   (void*)response);
  
      return(0);
***************
*** 341,347 ****
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_WRITE_LAYER,
!                   (void*)request,
!                   0,
!                   NULL);
      return(0);
    }
--- 340,344 ----
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_VECTORMAP_REQ_WRITE_LAYER,
!                   (void*)request);
      return(0);
    }
***************
*** 388,391 ****
  void PostGIS::RequestLayerWrite(player_vectormap_layer_data_t* data)
  {
!   return;
  }
--- 385,397 ----
  void PostGIS::RequestLayerWrite(player_vectormap_layer_data_t* data)
  {
!   if (conn == NULL || conn->Connected() == false)
!   {
!     PLAYER_ERROR("PostGis::WriteLayerData() failed! No db connection.");
!   }
! 
!   LayerDataHolder layer(data);
!   if (conn->WriteLayerData(layer))
!   {
!     PLAYER_ERROR("PostGis::WriteLayerData() failed!");
!   }
  }


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to