------------------------------------------------------------------------------------------------ [BUG/PRB.] VFP 9.0 FIX - CHECK THE DESTINATION FILE FOR THE CREATE TABLE FILE COMMANDS January 2024 ------------------------------------------------------------------------------------------------ CCB 1. BUG: In vfp9 (and vfp6, vfp7, vfp8), for the create table file commands, if the file extension of the destination file is not .dbf, it will NOT delete the destination cdx file, sometimes the destination cdx file is damaged. There is a test program: *PROC testcopytotablefilewithcdx USE testtmpa.tmp COPY TO testtmpc.tmp WITH CDX USE RETURN * END OF PROC TESTCOPYTOTABLEFILEWITHCDX. We think it will run fine, but sometimes the destination cdx file is damaged. 2. CAUSE: In vfp9 (and vfp6, vfp7, vfp8), for the following COPY TO command: COPY TO test.dbf WITH CDX if the destination cdx file (test.cdx) exists, it will delete the destination cdx file first, and then copy data to the destination table file, and then create the destination cdx file. In vfp9 (and vfp6, vfp7, vfp8), for the following COPY TO command: COPY TO test.tmp WITH CDX if the destination cdx file (test.cdx) exists, it will NOT delete the destination cdx file, it will copy data to the destination table file, and then copy/add the tags and index expressions to the destination cdx file, sometimes the destination cdx file is damaged. In Visual FoxPro Advanced, for the following COPY TO commands: COPY TO test.dbf WITH CDX COPY TO test.tmp WITH CDX if the destination cdx file (test.cdx) exists, it will delete the destination cdx file first, and then copy data to the destination table file, and then create the destination cdx file. 3. RESOLUTION: We can write some code to fix the BUG. Fun4145d6 :: ; proc near push ebp ;0x004145d6 : 55 mov ebp , esp ;0x004145d7 : 8bec and esp , 0FFFFFFF8h ;0x004145d9 : 83e4f8 sub esp , 021Ch ;0x004145dc : 81ec1c020000 mov eax , dword ptr [ Data937090 ] ;0x004145e2 : a190709300 push ebx ;0x004145e7 : 53 push esi ;0x004145e8 : 56 mov dword ptr [ esp + 0220h ] , eax ;0x004145e9 : 89842420020000 push edi ;0x004145f0 : 57 lea eax , dword ptr [ esp + 0118h ] ;0x004145f1 : 8d842418010000 mov ebx , ecx ;0x004145f8 : 8bd9 call Fun41975b ;0x004145fa : e85c510000 mov eax , dword ptr [ ebp + 16 ] ;0x004145ff : 8b4510 test eax , eax ;0x00414602 : 85c0 je Label41464c ;0x00414604 : 7446 ; ; ------------------------------------------------------------------------------------- ; VFP 9.0 FIX - CHECK THE DESTINATION FILE FOR THE CREATE TABLE FILE COMMANDS ; June 2022 ; ------------------------------------------------------------------------------------- ; CCB ; ; Check the destination file for the create table file commands. ; ; 2022/6/17, by ccb ; cmp dword ptr vfpa_sys9102_data,00h je Label4148d0 lea eax , dword ptr [ esp + 0118h ] ;0x00414606 : 8d842418010000 pushd 05Ch ;0x0041460d : 6a5c push eax ;0x0041460f : 50 call dword ptr [ Data9370d0 ] ;0x00414610 : ff15d0709300 add esp , 08h ;0x00414616 : 83c408 test eax , eax ;0x00414619 : 85c0 je Label57e7cd ;0x0041461b : 0f84aca11600 Label414621 :: pushd 02Eh ;0x00414621 : 6a2e push eax ;0x00414623 : 50 call dword ptr [ Data9370d0 ] ;0x00414624 : ff15d0709300 add esp , 08h ;0x0041462a : 83c408 test eax , eax ;0x0041462d : 85c0 je Label41464c ;0x0041462f : 741b inc eax ;0x00414631 : 40 pushd offset Data919ea0 ;0x00414632 : 68a09e9100 push eax ;0x00414637 : 50 call dword ptr [ Data9370d8 ] ;0x00414638 : ff15d8709300 add esp , 08h ;0x0041463e : 83c408 neg eax ;0x00414641 : f7d8 sbb eax , eax ;0x00414643 : 1bc0 inc eax ;0x00414645 : 40 jne Label4148d0 ;0x00414646 : 0f8584020000 Label41464c :: mov esi , dword ptr [ ebp + 8 ] ;0x0041464c : 8b7508 mov edx , dword ptr [ esi + 32 ] ;0x0041464f : 8b5620 xor ecx , ecx ;0x00414652 : 33c9 mov cl , byte ptr [ Data933758 ] ;0x00414654 : 8a0d58379300 and edx , 0FF7FFEC7h ;0x0041465a : 81e2c7fe7fff xor eax , eax ;0x00414660 : 33c0 mov dword ptr [ esi + 8 ] , 0FFFFFFFFh ;0x00414662 : c74608ffffffff mov dword ptr [ esi + 36 ] , eax ;0x00414669 : 894624 mov dword ptr [esi] , ebx ;0x0041466c : 891e mov dword ptr [ esi + 40 ] , 01h ;0x0041466e : c7462801000000 and ecx , 01h ;0x00414675 : 83e101 shl ecx , 03h ;0x00414678 : c1e103 or ecx , edx ;0x0041467b : 0bca or ecx , 03h ;0x0041467d : 83c903 mov dword ptr [ esi + 60 ] , eax ;0x00414680 : 89463c mov dword ptr [ esi + 104 ] , eax ;0x00414683 : 894668 mov dword ptr [ esi + 32 ] , ecx ;0x00414686 : 894e20 call GetTickCount ;0x00414689 : ff15f8709100 mov edi , eax ;0x0041468f : 8bf8 cmp edi , dword ptr [ Data937ec8 ] ;0x00414691 : 3b3dc87e9300 jb Label57e7e7 ;0x00414697 : 0f824aa11600 Label41469d :: push edi ;0x0041469d : 57 pushd offset Data937ec8 ;0x0041469e : 68c87e9300 call InterlockedExchange ;0x004146a3 : ff1594719100 mov eax , dword ptr [ Data937ec0 ] ;0x004146a9 : a1c07e9300 add eax , edi ;0x004146ae : 03c7 mov edi , dword ptr [ ebp + 24 ] ;0x004146b0 : 8b7d18 mov dword ptr [ esi + 0A8h ] , eax ;0x004146b3 : 8986a8000000 mov eax , edi ;0x004146b9 : 8bc7 mov dword ptr [ esi + 0ACh ] , 00h ;0x004146bb : c786ac00000000000000 call Fun41e447 ;0x004146c5 : e87d9d0000 push esi ;0x004146ca : 56 call Fun414160 ;0x004146cb : e890faffff test eax , eax ;0x004146d0 : 85c0 jne Label413e14 ;0x004146d2 : 0f853cf7ffff Label4146d8 :: mov dword ptr [ esi + 4 ] , 0FFFFFFFFh ;0x004146d8 : c74604ffffffff Label4146df :: pushd 0181Ah ;0x004146df : 681a180000 mov eax , 024h ;0x004146e4 : b824000000 call Fun42bf2a ;0x004146e9 : e83c780100 mov dword ptr [ esi + 108 ] , eax ;0x004146ee : 89466c call Fun41979f ;0x004146f1 : e8a9500000 mov eax , dword ptr [ esi + 32 ] ;0x004146f6 : 8b4620 test byte ptr ah , 084h ;0x004146f9 : f6c484 jne Label517613 ;0x004146fc : 0f85112f1000 test al , al ;0x00414702 : 84c0 js Label517613 ;0x00414704 : 0f88092f1000 mov eax , dword ptr [ esi + 92 ] ;0x0041470a : 8b465c test eax , eax ;0x0041470d : 85c0 jne Label517613 ;0x0041470f : 0f85fe2e1000 Label414715 :: mov edx , dword ptr [ esi + 40 ] ;0x00414715 : 8b5628 mov ecx , dword ptr [ esp + 0224h ] ;0x00414718 : 8b8c2424020000 mov dword ptr [ esi + 44 ] , edx ;0x0041471f : 89562c mov eax , dword ptr [ Data93889c ] ;0x00414722 : a19c889300 mov dword ptr [ esi + 0B8h ] , eax ;0x00414727 : 8986b8000000 mov dword ptr [ Data93889c ] , esi ;0x0041472d : 89359c889300 call Fun42bf1d ;0x00414733 : e8e5770100 pop edi ;0x00414738 : 5f pop esi ;0x00414739 : 5e pop ebx ;0x0041473a : 5b mov esp , ebp ;0x0041473b : 8be5 pop ebp ;0x0041473d : 5d ret 014h ;0x0041473e : c21400 4. APPLIES TO: VFP 6.0.8167.0 VFP 6.0.8961.0 (SP5) VFP 7.0.0.9262 VFP 7.0.0.9465 (SP1) VFP 8.0.0.2521 VFP 8.0.0.3117 (SP1) VFP 9.0.0.2412 VFP 9.0.0.3504 (SP1) VFP 9.0.0.4611 (SP2) VFP 9.0.0.5015 (SP2) VFP 9.0.0.5411 (SP2) VFP 9.0.0.5721 (SP2) VFP 9.0.0.5815 (SP2) VFP 9.0.0.6303 (SP2) VFP 9.0.0.6602 (SP2) VFP 9.0.0.7423 (SP2) The bug has been fixed in VFP Advanced. IMPORTANT NOTE: In vfp9 (and vfp6, vfp7, vfp8), we can delete the destination cdx file before run the COPY TO command, for example, IF FILE("test.tmp") DELETE FILE ("test.tmp") ENDIF IF FILE("test.cdx") DELETE FILE ("test.cdx") ENDIF COPY TO ("test.tmp") WITH CDX and then there is no the bug. 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com http://www.baiyujia.com/vfpdocuments/f_vfp9fix216.asp 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |