diff --git a/mystic/bbs_database.pas b/mystic/bbs_database.pas new file mode 100644 index 0000000..091e8f3 --- /dev/null +++ b/mystic/bbs_database.pas @@ -0,0 +1,187 @@ +Unit bbs_dataBase; + +// This unit us a work in progress designed to move lower level functions +// away from session-tied objects and into a unit usable for external +// utilities. Keeping them procedural instead of object-based also has some +// additional smartlinking benefits in the long run. + +// The drawback of a non-abstract object is that we cannot easily define +// alternate data sources such as a INI or SQL backend. Because of that, +// this MAY change in the future -- particularly if we can smartlink at the +// method level of classes in future FP releases. + +{$I M_OPS.PAS} + +Interface + +{$I RECORDS.PAS} + +Var + bbsCfg : RecConfig; + bbsCfgPath : String; + bbsCfgStatus : Byte; + +Const + CfgOK = 0; + CfgNotFound = 1; + CfgMisMatch = 2; + +// GENERAL + +Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte; +Function PutBaseConfiguration (Var TempCfg: RecConfig) : Boolean; + +// MESSAGE BASE + +Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; +Procedure GetMessageScan (UN: Cardinal; TempBase: RecMessageBase; Var TempScan: MScanRec); +Procedure PutMessageScan (UN: Cardinal; TempBase: RecMessageBase; TempScan: MScanRec); + +// FILE BASE + +Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt; + +Implementation + +Uses + DOS, + m_FileIO; + +Function GetBaseConfiguration (UseEnv: Boolean; Var TempCfg: RecConfig) : Byte; +Var + TempFile : File; +Begin + Result := CfgOK; + bbsCfgPath := ''; + + If Not FileExist('mystic.dat') And UseEnv Then + If GetENV('mysticbbs') <> '' Then + bbsCfgPath := DirSlash(GetENV('mysticbbs')); + + Assign (TempFile, bbsCfgPath + 'mystic.dat'); + + If ioReset (TempFile, SizeOf(RecConfig), fmRWDN) Then Begin + ioRead (TempFile, TempCfg); + Close (TempFile); + End Else Begin + Result := CfgNotFound; + + Exit; + End; + + If TempCfg.DataChanged <> mysDataChanged Then + Result := CfgMisMatch; +End; + +Function PutBaseConfiguration (Var TempCfg: RecConfig) : Boolean; +Var + TempFile : File; +Begin + Result := False; + + Assign (TempFile, bbsCfgPath + 'mystic.dat'); + + If ioReset (TempFile, SizeOf(RecConfig), fmRWDW) Then Begin + ioWrite (TempFile, TempCfg); + Close (TempFile); + + bbsCfg := TempCfg; + Result := True; + End; +End; + +Function GetMBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; +Var + F : File; +Begin + Result := False; + + Assign (F, bbsCfg.DataPath + 'mbases.dat'); + + If Not ioReset(F, SizeOf(RecMessageBase), fmRWDN) Then Exit; + + While Not Eof(F) Do Begin + ioRead (F, TempBase); + + If TempBase.Index = Num Then Begin + Result := True; + + Break; + End; + End; + + Close (F); +End; + +Procedure GetMessageScan (UN: Cardinal; TempBase: RecMessageBase; Var TempScan: MScanRec); +Var + ScanFile : File; +Begin + TempScan.NewScan := TempBase.DefNScan; + TempScan.QwkScan := TempBase.DefQScan; + + Assign (ScanFile, TempBase.Path + TempBase.FileName + '.scn'); + + If Not ioReset(ScanFile, SizeOf(TempScan), fmRWDN) Then + Exit; + + If FileSize(ScanFile) >= UN Then Begin + If ioSeek (ScanFile, UN - 1) Then + ioRead (ScanFile, TempScan); + + If TempBase.DefNScan = 2 Then TempScan.NewScan := 2; + If TempBase.DefQScan = 2 Then TempScan.QwkScan := 2; + End; + + Close (ScanFile); +End; + +Procedure PutMessageScan (UN: Cardinal; TempBase: RecMessageBase; TempScan: MScanRec); +Var + ScanFile : File; + Count : Cardinal; + Temp : MScanRec; + FileName : String; +Begin + Temp.NewScan := TempBase.DefNScan; + Temp.QwkScan := TempBase.DefQScan; + + FileName := TempBase.Path + TempBase.FileName + '.scn'; + + Assign (ScanFile, FileName); + + If Not ioReset (ScanFile, SizeOf(TempScan), fmRWDW) Then Begin + If FileExist(FileName) Then Exit; + + If Not ioReWrite(ScanFile, SizeOf(TempScan), fmRWDW) Then Exit; + End; + + If FileSize(ScanFile) < UN - 1 Then Begin + ioSeek (ScanFile, FileSize(ScanFile)); + + For Count := FileSize(ScanFile) to UN - 1 Do + ioWrite (ScanFile, Temp); + End; + + ioSeek (ScanFile, UN - 1); + ioWrite (ScanFile, TempScan); + Close (ScanFile); +End; + +Function GetTotalFiles (Var TempBase: RecFileBase) : LongInt; +Begin + Result := 0; + + If TempBase.Name = 'None' Then Exit; + + Result := FileByteSize(bbsCfg.DataPath + TempBase.FileName + '.dir'); + + If Result > 0 Then + Result := Result DIV SizeOf(RecFileList); +End; + +Initialization + + bbsCfgStatus := GetBaseConfiguration(True, bbsCfg); + +End.