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