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