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)