Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members  

fmapsimportmifmid.c

Go to the documentation of this file.
00001 /* fmapsimportmifmid.c - Import/Export MIF/MID library of FMaps
00002  *
00003  * Copyright (C) 2000  Franck Martin <franck@sopac.org>
00004  *
00005  * This Program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  *
00010  * This Program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Library General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public
00016  * License along with this Program; if not, write to the
00017  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018  * Boston, MA 02111-1307, USA.
00019  */
00020 
00021 /*
00022  * Modified by the FMaps Team and others 2000.  See the AUTHORS
00023  * file for a list of people on the FMaps Team.  See the ChangeLog
00024  * files for a list of changes.  These files are distributed with
00025  * FMaps at http://FMaps.sourceforge.net/.
00026  */
00027 
00028 #include <math.h>
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <gnome.h>
00032 #include "fmaps.h"
00033 
00034 #define MAXLINE 8192  /* Maximum size to read a line in a file */
00035 
00036 /* MIF/MID Objects */
00037 #define MIF_NONE        0
00038 #define MIF_POINT       1
00039 #define MIF_LINE        2
00040 #define MIF_PLINE       3
00041 #define MIF_REGION      4
00042 #define MIF_ARC         5
00043 #define MIF_TEXT        6
00044 #define MIF_RECT        7
00045 #define MIF_ROUND_RECT  8
00046 #define MIF_ELLIPSE     9
00047 
00048 /* MIF/MID Types */
00049 #define MID_UNKNOWN     0
00050 #define MID_INTEGER     1
00051 #define MID_SMALLINT    2
00052 #define MID_FLOAT       3
00053 #define MID_DATE        4
00054 #define MID_LOGICAL     5
00055 #define MID_CHAR        6
00056 #define MID_DECIMAL     7
00057 
00058 void FM_Import_MIFMID(PGconn* conn,const char *name)
00059 {
00060   gchar *buffer;
00061   gchar *buffer2;
00062   gchar *buffer3;
00063   gchar *buffer4;
00064   gchar **col;
00065   gint *coltype=NULL;
00066   gint colobj=0;
00067   PGresult *qryResult;
00068   FILE *miffile;
00069   FILE *midfile;
00070   gint i;
00071   gint j;
00072   gint nbtuples;
00073 
00074   gchar *fieldname;
00075   gchar *fieldtype;
00076   gchar *tablestruct=NULL;
00077   gchar *tablefield=NULL;
00078   gchar *tablename;
00079 
00080   gchar *mifVersion;
00081   gchar *mifCharset;
00082   gint nbColumns=0;
00083   gint charlen;
00084   gchar *delimiter=NULL;
00085   gchar *oid;
00086 
00087   gboolean nextline;
00088   gboolean found;
00089 
00090   gdouble dblx=0;
00091   gdouble dbly=0;
00092 
00093   Point *points=NULL;
00094   gint npoints=0;
00095 
00096   g_return_if_fail (conn!=NULL);
00097   g_return_if_fail (name!=NULL);
00098 
00099   gnome_app_flash (GNOME_APP(Fmaps), "Importing MIFMID");
00100 
00101   buffer=g_strndup(name,strlen(name)-4);
00102   buffer2=g_strconcat(buffer,".MID",NULL);
00103 
00104   tablename=g_strdup(g_basename(buffer));
00105 
00106   g_warning("%s",tablename);
00107 
00108   g_warning("%s %s",name,buffer2);
00109   miffile=fopen(name,"r");
00110   midfile=fopen(buffer2,"r");
00111 
00112   g_free(buffer);
00113   g_free(buffer2);
00114 
00115   buffer=g_malloc0(255);
00116   /* Analyse MIF */
00117   fscanf(miffile,"%s\n",buffer);
00118   /* wrong format */
00119   g_strup(buffer);
00120   if (g_str_equal(buffer,"VERSION"))
00121   {
00122         fscanf(miffile,"%s\n",buffer);
00123         g_strup(buffer);
00124         g_warning("%s",buffer);
00125         mifVersion=g_strstrip(buffer);  
00126   } else
00127   {
00128         g_warning("%s",buffer);
00129         FM_MessageBox("This is not a MIF file");
00130         return;
00131   }
00132 
00133   fscanf(miffile,"%s\n",buffer);
00134   g_strup(buffer);
00135   /* get Charset */
00136   if (g_str_equal(buffer,"CHARSET"))
00137   {
00138         fscanf(miffile,"%s\n",buffer);
00139         g_strup(buffer);
00140         mifCharset=g_strstrip(buffer);
00141         g_warning("CHARSET:%s",buffer);
00142         fscanf(miffile,"%s\n",buffer);
00143         g_strup(buffer);
00144   }
00145   /* get DELIMITER */
00146   if (g_str_equal(buffer,"DELIMITER"))
00147   {
00148         fscanf(miffile,"%s\n",buffer);
00149         g_warning("DELIMITER:%s",buffer);
00150         delimiter=g_strndup(buffer+1,1);
00151         fscanf(miffile,"%s\n",buffer);
00152         g_strup(buffer);
00153   }
00154   /* get UNIQUE */
00155   if (g_str_equal(buffer,"UNIQUE"))
00156   {
00157         fscanf(miffile,"%s\n",buffer);
00158         g_warning("UNIQUE:%s",buffer);
00159         fscanf(miffile,"%s\n",buffer);
00160         g_strup(buffer);
00161   }
00162   /* get INDEX */
00163   if (g_str_equal(buffer,"INDEX"))
00164   {
00165         fscanf(miffile,"%s\n",buffer);
00166         g_warning("INDEX:%s",buffer);
00167         fscanf(miffile,"%s\n",buffer);
00168         g_strup(buffer);
00169   }
00170   /* get COORDSYS */
00171   if (g_str_equal(buffer,"COORDSYS"))
00172   {
00173         fscanf(miffile,"%s\n",buffer);
00174         g_strup(buffer);
00175         g_warning("COORDSYS:%s",buffer);
00176         if (g_str_equal(buffer,"EARTH"))
00177         {
00178           buffer=fgets(buffer,255,miffile);
00179         } else
00180         {
00181           buffer=fgets(buffer,255,miffile);
00182         }
00183         fscanf(miffile,"%s\n",buffer);
00184         g_strup(buffer);
00185   }
00186   /* get TRANSFORM */
00187   if (g_str_equal(buffer,"TRANSFORM"))
00188   {
00189         fscanf(miffile,"%s\n",buffer);
00190         g_warning("TRANSFORM:%s",buffer);
00191         fscanf(miffile,"%s\n",buffer);
00192         g_strup(buffer);
00193   }
00194   /* get COLUMNS */
00195   if (g_str_equal(buffer,"COLUMNS"))
00196   {
00197         fscanf(miffile,"%s\n",buffer);
00198         nbColumns=atoi(buffer);
00199         g_warning("COLUMNS:%d",nbColumns);
00200         
00201         tablestruct=g_strdup_printf("CREATE TABLE %s ( ",tablename);
00202         tablefield=g_strdup(" (");
00203         
00204         coltype=g_malloc(sizeof(gint)*nbColumns);
00205         
00206         for(i=1;i<=nbColumns;i++)
00207         {
00208         
00209           fscanf(miffile,"%s\n",buffer);
00210           fieldname=g_strdup(buffer);
00211           fscanf(miffile,"%s\n",buffer);
00212           g_strup(buffer);
00213         
00214           if (g_str_equal(buffer,"INTEGER"))
00215           {
00216             fieldtype=g_strdup("INT4");
00217             coltype[i-1]=MID_INTEGER;
00218           } else if (g_str_equal(buffer,"SMALLINT"))
00219           {
00220             fieldtype=g_strdup("INT2");
00221             coltype[i-1]=MID_SMALLINT;
00222           } else if (g_str_equal(buffer,"FLOAT"))
00223           {
00224             fieldtype=g_strdup("FLOAT8");
00225             coltype[i-1]=MID_FLOAT;
00226           } else if (g_str_equal(buffer,"DATE"))
00227           {
00228             fieldtype=g_strdup("DATE");
00229             coltype[i-1]=MID_DATE;
00230           } else if (g_str_equal(buffer,"LOGICAL"))
00231           {
00232             fieldtype=g_strdup("BOOLEAN");
00233             coltype[i-1]=MID_LOGICAL;
00234           } else if (g_strncasecmp(buffer,"CHAR",4)==0)
00235           {
00236             charlen=1;
00237             for(j=0;j<strlen(buffer);j++)
00238             {
00239               if ((gchar)(buffer[j])=='(')
00240               {
00241                 charlen=atoi(&buffer[j+1]);
00242                 break;
00243               }
00244             }
00245             fieldtype=g_strdup_printf("VARCHAR(%d)",charlen);
00246             coltype[i-1]=MID_CHAR;
00247           } else if (g_strncasecmp(buffer,"DECIMAL",7)==0)
00248           {
00249             fieldtype=g_strdup("FLOAT8");
00250             buffer=fgets(buffer,255,miffile);
00251             coltype[i-1]=MID_DECIMAL;
00252           } else
00253           {
00254             fieldtype=g_strdup("INT2");
00255             coltype[i-1]=MID_UNKNOWN;
00256           }
00257         
00258           buffer2=g_strdup(tablestruct);
00259           buffer3=g_strdup(tablefield);
00260           g_free(tablestruct);
00261           g_free(tablefield);
00262           if (i==nbColumns)
00263           {
00264             tablestruct=g_strconcat(buffer2," ",fieldname, " ",fieldtype,") ",NULL);
00265             tablefield= g_strconcat(buffer3," ",fieldname, ") ",NULL);
00266           } else
00267           {
00268             tablestruct=g_strconcat(buffer2," ",fieldname, " ",fieldtype,", ",NULL);
00269             tablefield=g_strconcat(buffer3," ",fieldname, ", ",NULL);
00270           }
00271           g_free(buffer2);
00272           g_free(buffer3);
00273           g_free(fieldtype);
00274           g_free(fieldname);
00275         }
00276         
00277         g_warning("%s",tablestruct);
00278         g_warning("%s",tablefield);
00279                 
00280         /* drop the table first*/
00281         buffer2=g_strdup_printf("DROP TABLE %s",tablename);
00282         qryResult = PQexec(conn,buffer2);
00283         g_free(buffer2);
00284         PQclear(qryResult);
00285 
00286         /* create the table */
00287         qryResult = PQexec(conn,tablestruct);
00288         PQclear(qryResult);
00289 
00290         /*remove the reference in the metadata it will be added at the end*/
00291                 buffer2=g_strdup_printf("select OID FROM f_catalogue WHERE meta_file_id='%s'",tablename);
00292                 qryResult = PQexec(conn,buffer2);
00293                 nbtuples = PQntuples(qryResult);
00294     oid=NULL;
00295     if (nbtuples>0)
00296     {
00297                   oid = g_strdup(PQgetvalue(qryResult,0,0));
00298                  }
00299                 g_free(buffer2);
00300                 PQclear(qryResult);     
00301           
00302   
00303                 buffer2=g_strdup_printf("DELETE FROM f_catalogue WHERE meta_file_id='%s'",tablename);
00304                 qryResult = PQexec(conn,buffer2);
00305                 g_free(buffer2);
00306                 PQclear(qryResult);     
00307 
00308           if (!(oid==NULL))
00309           {
00310                 buffer2=g_strdup_printf("DELETE FROM f_catalogue_spatial_rep_type_code WHERE CID=%s",oid);
00311                 qryResult = PQexec(conn,buffer2);
00312                 g_free(buffer2);
00313                 PQclear(qryResult);             
00314           }
00315                         
00316         fscanf(miffile,"%s\n",buffer);
00317         g_strup(buffer);
00318   }
00319   /* get DATA */
00320   if (g_str_equal(buffer,"DATA"))
00321   {
00322         g_warning("DATA");
00323         fscanf(miffile,"%s\n",buffer);
00324         g_strup(buffer);
00325   }
00326 
00327   /* create the geographic table as it does not exists */
00328   /* drop it first for security */
00329   buffer2=g_strdup_printf("DROP TABLE f_geo_%s",tablename);
00330   qryResult = PQexec(conn,buffer2);
00331   PQclear(qryResult);
00332   g_free(buffer2);
00333         
00334   /* then create it */
00335   buffer2=g_strdup_printf("CREATE TABLE f_geo_%s %s",tablename,F_GEO_TABLE);
00336   qryResult = PQexec(conn,buffer2);
00337   g_warning("%s",buffer2);
00338   PQclear(qryResult);
00339   g_free(buffer2);
00340 
00341   while (!feof(miffile))
00342   {
00343     nextline=TRUE;
00344     found=FALSE;
00345     colobj=MIF_NONE;
00346     if (g_str_equal(buffer,"NONE"))
00347     {
00348       found=TRUE;
00349       colobj=MIF_NONE;
00350     } else if (g_str_equal(buffer,"POINT"))
00351     {
00352       found=TRUE;
00353       colobj=MIF_POINT;
00354       fscanf(miffile,"%s\n",buffer);
00355       dblx=strtod(buffer,NULL);
00356 
00357       fscanf(miffile,"%s\n",buffer);
00358       dbly=strtod(buffer,NULL);
00359 
00360       fscanf(miffile,"%s\n",buffer);
00361       if (g_str_equal(buffer,"SYMBOL"))
00362       {
00363         buffer=fgets(buffer,255,miffile);
00364       } else
00365       {
00366         nextline=FALSE;
00367       }
00368     } else if (g_str_equal(buffer,"LINE"))
00369     {
00370       found=TRUE;
00371       colobj=MIF_LINE;
00372 
00373       npoints=2;
00374       points=g_new(Point,npoints);
00375       for (i=0;i<npoints;i++)
00376       {
00377         fscanf(miffile,"%s\n",buffer);
00378         points[i].x=strtod(buffer,NULL);
00379 
00380         fscanf(miffile,"%s\n",buffer);
00381         points[i].y=strtod(buffer,NULL);
00382       }
00383 
00384       fscanf(miffile,"%s\n",buffer);
00385       if (g_str_equal(buffer,"PEN"))
00386       {
00387         buffer=fgets(buffer,255,miffile);
00388       } else
00389       {
00390         nextline=FALSE;
00391       }
00392     } else if (g_str_equal(buffer,"PLINE"))
00393     {
00394       found=TRUE;
00395       colobj=MIF_PLINE;
00396 
00397       fscanf(miffile,"%s\n",buffer);
00398       npoints=strtod(buffer,NULL);
00399 
00400       points=g_new(Point,npoints);
00401 
00402       for (i=0;i<npoints;i++)
00403       {
00404         fscanf(miffile,"%s\n",buffer);
00405         points[i].x=strtod(buffer,NULL);
00406 
00407         fscanf(miffile,"%s\n",buffer);
00408         points[i].y=strtod(buffer,NULL);
00409       }
00410 
00411       fscanf(miffile,"%s\n",buffer);
00412       if (g_str_equal(buffer,"PEN"))
00413       {
00414         buffer=fgets(buffer,255,miffile);
00415       }
00416       if (g_str_equal(buffer,"SMOOTH"))
00417       {
00418         buffer=fgets(buffer,255,miffile);
00419       }
00420       nextline=FALSE;
00421     } else if (g_str_equal(buffer,"REGION"))
00422     {
00423       found=TRUE;
00424     } else if (g_str_equal(buffer,"ARC"))
00425     {
00426       found=TRUE;
00427     } else if (g_str_equal(buffer,"TEXT"))
00428     {
00429       found=TRUE;
00430     } else if (g_str_equal(buffer,"RECT"))
00431     {
00432       found=TRUE;
00433     } else if (g_str_equal(buffer,"ROUNDRECT"))
00434     {
00435       found=TRUE;
00436     } else if (g_str_equal(buffer,"ELLIPSE"))
00437     {
00438       found=TRUE;
00439     }
00440 
00441     /* read the data in MID file and store it in the table */
00442     if (found)
00443     {
00444       buffer2=g_malloc0(MAXLINE);
00445       buffer2=fgets(buffer2,MAXLINE,midfile);
00446       buffer3=g_strndup(buffer2,strlen(buffer2)-1);
00447 
00448       col=g_strsplit(buffer3,delimiter,nbColumns);
00449       g_free(buffer3);
00450       g_free(buffer2);
00451 
00452       /* remove the "" of strings */
00453       for(i=0;i<nbColumns;i++)
00454       {
00455         if (col[i][0]=='"')
00456         {
00457           buffer2=g_strdup(col[i]);
00458           g_free(col[i]);
00459           col[i]=g_strndup(buffer2+1,strlen(buffer2)-2);
00460           g_free(buffer2);
00461         }
00462       }
00463       /* prepare the sql statement to enter tuple data*/
00464       buffer2=g_strdup_printf("INSERT INTO %s %s VALUES ( ",tablename,tablefield);
00465       for (i=0;i<nbColumns;i++)
00466       {
00467         /* format the data in postgres format */
00468         buffer4=NULL;
00469         if (coltype[i]==MID_DATE)
00470         {
00471           if (g_str_equal(col[i],""))
00472           {
00473             buffer4=g_strdup("NULL");
00474           } else
00475           {
00476             buffer4=g_strdup(col[i]);
00477           }
00478         } else if (coltype[i]==MID_LOGICAL)
00479         {
00480           if (g_str_equal(col[i],"F"))
00481           {
00482             buffer4=g_strdup("'0'");
00483           } else
00484           {
00485             buffer4=g_strdup("'1'");
00486           }
00487         } else
00488         {
00489           buffer4=g_strconcat("'",col[i],"'",NULL);
00490         }
00491 
00492         buffer3=g_strconcat(buffer2,buffer4,NULL);
00493         g_free(buffer4);
00494         g_free(buffer2);
00495         if (i<nbColumns-1)
00496         {
00497           buffer2=g_strconcat(buffer3,",",NULL);
00498         } else
00499         {
00500           buffer2=g_strdup(buffer3);
00501         }
00502         g_free(buffer3);
00503       }
00504       buffer3=g_strconcat(buffer2,")",NULL);
00505       g_free(buffer2);
00506 
00507       /* insert the data */
00508       qryResult = PQexec(conn,buffer3);
00509       oid=g_strdup(PQoidStatus(qryResult));
00510       
00511       /* debug */
00512       if (!(g_str_equal(PQresultErrorMessage(qryResult),"")))
00513       {
00514         g_warning("%s : %s",buffer3, PQresultErrorMessage(qryResult));
00515       }
00516       
00517       g_free(buffer3);
00518       PQclear(qryResult);
00519 
00520 
00521 
00522       /* now we have the oid and we insert the geodata depending of the object*/
00523       if (colobj==MIF_POINT)
00524       {
00525         /* insert point data */
00526 
00527         buffer2=g_strdup_printf("INSERT INTO f_geo_%s (%s) VALUES(%s, 1, 0, 0, 0, 0, 0, 0, NULL, NULL, 'POINT (%f, %f, 0)',NULL ,NULL )", tablename, F_GEO_TABLE_FIELD, oid, dblx, dbly);
00528         qryResult = PQexec(conn,buffer2);
00529         
00530         /* debug */
00531         if (!(g_str_equal(PQresultErrorMessage(qryResult),"")))
00532         {
00533           g_warning("%s : %s",buffer2, PQresultErrorMessage(qryResult));
00534         }
00535         PQclear(qryResult);
00536         g_free(buffer2);
00537         
00538       }
00539       if (colobj==MIF_LINE || colobj==MIF_PLINE)
00540       {
00541         /* insert line data */
00542         buffer4=g_strdup("");
00543         for (i=0;i<npoints;i++)
00544         {
00545           buffer3=g_strdup_printf("%s (%f, %f, 0)",buffer4,points[i].x,points[i].y);
00546           g_free(buffer4);
00547           buffer4=g_strdup(buffer3);
00548           g_free(buffer3);
00549         }
00550 
00551         buffer2=g_strdup_printf("INSERT INTO f_geo_%s (%s) VALUES(%s, 1, 0, 0, 0, 0, 0, 0, NULL, NULL, 'POLYLINE%s', NULL, NULL)",tablename,F_GEO_TABLE_FIELD,oid,buffer4);
00552         qryResult = PQexec(conn,buffer2);
00553 
00554         g_free(buffer4);
00555         g_free(points);
00556         
00557         /* debug */
00558         if (!(g_str_equal(PQresultErrorMessage(qryResult),"")))
00559         {
00560           g_warning("%s : %s",buffer2, PQresultErrorMessage(qryResult));
00561         }
00562         PQclear(qryResult);
00563         g_free(buffer2);
00564         
00565       }
00566 
00567 
00568       /* clean up */
00569       g_free(oid);
00570       for(i=0;i<=nbColumns;i++)
00571       {
00572         g_free(col[i]);
00573       }
00574      g_free(col);
00575      }
00576 
00577     /* read next string if needed */
00578     if (nextline)
00579     {
00580       fscanf(miffile,"%s\n",buffer);
00581       g_strup(buffer);
00582     }
00583   }
00584 
00585   /* reference the table in the metadata */
00586 
00587   buffer2=g_strdup_printf("INSERT INTO f_catalogue (meta_file_id,series) VALUES ('%s','coasts')",tablename);
00588   qryResult = PQexec(conn,buffer2);
00589   g_free(buffer2);
00590   PQclear(qryResult);
00591 
00592         oid=g_strdup(PQoidStatus(qryResult));
00593   
00594   buffer2=g_strdup_printf("INSERT INTO f_catalogue_spatial_rep_type_code (CID,spatial_rep_type_code) VALUES (%s,2)",oid);
00595   qryResult = PQexec(conn,buffer2);
00596   g_free(buffer2);
00597   PQclear(qryResult);
00598   
00599   g_free(oid);
00600 
00601   /* cleaning */
00602 
00603   g_free(buffer);
00604   g_free(delimiter);
00605 
00606   g_free(tablefield);
00607   g_free(tablestruct);
00608 
00609   g_free(tablename);
00610 
00611   g_free(coltype);
00612 
00613   fclose(midfile);
00614   fclose(miffile);
00615 
00616 
00617 
00618   gnome_app_flash (GNOME_APP(Fmaps), "Importing MIFMID Completed");
00619 
00620   return;
00621 }

Generated at Sat Jan 6 20:55:33 2001 for FMaps by doxygen1.2.1 written by Dimitri van Heesch, © 1997-2000