Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.01 c