Page 1 of 2
Comparing the source multiple JADE bases
Posted: Tue Aug 23, 2011 2:00 am
by Dr Danyo
Hi folks,
Does anyone have any code handy that will allow me to compare multiple JADE bases to each other
In particular we need to know if any of the bases are missing any code (not brothered about persistent data, but forms would also need to be considered).
We have over 140K methods so any code would have to run nice and quick (fastest solution wins).
As a starter just identifying bases that don't match would be fine, but extra points for identifying the specific differences.
cheers - Dr Danyo.
Re: Comparing the source multiple JADE bases
Posted: Tue Aug 23, 2011 9:20 am
by allistar
Assuming both databases are on the same version of JADE, simply run the two schema extracts taken from them through a visual diff tool (I use one called Kompare quite often). This will make it clear pretty quickly what the differences are. This doesn't work so well if the timestamp/user for features in the databases are different, even though the source is the same. If this is the case, then another simple option is to output a text file from the databases which are in this format: SchemaName::ClassName::methodName::md5sum where md5sum is the md5sum of the method source. Then run those two files through a diff program. You could take a similar approach with forms (but instead
Re: Comparing the source multiple JADE bases
Posted: Tue Aug 23, 2011 9:57 am
by torrie
We've just done this on a one client's system. Unfortunately the source was encrypted so we were only able to compare the dates / times. In the end, we just compared the persistent data structures (Classes, properties and references) and then did a full schema load (with appropriate scripts.)
I've also done schema file comparisons between systems as Allistar suggested. (I use TextPad for this) Some times I've stripped the userModifiedTimestamps fom the schema file to remove errors due to different time stamps etc. (Code below)
If you have a copy of the Jade 6.0 documentation, the Developers Reference has the Schema File Syntax. It hasn't been published by Jade since, but is basically the same.
Code: Select all
cleanSchemaFile();
// Cleans a schema file removing all the modified time stamps
vars
oInputFile : File;
oOutputFile : File;
oFileOpenDlg : CMDFileOpen;
sLine : String;
begin
create oFileOpenDlg transient;
oFileOpenDlg.filter := "All Schema Files (*.scm, *.mth, *.cls)|*.scm;*.cls;*.mth|Schema Files (*.scm)|*.scm|Class Files (*.cls)|*.cls|Method Files (*.mth)|*.mth|All Files (*.*)|*.*";
oFileOpenDlg.dialogTitle := "Schema File Clean";
oFileOpenDlg.fileMustExist := true;
oFileOpenDlg.validate := true;
if oFileOpenDlg.open() = 0 then
create oInputFile transient;
oInputFile.fileName := oFileOpenDlg.fileName;
oInputFile.shareMode := File.Share_Read;
oInputFile.kind := File.Kind_Unknown_Text;
oInputFile.mode := File.Mode_Input;
oInputFile.open();
create oOutputFile transient;
oOutputFile.fileName := oFileOpenDlg.fileName.getFileStem & "_Cleaned." & oFileOpenDlg.fileName.extractFileExtension;
oOutputFile.shareMode := File.Share_Exclusive;
oOutputFile.kind := File.Kind_Unknown_Text;
oOutputFile.mode := File.Mode_Output;
oOutputFile.open;
while not oInputFile.endOfFile do
sLine := oInputFile.readLine;
if sLine[1:22] = " setModifiedTimeStamp" then
else
oOutputFile.writeLine( sLine );
endif;
if sLine = "typeSources" or sLine = "externalFunctionSources" then
break;
endif;
endwhile;
// Got to the message sources so just write all the method source.
while not oInputFile.endOfFile do
oOutputFile.writeString( oInputFile.readString( 2048 ) );
endwhile;
endif;
epilog
delete oFileOpenDlg;
delete oInputFile;
delete oOutputFile;
end;
Re: Comparing the source multiple JADE bases
Posted: Wed Aug 24, 2011 1:08 pm
by shadowfax
A variant on the extract a schema and compare is to use JadeBatchExtract to extract in sections. See the section "Extracting Schemas in Sections" in the UserGuide.
For example the following extracts every schema in the system to the directory C:\temp2\userSchemas
jadclient path=e:\jadesystems\jade6111\system app=JadeBatchExtract schema=JadeSchema server=singleUser endJade Every C:\temp2\userSchemas\schemas.mul "<sections>"
Because each Type (Class) is extracted to a separate file and the methods are in the same order (this is not true in a scm file) it is easier to compare for differences.
KDiff3 allows you to recursively compare the folders quickly.
This is also a good way to get files than can be banked into subversion.
Re: Comparing the source multiple JADE bases
Posted: Fri Aug 26, 2011 3:35 am
by Dr Danyo
Thanks for all the responses guys, that gives me plenty to work with.
Shadowfax, are you using subversion for your JADE source?
ps KDiff3 looks particularly useful.
Re: Comparing the source multiple JADE bases
Posted: Mon Aug 29, 2011 12:36 pm
by shadowfax
In answer to Dr Danyo.
Yes we are using subversion for our JADE source. Every night we extract it and bank it.
I is used to answer questions such as
1. Who changed this method last (and how)
2. When did this line appear in this Jade method (and who added it)
3. When did the type of this property change.
4. etc.
Note questions such as 2 and 3 are easy to answer using the subversion "blame" feature
Re: Comparing the source multiple JADE bases
Posted: Mon Aug 29, 2011 2:05 pm
by BeeJay
Presumably the person who gets the blame is the last person to compile the method on the day it was changed?
For example, suppose the following sequence of events occurs on the one day:
- User A changes the method by adding two lines of code
- User B also changes the method by updating a different line of code
- The nightly extract runs and both lots of changes are now extracted & loaded into subversion
Does User B now get assigned the blame for both lots of changes, or are you somehow also using patch versioning and the method history to track both of these changes independently?
Cheers,
BeeJay.
Re: Comparing the source multiple JADE bases
Posted: Tue Aug 30, 2011 9:04 pm
by Dr Danyo
Hi Beejay, For that level of detail they would need a commit strategy, but just having the daily source under source control must be giving loads of benefits.
Shadowfax, I presume that you are automating the extract and commit, any chance we could see your scripts etc
Re: Comparing the source multiple JADE bases
Posted: Wed Aug 31, 2011 1:23 pm
by shadowfax
Here is our script. I have edited this so you could not see who the system belongs to
There may be some artifacts that result from this so be careful.
However the gist of the bat file should be ok.
Code: Select all
set HomeDrive=%1
if '%HomeDrive%' == '' goto usage
set Project=%2
if '%Project%' == '' goto usage
goto params
:usage
echo usage: extractSchema drive project
goto end
:params
:start
set DatabaseRoot=D:\Jade_Development
if not exist %DatabaseRoot%\nul set DatabaseRoot=R:\Jade_Development
set BuildType=ExtractSchema
set Root=daily
set BinDir=%DatabaseRoot%\%Project%\bin
set DatabasePath=%DatabaseRoot%\%Project%\system
set DistDatabasePath=%DatabaseRoot%\%Project%\systemd
rem === Set up configuration variables ===
set Volume=%HomeDrive%:
set User=build
set TimeServer=\\machinename
set Subversion="C:\Program Files (x86)\Subversion\bin\svn.exe"
if not exist %Subversion% set Subversion="C:\Program Files\Subversion\bin\svn.exe"
set Blat=%Volume%\%Root%\%Directory%\%Project%\overnight\Blat
rem note: comma separate multiple address,*don't* include any spaces
set MailTo=-t xxx@yyyy.com
rem === Set up convenience variables ===
set SrcDir=%Volume%\%Root%\%Project%
set SchemaDir=%SrcDir%\schema
set LockFile=%Volume%\%Root%\%Project%_%BuildType%.lock
set LogFile=%Volume%\%Root%\%BuildType%_%Project%.log
rem === Change to the build directory ===
md "%Volume%\%Root%"
pushd "%Volume%\%Root%"
rem === Check for existing build session ===
if exist "%LockFile%" goto locked
rem === Create lock file ===
net time %TimeServer% >> %LockFile%
rem === Cleanup old logs ===
del "%LogFile%"
rem === Log start timestamp ==
echo. > %LogFile%
echo *** Extract Schema started *** >> %LogFile%
net time %TimeServer% >> %LogFile% 2>&1
echo. >> %LogFile%
echo. >> %LogFile%
echo *** Deleting schema files *** >> %LogFile%
del "%SchemaDir%\User1Schema.*" /q/f >> %LogFile% 2>&1
del "%SchemaDir%\User2Schema.*" /q/f >> %LogFile% 2>&1
"%BinDir%\jadclient.exe" displayTimes=true ini="%DatabasePath%\jade.ini" path="%DatabasePath%" server=multiUser schema=JadeSchema app=JadeBatchExtract endJade Every "%SchemaDir%\schemas.mul " "<sections>"
echo. >> %LogFile%
echo *** Checking in schema files *** >> %LogFile%
echo. >> %LogFile%
echo *** Add any new and Delete removed .cls files *** >> %LogFile%
echo. >> %LogFile%
pushd "%SrcDir%\schema"
pushd "User1Schema"
if exist deletedFiles %Subversion% delete --targets deletedFiles >> %LogFile% 2>&1
if exist addedFiles %Subversion% add --targets addedFiles >> %LogFile% 2>&1
popd
pushd "User2Schema"
if exist deletedFiles %Subversion% delete --targets deletedFiles >> %LogFile% 2>&1
if exist addedFiles %Subversion% add --targets addedFiles >> %LogFile% 2>&1
popd
popd
echo. >> %LogFile%
%Subversion% --non-interactive commit -F"%SrcDir%\schema\PatchHistory_newlines.txt" "%SrcDir%\schema" >> %LogFile% 2>&1
echo. >> %LogFile%
echo. >> %LogFile%
%Blat% %LogMsgFile2% %MailTo%
net time %TimeServer% >> %LogFile% 2>&1
echo *** Extract Schema Succeeded *** >> %LogFile%
echo. >> %LogFile%
goto unlock
:locked
echo *** Extract Schema is already in progress ***
goto end
:unlock
del "%LockFile%"
:end
popd
Re: Comparing the source multiple JADE bases
Posted: Mon Sep 05, 2011 8:22 pm
by Dr Danyo
Perfect, thank you.