dbmscap.c

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <stdlib.h>
00004 #include <dirent.h>
00005 #include <unistd.h>
00006 #include <grass/dbmi.h>
00007 #include <grass/gis.h>
00008 
00009 static
00010 char *dbmscap_files[] = {
00011     "/etc/dbmscap",
00012     "/lib/dbmscap",
00013     "/usr/lib/dbmscap",
00014     "/usr/local/lib/dbmscap",
00015     "/usr/local/dbmi/lib/dbmscap",
00016     NULL };
00017 
00018 extern char *getenv();
00019 static void add_entry();
00020 
00021 static char *
00022 dbmscap_filename(err_flag)
00023 {
00024     char *file;
00025     int i;
00026 
00027     file = getenv ("DBMSCAP");
00028     if (file)
00029         return file;
00030 
00031     for (i = 0; file = dbmscap_files[i]; i++)
00032     {
00033         if (access (file, 0) == 0)
00034             return file;
00035     }
00036     if(err_flag)
00037         db_error ("DBMSCAP not set");
00038     return ((char *)NULL);
00039 }
00040 
00047 char *
00048 db_dbmscap_filename()
00049 {
00050     return dbmscap_filename(1);
00051 }
00052 
00059 int
00060 db_has_dbms()
00061 {
00062     return (dbmscap_filename(0) != NULL);
00063 }
00064 
00071 void
00072 db_copy_dbmscap_entry (dbDbmscap *dst, dbDbmscap *src)
00073 
00074 {
00075     strcpy (dst->driverName, src->driverName);
00076     strcpy (dst->comment, src->comment);
00077     strcpy (dst->startup, src->startup);
00078 }
00079 
00086 /* dbmscap file was used in grass5.0 but it is not used in
00087  * grass5.7 until we find it necessary. All code for dbmscap
00088  * file is commented here. 
00089  *
00090  * Instead of in dbmscap file db_read_dbmscap() searches 
00091  * for available dbmi drivers in $(GISBASE)/driver/db/  */ 
00092 
00093 dbDbmscap *
00094 db_read_dbmscap()
00095 {
00096     /*  
00097     FILE *fd;
00098     char *file;
00099     char name[1024];
00100     char startup[1024];
00101     char comment[1024];
00102     int  line;
00103     */
00104     char   buf[1024];
00105     char   *dirpath;
00106     DIR    *dir;        
00107     struct dirent *ent; 
00108 
00109     dbDbmscap *list = NULL;
00110 
00111 /* START OF OLD CODE FOR dbmscap FILE - NOT USED, BUT KEEP IT FOR FUTURE */
00112     /* get the full name of the dbmscap file */
00113     /*
00114     file = db_dbmscap_filename();
00115     if (file == NULL)
00116         return (dbDbmscap *) NULL;
00117     */
00118     
00119     /* open the dbmscap file */
00120     /*
00121     fd = fopen (file, "r");
00122     if (fd == NULL)
00123     {
00124         db_syserror (file);
00125         return (dbDbmscap *) NULL;
00126     }
00127     */ 
00128     
00129     /* find all valid entries
00130      * blank lines and lines with # as first non blank char are ignored
00131      * format is:
00132      *   driver name:startup command:comment
00133      */
00134     /*
00135     for (line = 1; fgets (buf, sizeof buf, fd); line++)
00136     {
00137         if (sscanf (buf, "%1s", comment) != 1 || *comment == '#')
00138             continue;
00139         if (sscanf (buf, "%[^:]:%[^:]:%[^:\n]", name, startup, comment) == 3)
00140             add_entry (&list, name, startup, comment);
00141         else if (sscanf (buf, "%[^:]:%[^:\n]", name, startup) == 2)
00142             add_entry (&list, name, startup, "");
00143         else
00144         {
00145             fprintf (stderr, "%s: line %d: invalid entry\n", file, line);
00146             fprintf (stderr,"%d:%s\n", line, buf);
00147         }
00148         if (list == NULL)
00149             break;
00150     }
00151     fclose (fd);
00152     */
00153 /* END OF OLD CODE FOR dbmscap FILE */
00154 
00155 /* START OF NEW CODE FOR SEARCH IN $(GISBASE)/driver/db/ */
00156     
00157     /* opend db drivers directory */
00158 #ifdef __MINGW32__
00159     dirpath = G_malloc ( strlen("\\driver\\db\\") + strlen(G_gisbase()) + 1 );
00160     sprintf ( dirpath, "%s\\driver\\db\\", G_gisbase());
00161 #else
00162     G_asprintf (&dirpath, "%s/driver/db/", G_gisbase());
00163 #endif
00164 
00165     G_debug ( 2, "opendir %s\n", dirpath );
00166     dir = opendir(dirpath);
00167     if (dir == NULL)
00168     {
00169         db_syserror ("Cannot open drivers directory");
00170         return (dbDbmscap *) NULL;
00171     }
00172     G_free (dirpath);
00173     
00174     /* read all drivers */
00175     while ( ent = readdir (dir) )
00176       {
00177         char *name;
00178 
00179         if ( (strcmp (ent->d_name, ".") == 0) 
00180             || (strcmp (ent->d_name, "..") == 0) ) continue;    
00181 
00182         /* Remove '.exe' from name (windows extension) */
00183         name = G_str_replace ( ent->d_name, ".exe", "" );
00184         
00185 #ifdef __MINGW32__
00186         dirpath = G_malloc ( strlen("\\driver\\db\\") 
00187                   + strlen(G_gisbase()) + strlen(ent->d_name) + 1 );
00188         sprintf ( dirpath, "%s\\driver\\db\\%s", G_gisbase(), ent->d_name);
00189 #else
00190         G_asprintf (&dirpath, "%s/driver/db/%s", G_gisbase(),ent->d_name);
00191 #endif
00192         add_entry (&list, name, dirpath, "");
00193         G_free (name);
00194         G_free (dirpath);
00195       }
00196     
00197     closedir (dir);
00198 
00199     return list;
00200 }
00201 
00202 static void
00203 add_entry  (dbDbmscap **list, char *name, char *startup, char *comment)
00204 
00205 {
00206     dbDbmscap *head, *cur, *tail;
00207 
00208 /* add this entry to the head of a linked list */
00209     tail = head = *list;
00210     while (tail && tail->next)
00211         tail = tail->next;
00212     *list = NULL;
00213 
00214     cur = (dbDbmscap *) db_malloc (sizeof(dbDbmscap));
00215     if (cur == NULL)
00216         return; /* out of memory */
00217     cur->next = NULL;
00218 
00219 /* copy each item to the dbmscap structure */
00220     strcpy (cur->driverName, name);
00221     strcpy (cur->startup, startup);
00222     strcpy (cur->comment, comment);
00223 
00224 /* handle the first call (head == NULL) */
00225     if (tail)
00226         tail->next = cur;
00227     else
00228         head = cur;
00229 
00230     *list = head;
00231 }
00232 
00239 void
00240 db_free_dbmscap  (dbDbmscap *list)
00241 
00242 {
00243     dbDbmscap *next, *cur;
00244 
00245     for (cur = list; cur; cur = next)
00246     {
00247         next = cur->next;
00248         free (cur);
00249     }
00250 }

Generated on Sun Apr 6 17:31:38 2008 for GRASS by  doxygen 1.5.5