00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019
00020
00021 00022 00023 00024 00025 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
00035
00036
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
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
00117 fscanf(miffile,"%s\n",buffer);
00118
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
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
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
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
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
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
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
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
00281 buffer2=g_strdup_printf("DROP TABLE %s",tablename);
00282 qryResult = PQexec(conn,buffer2);
00283 g_free(buffer2);
00284 PQclear(qryResult);
00285
00286
00287 qryResult = PQexec(conn,tablestruct);
00288 PQclear(qryResult);
00289
00290
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
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
00328
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
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
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
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
00464 buffer2=g_strdup_printf("INSERT INTO %s %s VALUES ( ",tablename,tablefield);
00465 for (i=0;i<nbColumns;i++)
00466 {
00467
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
00508 qryResult = PQexec(conn,buffer3);
00509 oid=g_strdup(PQoidStatus(qryResult));
00510
00511
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
00523 if (colobj==MIF_POINT)
00524 {
00525
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
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
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
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
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
00578 if (nextline)
00579 {
00580 fscanf(miffile,"%s\n",buffer);
00581 g_strup(buffer);
00582 }
00583 }
00584
00585
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
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 }