Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];

Вниз

Типизированный файл - замена БД   Найти похожие ветки 

 
smok_er   (2002-12-27 10:53) [0]

Уважаемые, здравствуйте!
Может есть у кого-нибудь наработки по организации сабжа?


 
Song   (2002-12-27 10:56) [1]

Type=Record .. end ?


 
Anatoly Podgoretsky   (2002-12-27 10:59) [2]

Начиная с восьмидесятых готов это популярная тема в книгах, практически в любых, ну может нет только в современных


 
smok_er   (2002-12-27 11:01) [3]

Song © (27.12.02 10:56)
Type=Record .. end ?

Да, оно самое :)

Anatoly Podgoretsky © (27.12.02 10:59)
А можете дать ссылку на какие-то примеры, документацию, в общем все, что с этим связано?



 
Дмитрий К.К.   (2002-12-27 11:05) [4]

Type=packed record .. end



 
Skier   (2002-12-27 11:12) [5]

>smok_er

> Может есть у кого-нибудь наработки по организации сабжа?

Наработки есть в книге Пачеко и Тейксейры...


 
smok_er   (2002-12-27 11:24) [6]

>>Наработки есть в книге Пачеко и Тейксейры...

Если есть электронная версия этой книги, буду очень рад...


 
yuri_1   (2002-12-27 11:47) [7]

У меня были старые (BP7) ,
на Delphi я перетащил только B-дерево.
(Кстати тебе скорей понадобится организация индексного файла,
например B-дерево, чем самой БД)
Сама БД - набор записей+ведение списка удаленных.
И учти при этом никакого многопользовательского доступа на изменение.

В общем все это прошлый век. Хотя B-tree натравленное на TList меня однажды очень выручило.


 
smok_er   (2002-12-27 11:59) [8]

В том то и дело, что база простенькая, никакого многопользовательского режима.
Можете дать наработки?


 
Дмитрий К.К.   (2002-12-27 12:02) [9]

2smok_er

А вообще не позорься, прося материал по типизированным файлам.
Если просто не хочется возиться с монстрами типа BDE, юзай таблицы в памяти.


 
han_malign   (2002-12-27 12:27) [10]

unit DbfUnit;

interface

uses Windows,UniTalk;

type
TDbfHeader = packed record
DbfType : Byte;
LastUpdate : packed record
Year, Month, Day : Byte;
end;
NumRecords : Longint;
HeaderSize : Word;
RecordSize : Word;
Reserved1 : array[12..27] of Byte;
ProductInd : Byte;
Reserved2 : array[29..31] of Byte;
end;

TDbfField = packed record
FName : array[0..10] of AnsiChar;
FDataType : AnsiChar;
FDisplacement : Longint;
FLength : Byte;
Reserved : array[17..31] of Byte;
end;

type
TFields=(fDT,fKNUM,fKNAME,fDTRING,fTBEG,fTEND,fTLEN,fINOUT,fNUMFROM,
fNUMTO,fNAMETO,fSUBJ,fCOMM,fSNDDIR,fSNDFILE,fFAXDIR,fFAXFILE);
type
TCompleteDbfHeader = packed record
DbfHeader : TDbfHeader;
Fields : array[TFields]of TDbfField;
Separator : char;
end;

const
csNames: array[TFields]of string[10]=
("DT","KNUM","KNAME","DTRING","TBEG","TEND","TLEN","INOUT","NUMFROM",
"NUMTO","NAMETO","SUBJ","COMM","SNDDIR","SNDFILE","FAXDIR","FAXFILE");
ccTypes: array[TFields]of AnsiChar=
("D","N","C","D","C","C","C","L","C","C","C","C","M","C","C","C","C");
ciLens: array[TFields]of integer=
(8,5,20,8,6,6,6,1,20,20,255,255,10,255,255,255,255);
ciRecordSize =1+//Delete flag
8+5+20+8+6+6+6+1+20+20+255+255+10+255+255+255+255;

type
TDbfWriter = class
private
fhDbf : THandle;
fhDbt : THandle;
FHdr : TCompleteDbfHeader;
protected
function CheckDbf(ADbfFile : String): boolean;
function CheckDbt(ADbtFile : String): boolean;
public
constructor Create(ADbfFile : String); virtual;
destructor Destroy; override;

function AddTalk(const aTalk: TUniTalkRec): boolean;
function SetDbfFile(ADbfFile : String): boolean;
end;

var DBW : TDbfWriter;

implementation

uses Utils;

{ TDbfSearch }

function TDbfWriter.CheckDbf(ADbfFile : String): boolean;
function FillTable: boolean;
var _f: TFields;
dw: DWORD;
const _eof: char = #$1A;
begin
FillChar(FHdr,sizeof(FHdr),0);
with FHdr.DbfHeader do begin
DbfType := $83;
HeaderSize := sizeof(FHdr);
RecordSize := ciRecordSize;
end;
dw:=0;
for _f:=fDT to fFAXFILE do with FHdr.Fields[_f] do begin
Move(csNames[_f][1],FName,Length(csNames[_f]));
FDataType := ccTypes[_f];
FDisplacement := dw;
FLength := ciLens[_f];
inc(dw,FLength);
end;
FHdr.Separator:=#$0D;
Result:=WriteFile(fhDbf,FHdr,sizeof(FHdr),dw,nil)and(dw=sizeof(FHdr))and
WriteFile(fhDbf,_eof,sizeof(_eof),dw,nil)and(dw=sizeof(_eof));
end;
function CheckTable: boolean;
var dw,szf: DWORD;
_f: TFields;
begin
szf:=GetFileSize(fhDbf,nil);
with FHdr.DbfHeader do
Result:=(szf<>$FFFFFFFF)and(szf>=sizeof(FHdr))and
ReadFile(fhDbf,FHdr,sizeof(FHdr),dw,nil)and(dw=sizeof(FHdr))and
(DbfType=$83)and
(HeaderSize=sizeof(FHdr))and
(RecordSize=ciRecordSize)and
(FHdr.Separator=#$0D)and
((HeaderSize+NumRecords*RecordSize)<szf);
_f:=fDT;dw:=0;
while(Result and (_f<=fFAXFILE))do with FHdr.Fields[_f] do begin
Result:=(FName=csNames[_f])and
(FDataType=ccTypes[_f])and
(FLength=ciLens[_f]);
FDisplacement:= dw;
inc(dw,FLength);
inc(_f);
end;
end;
begin
fhDbf := CreateFile(PChar(ADbfFile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if((fhDbf=0)or(fhDbf=INVALID_HANDLE_VALUE))then begin
fhDbf := CreateFile(PChar(ADbfFile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
Result:=((fhDbf<>0)or(fhDbf<>INVALID_HANDLE_VALUE))
and FillTable;
end else begin
Result:=CheckTable;
end;
if(not Result)then begin
CloseHandle(fhDbf);
fhDbf:=INVALID_HANDLE_VALUE;
end;
end;
.............................


 
han_malign   (2002-12-27 12:30) [11]


...........................
function TDbfWriter.CheckDbt(ADbtFile : String): boolean;
var _block: array[0..511]of byte;
dw,szf: DWORD;
function FillMemo: boolean;
begin
FillChar(_block,sizeof(_block),0);
_block[0]:=1;
_block[16]:=$03;//Version No
Result:=WriteFile(fhDbt,_block,sizeof(_block),dw,nil)and(dw=sizeof(_block));
end;
begin
fhDbt := CreateFile(PChar(ADbtFile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if((fhDbt=0)or(fhDbt=INVALID_HANDLE_VALUE))then begin
fhDbt := CreateFile(PChar(ADbtFile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
Result:=((fhDbt<>0)or(fhDbt<>INVALID_HANDLE_VALUE))
and FillMemo;
end else begin
szf:=GetFileSize(fhDbt,nil);
Result:=(szf<>$FFFFFFFF)and(szf>=sizeof(_block))and
ReadFile(fhDbt,_block,sizeof(_block),dw,nil)and(dw=sizeof(_block)){and
((DWORD(_block[0])*sizeof(_block))<=szf)};
end;
if(not Result)then begin
CloseHandle(fhDbt);
fhDbt:=INVALID_HANDLE_VALUE;
end;
end;

constructor TDbfWriter.Create(ADbfFile: String);
begin
fhDbf := INVALID_HANDLE_VALUE;
fhDbt := INVALID_HANDLE_VALUE;
if(not SetDbfFile(ADbfFile))then raise TObject.Create;
end;

destructor TDbfWriter.Destroy;
begin
SetDbfFile("");
end;
..................................


 
han_malign   (2002-12-27 12:31) [12]


.................................
function TDbfWriter.AddTalk(const aTalk: TUniTalkRec): boolean;
function WriteMemo(aMemo: String): DWORD;
var dw,block,nblocks: DWORD;
begin
Result:=DWORD(-1);
aMemo:=aMemo+#$1A#$1A;
while((Length(aMemo)mod 512)>0)do aMemo:=aMemo+#0;
nblocks:=Length(aMemo)div 512;
if((SetFilePointer(fhDbt,0,nil,FILE_BEGIN)=0)and
ReadFile(fhDbt,block,sizeof(block),dw,nil)and(dw=sizeof(block)))
then begin
if((SetFilePointer(fhDbt,block*512,nil,FILE_BEGIN)=block*512)and
WriteFile(fhDbt,aMemo[1],Length(aMemo),dw,nil)and(dw=Length(aMemo)))
then begin
inc(nblocks,block);
if((SetFilePointer(fhDbt,0,nil,FILE_BEGIN)=0)and
WriteFile(fhDbt,nblocks,sizeof(nblocks),dw,nil)and(dw=sizeof(nblocks)))
then Result:=block;
end;
end;
end;
function DT2YMD(aTime : TDateTime): string;
var year,month,day: word;
begin
DateToYMD(aTime,year,month,day);
Result:=IntStr(year)+DecByte2(month)+DecByte2(Day);
end;
function DT2HMS(aTime : TDateTime): string;
var Hour, Minute, Second, MSec : Word;
begin
TimeToHMS(aTime,Hour, Minute, Second, MSec);
Result:=DecByte2(Hour)+DecByte2(Minute)+DecByte2(Second);
end;

var dw: dword;
wYear,wMonth,wDay: word;
_s: string;
_rec: array[-1..ciRecordSize]of byte;
begin
FillChar(_rec,sizeof(_rec),$20);
Result:=(fhDbf<>0)and(fhDbf<>INVALID_HANDLE_VALUE)and
(fhDbt<>0)and(fhDbt<>INVALID_HANDLE_VALUE);
if(not Result)then Exit;
if(aTalk.Comment<>"")then begin
dw:=WriteMemo(aTalk.Comment);
if(dw<>DWORD(-1))then begin
_s:=intStr(dw);
Move(_s[1],_rec[FHdr.Fields[fCOMM].FDisplacement+10-Length(_s)],length(_s));
end;
end;
//dt
_s:=ThisYMDStr;
with FHdr.Fields[fDT] do
Move(_s[1],_rec[FDisplacement],length(_s));
//knum
_s:=IntStr(aTalk.Channel);
with FHdr.Fields[fKNUM] do
Move(_s[1],_rec[FDisplacement+FLength-length(_s)],length(_s));
//kname
_s:=aTalk.ChannelName;
with FHdr.Fields[fKNAME] do
Move(_s[1],_rec[FDisplacement],length(_s));
//dtring
_s:=DT2YMD(aTalk.Start);
with FHdr.Fields[fDTRING] do
Move(_s[1],_rec[FDisplacement],length(_s));
//tbeg
_s:=DT2HMS(aTalk.Start);
with FHdr.Fields[fTBEG] do
Move(_s[1],_rec[FDisplacement],length(_s));
//tend
_s:=DT2HMS(aTalk.Stop);
with FHdr.Fields[fTEND] do
Move(_s[1],_rec[FDisplacement],length(_s));
//tlen
_s:=DT2HMS(aTalk.Stop-aTalk.Start);
with FHdr.Fields[fTLEN] do
Move(_s[1],_rec[FDisplacement],length(_s));
//inout
if(aTalk.Incoming)then _s:="T" else _s:="F";
with FHdr.Fields[fINOUT] do
Move(_s[1],_rec[FDisplacement],length(_s));
//numfrom
_s:=aTalk.PhoneFrom;
with FHdr.Fields[fNUMFROM] do
Move(_s[1],_rec[FDisplacement],length(_s));
//numto
_s:=aTalk.PhoneTo;
with FHdr.Fields[fNUMTO] do
Move(_s[1],_rec[FDisplacement],length(_s));
//nameto
_s:=aTalk.CallInfo;
with FHdr.Fields[fNAMETO] do
Move(_s[1],_rec[FDisplacement],length(_s));
//subj
_s:=aTalk.Remark;
with FHdr.Fields[fSUBJ] do
Move(_s[1],_rec[FDisplacement],length(_s));
//snddir
_s:=ExtractPath(aTalk.FilePath);
with FHdr.Fields[fSNDDIR] do
Move(_s[1],_rec[FDisplacement],length(_s));
//sndfile
_s:=Copy(aTalk.FilePath,length(_s)+1,length(aTalk.FilePath));
with FHdr.Fields[fSNDFILE] do
Move(_s[1],_rec[FDisplacement],length(_s));
//faxdir
_s:=ExtractPath(aTalk.FaxPath);
with FHdr.Fields[fFAXDIR] do
Move(_s[1],_rec[FDisplacement],length(_s));
//faxfile
_s:=Copy(aTalk.FaxPath,length(_s)+1,length(aTalk.FaxPath));
with FHdr.Fields[fFAXFILE] do
Move(_s[1],_rec[FDisplacement],length(_s));

_rec[ciRecordSize]:=$1A;

Result:=((SetFilePointer(fhDbf,0,nil,FILE_BEGIN)=0)and
ReadFile(fhDbf,FHdr.DbfHeader,sizeof(FHdr.DbfHeader),dw,nil)and
(sizeof(FHdr.DbfHeader)=dw));
if Result then with FHdr.DbfHeader do begin
dw:=HeaderSize+NumRecords*RecordSize;
Result:=((SetFilePointer(fhDbf,dw,nil,FILE_BEGIN)=dw)and
WriteFile(fhDbf,_rec,sizeof(_rec),dw,nil)and (dw=sizeof(_rec)));
if(Result)then begin
DateToYmd(ThisDayTime,wYear,wMonth,wDay);
with LastUpdate do begin
Year:=wYear-1900;
Month:=wMonth;
Day:=wDay;
end;
Inc(NumRecords);
Result:=((SetFilePointer(fhDbf,0,nil,FILE_BEGIN)=0)and
WriteFile(fhDbf,FHdr.DbfHeader,sizeof(FHdr.DbfHeader),dw,nil)and
(sizeof(FHdr.DbfHeader)=dw));
end;
end;
end;
...........................


 
han_malign   (2002-12-27 12:32) [13]

...........................
function TDbfWriter.SetDbfFile(ADbfFile : String): boolean;
var i: integer;
begin
if((fhDbf<>0)and(fhDbf<>INVALID_HANDLE_VALUE))then begin
CloseHandle(fhDbf);fhDbf:=INVALID_HANDLE_VALUE;
end;
if((fhDbt<>0)and(fhDbt<>INVALID_HANDLE_VALUE))then begin
CloseHandle(fhDbt);fhDbt:=INVALID_HANDLE_VALUE;
end;
Result:=ADbfFile<>"";
if(Result)then begin
i:=Length(ADbfFile);
while((i>0)and not(ADbfFile[i]in[".",":","\"]))do dec(i);
if((i>1)and(ADbfFile[i]="."))then SetLength(ADbfFile,i-1);
Result:=CheckDbf(ADbfFile+".dbf")and CheckDbt(ADbfFile+".dbt");
if(not Result)then begin
if((fhDbf<>0)and(fhDbf<>INVALID_HANDLE_VALUE))then begin
CloseHandle(fhDbf);fhDbf:=INVALID_HANDLE_VALUE;
end;
if((fhDbt<>0)and(fhDbt<>INVALID_HANDLE_VALUE))then begin
CloseHandle(fhDbt);fhDbt:=INVALID_HANDLE_VALUE;
end;
end;
end;
end;
end.


 
han_malign   (2002-12-27 12:33) [14]

З.Ы. Указывайте мыло - за...лся текст бить.


 
Дмитрий К.К.   (2002-12-27 12:34) [15]

2han_malign

Я, конечно, дико извиняюсь... но неплохо было бы етот код через какой-нить Delphi Formatter прогнать... шо ли...


 
smok_er   (2002-12-27 12:44) [16]

В мыле я вставил левые символы против мыло-грабберов - %
roman%@%billing.idknet.com


 
han_malign   (2002-12-27 12:46) [17]

Дмитрий К.К. © (27.12.02 12:34)
- это полиатив по капризу fox-замороченного клиента, текст достаточно форматирован, а коментировать DBF-формат...
З.Ы. Какой вопрос - такой ответ, в смысле, каждой Изауре - по фазенде, каждой ветке - свой пост :)))


 
smok_er   (2002-12-27 12:46) [18]

Огромнейшее спасибо!
Кстати, если можно и если есть, то хотел бы глянуть какой-нибудь готовый проект по этой теме.


 
Дмитрий К.К.   (2002-12-27 13:04) [19]


> han_malign © (27.12.02 12:46)
> Дмитрий К.К. © (27.12.02 12:34)
> - это полиатив по капризу fox-замороченного клиента, текст
> достаточно форматирован


Текст достаточно форматирован, но по два оператора в одной строке... и без пробелов между оператором присваивания... и проч...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
7-25120
DJ_Sedoy
2002-10-29 09:15
2003.01.09
Факс


3-24783
denick
2002-12-16 12:50
2003.01.09
Люд-д-и помогите!


1-24874
Separator
2002-12-28 06:37
2003.01.09
StringGrid и полоса проктрутки


1-24861
Timka
2002-12-26 18:49
2003.01.09
удаление файлов


14-25083
nick_vstu
2002-12-19 11:58
2003.01.09
Как отключить обработку исключительних ситуаций в IDE Delphi 7?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский