DataBase.pas ( File view )

  • By adm.maniaco 2014-09-01
  • View(s):170
  • Download(s):11
  • Point(s): 2
			unit DataBase;

interface
 uses
  Windows, Graphics, NCore, SysUtils, Controls,
  Forms, Dialogs, NImages, DB, Classes, ComObj, Jpeg, NUtils, NTemplates, SQLiteTable3;

 //-------------------------------------
 // Types
 //-------------------------------------

 type
  TTemplate = record
   FTemplateId: string;
   FTemplate: TArrayOfByte;
   FId: Integer;
  end;

  TDataBase = class(TObject)
   private
    database: TSQLiteDatabase;
    Data: array of TTemplate;

    procedure LoadData();
    procedure ClearData();

    function  AddToDataBase(templateId: string; biometricType: TNBiometricType; template: TArrayOfByte; image: TNImage; thumbnail: TNImage): Integer;
    procedure AddToImagesDatabase(templateId: Integer; biometricType: TNBiometricType; recordIndex: Integer; genIndex: Integer; frameIndex: Integer; image: TNImage);
   public
    constructor Create();
    destructor  Destroy(); override;

    procedure Save();
    procedure Clear();

    procedure Append(biometricType: TNBiometricType; template: TTemplate; image: TNImage; thumbnail: TNImage);

    function  GetThumbnail(templateId: Integer): TBitmap;

    function  GetTemplate(index: Integer): TTemplate;
    function  GetCount: Integer;
  end;

implementation
 uses MainForm;
 
//-------------------------------------
// Constants
//-------------------------------------
const
  PathToDb = '\Neurotechnology\FacesSample\Faces.db';

//-------------------------------------
// Misc functions
//-------------------------------------

procedure ByteArrayToStream(const A: TArrayOFByte; const Stream: TStream);
begin
  Stream.Position := 0;
  Stream.Size := Length(A);
  Stream.Write(Pointer(A)^, Length(A));
end;

procedure StreamToByteArray(const Stream: TStream; var A: TArrayOFByte);
begin
  Stream.Position := 0;
  SetLength(A, Stream.Size);
  Stream.Read(Pointer(A)^, Stream.Size);
end;

//-------------------------------------
// DataBase
//-------------------------------------

constructor TDataBase.Create();
 var db: String;
     createTable: AnsiString;
begin
 inherited Create;
 db := LocalAppDataPath + PathToDb;
 SetLength(Data, 0);
 database := TSQLiteDatabase.Create(db);

 if (not database.TableExists('Templates')) then
 begin
  createTable := AnsiString('CREATE TABLE Templates (Id INTEGER PRIMARY KEY, TemplateId TEXT NOT NULL, Template BLOB NOT NULL, Thumbnail BLOB)');
  database.ExecSQL(createTable);
 end;
  if (not database.TableExists('Images')) then
 begin
  createTable := AnsiString('CREATE TABLE Images (Id INTEGER PRIMARY KEY, TemplateId INTEGER NOT NULL, BiometricType INTEGER NOT NULL,')
  + AnsiString('RecordIndex INTEGER NOT NULL, GenIndex INTEGER NOT NULL, FrameIndex INTEGER NOT NULL, Image BLOB NOT NULL)');
  database.ExecSQL(createTable);
 end;

 LoadData;
end;

destructor TDataBase.Destroy;
begin
 Save;
 ClearData();
 if (database <> nil)
 then
  begin
   FreeAndNil(database);
  end;
 inherited;
end;

procedure TDataBase.Save;
begin
 //database.ExecSQL('VACUUM');
end;

procedure TDataBase.Clear();
begin
 database.ExecSQL('DELETE FROM Templates');
 ClearData;
end;

procedure TDataBase.ClearData();
 var i: Integer;
begin
 for i := 0 to Length(Data) - 1 do
  SetLength(Data[i].FTemplate, 0);
 SetLength(Data, 0);
end;

procedure TDataBase.LoadData();
 var templateRecord: TTemplate;
     position: Integer;
     table: TSQLIteTable;
begin
 ClearData;
 table := nil;
 try
  table := database.GetTable('SELECT Id, TemplateId, Template FROM Templates');
  SetLength(Data, table.Count);
  position := 0;
  table.MoveFirst;
  while (not table.EOF) do
  begin
   templateRecord.FTemplateId  := table.FieldAsString(1);
   templateRecord.FId := table.FieldAsInteger(0);
   StreamToByteArray(table.FieldAsBlob(2), templateRecord.FTemplate);
   Data[position] := templateRecord;
   position := position + 1;
   table.Next;
  end;
 finally
  FreeAndNil(table);
 end;
end;

procedure TDataBase.Append(biometricType: TNBiometricType; template: TTemplate; image: TNImage; thumbnail: TNImage);
 var position, Id: Integer;
begin
 Id := AddToDataBase(template.FTemplateId, biometricType, template.FTemplate, image, thumbnail);
 if (Id >= 0) then
 begin
  template.FId := Id;
  Form.AddToLog(Format('Subject ID = %d.',[template.FId]), false);
  position := Length(Data);
  SetLength(Data, position + 1);
  Data[position] := template;
 end;
end;

procedure TDataBase.AddToImagesDatabase(templateId: Integer; biometricType: TNBiometricType; recordIndex: Integer; genIndex: Integer; frameIndex: Integer; image: TNImage);
 var streamImage: TStream;
begin
 streamImage := TMemoryStream.Create;
 ByteArrayToStream(TNPng.SaveImage(image), streamImage);
 database.ParamsClear;
 database.AddParamInt(':1', templateId);
 database.AddParamInt(':2', Integer(biometricType));
 database.AddParamInt(':3', recordIndex);
 database.AddParamInt(':4', genIndex);
 database.AddParamInt(':5', frameIndex);
 database.AddParamBlob(':6', streamImage);
 database.ExecSQL('INSERT INTO Images(Id, TemplateId, BiometricType, RecordIndex, GenIndex, FrameIndex, Image) VALUES(NULL, :1, :2, :3, :4, :5, :6)');
end;

function TDataBase.AddToDataBase(templateId: string; biometricType: TNBiometricType; template: TArrayOfByte; image: TNImage; thumbnail: TNImage): Integer;
 var stream: TStream;
     streamImage: TStream;
     lastIndex: Integer;
begin
 stream := TMemoryStream.Create;
 streamImage := TMemoryStream.Create;
 ByteArrayToStream(template, stream);
 database.ParamsClear;
 database.AddParamText(':1', templateId);
 database.AddParamBlob(':2', stream);
 if (thumbnail <> nil) then
 begin
  ByteArrayToStream(TNPng.SaveImage(thumbnail), streamImage);
  database.AddParamBlob(':3', streamImage);
 end
 else
  database.AddParamNull(':3');
 database.ExecSQL(AnsiString('INSERT INTO Templates(Id, TemplateId, Template, Thumbnail) VALUES(NULL, :1, :2, :3)'));
 lastIndex := database.GetLastInsertRowID;
 if (image <> nil) then
 begin
   AddToImagesDatabase(lastIndex, biometricType, 0, 0, 0, image);
 end;
 Result := lastIndex;
end;

function TDataBase.GetThumbnail(templateId: Integer): TBitmap;
var table: TSQLIteTable;
    pic : TMemoryStream;
    arr: TArrayofByte;
    bitmap: TBitmap;
    image: TNImage;
begin
  Result := nil;
  table := nil;
  image := nil;
  try
  table := database.GetTable(AnsiString('SELECT Thumbnail FROM Templates WHERE Id = ' + IntToStr(templateId)));
  while (not table.EOF) do
  begin
    pic := table.FieldAsBlob(0);
    if (pic = nil) then
    begin
      Result := nil;
      Exit;
    end;
    StreamToByteArray(pic, arr);
    image := TNPng.LoadImage(arr);
    bitmap := TBitmap.Create;
    bitmap.Handle := image.SaveToHBitmap;
    Result := bitmap;
    table.Next;
  end;
  finally
    FreeAndNil(table);
    FreeAndNil(image);
  end;
end;

function TDataBase.GetTemplate(index: Integer): TTemplate;
begin
 Result := Data[index];
end;

function TDataBase.GetCount: Integer;
begin
 Result := Length(Data);
end;

end.
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 2

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
Aboutform.dcu7.81 kB29-05-10 03:22
AboutForm.dfm59.86 kB02-04-10 14:37
AboutForm.pas2.79 kB02-04-10 14:37
DataBase.dcu10.72 kB29-05-10 02:56
DataBase.pas7.02 kB02-04-10 14:37
NCore.dcu12.55 kB29-05-10 02:56
NCore.pas11.17 kB02-04-10 14:37
NDeviceManager.dcu24.08 kB29-05-10 02:56
NDeviceManager.pas20.58 kB26-05-10 01:21
NExtractors.dcu26.38 kB29-05-10 02:56
NExtractors.pas22.97 kB02-04-10 14:37
NImages.dcu18.89 kB29-05-10 02:56
NImages.pas16.86 kB02-04-10 14:37
NLicensing.dcu1.73 kB29-05-10 02:56
NLicensing.pas2.27 kB02-04-10 14:37
NMatchers.dcu10.16 kB29-05-10 02:56
NMatchers.pas8.69 kB02-04-10 14:37
NTemplates.dcu13.67 kB29-05-10 02:56
NTemplates.pas10.28 kB02-04-10 14:37
NUtils.dcu17.47 kB29-05-10 02:56
NUtils.pas14.14 kB02-04-10 14:37
SQLite3.dcu10.79 kB29-05-10 02:56
sqlite3.dll493.92 kB02-04-10 14:37
SQLite3.pas13.07 kB02-04-10 14:37
SQLiteTable3.dcu49.60 kB29-05-10 02:56
SQLiteTable3.pas44.43 kB02-04-10 14:37
<SQLite>0.00 B29-05-10 03:00
DataBase.pas.~1~7.02 kB02-04-10 14:37
DataBase.pas.~2~7.02 kB26-05-10 01:49
DataBase.pas.~3~7.03 kB26-05-10 01:51
NDeviceManager.pas.~1~20.57 kB02-04-10 14:37
<__history>0.00 B29-05-10 03:00
<Bibliotecas>0.00 B29-05-10 03:00
CameraForm.dcu7.54 kB29-05-10 03:22
CameraForm.dfm172.63 kB02-04-10 14:37
CameraForm.pas2.57 kB02-04-10 14:37
DataBase.dcu10.98 kB29-05-10 03:22
DataBase.pas7.02 kB02-04-10 14:37
EnrollmentForm.dcu4.85 kB29-05-10 03:22
EnrollmentForm.dfm171.08 kB02-04-10 14:37
EnrollmentForm.pas577.00 B02-04-10 14:37
FacesSamplePas.cfg473.00 B02-04-10 14:37
FacesSamplePas.dof2.57 kB02-04-10 14:37
FacesSamplePas.dpr1.00 kB02-04-10 14:37
FacesSamplePas.dproj5.96 kB29-05-10 03:20
FacesSamplePas.dproj.20074.74 kB02-04-10 14:37
FacesSamplePas.dproj.local62.00 B29-05-10 03:21
FacesSamplePas.identcache1.19 kB29-05-10 03:22
FacesSamplePas.res78.90 kB29-05-10 03:20
fPrincipal.dcu53.36 kB29-05-10 03:13
fPrincipal.dfm176.14 kB29-05-10 03:05
fPrincipal.pas47.37 kB29-05-10 03:05
MainForm.dcu53.56 kB29-05-10 03:22
MainForm.dfm176.34 kB29-05-10 02:38
MainForm.pas47.42 kB29-05-10 02:54
NCore.dcu12.56 kB29-05-10 03:15
NDeviceManager.dcu24.09 kB29-05-10 03:15
Neurotechnology.bmp19.17 kB02-04-10 14:37
Neurotechnology.ico77.80 kB02-04-10 14:37
NExtractors.dcu26.39 kB29-05-10 03:15
NImages.dcu18.90 kB29-05-10 03:15
NLicensing.dcu1.74 kB29-05-10 03:15
NMatchers.dcu10.17 kB29-05-10 03:15
NTemplates.dcu13.68 kB29-05-10 03:15
NUtils.dcu17.48 kB29-05-10 03:15
SettingsForm.dcu15.43 kB29-05-10 03:22
SettingsForm.dfm177.53 kB02-04-10 14:37
SettingsForm.pas7.09 kB02-04-10 14:37
SQLite3.dcu10.80 kB29-05-10 03:15
SQLiteTable3.dcu49.61 kB29-05-10 03:15
FacesSamplePas.dpr.~1~1.00 kB02-04-10 14:37
FacesSamplePas.dpr.~2~1.01 kB29-05-10 03:02
FacesSamplePas.dpr.~3~411.00 B29-05-10 03:02
fPrincipal.dfm.~1~176.34 kB29-05-10 02:38
fPrincipal.dfm.~2~176.35 kB29-05-10 03:02
fPrincipal.dfm.~3~176.32 kB29-05-10 03:04
fPrincipal.pas.~1~47.42 kB29-05-10 03:01
fPrincipal.pas.~2~47.59 kB29-05-10 03:02
fPrincipal.pas.~3~47.58 kB29-05-10 03:04
fPrincipal.pas.~4~47.43 kB29-05-10 03:05
MainForm.dfm.~1~176.32 kB02-04-10 14:37
MainForm.dfm.~2~176.34 kB26-05-10 01:10
MainForm.dfm.~3~176.34 kB26-05-10 01:45
MainForm.dfm.~4~176.35 kB26-05-10 23:51
MainForm.dfm.~5~176.35 kB27-05-10 01:38
MainForm.dfm.~6~176.35 kB29-05-10 01:37
MainForm.pas.~1~45.50 kB02-04-10 14:37
MainForm.pas.~2~45.50 kB26-05-10 01:26
MainForm.pas.~3~45.64 kB26-05-10 01:45
MainForm.pas.~4~47.41 kB27-05-10 00:51
MainForm.pas.~5~47.42 kB27-05-10 01:18
MainForm.pas.~6~47.42 kB29-05-10 01:40
<__history>0.00 B29-05-10 03:16
<Biometria>0.00 B0 0%
...
Sponsored links

DataBase.pas (1.58 MB)

Need 2 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D