Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

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 
00044 static BOOL
00045 ProcessErrorMessages(char *name)
00046 {
00047     WORD err = 1;
00048     DWORD code;
00049     char errmsg[301];
00050     WORD errlen, errmax = sizeof (errmsg) - 1;
00051     int rc;
00052     BOOL ret = FALSE;
00053 
00054     do {
00055         errmsg[0] = '\0';
00056         rc = SQLInstallerError(err, &code, errmsg, errmax, &errlen);
00057         if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
00058             MessageBox(NULL, errmsg, name,
00059                        MB_ICONSTOP|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
00060             ret = TRUE;
00061         }
00062         err++;
00063     } while (rc != SQL_NO_DATA);
00064     return ret;
00065 }
00066 
00075 static BOOL
00076 InUn(int remove, char *drivername, char *dllname, char *dsname)
00077 {
00078     char path[301], driver[300], attr[300], inst[400], *p;
00079     WORD pathmax = sizeof (path) - 1, pathlen;
00080     DWORD usecnt, mincnt;
00081 
00082     if (SQLInstallDriverManager(path, pathmax, &pathlen)) {
00083         char *p;
00084 
00085         sprintf(driver, "%s;Driver=%s;Setup=%s;",
00086                 drivername, dllname, dllname);
00087         p = driver;
00088         while (*p) {
00089             if (*p == ';') {
00090                 *p = '\0';
00091                 ++p;
00092             }
00093             ++p;
00094         }
00095         SQLInstallDriverEx(driver, NULL, path, pathmax, &pathlen,
00096                            ODBC_INSTALL_INQUIRY, &usecnt);
00097         sprintf(driver, "%s;Driver=%s\\%s;Setup=%s\\%s;",
00098                 drivername, path, dllname, path, dllname);
00099         p = driver;
00100         while (*p) {
00101             if (*p == ';') {
00102                 *p = '\0';
00103                 ++p;
00104             }
00105             ++p;
00106         }
00107         sprintf(inst, "%s\\%s", path, dllname);
00108         mincnt = remove ? 1 : 0;
00109         while (usecnt != mincnt) {
00110             if (!SQLRemoveDriver(driver, TRUE, &usecnt)) {
00111                 break;
00112             }
00113         }
00114         if (remove) {
00115             if (!SQLRemoveDriver(driver, TRUE, &usecnt)) {
00116                 ProcessErrorMessages("SQLRemoveDriver");
00117                 return FALSE;
00118             }
00119             if (!usecnt) {
00120                 char buf[512];
00121 
00122                 DeleteFile(inst);
00123                 sprintf(buf, "%s uninstalled.", drivername);
00124                 MessageBox(NULL, buf, "Info",
00125                            MB_ICONINFORMATION|MB_OK|MB_TASKMODAL|
00126                            MB_SETFOREGROUND);
00127             }
00128             sprintf(attr, "DSN=%s;Database=sqlite.db;", dsname);
00129             p = attr;
00130             while (*p) {
00131                 if (*p == ';') {
00132                     *p = '\0';
00133                     ++p;
00134                 }
00135                 ++p;
00136             }
00137             SQLConfigDataSource(NULL, ODBC_REMOVE_SYS_DSN, drivername, attr);
00138             return TRUE;
00139         }
00140         if (GetFileAttributes(dllname) == 0xFFFFFFFF) {
00141             return FALSE;
00142         }
00143         if (!CopyFile(dllname, inst, 0)) {
00144             char buf[512];
00145 
00146             sprintf(buf, "Copy %s to %s failed", dllname, inst);
00147             MessageBox(NULL, buf, "CopyFile",
00148                        MB_ICONSTOP|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND); 
00149             return FALSE;
00150         }
00151         if (!SQLInstallDriverEx(driver, path, path, pathmax, &pathlen,
00152                                 ODBC_INSTALL_COMPLETE, &usecnt)) {
00153             ProcessErrorMessages("SQLInstallDriverEx");
00154             return FALSE;
00155         }
00156         sprintf(attr, "DSN=%s;Database=sqlite.db;", dsname);
00157         p = attr;
00158         while (*p) {
00159             if (*p == ';') {
00160                 *p = '\0';
00161                 ++p;
00162             }
00163             ++p;
00164         }
00165         SQLConfigDataSource(NULL, ODBC_REMOVE_SYS_DSN, drivername, attr);
00166         if (!SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, drivername, attr)) {
00167             ProcessErrorMessages("SQLConfigDataSource");
00168             return FALSE;
00169         }
00170     } else {
00171         ProcessErrorMessages("SQLInstallDriverManager");
00172         return FALSE;
00173     }
00174     return TRUE;
00175 }
00176 
00184 int APIENTRY
00185 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
00186         LPSTR lpszCmdLine, int nCmdShow)
00187 {
00188     char path[300], *p;
00189     int i, remove, quiet;
00190     BOOL ret[3];
00191 
00192     GetModuleFileName(NULL, path, sizeof (path));
00193     p = path;
00194     while (*p) {
00195         *p = tolower(*p);
00196         ++p;
00197     }
00198     p = strrchr(path, '\\');
00199     if (p == NULL) {
00200         p = path;
00201     }
00202     remove = strstr(p, "uninst") != NULL;
00203     quiet = strstr(p, "instq") != NULL;
00204     for (i = 0; i < 3; i++) {
00205         ret[i] = InUn(remove, DriverName[i], DriverDLL[i], DSName[i]);
00206     }
00207     if (!remove && (ret[0] || ret[1] || ret[2])) {
00208         if (!quiet) {
00209             MessageBox(NULL, "SQLite ODBC Driver(s) installed.", "Info",
00210                        MB_ICONINFORMATION|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
00211         }
00212     }
00213     exit(0);
00214 }
00215 

Generated on 25 Feb 2005 by doxygen.
Contact: chw@ch-werner.de