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
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