'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 14 January 2008 at 9:55:46 pm'! Object subclass: #SMFileDatabase instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'SentorsaMagritte-Domain'! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! SMFileDatabase class instanceVariableNames: 'lock'! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 17:57'! backupDirectory ^ (FileDirectory default directoryNamed: self name) assureExistence. ! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/9/2007 12:47'! defaultHistoryCount ^ 50! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 18:15'! enablePersistence Smalltalk addToStartUpList: self. Smalltalk addToShutDownList: self! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 1/14/2008 08:50'! lastBackup | lastBackup | lastBackup := self lastBackupFile. lastBackup ifNil: [ ^ nil ]. ^ ReferenceStream readOnlyFileNamed: (self backupDirectory fullNameFor: lastBackup) do: [ : f | f next ]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 18:28'! lastBackupFile ^ self backupDirectory fileNames detectMax: [:each | each name asInteger]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 18:04'! repositories self subclassResponsibility! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/11/2007 12:17'! restoreLastBackup self lastBackup ifNotNilDo: [ : backup | self restoreRepositories: backup ]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 17:59'! restoreRepositories: someRepositories self subclassResponsibility! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 1/14/2008 08:52'! saveRepository | version | lock ifNil: [ lock := Semaphore forMutualExclusion ]. lock critical: [ self trimBackups. version := self lastBackupFile ifNil: [ 1 ] ifNotNil: [ self lastBackupFile name asInteger + 1 ]. ReferenceStream newFileNamed: (self backupDirectory fullPathFor: self name) , '.' , version asString do: [ : f | f nextPut: self repositories ; flush ] ]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 18:19'! shutDown: isGoingDown isGoingDown ifTrue: [ self saveRepository ]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/4/2007 18:24'! startUp: isComingUp isComingUp ifTrue: [ self restoreLastBackup ]! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/9/2007 12:24'! takeSnapshot [self saveRepository] forkAt: Processor userBackgroundPriority named: 'snapshot: ' , self class name! ! !SMFileDatabase class methodsFor: 'database' stamp: 'rjl 12/11/2007 12:19'! trimBackups | entries versionsToKeep | versionsToKeep := self defaultHistoryCount. entries := self backupDirectory entries. entries size < versionsToKeep ifTrue: [ ^ self ]. ((entries sortBy: [ : a : b | a first asInteger < b first asInteger ]) allButLast: versionsToKeep) do: [ : entry | self backupDirectory deleteFileNamed: entry first ]! !