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
00087
00088
00089
00090
00091
00092
00093 dbDbmscap *
00094 db_read_dbmscap()
00095 {
00096
00097
00098
00099
00100
00101
00102
00103
00104 char buf[1024];
00105 char *dirpath;
00106 DIR *dir;
00107 struct dirent *ent;
00108
00109 dbDbmscap *list = NULL;
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
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
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
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
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;
00217 cur->next = NULL;
00218
00219
00220 strcpy (cur->driverName, name);
00221 strcpy (cur->startup, startup);
00222 strcpy (cur->comment, comment);
00223
00224
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 }