sqldb, ISAPI и IIS3.0
- From
- Artemiev Igor ()
- To
- All
- Date
- 2002-10-21T14:40:34Z
- Area
- SU.WINDOWS.NT.PROG
From: "Artemiev Igor" <ai@bmc.bryansk.ru>
Имеется MS SQL2000 где-то в сети и старый комп с NT4.0 c установленным на нем
IIS3.0.
Написал ISAPI расширение, которое обрабатывает обращения к *.sql файлам,
содержащим запросы. Проблема в том, что спустя некоторое время ииска начинает
кушать почти 100% процессорного времени (Если убрать try/except - то просто
трапается). Перезапуск проблему решает, но, к сожалению, только временно.
Поменять IIS3.0 на что-то более другое нельзя. Эти творческие метания впоисках
ошибки уже достали, посоветуйте, где у меня руки тут кривые?
------------------------------------------------------
#include<windows.h>
#include<httpext.h>
#include<string.h>
#include<stdio.h>
#include<sqlfront.h>
#include<sqldb.h>
void *operator new[](size_t size){
return HeapAlloc(GetProcessHeap(), 0, size);
}
void operator delete[](PVOID buffer){
HeapFree(GetProcessHeap(), 0, buffer);
buffer = NULL;
}
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO* pVer)
{
pVer->dwExtensionVersion = 0x0001;
strcpy(pVer->lpszExtensionDesc, "Info");
return TRUE;
}
int err_handler(DBPROCESS *dbproc, int severity, int dberr,
int oserr, char *dberrstr, char *oserrstr) {
return INT_CANCEL;
}
int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severity,
char *msgtext)
{
return 0;
}
#define SQL_EXT ".sql"
#define INITIAL_BUFFER_SIZE 16385
DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB)
{
DWORD status = HSE_STATUS_ERROR;
__try{
char *buffer = NULL, *reply_buffer = NULL;
char *filename = lpECB->lpszPathTranslated;
DWORD strsize = strlen(filename);
bool isDbInit = false;
if(strsize <= strlen(SQL_EXT)) return HSE_STATUS_ERROR;
if(_stricmp(filename + strsize - strlen(SQL_EXT), SQL_EXT)) return
HSE_STATUS_ERROR;
HANDLE hReqFile = CreateFile(filename,
GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(hReqFile == INVALID_HANDLE_VALUE) return HSE_STATUS_ERROR;
__try {
DWORD ReqFileSize = GetFileSize(hReqFile, NULL);
if(ReqFileSize == INVALID_FILE_SIZE) return HSE_STATUS_ERROR;
buffer = new char[ReqFileSize + 1];
if(!buffer) __leave;
DWORD bytes = 0;
if(!ReadFile(hReqFile, buffer, ReqFileSize, &bytes, NULL)) __leave;
DBPROCESS *dbproc = NULL;
LOGINREC *login = NULL;
DBCHAR sqlFormattedReply[INITIAL_BUFFER_SIZE*4];
RETCODE rcode;
if(!dbinit()) __leave;
else isDbInit = true;
dbmsghandle((DBMSGHANDLE_PROC)msg_handler);
dberrhandle((DBERRHANDLE_PROC)err_handler);
login = dblogin();
DBSETLUSER(login, "my_login");
DBSETLPWD(login, "my_pwd");
DBSETLAPP(login, "test");
DBSETLVERSION(login, DBVER60);
dbproc = dbopen(login, "sqlsrv");
if(!dbproc) __leave;
if(dbcmd(dbproc, buffer) == FAIL) __leave;
if(dbsqlexec(dbproc) == FAIL) __leave;
reply_buffer = new char[INITIAL_BUFFER_SIZE];
*reply_buffer = 0;
DWORD in_buffer = 0, total_in_buffer = INITIAL_BUFFER_SIZE - 1;
while((rcode = dbresults(dbproc)) != NO_MORE_RESULTS) {
if(rcode == SUCCEED) {
dbbind(dbproc, 1, STRINGBIND, (DBCHAR) 0,
reinterpret_cast<u_char *>(sqlFormattedReply));
while(dbnextrow(dbproc) != NO_MORE_ROWS){
register DWORD sqldatasize = strlen(sqlFormattedReply);
if((in_buffer + sqldatasize) > total_in_buffer){
total_in_buffer *= 2;
register char *batoot = reinterpret_cast<char *>(HeapReAlloc(
GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS,
reply_buffer, total_in_buffer));
reply_buffer = batoot;
}//if
strcat(reply_buffer, sqlFormattedReply), in_buffer += sqldatasize;
} // while
} // if
} // while
if(!lpECB->WriteClient(lpECB->ConnID, reply_buffer, &in_buffer, HSE_IO_SYNC))
__leave;
status = HSE_STATUS_SUCCESS;
}__finally{
if(isDbInit){
isDbInit = false;
dbexit();
}
if(reply_buffer) delete[] reply_buffer;
if(buffer) delete[] buffer;
CloseHandle(hReqFile);
}//__finally
}__except(EXCEPTION_EXECUTE_HANDLER){
status = HSE_STATUS_ERROR;
}//__except
return status;
}
BOOL WINAPI TerminateExtension(DWORD dwFlags)
{
return TRUE;
}
------------------------------------------------------
--
iprefetch AI (Sun SPARC-V9 optimized signature)
--- ifmail v.2.15dev5
* Origin: Bryansk Medical Center (2:5020/400)