diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 70e3ece..f0da442 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -107,6 +107,8 @@ * 19/09/2014 FDBOZZO v1.19.34 Arreglo bug: Si se ejecuta FoxBin2Prg desde ventana de comandos FoxPro para un proyecto y hay algún archivo abierto o cacheado, se produce un error al intentar capitalizar el archivo de entrada (Jim Nelson) * 26/09/2014 FDBOZZO v1.19.35 Mejora: Generar siempre el mismo Timestamp y UniqueID para los binarios minimizaría los cambios al regenerarlos (Marcio Gomez G.) * 08/10/2014 FDBOZZO v1.19.36 Arreglo bug: Al generar el mn2 el identificador queda vacío (bug introducido en v1.19.35) +* 19/11/2014 FDBOZZO v1.19.37 Arreglo bug: "String is too long to fit" cuando se procesa un DBF grande con DBF_Conversion_Support = 4 (edyshor) +* 19/11/2014 FDBOZZO v1.19.37 Mejora dbf: Nuevo parámetro ClearDBFLastUpdate para evitar diferencias por este dato (edyshor) * 21/10/2014 FDBOZZO v1.19.37 Mejora: Permitir generar una clase por archivo (Ryan Harris/Lutz Scheffler) * 30/10/2014 FDBOZZO v1.19.37 Mejora: Optimizaciones * @@ -155,6 +157,8 @@ * 28/08/2014 Peter Hipp REPORTE BUG mnx v1.19.32: Si una opción tiene asociado un Procedure de 1 línea, no se mantiene como Procedure y se convierte a Command (solucionado en v1.19.33) * 19/09/2014 Jim Nelson REPORTE BUG v1.19.33: Si se ejecuta FoxBin2Prg desde ventana de comandos FoxPro para un proyecto y hay algún archivo abierto o cacheado, se produce un error (solucionado en v1.19.34) * 26/09/2014 Marcio Gomez G. MEJORA v1.19.34: Generar siempre el mismo Timestamp y UniqueID para los binarios minimizaría los cambios al regenerarlos (Agregado en v1.19.35) +* 19/11/2014 edyshor REPORTE BUG dbf v1.19.36: "String is too long to fit" cuando se procesa un DBF grande con DBF_Conversion_Support = 4 (Agregado en v1.19.37) +* 19/11/2014 edyshor MEJORA dbf v1.19.36: Nuevo parámetro ClearDBFLastUpdate para evitar diferencias por este dato (Agregado en v1.19.37) * 14/10/2014 Lutz Scheffler MEJORA v1.19.36: Permitir generar una clase por archivo (pregunta) * 21/10/2014 Ryan Harris MEJORA v1.19.36: Permitir generar una clase por archivo (sugerencia) * @@ -509,6 +513,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -521,6 +526,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -541,6 +547,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -558,6 +565,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -604,8 +612,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM l_ClassPerFileCheck = .F. l_RedirectClassPerFileToMain = .F. l_NoTimestamps = .T. - l_ClearUniqueID = .T. - l_OptimizeByFilestamp = .F. + l_ClearUniqueID = .T. + l_ClearDBFLastUpdate = .T. + l_OptimizeByFilestamp = .F. l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias @@ -614,7 +623,8 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM n_ClassTimeStamp = 1130668032 && 2013/11/04 20:00:00 n_CFG_Actual = 0 n_ID = 0 - o_Conversor = NULL + n_FileHandle = 0 + o_Conversor = NULL o_Frm_Avance = NULL o_FSO = NULL o_FNC = NULL && Filename_caps object @@ -784,6 +794,15 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC + PROCEDURE l_ClearDBFLastUpdate_ACCESS + IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) + RETURN THIS.l_ClearDBFLastUpdate + ELSE + RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ClearDBFLastUpdate, THIS.l_ClearDBFLastUpdate ) + ENDIF + ENDPROC + + PROCEDURE l_OptimizeByFilestamp_ACCESS IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) RETURN THIS.l_OptimizeByFilestamp @@ -1146,17 +1165,17 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM tcOutputFile_Ext1 = FORCEEXT(tcOutputFile, lcExt_1) IF FILE( tcOutputFile_Ext1 ) - *-- LOG - DO CASE - CASE EMPTY(lcExt_2) + *-- LOG + DO CASE + CASE EMPTY(lcExt_2) .writeLog( C_BACKUP_OF_LOC + tcOutputFile_Ext1 ) - CASE EMPTY(lcExt_3) + CASE EMPTY(lcExt_3) .writeLog( C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 ) - OTHERWISE + OTHERWISE .writeLog( C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 + '/' + lcExt_3 ) - ENDCASE + ENDCASE - *-- COPIA BACKUP + *-- COPIA BACKUP COPY FILE ( tcOutputFile_Ext1 ) TO ( tcBakFile_1 ) IF NOT EMPTY(lcExt_2) @@ -1164,7 +1183,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM IF FILE( tcOutputFile_Ext2 ) COPY FILE ( tcOutputFile_Ext2 ) TO ( tcBakFile_2 ) - ENDIF + ENDIF ENDIF IF NOT EMPTY(lcExt_3) @@ -1172,11 +1191,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM IF FILE( tcOutputFile_Ext3 ) COPY FILE ( tcOutputFile_Ext3 ) TO ( tcBakFile_3 ) + ENDIF + ENDIF ENDIF ENDIF ENDIF - ENDIF - ENDIF ENDWITH && THIS CATCH TO toEx @@ -1190,7 +1209,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM FINALLY RELEASE toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3 ; - , lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 ; + , lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 ; , tcOutputFile ENDTRY @@ -1313,6 +1332,13 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM .writeLog( JUSTFNAME(lcConfigFile) + ' > ClearUniqueID: ' + TRANSFORM(lcValue) ) ENDIF + CASE LEFT( laConfig(I), 19 ) == LOWER('ClearDBFLastUpdate:') + lcValue = ALLTRIM( SUBSTR( laConfig(I), 20 ) ) + IF INLIST( lcValue, '0', '1' ) THEN + lo_CFG.l_ClearDBFLastUpdate = ( TRANSFORM(lcValue) == '1' ) + .writeLog( JUSTFNAME(lcConfigFile) + ' > ClearDBFLastUpdate: ' + TRANSFORM(lcValue) ) + ENDIF + CASE LEFT( laConfig(I), 20 ) == LOWER('OptimizeByFilestamp:') lcValue = ALLTRIM( SUBSTR( laConfig(I), 21 ) ) IF NOT INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN @@ -1516,6 +1542,84 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC + FUNCTION FilesComparedAreEqual + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tcFilename1 (v! IN ) Nombre del archivo1 a comparar + * tcFilename2 (v! IN ) Nombre del archivo2 a comparar + * tcStrFileName2 (v! IN ) ***NO IMPLEMENTADO*** Contenido del archivo2 a comparar + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcFilename1, tcFilename2, tcStrFileName2 + + LOCAL lnComparacion, lnLen1, lnLen2, lnHandle1, lnHandle2, lnTipoComp, lnChunkSize ; + , loEx as Exception + + TRY + STORE -1 TO lnComparacion, lnHandle1, lnHandle2 + lnTipoComp = 0 + lnChunkSize = 65535 + + DO CASE + CASE NOT EMPTY(tcFilename1) AND NOT EMPTY(tcFilename2) + lnTipoComp = 1 + lnHandle1 = FOPEN( tcFilename1 ) + + IF lnHandle1 = -1 + EXIT + ENDIF + + lnHandle2 = FOPEN( tcFilename2 ) + + IF lnHandle2 = -1 + EXIT + ENDIF + + lnLen1 = FSEEK( lnHandle1, 0, 2 ) + lnLen2 = FSEEK( lnHandle2, 0, 2 ) + + *-- Comparación de tamaño + IF lnLen1 <> lnLen2 THEN + lnComparacion = 0 && Son distintos + EXIT + ENDIF + + *-- Comparación de contenido + FSEEK( lnHandle1, 0, 0 ) + FSEEK( lnHandle2, 0, 0 ) + + DO WHILE NOT ( FEOF(lnHandle1) OR FEOF(lnHandle2) ) + IF NOT SYS( 2007, FREAD( lnHandle1, lnChunkSize ), -1, 1 ) == SYS( 2007, FREAD( lnHandle2, lnChunkSize ), -1, 1 ) THEN + lnComparacion = 0 && Son distintos + EXIT + ENDIF + ENDDO + + IF lnComparacion = 0 THEN + EXIT + ENDIF + + lnComparacion = 1 && Son iguales + + ENDCASE + + CATCH TO loEx + lnComparacion = -1 && Error + THROW + + FINALLY + DO CASE + CASE lnTipoComp = 1 + FCLOSE( lnHandle1 ) + FCLOSE( lnHandle2 ) + + ENDCASE + + ENDTRY + + RETURN lnComparacion + ENDFUNC + + FUNCTION FilenameFoundInFilter *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -2381,41 +2485,41 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDCASE - *-- Normalizar archivo(s) de entrada. El primero siempre se normaliza (??2, ??X, DBF, DBC) + *-- Normalizar archivo(s) de entrada. El primero siempre se normaliza (??2, ??X, DBF, DBC) .RenameFile( tcFileName, lcEXE_CAPS, loFSO, llRelanzarError ) - DO CASE - CASE lcType = 'PJX' + DO CASE + CASE lcType = 'PJX' .RenameFile( FORCEEXT(tcFileName,'PJT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'VCX' + CASE lcType = 'VCX' .RenameFile( FORCEEXT(tcFileName,'VCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'SCX' + CASE lcType = 'SCX' .RenameFile( FORCEEXT(tcFileName,'SCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'FRX' + CASE lcType = 'FRX' .RenameFile( FORCEEXT(tcFileName,'FRT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'LBX' + CASE lcType = 'LBX' .RenameFile( FORCEEXT(tcFileName,'LBT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'DBF' + CASE lcType = 'DBF' IF FILE( FORCEEXT(tcFileName,'FPT') ) .RenameFile( FORCEEXT(tcFileName,'FPT'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDIF + ENDIF IF FILE( FORCEEXT(tcFileName,'CDX') ) .RenameFile( FORCEEXT(tcFileName,'CDX'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDIF + ENDIF - CASE lcType = 'DBC' + CASE lcType = 'DBC' .RenameFile( FORCEEXT(tcFileName,'DCX'), lcEXE_CAPS, loFSO, llRelanzarError ) .RenameFile( FORCEEXT(tcFileName,'DCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'MNX' + CASE lcType = 'MNX' .RenameFile( FORCEEXT(tcFileName,'MNT'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDCASE + ENDCASE ENDWITH && THIS @@ -2446,6 +2550,30 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC + ******************************************************************************************************************* + PROCEDURE RenameTmpFile2Tx2File + LPARAMETERS tcFileName + + LOCAL lcTmpFile, loFSO AS Scripting.FileSystemObject, loEx as Exception + + TRY + *loFSO = THIS.o_FSO + lcTmpFile = tcFileName + '.TMP' + THIS.ChangeFileAttribute( tcFileName, '+N' ) + ERASE (tcFileName) + RENAME (lcTmpFile) TO (tcFileName) + + CATCH TO loEx + THROW + + FINALLY + *loFSO = NULL + ENDTRY + + RETURN + ENDPROC + + ******************************************************************************************************************* PROCEDURE writeErrorLog LPARAMETERS tcText @@ -2714,7 +2842,7 @@ DEFINE CLASS c_conversor_base AS SESSION * tnLEN_TAG_F (v! IN ) Longitud del tag de fin *-------------------------------------------------------------------------------------------------------------- LPARAMETERS tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F - + EXTERNAL ARRAY taProps LOCAL llBloqueEncontrado, loEx AS EXCEPTION @@ -2897,7 +3025,7 @@ DEFINE CLASS c_conversor_base AS SESSION IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior llIsContinuation = .T. ENDIF - + RELEASE taCodeLines, I, lcPrevLine RETURN llIsContinuation @@ -2950,7 +3078,7 @@ DEFINE CLASS c_conversor_base AS SESSION llEncontrado = .T. ENDIF ENDIF - + FINALLY RELEASE tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin, lcLine ENDTRY @@ -4823,7 +4951,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base lnPos2 = AT( ']', tcSeparatedCommaVars, I ) tcSeparatedCommaVars = STUFF( tcSeparatedCommaVars, lnPos1, lnPos2 - lnPos1 + 1, '' ) ENDFOR - + RELEASE tcSeparatedCommaVars, lnPos1, lnPos2, I RETURN ENDPROC @@ -4876,7 +5004,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDFOR RELEASE tcMemo, tcPAM, tcPAM_Type, tcPAM_Visibility, lcPAM, I - RETURN + RETURN ENDPROC @@ -4953,7 +5081,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , toObjeto._User ) ENDIF ENDWITH && THIS - + RELEASE toClase, toObjeto, toFoxBin2Prg, lcPropsMemo, lcMethodsMemo RETURN ENDPROC @@ -5125,7 +5253,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base FINALLY loProcedure = NULL RELEASE toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; - , taLineasExclusion, tnBloquesExclusion, llEsProcedureDeClase, loProcedure + , taLineasExclusion, tnBloquesExclusion, llEsProcedureDeClase, loProcedure ENDTRY @@ -6028,35 +6156,35 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base CASE .lineaExcluida( I, tnBloquesExclusion, @taLineasExclusion ) ; OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - *CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) - * llFoxBin2Prg_Completed = .T. + *CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) + * llFoxBin2Prg_Completed = .T. - *CASE NOT llEXTERNAL_CLASS_Completed AND .analizarBloque_EXTERNAL_CLASS( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) + *CASE NOT llEXTERNAL_CLASS_Completed AND .analizarBloque_EXTERNAL_CLASS( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) *-- Puede haber varias clases externas - *CASE NOT llLIBCOMMENT_Completed AND .analizarBloque_LIBCOMMENT( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) - * llLIBCOMMENT_Completed = .T. - * llEXTERNAL_CLASS_Completed = .T. + *CASE NOT llLIBCOMMENT_Completed AND .analizarBloque_LIBCOMMENT( @toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) + * llLIBCOMMENT_Completed = .T. + * llEXTERNAL_CLASS_Completed = .T. - *CASE NOT llOLE_DEF_Completed AND .analizarBloque_OLE_DEF( @toModulo, @lcLine, @taCodeLines ; - , @I, tnCodeLines, @lcProcedureAbierto ) + *CASE NOT llOLE_DEF_Completed AND .analizarBloque_OLE_DEF( @toModulo, @lcLine, @taCodeLines ; + , @I, tnCodeLines, @lcProcedureAbierto ) *-- Puede haber varios objetos OLE - *CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analizarBloque_INCLUDE( @toModulo, @loClase, @lcLine ; - , @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) + *CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analizarBloque_INCLUDE( @toModulo, @loClase, @lcLine ; + , @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) * Específico para SCX que lo tiene al inicio - * llINCLUDE_SCX_Completed = .T. - * llEXTERNAL_CLASS_Completed = .T. + * llINCLUDE_SCX_Completed = .T. + * llEXTERNAL_CLASS_Completed = .T. CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @I, tnCodeLines ; , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario ) *-- Puede haber varias clases definidas - * llEXTERNAL_CLASS_Completed = .T. + * llEXTERNAL_CLASS_Completed = .T. ENDCASE ENDFOR - + .verificar_CLASES_EXTERNAS( @toModulo, @toFoxBin2Prg ) ENDIF ENDWITH && THIS @@ -6118,7 +6246,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *-- Defino el objeto de módulo y sus propiedades *toModulo = NULL *toModulo = CREATEOBJECT('CL_MODULO') - + IF NOT (toFoxBin2Prg.l_UseClassPerFile AND toFoxBin2Prg.l_RedirectClassPerFileToMain) llEXTERNAL_CLASS_Completed = .T. ENDIF @@ -6151,15 +6279,15 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base llINCLUDE_SCX_Completed = .T. llEXTERNAL_CLASS_Completed = .T. - *CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @I, tnCodeLines ; - , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario ) + *CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @I, tnCodeLines ; + , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario ) *-- Puede haber varias clases definidas - * llEXTERNAL_CLASS_Completed = .T. + * llEXTERNAL_CLASS_Completed = .T. ENDCASE ENDFOR - + ENDIF ENDWITH && THIS @@ -6211,14 +6339,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *ERROR 'El conteo de clases externas (' + TRANSFORM(toModulo._ExternalClasses_Count) + ') no coincide con la cantidad encontrada (' + TRANSFORM(toModulo._Clases_Count) + ') en el archivo [' + toFoxBin2Prg.c_InputFile + ']' ERROR (TEXTMERGE(C_EXTERNAL_CLASS_COUNT_DOES_NOT_MATCH_FOUND_CLASSES)) - *CASE toModulo._ExternalClasses_Count <> toModulo._Clases_Count THEN + *CASE toModulo._ExternalClasses_Count <> toModulo._Clases_Count THEN ENDCASE FOR I = 1 TO toModulo._ExternalClasses_Count lnItem = 0 FOR X = 1 TO toModulo._Clases_Count - IF LOWER( toModulo._Clases(X)._objname ) == LOWER( toModulo._ExternalClasses(I) ) + IF LOWER( toModulo._Clases(X)._ObjName ) == LOWER( toModulo._ExternalClasses(I) ) lnItem = X EXIT ENDIF @@ -8315,7 +8443,12 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin USE IN (SELECT(JUSTSTEM(.c_OutputFile))) *-- La actualización de la fecha sirve para evitar diferencias al regenerar el DBF - ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) + IF toFoxBin2Prg.l_ClearDBFLastUpdate THEN + ldLastUpdate = EVALUATE( '{^2013/11/04}' ) + ELSE + ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) + ENDIF + loDBFUtils.write_DBC_BackLink( .c_OutputFile, toTable._Database, ldLastUpdate ) ENDWITH && THIS @@ -8900,11 +9033,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount ; - , taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count ; - , toFoxBin2Prg, lcMethodName, lnMethodCount + , taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count ; + , toFoxBin2Prg, lcMethodName, lnMethodCount ENDTRY RETURN @@ -8972,7 +9105,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments ; , lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen @@ -9043,7 +9176,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo ; , laLines, I, lnPos, loEx @@ -9160,7 +9293,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo ; , laItems, I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods @@ -9275,7 +9408,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMethod, tcIndentation, tlKeepProcHeader ; , I, X, llProcedure, lnInicio, lnFin, laLineas, lnOffset @@ -9307,7 +9440,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMethod, I ENDTRY @@ -9346,7 +9479,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine ; , I, lcComentarios, laLines, lcFinDeLinea @@ -9414,11 +9547,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; - , taProtected, tnProtected_Count, toFoxBin2Prg ; - , I, I2, laMethods, lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx + , taProtected, tnProtected_Count, toFoxBin2Prg ; + , I, I2, laMethods, lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx ENDTRY RETURN @@ -9637,13 +9770,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; - , taProtected, tnProtected_Count, toFoxBin2Prg ; - , lnLineCount, laLine, I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; - , laLineasExclusion, lnBloquesExclusion ; - , loEx + , taProtected, tnProtected_Count, toFoxBin2Prg ; + , lnLineCount, laLine, I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; + , laLineasExclusion, lnBloquesExclusion ; + , loEx ENDTRY RETURN @@ -9720,7 +9853,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE toRegObj, lcMemo, laPropsAndValues, lnPropsAndValues_Count ENDTRY @@ -9871,12 +10004,12 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF THROW - + FINALLY RELEASE toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; - , tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count ; - , lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; - , lcPropName, lnProtectedItem, lcComentarios, loEx + , tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count ; + , lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; + , lcPropName, lnProtectedItem, lcComentarios, loEx ENDTRY RETURN @@ -10533,9 +10666,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *!* ENDSCAN - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * - ENDTEXT + ENDTEXT *!* CATCH TO loEx *!* IF THIS.l_Debug AND _VFP.STARTMODE = 0 @@ -10561,9 +10694,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base #IF .F. LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF - + LOCAL llFileExists - + llFileExists = FILE(tcOutputFile) IF llFileExists AND FILETOSTR( tcOutputFile ) == tcCodigo THEN @@ -10575,7 +10708,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base toFoxBin2Prg.doBackup( .F., .T., '', '', '', tcOutputFile ) toFoxBin2Prg.ChangeFileAttribute( tcOutputFile, '-R' ) ENDIF - + IF STRTOFILE( tcCodigo, tcOutputFile ) = 0 *ERROR 'No se puede generar el archivo [' + .c_OutputFile + '] porque es ReadOnly' ERROR (TEXTMERGE(C_CANT_GENERATE_FILE_BECAUSE_IT_IS_READONLY_LOC)) @@ -10876,7 +11009,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg ENDFOR .write_OutputFile( @lcCodigo, lcOutputFile, @toFoxBin2Prg ) - ENDIF + ENDIF ENDIF ENDWITH && THIS @@ -11142,7 +11275,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg ENDFOR .write_OutputFile( @lcCodigo, lcOutputFile, @toFoxBin2Prg ) - ENDIF + ENDIF ENDIF ENDWITH && THIS @@ -12092,14 +12225,49 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg *-- Header loTable = CREATEOBJECT('CL_DBF_TABLE') - C_FB2PRG_CODE = C_FB2PRG_CODE + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + + IF toFoxBin2Prg.DBF_Conversion_Support = 4 + *-- Exportación de estructura y datos (para Diff solamente) + ERASE (.c_OutputFile + '.TMP' ) + toFoxBin2Prg.n_FileHandle = FCREATE( .c_OutputFile + '.TMP' ) + + IF toFoxBin2Prg.n_FileHandle = -1 THEN + ERROR 102, (.c_OutputFile) + ENDIF + + FWRITE( toFoxBin2Prg.n_FileHandle, C_FB2PRG_CODE ) + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + FCLOSE( toFoxBin2Prg.n_FileHandle ) - *-- Genero el DB2 - IF .l_Test - toModulo = C_FB2PRG_CODE + *-- Genero el DB2, renombrando el TMP + IF .l_Test + toModulo = C_FB2PRG_CODE + ELSE + DO CASE + CASE FILE(.c_OutputFile) AND toFoxBin2Prg.FilesComparedAreEqual( .c_OutputFile + '.TMP', .c_OutputFile ) = 1 + ERASE (.c_OutputFile + '.TMP') + *.writeLog( 'El archivo de salida [' + .c_OutputFile + '] no se sobreescribe por ser igual al generado.' ) + .writeLog( TEXTMERGE(C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC) ) + CASE toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) ; + AND toFoxBin2Prg.ChangeFileAttribute( .c_OutputFile, '-R' ) ; + AND NOT toFoxBin2Prg.RenameTmpFile2Tx2File( .c_OutputFile ) + *ERROR 'No se puede generar el archivo [' + .c_OutputFile + '] porque es ReadOnly' + ERROR (TEXTMERGE(C_CANT_GENERATE_FILE_BECAUSE_IT_IS_READONLY_LOC)) + ENDCASE + ENDIF + ELSE - .write_OutputFile( (C_FB2PRG_CODE), .c_OutputFile, @toFoxBin2Prg ) + C_FB2PRG_CODE = C_FB2PRG_CODE + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + + + *-- Genero el DB2 + IF .l_Test + toModulo = C_FB2PRG_CODE + ELSE + .write_OutputFile( (C_FB2PRG_CODE), .c_OutputFile, @toFoxBin2Prg ) + ENDIF + ENDIF *-- Hook para permitir ejecución externa (por ejemplo, para exportar datos) @@ -16841,7 +17009,7 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE <> <<>> <> <<>> <> - <<>> <> + <<>> <> <<>> <> <<>> <> <<>> <> @@ -16894,8 +17062,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE *** DH 06/02/2014: added _Records loRecords = THIS._Records - lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition) - + *lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition, @toFoxBin2Prg) + lcText = '' ENDIF TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 @@ -16903,6 +17073,11 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE <<>> ENDTEXT + IF toFoxBin2Prg.DBF_Conversion_Support = 4 && BIN2PRG (DATA EXPORT FOR DIFF) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' + ENDIF + CATCH TO loEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 @@ -17497,21 +17672,29 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE * taFields (@! IN ) Array de información de campos * tnField_Count (v! IN ) Cantidad de campos * tc_DBF_Conversion_Condition (v? IN ) Condición de filtro para la conversión. Solo se exporta lo que la cumpla. + * toFoxBin2Prg (@! IN ) Referencia de toFoxBin2Prg *--------------------------------------------------------------------------------------------------- - LPARAMETERS taFields, tnField_Count, tc_DBF_Conversion_Condition + LPARAMETERS taFields, tnField_Count, tc_DBF_Conversion_Condition, toFoxBin2Prg EXTERNAL ARRAY taFields + #IF .F. + LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + TRY - LOCAL lcText, loEx AS EXCEPTION ; + LOCAL lcText, loEx AS EXCEPTION, I ; , loRecord AS CL_DBF_RECORD OF 'FOXBIN2PRG.PRG' - lcText = '' + lcText = '' + I = 0 TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <<>> <> ENDTEXT + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' loRecord = CREATEOBJECT('CL_DBF_RECORD') IF EMPTY(tc_DBF_Conversion_Condition) @@ -17519,14 +17702,24 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE ENDIF SCAN FOR &tc_DBF_Conversion_Condition. - lcText = lcText + loRecord.toText(@taFields, tnField_Count) + I = I + 1 + lcText = loRecord.toText(@taFields, tnField_Count) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + IF MOD(I,10000) = 0 THEN + FFLUSH( toFoxBin2Prg.n_FileHandle, .T. ) + ENDIF ENDSCAN + lcText = '' + TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> <<>> ENDTEXT + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' + CATCH TO loEx loEx.UserValue = loEx.UserValue + 'tc_DBF_Conversion_Condition = [' + TRANSFORM(tc_DBF_Conversion_Condition) + ']' + CR_LF @@ -20593,6 +20786,7 @@ DEFINE CLASS CL_CFG AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -20633,7 +20827,8 @@ DEFINE CLASS CL_CFG AS CUSTOM l_Recompile = NULL l_NoTimestamps = NULL l_ClearUniqueID = NULL - l_OptimizeByFilestamp = NULL + l_ClearDBFLastUpdate = NULL + l_OptimizeByFilestamp = NULL l_RedirectClassPerFileToMain = NULL l_UseClassPerFile = NULL l_ClassPerFileCheck = NULL