From: Mark O. <sky...@us...> - 2001-04-05 17:05:47
|
Update of /cvsroot/firebird/interbase/jrd In directory usw-pr-cvs1:/tmp/cvs-serv32292/jrd Modified Files: event.c ini.e ods.h pag.h sdw.c utl.c winnt.c Log Message: Committed Changes made in the borland tree Committed Changes made by Mike Nordel re, 64 bit io for win32 and bug fixes Index: event.c =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/event.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** event.c 2000/08/03 20:50:05 1.1.1.1 --- event.c 2001/04/05 17:05:43 1.2 *************** *** 154,157 **** --- 154,160 ---- SRQ *que, *que2; + if (!EVENT_header) + return; + ACQUIRE; Index: ini.e =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/ini.e,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** ini.e 2000/08/03 20:50:37 1.1.1.1 --- ini.e 2001/04/05 17:05:43 1.2 *************** *** 468,472 **** vector = dbb->dbb_relations; - for (relfld = relfields; relfld [RFLD_R_NAME]; relfld = fld + 1) { --- 468,471 ---- *************** *** 488,535 **** else { ! relation = MET_relation (tdbb, relfld [RFLD_R_ID]); ! format = relation->rel_current_format; ! for (n = 0, fld = relfld + RFLD_RPT; fld [RFLD_F_NAME]; fld += RFLD_F_LENGTH) ! { ! /* If the ODS is less than 10, then remove the field ! * RDB$FIELD_PRECISION, as it is not present in < 10 ODS ! */ ! if (fld [RFLD_F_NAME] == nam_f_precision) { ! if (major_version >= ODS_VERSION10) ! if (!fld [RFLD_F_MINOR]) { n++; if (fld [RFLD_F_UPD_MINOR]) ! relation->rel_flags |= REL_force_scan; } ! else ! relation->rel_flags |= REL_force_scan; ! } ! else ! { ! if (!fld [RFLD_F_MINOR]) ! { ! n++; ! if (fld [RFLD_F_UPD_MINOR]) relation->rel_flags |= REL_force_scan; ! } ! else ! relation->rel_flags |= REL_force_scan; } - } ! relation->rel_fields->vec_count = n; ! format->fmt_count = n; ! format->fmt_length = FLAG_BYTES (n); ! desc = format->fmt_desc; ! for (fld = relfld + RFLD_RPT; fld [RFLD_F_NAME]; fld += RFLD_F_LENGTH, desc++) ! if (n-- > 0) ! { ! format->fmt_length = MET_align (desc, format->fmt_length); ! desc->dsc_address = (UCHAR*) (SLONG) format->fmt_length; ! format->fmt_length += desc->dsc_length; ! } } } --- 487,537 ---- else { ! relation = MET_relation (tdbb, relfld [RFLD_R_ID]); ! format = relation->rel_current_format; ! for (n = 0, fld = relfld + RFLD_RPT; fld [RFLD_F_NAME]; fld += RFLD_F_LENGTH) { ! /* If the ODS is less than 10, then remove all fields named ! * RDB$FIELD_PRECISION and field RDB$CHARACTER_LENGTH from ! * relation RDB$FUNCTION_ARGUMENTS , as they were not present ! * in < 10 ODS ! */ ! if (fld [RFLD_F_NAME] == nam_f_precision || ! (fld [RFLD_F_NAME] == nam_char_length && relfld [RFLD_R_NAME] == nam_args)) ! { ! if (major_version >= ODS_VERSION10) ! if (!fld [RFLD_F_MINOR]) ! { ! n++; ! if (fld [RFLD_F_UPD_MINOR]) ! relation->rel_flags |= REL_force_scan; ! } ! else ! relation->rel_flags |= REL_force_scan; ! } ! else ! { ! if (!fld [RFLD_F_MINOR]) { n++; if (fld [RFLD_F_UPD_MINOR]) ! relation->rel_flags |= REL_force_scan; } ! else relation->rel_flags |= REL_force_scan; ! } } ! relation->rel_fields->vec_count = n; ! format->fmt_count = n; ! format->fmt_length = FLAG_BYTES (n); ! desc = format->fmt_desc; ! for (fld = relfld + RFLD_RPT; fld [RFLD_F_NAME]; fld += RFLD_F_LENGTH, desc++) ! if (n-- > 0) ! { ! format->fmt_length = MET_align (desc, format->fmt_length); ! desc->dsc_address = (UCHAR*) (SLONG) format->fmt_length; ! format->fmt_length += desc->dsc_length; ! } } } Index: ods.h =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/ods.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** ods.h 2000/11/30 14:27:32 1.2 --- ods.h 2001/04/05 17:05:43 1.3 *************** *** 143,147 **** #endif ! #define MAX_PAGE_SIZE 8192 #define DEFAULT_PAGE_SIZE 4096 --- 143,147 ---- #endif ! #define MAX_PAGE_SIZE 16384 #define DEFAULT_PAGE_SIZE 4096 Index: pag.h =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/pag.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** pag.h 2000/11/30 14:27:32 1.2 --- pag.h 2001/04/05 17:05:43 1.3 *************** *** 43,49 **** SLONG pgc_ppp; /* Pages per pip */ SLONG pgc_pip; /* First pointer page */ ! int pgc_bytes; /* Number of bytes of bit in PIP */ ! int pgc_tpt; /* Transactions per TIP */ ! int pgc_gpg; /* Generators per generator page */ } *PGC; --- 43,49 ---- SLONG pgc_ppp; /* Pages per pip */ SLONG pgc_pip; /* First pointer page */ ! ULONG pgc_bytes; /* Number of bytes of bit in PIP */ ! ULONG pgc_tpt; /* Transactions per TIP */ ! ULONG pgc_gpg; /* Generators per generator page */ } *PGC; Index: sdw.c =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/sdw.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** sdw.c 2000/08/03 20:51:18 1.1.1.1 --- sdw.c 2001/04/05 17:05:43 1.2 *************** *** 939,943 **** SCHAR expanded_name [MAX_PATH_LENGTH]; UCHAR *p; ! FIL dbb_file, shadow_file; JMP_BUF env, *old_env; WIN window; --- 939,943 ---- SCHAR expanded_name [MAX_PATH_LENGTH]; UCHAR *p; ! FIL dbb_file, shadow_file = NULL_PTR; JMP_BUF env, *old_env; WIN window; *************** *** 991,994 **** --- 991,1001 ---- if (header_fetched) CCH_RELEASE (tdbb, &window); + if (shadow_file) + { + PIO_close (shadow_file); + ALL_release (shadow_file); + } + if (spare_buffer) + ALL_free (spare_buffer); if (file_flags & FILE_manual && !delete) ERR_post (gds__shadow_missing, gds_arg_number, (SLONG) shadow_number, 0); *************** *** 998,1003 **** gds__log ("shadow %s deleted from database %s due to unavailability on attach", expanded_name, dbb_file->fil_string); } - if (spare_buffer) - ALL_free (spare_buffer); return; } --- 1005,1008 ---- Index: utl.c =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/utl.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** utl.c 2000/10/15 13:26:47 1.5 --- utl.c 2001/04/05 17:05:43 1.6 *************** *** 1172,1175 **** --- 1172,1176 ---- * **************************************/ + #ifndef SUPERSERVER TEXT *username, *password; UCHAR *p, *end_dpb; *************** *** 1224,1227 **** --- 1225,1229 ---- else if (password && !password_seen) isc_expand_dpb (dpb, dpb_size, gds__dpb_password, password, 0); + #endif } Index: winnt.c =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/winnt.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** winnt.c 2000/08/03 20:51:46 1.1.1.1 --- winnt.c 2001/04/05 17:05:43 1.2 *************** *** 22,25 **** --- 22,35 ---- */ + #ifdef _MSC_VER + /* TMN: 27 Jul 2000 - Added define to make it compile on Win32 */ + #ifndef _tagBLOB_DEFINED + #define _tagBLOB_DEFINED + #endif + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #endif /* _MSC_VER */ + #include <string.h> #include "../jrd/jrd.h" *************** *** 41,46 **** --- 51,62 ---- #include <windows.h> + #ifdef TEXT + #undef TEXT + #endif #define TEXT SCHAR + #ifdef MAXPATHLEN + #undef MAXPATHLEN + #endif #define MAXPATHLEN 512 #define DEFAULTBUFFERSIZE 1024 *************** *** 58,74 **** static USHORT ostype; ! int PIO_add_file ( ! DBB dbb, ! FIL main_file, ! TEXT *file_name, ! SLONG start) ! { /************************************** * - * P I O _ a d d _ f i l e - * - ************************************** - * - * Functional description * Add a file to an existing database. Return the sequence * number of the new file. If anything goes wrong, return a --- 74,80 ---- static USHORT ostype; ! /************************************** * * Add a file to an existing database. Return the sequence * number of the new file. If anything goes wrong, return a *************** *** 76,90 **** * **************************************/ USHORT sequence; ! FIL file, new_file; ! if (!(new_file = PIO_create (dbb, file_name, strlen (file_name), FALSE))) return 0; new_file->fil_min_page = start; sequence = 1; ! for (file = main_file; file->fil_next; file = file->fil_next) ++sequence; file->fil_max_page = start - 1; --- 82,105 ---- * **************************************/ + int PIO_add_file( + DBB dbb, + FIL main_file, + TEXT* file_name, + SLONG start) + { USHORT sequence; ! FIL file; ! FIL new_file = PIO_create(dbb, file_name, strlen (file_name), FALSE); ! if (!new_file) { return 0; + } new_file->fil_min_page = start; sequence = 1; ! for (file = main_file; file->fil_next; file = file->fil_next) { ++sequence; + } file->fil_max_page = start - 1; *************** *** 94,99 **** } ! void PIO_close ( ! FIL main_file) { /************************************** --- 109,113 ---- } ! void PIO_close(FIL main_file) { /************************************** *************** *** 107,113 **** **************************************/ FIL file; - USHORT i; for (file = main_file; file; file = file->fil_next) if ((HANDLE) file->fil_desc != INVALID_HANDLE_VALUE) { --- 121,127 ---- **************************************/ FIL file; for (file = main_file; file; file = file->fil_next) + { if ((HANDLE) file->fil_desc != INVALID_HANDLE_VALUE) { *************** *** 115,119 **** --- 129,135 ---- file->fil_desc = (SLONG) INVALID_HANDLE_VALUE; if ((HANDLE) file->fil_force_write_desc != INVALID_HANDLE_VALUE) + { CloseHandle ((HANDLE) file->fil_force_write_desc); + } file->fil_force_write_desc = (SLONG) INVALID_HANDLE_VALUE; #ifdef SUPERSERVER_V2 *************** *** 125,128 **** --- 141,145 ---- } } + } int PIO_connection ( *************** *** 145,171 **** **************************************/ ! return NULL; } ! FIL PIO_create ( ! DBB dbb, ! TEXT *string, ! SSHORT length, ! BOOLEAN overwrite) ! { /************************************** * - * P I O _ c r e a t e - * - ************************************** - * - * Functional description * Create a new database file. * **************************************/ HANDLE desc; FIL file; ! TEXT workspace [MAXPATHLEN], *file_name; file_name = string; --- 162,192 ---- **************************************/ ! return 0; } ! /************************************** * * Create a new database file. * **************************************/ + FIL PIO_create( DBB dbb, + TEXT* string, + SSHORT length, + BOOLEAN overwrite) + { HANDLE desc; FIL file; ! TEXT workspace[MAXPATHLEN]; ! TEXT* file_name; + #ifdef SUPERSERVER_V2 + const DWORD dwShareFlags = 0; /* no sharing */ + const DWORD dwExtraFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING; + #else + const DWORD dwShareFlags = FILE_SHARE_READ | FILE_SHARE_WRITE; + const DWORD dwExtraFlags = 0; + #endif + file_name = string; *************** *** 177,197 **** } ! if ((desc = CreateFile (file_name, GENERIC_READ | GENERIC_WRITE, ! FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, (overwrite ? CREATE_ALWAYS : CREATE_NEW) , FILE_ATTRIBUTE_NORMAL | ! #ifdef SUPERSERVER_V2 ! FILE_FLAG_OVERLAPPED | ! FILE_FLAG_NO_BUFFERING | ! #endif ! FILE_FLAG_RANDOM_ACCESS, ! 0)) == INVALID_HANDLE_VALUE) ERR_post (isc_io_error, gds_arg_string, "CreateFile (create)", ! gds_arg_cstring, length, ERR_string (string, length), ! isc_arg_gds, isc_io_create_err, ! gds_arg_win32, GetLastError(), 0); /* File open succeeded. Now expand the file name. */ --- 198,224 ---- } ! desc = CreateFile( file_name, GENERIC_READ | GENERIC_WRITE, ! dwShareFlags, NULL, (overwrite ? CREATE_ALWAYS : CREATE_NEW) , FILE_ATTRIBUTE_NORMAL | ! FILE_FLAG_RANDOM_ACCESS | ! dwExtraFlags, ! 0); ! ! if (desc == INVALID_HANDLE_VALUE) ! { ERR_post (isc_io_error, gds_arg_string, "CreateFile (create)", ! gds_arg_cstring, ! length, ! ERR_string(string, length), ! isc_arg_gds, ! isc_io_create_err, ! gds_arg_win32, ! GetLastError(), ! 0); ! } /* File open succeeded. Now expand the file name. */ *************** *** 265,268 **** --- 292,303 ---- HANDLE desc; + #ifdef SUPERSERVER_V2 + const DWORD dwShareFlags = 0; /* no sharing */ + const DWORD dwExtraFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING; + #else + const DWORD dwShareFlags = FILE_SHARE_READ | FILE_SHARE_WRITE; + const DWORD dwExtraFlags = 0; + #endif + if (flag) { *************** *** 271,292 **** desc = CreateFile (file->fil_string, GENERIC_READ | GENERIC_WRITE, ! FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | ! #ifdef SUPERSERVER_V2 ! FILE_FLAG_OVERLAPPED | ! FILE_FLAG_NO_BUFFERING | ! #endif ! FILE_FLAG_RANDOM_ACCESS, 0); if (desc == INVALID_HANDLE_VALUE) ERR_post (isc_io_error, ! gds_arg_string, "CreateFile (force write)", ! gds_arg_cstring, file->fil_length, ERR_string (file->fil_string, file->fil_length), isc_arg_gds, isc_io_access_err, ! gds_arg_win32, GetLastError(), 0); file->fil_force_write_desc = desc; } --- 306,333 ---- desc = CreateFile (file->fil_string, GENERIC_READ | GENERIC_WRITE, ! dwShareFlags, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | ! FILE_FLAG_RANDOM_ACCESS | ! dwExtraFlags, 0); + if (desc == INVALID_HANDLE_VALUE) + { ERR_post (isc_io_error, ! gds_arg_string, ! "CreateFile (force write)", ! gds_arg_cstring, ! file->fil_length, ! ERR_string(file->fil_string, file->fil_length), isc_arg_gds, isc_io_access_err, ! gds_arg_win32, ! GetLastError(), ! 0); ! } + /* TMN: Take note! Assumes sizeof(long) == sizeof(void*) ! */ file->fil_force_write_desc = desc; } *************** *** 294,299 **** --- 335,342 ---- } else + { file->fil_flags &= ~FIL_force_write; } + } void PIO_header ( *************** *** 385,432 **** #endif ! if (ostype == OS_CHICAGO) THD_MUTEX_UNLOCK (file->fil_mutex); } - SLONG PIO_max_alloc ( - DBB dbb) - { /************************************** * ! * P I O _ m a x _ a l l o c ! * ! ************************************** ! * ! * Functional description ! * Compute last physically allocated page of database. * **************************************/ ! ULONG length; ! FIL file; ! for (file = dbb->dbb_file; file->fil_next; file = file->fil_next) ! ; ! if ((length = GetFileSize ((HANDLE) file->fil_desc, NULL)) == -1) nt_error ("GetFileSize", file, isc_io_access_err, NULL_PTR); ! return file->fil_min_page - file->fil_fudge + ! (length + dbb->dbb_page_size - 1) / dbb->dbb_page_size; } - SLONG PIO_act_alloc ( - DBB dbb) - { /************************************** * ! * P I O _ a c t _ a l l o c * ! ************************************** * - * Functional description * Compute actual number of physically allocated pages of database. * **************************************/ ! ULONG length; FIL file; SLONG tot_pages=0; --- 428,488 ---- #endif ! if (ostype == OS_CHICAGO) { THD_MUTEX_UNLOCK (file->fil_mutex); } + } + /************************************** * ! * Compute number of pages in file, based only on file size. * **************************************/ ! static ULONG private_PIO_get_number_of_pages( ! FIL file, ! USHORT pagesize) ! { ! HANDLE hFile = (HANDLE)file->fil_desc; ! DWORD dwFileSizeLow; ! DWORD dwFileSizeHigh; ! ULONGLONG ullFileSize; ! dwFileSizeLow = GetFileSize(hFile, &dwFileSizeHigh); ! if (dwFileSizeLow == -1) { nt_error ("GetFileSize", file, isc_io_access_err, NULL_PTR); + } ! ullFileSize = (((ULONGLONG)dwFileSizeHigh) << 32) + dwFileSizeLow; ! return (ULONG)((ullFileSize + pagesize - 1) / pagesize); } /************************************** * ! * Compute last physically allocated page of database. * ! **************************************/ ! SLONG PIO_max_alloc(DBB dbb) ! { ! FIL file = dbb->dbb_file; ! ULONG nPages; ! ! while (file->fil_next) { ! file = file->fil_next; ! } ! ! nPages = private_PIO_get_number_of_pages(file, dbb->dbb_page_size); ! ! return file->fil_min_page - file->fil_fudge + nPages; ! } ! ! ! /************************************** * * Compute actual number of physically allocated pages of database. * **************************************/ ! SLONG PIO_act_alloc(DBB dbb) ! { FIL file; SLONG tot_pages=0; *************** *** 438,445 **** for (file = dbb->dbb_file; file != NULL; file = file->fil_next) { ! if ((length = GetFileSize ((HANDLE) file->fil_desc, NULL)) == -1) ! nt_error ("GetFileSize", file, isc_io_access_err, NULL_PTR); ! ! tot_pages += (length + dbb->dbb_page_size - 1) / dbb->dbb_page_size; } --- 494,499 ---- for (file = dbb->dbb_file; file != NULL; file = file->fil_next) { ! tot_pages += ! private_PIO_get_number_of_pages(file, dbb->dbb_page_size); } *************** *** 447,450 **** --- 501,511 ---- } + + /************************************** + * + * Open a database file. If a "connection" block is provided, use + * the connection to communication with a page/lock server. + * + **************************************/ FIL PIO_open ( DBB dbb, *************** *** 456,473 **** USHORT file_length) { - /************************************** - * - * P I O _ o p e n - * - ************************************** - * - * Functional description - * Open a database file. If a "connection" block is provided, use - * the connection to communication with a page/lock server. - * - **************************************/ TEXT temp [MAXPATHLEN], *ptr; HANDLE desc; if (string) { --- 517,531 ---- USHORT file_length) { TEXT temp [MAXPATHLEN], *ptr; HANDLE desc; + #ifdef SUPERSERVER_V2 + const DWORD dwShareFlags = 0; /* no sharing */ + const DWORD dwExtraFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING; + #else + const DWORD dwShareFlags = FILE_SHARE_READ | FILE_SHARE_WRITE; + const DWORD dwExtraFlags = 0; + #endif + if (string) { *************** *** 491,512 **** } ! if ((desc = CreateFile (ptr, GENERIC_READ | GENERIC_WRITE, ! FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | ! #ifdef SUPERSERVER_V2 ! FILE_FLAG_OVERLAPPED | ! FILE_FLAG_NO_BUFFERING | ! #endif ! FILE_FLAG_RANDOM_ACCESS, ! 0)) == INVALID_HANDLE_VALUE) { #ifdef READONLY_DATABASE ! /* Try opening the database file in ReadOnly mode. The database file could ! * be on a RO medium (CD-ROM etc.). If this fileopen fails, return error. */ ! if ((desc = CreateFile (ptr, GENERIC_READ, FILE_SHARE_READ, --- 549,570 ---- } ! desc = CreateFile( ptr, GENERIC_READ | GENERIC_WRITE, ! dwShareFlags, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | ! FILE_FLAG_RANDOM_ACCESS | ! dwExtraFlags, ! 0); ! ! if (desc == INVALID_HANDLE_VALUE) { #ifdef READONLY_DATABASE ! /* Try opening the database file in ReadOnly mode. ! * The database file could be on a RO medium (CD-ROM etc.). ! * If this fileopen fails, return error. */ ! desc = CreateFile( ptr, GENERIC_READ, FILE_SHARE_READ, *************** *** 514,530 **** OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | ! #ifdef SUPERSERVER_V2 ! FILE_FLAG_OVERLAPPED | ! FILE_FLAG_NO_BUFFERING | ! #endif ! FILE_FLAG_RANDOM_ACCESS, ! 0)) == INVALID_HANDLE_VALUE) { #endif /* READONLY_DATABASE */ ERR_post (isc_io_error, ! gds_arg_string, "CreateFile (open)", ! gds_arg_cstring, file_length, ERR_string (file_name, file_length), ! isc_arg_gds, isc_io_open_err, ! gds_arg_win32, GetLastError(), 0); #ifdef READONLY_DATABASE } --- 572,593 ---- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | ! FILE_FLAG_RANDOM_ACCESS | ! dwExtraFlags, ! 0); ! ! if (desc == INVALID_HANDLE_VALUE) { #endif /* READONLY_DATABASE */ ERR_post (isc_io_error, ! gds_arg_string, ! "CreateFile (open)", ! gds_arg_cstring, ! file_length, ! ERR_string(file_name, file_length), ! isc_arg_gds, ! isc_io_open_err, ! gds_arg_win32, ! GetLastError(), ! 0); #ifdef READONLY_DATABASE } *************** *** 569,574 **** size = dbb->dbb_page_size; ! if (!(file = seek_file (file, bdb, status_vector, &overlapped, &overlapped_ptr))) return FALSE; desc = (HANDLE) ((file->fil_flags & FIL_force_write) ? --- 632,639 ---- size = dbb->dbb_page_size; ! file = seek_file(file, bdb, status_vector, &overlapped, &overlapped_ptr); ! if (!file) { return FALSE; + } desc = (HANDLE) ((file->fil_flags & FIL_force_write) ? *************** *** 594,615 **** #endif { ! if (ReadFile (desc, page, size, &actual_length, overlapped_ptr) && ! actual_length == size); #ifdef SUPERSERVER_V2 ! else if (!GetOverlappedResult (desc, overlapped_ptr, &actual_length, TRUE) || actual_length != size) { release_io_event (file, overlapped_ptr); return nt_error ("GetOverlappedResult", file, isc_io_read_err, status_vector); ! } #else - else { if (ostype == OS_CHICAGO) THD_MUTEX_UNLOCK (file->fil_mutex); return nt_error ("ReadFile", file, isc_io_read_err, status_vector); } #endif } #ifdef SUPERSERVER_V2 --- 659,683 ---- #endif { ! if (!ReadFile(desc, page, size, &actual_length, overlapped_ptr) || ! actual_length != size) ! { #ifdef SUPERSERVER_V2 ! if (!GetOverlappedResult (desc, overlapped_ptr, &actual_length, TRUE) || actual_length != size) { release_io_event (file, overlapped_ptr); return nt_error ("GetOverlappedResult", file, isc_io_read_err, status_vector); ! } else #else { if (ostype == OS_CHICAGO) + { THD_MUTEX_UNLOCK (file->fil_mutex); + } return nt_error ("ReadFile", file, isc_io_read_err, status_vector); } #endif } + } #ifdef SUPERSERVER_V2 *************** *** 618,622 **** --- 686,692 ---- if (ostype == OS_CHICAGO) + { THD_MUTEX_UNLOCK (file->fil_mutex); + } return TRUE; *************** *** 654,658 **** --- 724,730 ---- if (!piob) + { overlapped_ptr = &overlapped; + } else { *************** *** 668,673 **** bdb.bdb_page = start_page; ! if (!(file = seek_file (dbb->dbb_file, &bdb, status_vector, overlapped_ptr, &overlapped_ptr))) return FALSE; /* Check that every page within the set resides in the same database --- 740,748 ---- bdb.bdb_page = start_page; ! file = seek_file (dbb->dbb_file, &bdb, status_vector, overlapped_ptr, &overlapped_ptr); ! if (!file) ! { return FALSE; + } /* Check that every page within the set resides in the same database *************** *** 734,742 **** DWORD actual_length; ! if (piob->piob_flags & PIOB_success) ! ; ! else if (piob->piob_flags & PIOB_error) return FALSE; ! else if (!GetOverlappedResult ((HANDLE) piob->piob_desc, (OVERLAPPED *) &piob->piob_io_event, &actual_length, piob->piob_wait) || actual_length != piob->piob_io_length) { --- 809,822 ---- DWORD actual_length; ! if (!(piob->piob_flags & PIOB_success)) ! { ! if (piob->piob_flags & PIOB_error) ! { return FALSE; ! } ! if (!GetOverlappedResult( (HANDLE)piob->piob_desc, ! (OVERLAPPED*)&piob->piob_io_event, ! &actual_length, ! piob->piob_wait) || actual_length != piob->piob_io_length) { *************** *** 744,747 **** --- 824,828 ---- return nt_error ("GetOverlappedResult", piob->piob_file, isc_io_error, status_vector); } + } release_io_event (piob->piob_file, (OVERLAPPED *) &piob->piob_io_event); *************** *** 864,867 **** --- 945,949 ---- #endif + static FIL seek_file ( FIL file, *************** *** 885,901 **** DBB dbb; HANDLE desc; USHORT i; dbb = bdb->bdb_dbb; page = bdb->bdb_page; ! for (;; file = file->fil_next) ! if (!file) CORRUPT (158); /* msg 158 cannot sort on a field that does not exist */ ! else if (page >= file->fil_min_page && page <= file->fil_max_page) break; page -= file->fil_min_page - file->fil_fudge; if (ostype == OS_CHICAGO) { --- 967,993 ---- DBB dbb; HANDLE desc; + LARGE_INTEGER liOffset; + + #ifdef SUPERSERVER_V2 USHORT i; + #endif dbb = bdb->bdb_dbb; page = bdb->bdb_page; ! for (;; file = file->fil_next) { ! if (!file) { CORRUPT (158); /* msg 158 cannot sort on a field that does not exist */ ! } ! else ! if (page >= file->fil_min_page && page <= file->fil_max_page) { break; + } + } page -= file->fil_min_page - file->fil_fudge; + liOffset.QuadPart = UInt32x32To64((DWORD)page, (DWORD)dbb->dbb_page_size); + if (ostype == OS_CHICAGO) { *************** *** 903,907 **** desc = (HANDLE) ((file->fil_flags & FIL_force_write) ? file->fil_force_write_desc : file->fil_desc); ! if (SetFilePointer (desc, (LONG) (page * dbb->dbb_page_size), NULL, FILE_BEGIN) == -1) { THD_MUTEX_UNLOCK (file->fil_mutex); --- 995,1003 ---- desc = (HANDLE) ((file->fil_flags & FIL_force_write) ? file->fil_force_write_desc : file->fil_desc); ! ! if (SetFilePointer( desc, ! (LONG)liOffset.LowPart, ! &liOffset.HighPart, ! FILE_BEGIN) == 0xffffffff) { THD_MUTEX_UNLOCK (file->fil_mutex); *************** *** 913,927 **** else { ! memset (overlapped, 0, sizeof (OVERLAPPED)); ! overlapped->Offset = page * dbb->dbb_page_size; ! ! /* This error can be removed if 64-bit file support is added. */ - if ((overlapped->Offset / dbb->dbb_page_size) != page) - return (FIL) nt_error ("seek", file, isc_io_access_err, status_vector); *overlapped_ptr = overlapped; #ifdef SUPERSERVER_V2 THD_MUTEX_LOCK (file->fil_mutex); for (i = 0; i < MAX_FILE_IO; i++) if (overlapped->hEvent = (HANDLE) file->fil_io_events [i]) { --- 1009,1024 ---- else { ! overlapped->Offset = liOffset.LowPart; ! overlapped->OffsetHigh = liOffset.HighPart; ! overlapped->Internal = 0; ! overlapped->InternalHigh = 0; ! overlapped->hEvent = (HANDLE)0; *overlapped_ptr = overlapped; + #ifdef SUPERSERVER_V2 THD_MUTEX_LOCK (file->fil_mutex); for (i = 0; i < MAX_FILE_IO; i++) + { if (overlapped->hEvent = (HANDLE) file->fil_io_events [i]) { *************** *** 929,936 **** --- 1026,1036 ---- break; } + } THD_MUTEX_UNLOCK (file->fil_mutex); if (!overlapped->hEvent && !(overlapped->hEvent = CreateEvent (NULL, TRUE, FALSE, NULL))) + { return (FIL) nt_error ("CreateEvent", file, isc_io_access_err, status_vector); + } ResetEvent (overlapped->hEvent); #endif *************** *** 1058,1062 **** return FALSE; } ! else ERR_post (isc_io_error, gds_arg_string, string, --- 1158,1162 ---- return FALSE; } ! ERR_post (isc_io_error, gds_arg_string, string, *************** *** 1064,1067 **** --- 1164,1169 ---- isc_arg_gds, operation, gds_arg_win32, GetLastError(), 0); + + return TRUE; } |