'From Squeak3.0 of 4 February 2001 [latest update: #3545] on 19 February 2001 at 9:38:07 am'! "Change Set: CelesteCompactFix-sr Date: 19 February 2001 Author: Stephan Rudlof Removed a nasty Celeste bug and made some fixes/improvements. Compaction of database works now and results in a *valid* IndexFile. Works with Squeak3.0 of 4 February 2001 latest update: #3545."! !IndexFile methodsFor: 'file operations' stamp: 'sr 2/19/2001 07:36'! delete | logFilename | "delete logfile" logFilename _ filename , '.log'. FileDirectory splitName: logFilename to: [:dirPath :name | (FileDirectory forFileName: logFilename) deleteFileNamed: name ifAbsent: []]. "Delete this file." super delete! ! !IndexFile methodsFor: 'file operations' stamp: 'sr 2/19/2001 06:41'! openOn: aFileName messageFile: messageFile readLogFlag: readLogFlag "Initialize myself from the file with the given name." | fileStream | filename _ aFileName. fileStream _ FileStream fileNamed: aFileName. self readFrom: (ReadStream on: fileStream contentsOfEntireFile) messageFile: messageFile. readLogFlag ifTrue: [self readLogMessageFile: messageFile]. "close and release the file stream" fileStream close. fileStream _ nil! ! !IndexFile methodsFor: 'file operations' stamp: 'sr 2/19/2001 09:19'! readLogMessageFile: messageFile | file msgID entry | file _ self logStream position: 0. [file atEnd] whileFalse: [(file peekFor: $r) ifTrue: [MailDB readStringLineFrom: file. self privateRemove: (MailDB readIntegerLineFrom: file)] ifFalse: [msgID _ MailDB readIntegerLineFrom: file. entry _ IndexFileEntry readFrom: file messageFile: messageFile msgID: msgID. self privateAt: msgID put: entry]]. self logStream close! ! !IndexFile methodsFor: 'file operations' stamp: 'sr 2/19/2001 07:28'! rename: newFileName "rename log file" | logFilename newLogFilename | logFilename _ filename , '.log'. newLogFilename _ newFileName , '.log'. FileDirectory splitName: logFilename to: [:dirPath :oldFileName | | fd | fd _ FileDirectory forFileName: logFilename. (fd fileExists: logFilename) ifTrue: [fd rename: oldFileName toBe: newLogFilename]]. "at last, it changes filename!!" super rename: newFileName! ! !IndexFile methodsFor: 'dictionary access' stamp: 'sr 2/19/2001 07:54'! at: msgID put: anIndexFileEntry "Associate the given IndexFileEntry with the given message ID." self privateAt: msgID put: anIndexFileEntry. self logStream print: msgID; cr. "message ID" anIndexFileEntry writeOn: self logStream. self logStream close! ! !IndexFile class methodsFor: 'instance creation' stamp: 'sr 2/19/2001 06:46'! openOn: fileName messageFile: messageFile readLogFlag: readLogFlag "Answer a new instance of me for the given message file, backed by the file with the given name." ^ super new openOn: fileName messageFile: messageFile readLogFlag: readLogFlag! ! !MailDB methodsFor: 'open-create-save' stamp: 'sr 2/19/2001 06:49'! openDB "Open an existing mail database." Transcript show: 'Opening mail database ''', rootFilename, '''...'. messageFile _ MessageFile openOn: rootFilename, '.messages'. indexFile _ IndexFile openOn: rootFilename, '.index' messageFile: messageFile readLogFlag: true. categoriesFile _ CategoriesFile openOn: rootFilename, '.categories'. Transcript show: 'Done.'; cr.! ! !MailDB methodsFor: 'housekeeping' stamp: 'sr 2/19/2001 07:48'! compact "Compact the message file and rebuild the index file. Answer an array containing with the number of messages and the number of bytes recovered." | newMessageFile newIndexFile stats | newMessageFile _ MessageFile openOn: rootFilename , '.messages.tmp'. "don't read log file here!!" newIndexFile _ IndexFile openOn: rootFilename , '.index.tmp' messageFile: newMessageFile readLogFlag: false. stats _ self copyUndeletedTo: newMessageFile indexFile: newIndexFile. newMessageFile save. newIndexFile save. messageFile rename: rootFilename , '.messages.bak'. indexFile rename: rootFilename , '.index.bak'. newMessageFile rename: rootFilename , '.messages'. newIndexFile rename: rootFilename , '.index'. indexFile delete. messageFile delete. messageFile _ MessageFile openOn: rootFilename , '.messages'. "update messageFile in IndexFile entries by clean reopen of indexFile" indexFile _ IndexFile openOn: rootFilename , '.index' messageFile: messageFile readLogFlag: true. self cleanUpCategories. categoriesFile save. ^ stats! ! IndexFile class removeSelector: #openOn:messageFile:! IndexFile removeSelector: #openOn:messageFile:!