source: oup/current/DataAccess/Access_OUP_ADB.pas@ 663

Last change on this file since 663 was 321, checked in by alloc, 16 years ago
File size: 19.4 KB
RevLine 
[93]1unit Access_OUP_ADB;
2interface
3
[101]4uses DataAccess, ABSMain, TypeDefs, Classes;
[93]5
6type
7 TAccess_OUP_ADB = class(TDataAccess)
8 private
[101]9 FDatabase: TABSDatabase;
10 FQuery: TABSQuery;
11 Fdat_files: TFiles;
[93]12 Fdat_extensionsmap: TExtensionsMap;
13 protected
14 public
[101]15 constructor Create(DBFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
[93]16 procedure Close; override;
17
18 procedure UpdateListCache;
19
[106]20 function GetLinksToFile(FileID: Integer): TLinks;
21
[101]22 function GetFileInfo(FileID: Integer): TFileInfo; override;
23 function GetFilesList(Ext: String; Pattern: String;
24 NoEmptyFiles: Boolean; SortType: TSortType): TStrings; override;
25 function GetFileCount: Integer; override;
26 function GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; override;
[93]27
[101]28 procedure LoadDatFile(FileID: Integer; var Target: TStream); overload; override;
29 procedure UpdateDatFile(FileID: Integer; Src: TStream); overload; override;
30 procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; override;
31 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override;
32
[113]33 function GetDatLinks(FileID: Integer): TDatLinkList; override;
[116]34 function GetDatLink(FileID, DatOffset: Integer): TDatLink; override;
[101]35 function GetRawList(FileID: Integer): TRawDataList; override;
36 function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
[241]37 function GetRawsForType(RawType: String): TRawDataList; override;
[101]38
39 procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override;
40 procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override;
41 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override;
42 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); overload; override;
[93]43 published
[101]44 end;
[93]45
46
47implementation
48
[101]49uses
[156]50 SysUtils, Data, Functions, ABSDecUtil, DB, DatLinks, StrUtils;
[93]51
[101]52
[93]53(*
54================================================================================
55 Implementation of TOniDataADB
56*)
57
[101]58
59constructor TAccess_OUP_ADB.Create(DBFilename: String; ConnectionID: Integer; var Msg: TStatusMessages);
[93]60begin
[101]61 Msg := SM_UnknownError;
62 if not FileExists(DBFilename) then
[93]63 begin
[101]64 Msg := SM_FileNotFound;
[93]65 Exit;
66 end;
[101]67 FFileName := DBFilename;
68
[93]69 FDatabase := TABSDatabase.Create(nil);
[134]70 FDatabase.Exclusive := True;
71 FDatabase.MultiUser := False;
[101]72 FDatabase.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID);
73 FDatabase.DatabaseFileName := DBFilename;
[93]74 FDatabase.Open;
75 FQuery := TABSQuery.Create(FDatabase);
[134]76 FQuery.DisableControls;
[135]77 FQuery.RequestLive := False;
[101]78 FQuery.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID);
[93]79 FQuery.SQL.Text := 'SELECT [name],[value] FROM globals ORDER BY [name] ASC';
80 FQuery.Open;
81 FQuery.First;
82 repeat
83 if FQuery.FieldByName('name').AsString = 'dbversion' then
84 begin
85 if FQuery.FieldByName('value').AsString <> DBversion then
86 begin
[101]87 Msg := SM_IncompatibleDBVersion;
[93]88 FQuery.Close;
89 Exit;
90 end;
91 end;
92 if FQuery.FieldByName('name').AsString = 'lvl' then
[101]93 FLevelNumber := StrToInt(FQuery.FieldByName('value').AsString);
[173]94 if FQuery.FieldByName('name').AsString = 'os' then
[93]95 begin
[101]96 if FQuery.FieldByName('value').AsString = 'WIN' then
97 FDataOS := DOS_WIN
98 else if FQuery.FieldByName('value').AsString = 'WINDEMO' then
99 FDataOS := DOS_WINDEMO
100 else if FQuery.FieldByName('value').AsString = 'MAC' then
101 FDataOS := DOS_MAC
102 else if FQuery.FieldByName('value').AsString = 'MACBETA' then
103 FDataOS := DOS_MACBETA;
[93]104 end;
105 FQuery.Next;
106 until FQuery.EOF;
107 FQuery.Close;
108
[101]109 Msg := SM_OK;
110 FBackend := DB_ADB;
111
[105]112 FConnectionID := ConnectionID;
[101]113 FChangeRights := [CR_EditDat, CR_EditRaw, CR_ResizeDat, CR_ResizeRaw];
114
[93]115 UpdateListCache;
[229]116
117 inherited;
[93]118end;
119
120
121
122
[101]123procedure TAccess_OUP_ADB.Close;
[93]124begin
[101]125 FQuery.Free;
[93]126 FDatabase.Close;
127 FDatabase.Free;
128 Self.Free;
129end;
130
131
132
[101]133procedure TAccess_OUP_ADB.UpdateListCache;
[93]134var
[101]135 i: Integer;
[93]136 temps: String;
137begin
138 FQuery.SQL.Text := 'SELECT id,name,extension,[size],contenttype FROM datfiles ORDER BY id ASC;';
139 FQuery.Open;
[101]140 SetLength(Fdat_files, FQuery.RecordCount);
[93]141 if FQuery.RecordCount > 0 then
142 begin
143 FQuery.First;
144 i := 0;
145 repeat
146 Fdat_files[i].ID := FQuery.FieldByName('id').AsInteger;
147 Fdat_files[i].Name := FQuery.FieldByName('name').AsString;
148 Fdat_files[i].Extension := FQuery.FieldByName('extension').AsString;
149 Fdat_files[i].Size := FQuery.FieldByName('size').AsInteger;
[113]150 Fdat_files[i].FileType := StrToInt('$'+FQuery.FieldByName('contenttype').AsString);
[93]151 Fdat_files[i].DatAddr := 0;
152 Inc(i);
153 FQuery.Next;
154 until FQuery.EOF;
155 end;
156 FQuery.Close;
157
158 FQuery.SQL.Text :=
159 'SELECT extension,count(extension) AS x FROM datfiles GROUP BY extension ORDER BY extension ASC;';
160 FQuery.Open;
[101]161 SetLength(Fdat_extensionsmap, FQuery.RecordCount);
[93]162 if FQuery.RecordCount > 0 then
163 begin
164 i := 0;
165 repeat
[101]166 temps := FQuery.FieldByName('extension').AsString;
[93]167 Fdat_extensionsmap[i].Extension[3] := temps[1];
168 Fdat_extensionsmap[i].Extension[2] := temps[2];
169 Fdat_extensionsmap[i].Extension[1] := temps[3];
170 Fdat_extensionsmap[i].Extension[0] := temps[4];
171 Fdat_extensionsmap[i].ExtCount := FQuery.FieldByName('x').AsInteger;
172 Inc(i);
173 FQuery.Next;
174 until FQuery.EOF;
175 end;
176 FQuery.Close;
177end;
178
179
[106]180
181function TAccess_OUP_ADB.GetLinksToFile(FileID: Integer): TLinks;
182var
183 i: Integer;
184begin
185 SetLength(Result.ByName, 0);
186 FQuery.SQL.Text := 'SELECT src_link_offset, src_id FROM linkmap WHERE target_id = ' + IntToStr(FileID) + ' ORDER BY src_id ASC;';
187 FQuery.Open;
188 SetLength(Result.ByID, FQuery.RecordCount);
189 if FQuery.RecordCount > 0 then
190 begin
191 i := 0;
192 repeat
193 Result.ByID[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
194 Result.ByID[i].Destination := FQuery.FieldByName('src_id').AsInteger;
195 Inc(i);
196 FQuery.Next;
197 until FQuery.EOF;
198 end;
199 FQuery.Close;
200end;
201
202
203
[101]204function TAccess_OUP_ADB.GetFileInfo(fileid: Integer): TFileInfo;
[93]205begin
206 if fileid = -1 then
207 begin
208 Result := inherited GetFileInfo(fileid);
209 Exit;
210 end;
[101]211 if fileid < Self.GetFileCount then
212 Result := Fdat_files[fileid]
[93]213 else
214 Result.ID := -1;
215end;
216
217
218
[159]219 function CompareItems(List: TStringList; I1, I2: Integer): Integer;
220 var
221 s1, s2: String;
222 begin
223 s1 := MidStr(List[I1], 1, PosEx(';', List[I1], 6) - 1);
224 s2 := MidStr(List[I2], 1, PosEx(';', List[I2], 6) - 1);
225 Result := CompareStr(s1, s2);
226 end;
227
[101]228function TAccess_OUP_ADB.GetFilesList(ext: String; pattern: String;
229 NoEmptyFiles: Boolean; SortType: TSortType): TStrings;
[93]230var
[101]231 i: Integer;
232 list: TStringList;
[93]233 id, name, extension: String;
234 fields: TStrings;
235
236 procedure getfields;
237 begin
[101]238 fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]);
239 if SortType in [ST_IDAsc, ST_IDDesc] then
[93]240 begin
241 id := fields.Strings[0];
242 name := fields.Strings[1];
243 extension := fields.Strings[2];
244 end;
[101]245 if SortType in [ST_NameAsc, ST_NameDesc] then
[93]246 begin
247 id := fields.Strings[1];
248 name := fields.Strings[0];
249 extension := fields.Strings[2];
250 end;
[101]251 if SortType in [ST_ExtAsc, ST_ExtDesc] then
[93]252 begin
253 id := fields.Strings[1];
254 name := fields.Strings[2];
255 extension := fields.Strings[0];
256 end;
[112]257 if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then
258 begin
259 id := fields.Strings[2];
260 name := fields.Strings[1];
261 extension := fields.Strings[0];
262 end;
[93]263 end;
264
265begin
[159]266 list := TStringList.Create;
267 if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then
268 list.Sorted := False
269 else
270 list.Sorted := True;
[241]271 if ext = '*' then
272 ext := '';
[159]273 for i := 0 to GetFileCount - 1 do
[157]274 begin
[159]275 if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and
276 ((Length(pattern) = 0) or
277 (Pos(UpperCase(pattern), UpperCase(Fdat_files[i].Name)) > 0)) then
[93]278 begin
[159]279 if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then
[93]280 begin
[159]281 id := FormatNumber(Fdat_files[i].ID, 5, '0');
282 name := Fdat_files[i].Name;
283 extension := Fdat_files[i].Extension;
[93]284
[159]285 case SortType of
286 ST_IDAsc, ST_IDDesc: list.Add(id + ';' + name + ';' + extension);
287 ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension);
288 ST_ExtAsc, ST_ExtDesc: list.Add(extension + ';' + id + ';' + name);
289 ST_ExtNameAsc, ST_ExtNameDesc: list.Add(extension + ';' + name + ';' + id);
[93]290 end;
291 end;
292 end;
[159]293 end;
294 if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then
295 list.CustomSort(CompareItems);
296 if not Assigned(Result) then
297 Result := TStringList.Create;
298 if list.Count > 0 then
[101]299 begin
[159]300 fields := TStringList.Create;
301 if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc, ST_ExtNameAsc] then
302 for i := 0 to list.Count - 1 do
303 begin
304 getfields;
305 Result.Add(id + '-' + name + '.' + extension);
306 end
307 else
308 for i := list.Count - 1 downto 0 do
309 begin
310 getfields;
311 Result.Add(id + '-' + name + '.' + extension);
312 end;
313 fields.Free;
[101]314 end;
[159]315 list.Free;
[93]316end;
317
318
319
320
[101]321function TAccess_OUP_ADB.GetFileCount: Integer;
[93]322begin
323 Result := Length(Fdat_files);
324end;
325
326
[101]327function TAccess_OUP_ADB.GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings;
[93]328var
[101]329 i: Integer;
[93]330begin
[113]331 if not Assigned(Result) then
332 Result := TStringList.Create;
333 if Result is TStringList then
334 TStringList(Result).Sorted := True;
[101]335 for i := 0 to Length(Fdat_extensionsmap) - 1 do
[93]336 begin
337 with Fdat_extensionsmap[i] do
338 begin
[101]339 case ExtListFormat of
340 EF_ExtOnly:
341 Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0]);
342 EF_ExtCount:
343 Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0] +
344 ' (' + IntToStr(ExtCount) + ')');
345 end;
[93]346 end;
347 end;
348end;
349
350
[101]351procedure TAccess_OUP_ADB.LoadDatFile(FileID: Integer; var Target: TStream);
[93]352var
[101]353 mem: TStream;
354 streampos: Integer;
[93]355begin
[101]356 if fileid < GetFileCount then
[93]357 begin
[101]358 if not Assigned(Target) then
359 Target := TMemoryStream.Create;
[93]360
[101]361 streampos := Target.Position;
[93]362
363 FQuery.SQL.Text := 'SELECT data FROM datfiles WHERE id=' + IntToStr(fileid) + ';';
364 FQuery.Open;
365 if FQuery.RecordCount > 0 then
366 begin
367 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead);
368 mem.Seek(0, soFromBeginning);
[101]369 Target.CopyFrom(mem, mem.Size);
[93]370 mem.Free;
371 end;
372 FQuery.Close;
[101]373
374 Target.Seek(streampos, soFromBeginning);
[93]375 end;
376end;
377
[101]378procedure TAccess_OUP_ADB.UpdateDatFile(FileID: Integer; Src: TStream);
[93]379var
380 MimeCoder: TStringFormat_MIME64;
381 mem: TMemoryStream;
382begin
[101]383 if fileid < GetFileCount then
[93]384 begin
385 mimecoder := TStringFormat_MIME64.Create;
386 mem := TMemoryStream.Create;
[101]387 mem.CopyFrom(Src, Src.Size);
[93]388 FQuery.SQL.Text := 'UPDATE datfiles SET data=MimeToBin("' +
389 MimeCoder.StrTo(mem.Memory, mem.Size) + '"), size=' + IntToStr(mem.Size) +
390 ' WHERE id=' + IntToStr(fileid) + ';';
391 FQuery.ExecSQL;
392 mem.Free;
393 mimecoder.Free;
394 end;
395end;
396
397
398
[101]399procedure TAccess_OUP_ADB.LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream);
[93]400var
[101]401 streampos: Integer;
[93]402 mem: TStream;
403begin
[101]404 if fileid < GetFileCount then
[93]405 begin
[101]406 if not Assigned(Target) then
407 Target := TMemoryStream.Create;
408 streampos := Target.Position;
409
[93]410 FQuery.SQL.Text := 'SELECT data FROM datfiles WHERE id=' + IntToStr(fileid) + ';';
411 FQuery.Open;
412 if FQuery.RecordCount > 0 then
413 begin
414 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead);
415 mem.Seek(offset, soFromBeginning);
[101]416 Target.CopyFrom(mem, size);
[93]417 mem.Free;
418 end;
419 FQuery.Close;
[101]420 Target.Seek(streampos, soFromBeginning);
[93]421 end;
422end;
423
424
425
[101]426procedure TAccess_OUP_ADB.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream);
[93]427var
428 MimeCoder: TStringFormat_MIME64;
429 mem: TMemoryStream;
430begin
[101]431 if fileid < GetFileCount then
[93]432 begin
[101]433 mem := nil;
434 LoadDatFile(fileid, TStream(mem));
435 mem.Seek(Offset, soFromBeginning);
436 mem.CopyFrom(Src, Size);
437 mem.Seek(0, soFromBeginning);
[93]438 mimecoder := TStringFormat_MIME64.Create;
439 FQuery.SQL.Text := 'UPDATE datfiles SET data=MimeToBin("' +
440 MimeCoder.StrTo(mem.Memory, mem.Size) + '") WHERE id=' + IntToStr(fileid) + ';';
441 FQuery.ExecSQL;
442 mem.Free;
443 mimecoder.Free;
444 end;
445end;
446
447
[116]448
449function TAccess_OUP_ADB.GetDatLink(FileID, DatOffset: Integer): TDatLink;
450begin
451 Result := DatLinksManager.GetDatLink(FConnectionID, FileID, DatOffset);
452 FQuery.SQL.Text := 'SELECT target_id FROM linkmap WHERE src_id = ' + IntToStr(FileID) + ' and src_link_offset = ' + IntToStr(DatOffset) + ';';
453 FQuery.Open;
454 if FQuery.RecordCount > 0 then
455 Result.DestID := FQuery.FieldByName('target_id').AsInteger;
456 FQuery.Close;
457end;
458
459
460function TAccess_OUP_ADB.GetDatLinks(FileID: Integer): TDatLinkList;
461var
462 i: Integer;
463 SrcOffset, DestID: Integer;
464begin
465 Result := DatLinksManager.GetDatLinks(FConnectionID, FileID);
466 if Length(Result) > 0 then
467 begin
468 FQuery.SQL.Text := 'SELECT src_link_offset, target_id FROM linkmap WHERE src_id = ' + IntToStr(FileID) + ' ORDER BY src_link_offset ASC;';
469 FQuery.Open;
470 if FQuery.RecordCount > 0 then
471 begin
472 repeat
473 SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
474 DestID := FQuery.FieldByName('target_id').AsInteger;
475 for i := 0 to High(Result) do
476 if Result[i].SrcOffset = SrcOffset then
477 Break;
478 if i < Length(Result) then
479 Result[i].DestID := DestID
480 else
481 Result[i].DestID := -1;
482 FQuery.Next;
483 until FQuery.EOF;
484 end;
485 FQuery.Close;
486 end;
487end;
488
489
[101]490function TAccess_OUP_ADB.GetRawList(FileID: Integer): TRawDataList;
[93]491var
[101]492 i: Integer;
[93]493begin
494 SetLength(Result, 0);
[241]495 FQuery.SQL.Text := 'SELECT [src_link_offset],[name],[size],[sep],[type] FROM rawmap WHERE [src_id]=' +
[93]496 IntToStr(fileid) + ' ORDER BY src_link_offset ASC;';
497 FQuery.Open;
498 if FQuery.RecordCount > 0 then
499 begin
500 FQuery.First;
501 SetLength(Result, FQuery.RecordCount);
502 i := 0;
503 repeat
[241]504 Result[i].Name := FQuery.FieldByName('name').AsString;
[101]505 Result[i].SrcID := fileid;
506 Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
507 Result[i].RawAddr := 0;
508 Result[i].RawSize := FQuery.FieldByName('size').AsInteger;
509 Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean;
[241]510 Result[i].RawType := FQuery.FieldByName('type').AsString;
[93]511 Inc(i);
512 FQuery.Next;
513 until FQuery.EOF;
514 end;
515 FQuery.Close;
516end;
517
518
[101]519function TAccess_OUP_ADB.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo;
520var
521 i: Integer;
522 rawlist: TRawDataList;
523begin
524 rawlist := GetRawList(FileID);
525 if Length(rawlist) > 0 then
526 begin
527 for i := 0 to High(rawlist) do
528 if rawlist[i].SrcOffset = DatOffset then
529 Break;
530 if i < Length(rawlist) then
531 Result := rawlist[i]
532 else begin
[241]533 Result.Name := '';
[101]534 Result.SrcID := -1;
535 Result.SrcOffset := -1;
536 Result.RawAddr := -1;
537 Result.RawSize := -1;
[241]538 Result.RawType := '';
[101]539 end;
540 end;
541end;
[93]542
543
[241]544function TAccess_OUP_ADB.GetRawsForType(RawType: String): TRawDataList;
545var
546 i: Integer;
547begin
548 SetLength(Result, 0);
549 FQuery.SQL.Text := 'SELECT [src_id],[src_link_offset],[name],[size],[sep] FROM rawmap ' +
[243]550 'WHERE [type]="' + RawType + '" and [size]>0 ORDER BY src_id ASC, src_link_offset ASC;';
[241]551 FQuery.Open;
552 if FQuery.RecordCount > 0 then
553 begin
554 FQuery.First;
555 SetLength(Result, FQuery.RecordCount);
556 i := 0;
557 repeat
558 Result[i].Name := FQuery.FieldByName('name').AsString;
559 Result[i].SrcID := FQuery.FieldByName('src_id').AsInteger;
560 Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
561 Result[i].RawAddr := 0;
562 Result[i].RawSize := FQuery.FieldByName('size').AsInteger;
563 Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean;
564 Result[i].RawType := RawType;
565 Inc(i);
566 FQuery.Next;
567 until FQuery.EOF;
568 end;
569 FQuery.Close;
570end;
[101]571
[241]572
573
574
[101]575procedure TAccess_OUP_ADB.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream);
[93]576var
577 mem: TStream;
[101]578 streampos: Integer;
[93]579begin
[101]580 if fileid < GetFileCount then
[93]581 begin
[101]582 if not Assigned(Target) then
583 Target := TMemoryStream.Create;
584 streampos := Target.Position;
[93]585 FQuery.SQL.Text := 'SELECT data FROM rawmap WHERE (src_id=' +
[101]586 IntToStr(FileID) + ') AND (src_link_offset=' + IntToStr(DatOffset) + ');';
[93]587 FQuery.Open;
588 if FQuery.RecordCount > 0 then
589 begin
590 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead);
591 mem.Seek(0, soFromBeginning);
[101]592 Target.CopyFrom(mem, mem.Size);
[93]593 mem.Free;
594 end;
595 FQuery.Close;
[101]596 Target.Seek(streampos, soFromBeginning);
[93]597 end;
598end;
599
600
[101]601procedure TAccess_OUP_ADB.UpdateRawFile(FileID, DatOffset: Integer; Src: TStream);
[93]602var
603 MimeCoder: TStringFormat_MIME64;
604 mem: TMemoryStream;
605begin
[101]606 if fileid < GetFileCount then
[93]607 begin
608 mimecoder := TStringFormat_MIME64.Create;
609 mem := TMemoryStream.Create;
[101]610 mem.CopyFrom(Src, Src.Size);
[93]611 mem.Seek(0, soFromBeginning);
612 FQuery.SQL.Text := 'UPDATE rawmap SET data=MimeToBin("' + MimeCoder.StrTo(
[101]613 mem.Memory, mem.Size) + '") WHERE (src_id=' + IntToStr(FileID) +
614 ') AND (src_link_offset=' + IntToStr(DatOffset) + ');';
[93]615 FQuery.ExecSQL;
616 mem.Free;
617 mimecoder.Free;
618 end;
619end;
620
621
622
623
[101]624procedure TAccess_OUP_ADB.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream);
[93]625var
626 mem: TMemoryStream;
[101]627 streampos: Integer;
[93]628begin
[101]629 if fileid < GetFileCount then
[93]630 begin
[101]631 if not Assigned(Target) then
632 Target := TMemoryStream.Create;
633 streampos := Target.Position;
634 mem := nil;
635 LoadRawFile(FileID, DatOffset, TStream(mem));
636 mem.Seek(Offset, soFromBeginning);
637 Target.CopyFrom(mem, Size);
[93]638 mem.Free;
[101]639 Target.Seek(streampos, soFromBeginning);
[93]640 end;
641end;
642
643
644
645
[101]646procedure TAccess_OUP_ADB.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream);
[93]647var
648 MimeCoder: TStringFormat_MIME64;
649 mem: TMemoryStream;
650begin
[101]651 if fileid < GetFileCount then
[93]652 begin
[101]653 mem := nil;
654 LoadRawFile(fileid, offset, TStream(mem));
[93]655 mem.Seek(offset, soFromBeginning);
[101]656 mem.CopyFrom(Src, Size);
[93]657 mem.Seek(0, soFromBeginning);
[101]658 mimecoder := TStringFormat_MIME64.Create;
[93]659 FQuery.SQL.Text := 'UPDATE rawmap SET data=MimeToBin("' + MimeCoder.StrTo(
660 mem.Memory, mem.Size) + '") WHERE (src_id=' + IntToStr(fileid) +
[101]661 ') AND (src_link_offset=' + IntToStr(DatOffset) + ');';
[93]662 FQuery.ExecSQL;
663 mem.Free;
664 mimecoder.Free;
665 end;
666end;
667
668
669
[101]670
[93]671end.
Note: See TracBrowser for help on using the repository browser.