Versienummer onderhouden

Een Gambas programma heeft een versienummer dat bestaat uit x.x.x, bv 0.0.1 als je net een nieuw project gestart hebt.
Het is in de IDE zichtbaar in Project, properties, en kan daar ook aangepast worden. Het wordt automatische verhoogd als je “compile” doet in de IDE. In code kan je het opvragen met Application.Version.

In een programma dat een databank gebruikt, hou ik ook bij welke versie lokaal geïnstalleerd staat, en wat de vorige versie was. Dat kan helpen in het oplossen van problemen, bv op het moment dat de struktuur van de databank verandert, en je dus zeker moet zijn met welke versie je werkt. Eigenlijk zou ik ook in de databank de minimumversie moeten bewaren bedenk ik nu, of misschien zelfs loggen user_id, version_used.

Ik heb geprobeerd zicht te houden op de versies die lokaal gebruikt worden, opgeslagen in de Settings File (~/.config/gambas/application.conf):

application.conf

[General]
..
Language="nl_BE"
Runcounter=1028
..
PreviousVersion="0.2.38"
LastVersion="0.2.38"
Version="0.2.38"
HighVersion="0.2.39"
LowVersion="0.2.10"
PreVersionDateOut=07/01/2016 13:24:07.426
...

Ik kan aflezen wat de laagste gebruikte versie is, wat de hoogste (soms schakel je terug naar een lagere versie na vastgestelde fouten bv), wat de huidige, voorgaande en wat de laatst gebruikte versie was.

Waarvoor ik in de module MCommon:


PRIVATE sLastError AS String

PUBLIC SUB storeVersion()
  ' check version settings exist
  IF NOT Settings["General/PreviousVersion"]  ' previous version number used (lower)
    Settings["General/PreviousVersion"] = Application.Version 
  ENDIF 

  IF NOT Settings["General/LowVersion"] ' lowest version used 
    Settings["General/LowVersion"] = Application.Version
  ENDIF 
 
  IF NOT Settings["General/HighVersion"] ' highest version used - kept when downgrading!
    Settings["General/HighVersion"] = Application.Version
  ENDIF 
  
  Settings["General/LastVersion"] = Settings["General/Version", ""] ' first save value before replacing it
  Settings["General/Version"] = Application.Version ' store version of current run 
  
  IF (Settings["General/Version"] <> Settings["General/LastVersion"]) ' up or downgrade?
    IF newestVersion(Settings["General/LastVersion"], Settings["General/Version"]) = Settings["General/Version"] ' upgrade
      Settings["General/PreVersionDateOut"] = Now() 
      Settings["General/PreviousVersion"] = Settings["General/LastVersion"]
      
    ELSE ' downgrade, check under lowest ?
      IF newestVersion(Settings["General/LowVersion"], Application.Version) = Settings["General/LowVersion"]
        Settings["General/LowVersion"] = Application.Version
      ENDIF 
    ENDIF 
    IF Settings["General/HighVersion"] <> Application.Version
      Settings["General/HighVersion"] = newestVersion(Settings["General/HighVersion", ""], Application.Version)
    ENDIF 
    
  ENDIF 
  Settings.Save

END

met de test :

PUBLIC FUNCTION newestVersion(sVersionA AS String, sVersionB AS String) AS String
  
  DIM sPart AS String
  
  DIM arrsPartsA AS String[]
  DIM arrsPartsB AS String[]
  
  DIM i AS Integer
  
  IF NOT sVersionA ' sVersionA is empty
    IF sVersionB 
      RETURN sVersionB
    ELSE ' AND sVersionB is empty
      RETURN ""
    ENDIF 
  ELSE IF NOT sVersionB ' sVersionB is empty
    RETURN sVersionA
  ELSE ' none is empty; compare parts to find out
    arrsPartsA = Split(sVersionA, ".")
    arrsPartsB = Split(sVersionB, ".")
  
    IF arrsPartsA.Count = arrsPartsB.Count
  
      FOR i = 0 TO (arrsPartsA.Count - 1)
        IF Val(arrsPartsA[i]) > Val(arrsPartsB[i])
          RETURN sVersionA
        ELSE 
          IF Val(arrsPartsB[i]) > Val(arrsPartsA[i])
            RETURN sVersionB
          ELSE 
            sLastError = "Part " & Str$(i + 1) & " of version number is the same " & arrsPartsA[i]
            DEBUG sLastError
          ENDIF 
        ENDIF 
        
      NEXT 
    ELSE 
      sLastError = "Could not detect versions; structure not the same: " & sVersionA & " <> " & sVersionB
      RETURN ""
    ENDIF 
    
  ENDIF   
  
END

en aangeroepen vanuit de eerst opstartende module, bv de klasse MMain (die opstartklasse is en nadien FMain aanroept):

MMain


 MCommon.storeVersion()