Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

206 lines
7.4 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
newdsn.c
Abstract:
This module creates a data source given information from DSNFORM.EXE
Author:
Kyle Geiger
Revision History:
--*/
#include <windows.h>
#include <stdio.h>
#include <odbcinst.h>
#include "dynodbc.h"
#include "cgi.h"
#include "html.h"
#include "resource.h"
# define MAX_DATA 1024
#define SUCCESS(rc) (!((rc)>>1))
int __cdecl
main( int argc, char * argv[])
{
BOOL rc; // Return code for ODBC functions
char rgchQuery[MAX_DATA];
long dwLen;
char * p;
char szDriver[MAX_DATA];
char * pszDriver;
char szAttr[MAX_DATA];
char * pszAttr;
char szAttr2[MAX_DATA];
char * pszAttr2;
BOOL fCreateDB=FALSE;
char szAccessDriver[MAX_DATA];
char szDsn[MAX_DATA];
char szSQLServer[MAX_DATA];
char szServer[MAX_DATA];
char szNewDB[MAX_DATA];
char szDBQ[MAX_DATA];
char szDBQEqual[MAX_DATA];
char szGeneral[MAX_DATA];
char szTmp[MAX_DATA];
char szSuccessful[MAX_DATA];
char szFail[MAX_DATA];
HINSTANCE hInst = GetModuleHandle(NULL);
if ( !DynLoadODBC())
return (1);
// get dsn name, custom attributes, and attribute string from form
dwLen = GetEnvironmentVariableA( PSZ_QUERY_STRING_A, rgchQuery, MAX_DATA);
if (!dwLen)
{
// debugging cases
/*
strcpy(rgchQuery, "driver=SQL%20Server&dsn=foo2&attr=server%3D%7Bkyleg0%7D%3Bdbq%3Dpubs");
strcpy(rgchQuery, "driver=Microsoft Access Driver (*.mdb)&dsn=foo4&dbq=c%3A%5Cfoo4.mdb&newdb=CREATE_DB&attr=");
strcpy(rgchQuery, "driver=Microsoft Access Driver (*.mdb)&dsn=foo5&dbq=c%3A%5Cfoo4.mdb&newdb=dbq&attr=");
*/
LoadString(hInst, IDS_ACCESS_DRIVER, szAccessDriver, sizeof(szAccessDriver));
strcpy(rgchQuery, szAccessDriver);
dwLen=strlen(rgchQuery);
}
// get rid of percent junk
TranslateEscapes2(rgchQuery, dwLen);
LoadString(hInst, IDS_DRIVER, szDriver, sizeof(szDriver));
// find driver name from URL
p=strstr(rgchQuery, szDriver)+7;
pszDriver=szDriver;
for(;p && *p && *p!='&'; p++)
*pszDriver++= *p;
*pszDriver++='\0';
LoadString(hInst, IDS_DSN, szDsn, sizeof(szDsn));
// find dsn name from URL, put in attribute string
p=strstr(rgchQuery, szDsn);
pszAttr=szAttr;
for(; p && *p && *p!='&'; p++)
*pszAttr++= *p;
*pszAttr++='\0';
LoadString(hInst, IDS_SQL_SERVER, szSQLServer, sizeof(szSQLServer));
LoadString(hInst, IDS_SERVER, szServer, sizeof(szServer));
LoadString(hInst, IDS_ACCESS_DRIVER_1, szAccessDriver, sizeof(szAccessDriver));
LoadString(hInst, IDS_NEWDB, szNewDB, sizeof(szNewDB));
LoadString(hInst, IDS_DBQ, szDBQ, sizeof(szDBQ));
LoadString(hInst, IDS_DBQ_EQUAL, szDBQEqual, sizeof(szDBQEqual));
LoadString(hInst, IDS_GENERAL, szGeneral, sizeof(szGeneral));
// do special case processing for certain drivers (sql server, access, ddp, other)
if (!strcmp(szDriver, szSQLServer)) {
// find server name from URL, put in attribute string
p=strstr(rgchQuery, szServer);
for(; p && *p && *p!='&'; p++)
*pszAttr++= *p;
*pszAttr++='\0';
}
else if (!strcmp(szDriver, szAccessDriver)) {
// find database name from URL, put in attribute string
// the radio button group 'newdb' return either CREATE_DB for a new database
// or DBQ for an existing MDB file
// the edit control for the database name ('dbq') is appended after the CREATE_DB
// or DBQ attribute
p=strstr(rgchQuery, szNewDB)+6;
fCreateDB=(*p=='C');
// if creating a database, also need to add the dsn pointing to it
// this requires two different attribute strings, one like:
// dsn=foo;CREATE_DB=<filename>, where the dsn is ignored
// which is derived from
// dsn=foo&newdb=CREATE_DB&dbq=<filename>
// and
// dsn=foo;dbq=<filename>
// which is derived from
// dsn=foo&newdb=dbq&dbq=<filename>
if (fCreateDB) {
strcpy(szAttr2, szAttr);
for(; p && *p && *p!='&'; p++)
*pszAttr++= *p;
// assert: szAttr= "driver=foo\0dsn=bar\0CREATE_DB"
// assert: szAttr2= "driver=foo\0dsn=bar\0"
p = strstr(rgchQuery, szDBQEqual)+3;
pszAttr2=szAttr2+strlen(szAttr2)+1;
strcpy(pszAttr2,szDBQ);
// assert: szAttr2= "driver=foo\0dsn=bar\0dbq"
pszAttr2+=3;
for(; p && *p && *p!='&'; p++) {
*pszAttr++= *p;
*pszAttr2++= *p;
}
// assert: szAttr= "driver=foo\0dsn=bar\0CREATE_DB=<filename>"
// assert: szAttr2= "driver=foo\0dsn=bar\0dbq=<filename>"
strcpy(pszAttr, szGeneral);
pszAttr+=9;
*pszAttr2++='\0';
*pszAttr2='\0';
// assert: szAttr= "driver=foo\0dsn=bar\0CREATE_DB=<filename> General"
}
else {
p = strstr(rgchQuery, szDBQEqual);
for(; p && *p && *p!='&'; p++)
*pszAttr++= *p;
}
}
LoadString(hInst, IDS_ATTR, szTmp, sizeof(szTmp));
// now add any additional items from attribute string
p=strstr(rgchQuery, szTmp);
if (p != NULL) {
p+=5;
for(; p && *p && *p!='&'; p++) {
if ( *p == ';' ) {
*pszAttr++='\0';
} else if ( *p == '+') {
*pszAttr++=' ';
} else {
*pszAttr++ = *p;
}
}
}
*pszAttr='\0';
// call ODBC to add the data source
rc= SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, szDriver, szAttr);
LoadString(hInst, IDS_CREATE_DB, szTmp, sizeof(szTmp));
// special case for Access: if just created a database, now need to add the DSN
if (rc && strstr(rgchQuery, szTmp)) {
rc= SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, szDriver, szAttr2);
}
LoadString(hInst, IDS_START_ODBC, szTmp, sizeof(szTmp));
StartHTML(szTmp, 1);
LoadString(hInst, IDS_DATASOURCE_CREATE, szTmp, sizeof(szTmp));
LoadString(hInst, IDS_SUCCESSFUL, szSuccessful, sizeof(szSuccessful));
LoadString(hInst, IDS_FAILED, szFail, sizeof(szFail));
printf( szTmp, (rc) ? szSuccessful : szFail );
EndHTML();
return (1);
} // main()