inst.c

Go to the documentation of this file.
00001 
00014 #include <windows.h>
00015 #include <sql.h>
00016 #include <sqlext.h>
00017 #include <odbcinst.h>
00018 #include <winver.h>
00019 #include <string.h>
00020 #include <ctype.h>
00021 #include <stdio.h>
00022 
00023 static char *DriverName[3] = {
00024     "SQLite ODBC Driver",
00025     "SQLite ODBC (UTF-8) Driver",
00026     "SQLite3 ODBC Driver"
00027 };
00028 static char *DSName[3] = {
00029     "SQLite Datasource",
00030     "SQLite UTF-8 Datasource",
00031     "SQLite3 Datasource"
00032 };
00033 static char *DriverDLL[3] = {
00034     "sqliteodbc.dll",
00035     "sqliteodbcu.dll",
00036     "sqlite3odbc.dll"
00037 };
00038 
00039 static int quiet = 0;
00040 
00046 static BOOL
00047 ProcessErrorMessages(char *name)
00048 {
00049     WORD err = 1;
00050     DWORD code;
00051     char errmsg[301];
00052     WORD errlen, errmax = sizeof (errmsg) - 1;
00053     int rc;
00054     BOOL ret = FALSE;
00055 
00056     do {
00057         errmsg[0] = '\0';
00058         rc = SQLInstallerError(err, &code, errmsg, errmax, &errlen);
00059         if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
00060             MessageBox(NULL, errmsg, name,
00061                        MB_ICONSTOP|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
00062             ret = TRUE;
00063         }
00064         err++;
00065     } while (rc != SQL_NO_DATA);
00066     return ret;
00067 }
00068 
00077 static BOOL
00078 InUn(int remove, char *drivername, char *dllname, char *dsname)
00079 {
00080     char path[301], driver[300], attr[300], inst[400];
00081     WORD pathmax = sizeof (path) - 1, pathlen;
00082     DWORD usecnt, mincnt;
00083 
00084     if (SQLInstallDriverManager(path, pathmax, &pathlen)) {
00085         char *p;
00086 
00087         sprintf(driver, "%s;Driver=%s;Setup=%s;",
00088                 drivername, dllname, dllname);
00089         p = driver;
00090         while (*p) {
00091             if (*p == ';') {
00092                 *p = '\0';
00093                 ++p;
00094             }
00095             ++p;
00096         }
00097         usecnt = 0;
00098         SQLInstallDriverEx(driver, NULL, path, pathmax, &pathlen,
00099                            ODBC_INSTALL_INQUIRY, &usecnt);
00100         sprintf(driver, "%s;Driver=%s\\%s;Setup=%s\\%s;",
00101                 drivername, path, dllname, path, dllname);
00102         p = driver;
00103         while (*p) {
00104             if (*p == ';') {
00105                 *p = '\0';
00106                 ++p;
00107             }
00108             ++p;
00109         }
00110         sprintf(inst, "%s\\%s", path, dllname);
00111         if (!remove && usecnt > 0) {
00112             /* first install try: copy over driver dll, keeping DSNs */
00113             if (GetFileAttributes(dllname) != 0xFFFFFFFF &&
00114                 CopyFile(dllname, inst, 0)) {
00115                 return TRUE;
00116             }
00117         }
00118         mincnt = remove ? 1 : 0;
00119         while (usecnt != mincnt) {
00120             if (!SQLRemoveDriver(driver, TRUE, &usecnt)) {
00121                 break;
00122             }
00123         }
00124         if (remove) {
00125             if (!SQLRemoveDriver(driver, TRUE, &usecnt)) {
00126                 ProcessErrorMessages("SQLRemoveDriver");
00127                 return FALSE;
00128             }
00129             if (!usecnt) {
00130                 char buf[512];
00131 
00132                 DeleteFile(inst);
00133                 if (!quiet) {
00134                     sprintf(buf, "%s uninstalled.", drivername);
00135                     MessageBox(NULL, buf, "Info",
00136                                MB_ICONINFORMATION|MB_OK|MB_TASKMODAL|
00137                                MB_SETFOREGROUND);
00138                 }
00139             }
00140             sprintf(attr, "DSN=%s;Database=sqlite.db;", dsname);
00141             p = attr;
00142             while (*p) {
00143                 if (*p == ';') {
00144                     *p = '\0';
00145                     ++p;
00146                 }
00147                 ++p;
00148             }
00149             SQLConfigDataSource(NULL, ODBC_REMOVE_SYS_DSN, drivername, attr);
00150             return TRUE;
00151         }
00152         if (GetFileAttributes(dllname) == 0xFFFFFFFF) {
00153             return FALSE;
00154         }
00155         if (!CopyFile(dllname, inst, 0)) {
00156             char buf[512];
00157 
00158             sprintf(buf, "Copy %s to %s failed", dllname, inst);
00159             MessageBox(NULL, buf, "CopyFile",
00160                        MB_ICONSTOP|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND); 
00161             return FALSE;
00162         }
00163         if (!SQLInstallDriverEx(driver, path, path, pathmax, &pathlen,
00164                                 ODBC_INSTALL_COMPLETE, &usecnt)) {
00165             ProcessErrorMessages("SQLInstallDriverEx");
00166             return FALSE;
00167         }
00168         sprintf(attr, "DSN=%s;Database=sqlite.db;", dsname);
00169         p = attr;
00170         while (*p) {
00171             if (*p == ';') {
00172                 *p = '\0';
00173                 ++p;
00174             }
00175             ++p;
00176         }
00177         SQLConfigDataSource(NULL, ODBC_REMOVE_SYS_DSN, drivername, attr);
00178         if (!SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, drivername, attr)) {
00179             ProcessErrorMessages("SQLConfigDataSource");
00180             return FALSE;
00181         }
00182     } else {
00183         ProcessErrorMessages("SQLInstallDriverManager");
00184         return FALSE;
00185     }
00186     return TRUE;
00187 }
00188 
00196 int APIENTRY
00197 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
00198         LPSTR lpszCmdLine, int nCmdShow)
00199 {
00200     char path[300], *p;
00201     int i, remove;
00202     BOOL ret[3];
00203 
00204     GetModuleFileName(NULL, path, sizeof (path));
00205     p = path;
00206     while (*p) {
00207         *p = tolower(*p);
00208         ++p;
00209     }
00210     p = strrchr(path, '\\');
00211     if (p == NULL) {
00212         p = path;
00213     } else {
00214         *p = '\0';
00215         ++p;
00216         SetCurrentDirectory(path);
00217     }
00218     remove = strstr(p, "uninst") != NULL;
00219     quiet = strstr(p, "instq") != NULL;
00220     for (i = 0; i < 3; i++) {
00221         ret[i] = InUn(remove, DriverName[i], DriverDLL[i], DSName[i]);
00222     }
00223     if (!remove && (ret[0] || ret[1] || ret[2])) {
00224         if (!quiet) {
00225             MessageBox(NULL, "SQLite ODBC Driver(s) installed.", "Info",
00226                        MB_ICONINFORMATION|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
00227         }
00228     }
00229     exit(0);
00230 }
00231 

Generated on 24 Apr 2006 by doxygen.
Contact: chw@ch-werner.de