{*********************************************************}
{ }
{ Zeos Database Objects }
{ Blobs Example Application }
{ }
{ Originally written by Sergey Seroukhov }
{ }
{*********************************************************}
{@********************************************************}
{ Copyright (c) 1999-2006 Zeos Development Group }
{ }
{ License Agreement: }
{ }
{ This library is distributed in the hope that it will be }
{ useful, but WITHOUT ANY WARRANTY; without even the }
{ implied warranty of MERCHANTABILITY or FITNESS FOR }
{ A PARTICULAR PURPOSE. See the GNU Lesser General }
{ Public License for more details. }
{ }
{ The source code of the ZEOS Libraries and packages are }
{ distributed under the Library GNU General Public }
{ License (see the file COPYING / COPYING.ZEOS) }
{ with the following modification: }
{ As a special exception, the copyright holders of this }
{ library give you permission to link this library with }
{ independent modules to produce an executable, }
{ regardless of the license terms of these independent }
{ modules, and to copy and distribute the resulting }
{ executable under terms of your choice, provided that }
{ you also meet, for each linked independent module, }
{ the terms and conditions of the license of that module. }
{ An independent module is a module which is not derived }
{ from or based on this library. If you modify this }
{ library, you may extend this exception to your version }
{ of the library, but you are not obligated to do so. }
{ If you do not wish to do so, delete this exception }
{ statement from your version. }
{ }
{ }
{ The project web site is located on: }
{ http://zeos.firmos.at (FORUM) }
{ http://zeosbugs.firmos.at (BUGTRACKER) }
{ svn://zeos.firmos.at/zeos/trunk (SVN Repository) }
{ }
{ http://www.sourceforge.net/projects/zeoslib. }
{ http://www.zeoslib.sourceforge.net }
{ }
{ }
{ }
{ Zeos Development Group. }
{********************************************************@}
unit ZBlobsMain;
interface
uses
SysUtils, {$IFDEF VER140}Types, {$ENDIF}Classes, DB,
{$IFDEF LINUX}
QGraphics, QControls, QForms, QDialogs,
QStdCtrls, QExtCtrls, QDBCtrls, QGrids, QDBGrids,
{$ELSE}
Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids,
{$ENDIF}
ZConnection, ZDataset,
ZDbcMySQL, ZDbcPostgreSQL, ZDbcInterbase6, ZDbcCache, ZSqlUpdate, ZSqlMetadata,
ZDbcIntfs, ZDbcProperties;
type
{** Defines the main form of the application. }
TfrmMain = class(TForm)
pnControl: TPanel;
pnMain: TPanel;
navMain: TDBNavigator;
gdMain: TDBGrid;
pnDetail: TPanel;
splMain: TSplitter;
splDetail: TSplitter;
memText: TDBMemo;
lblProtocol: TLabel;
cbxProtocol: TComboBox;
lblHostName: TLabel;
edtHostName: TEdit;
lblDatabase: TLabel;
edtDatabase: TEdit;
lblUserName: TLabel;
edtUserName: TEdit;
edtPassword: TEdit;
lblPassword: TLabel;
btnConnect: TButton;
btnDisconnect: TButton;
btnOpen: TButton;
btnClose: TButton;
btnApplyUpdates: TButton;
btnCancelUpdates: TButton;
dsMain: TDataSource;
imgBlob: TDBImage;
lblTableName: TLabel;
edtTableName: TEdit;
lblMemoColumn: TLabel;
edtMemoColumn: TEdit;
lblBlobColumn: TLabel;
edtBlobColumn: TEdit;
btnLoadImage: TButton;
dlgOpenFile: TOpenDialog;
cbxOidAsBlob: TCheckBox;
procedure cbxOidAsBlobClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure btnApplyUpdatesClick(Sender: TObject);
procedure btnCancelUpdatesClick(Sender: TObject);
procedure PropertiesChange(Sender: TObject);
procedure btnLoadImageClick(Sender: TObject);
private
FConnection: TZConnection;
FDataset: TZQuery;
FMetadata: TZSqlMetadata;
public
property Connection: TZConnection read FConnection write FConnection;
property Metadata:TZSqlMetadata read FMetadata write FMetadata;
property Dataset: TZQuery read FDataset write FDataset;
end;
var
frmMain: TfrmMain;
implementation
{$IFDEF VER140}
{$R *.xfm}
{$ELSE}
{$R *.dfm}
{$ENDIF}
{**
Initializes this form properties.
@param Sender an event sender object reference.
}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Connection := TZConnection.Create(Self);
Dataset := TZQuery.Create(Self);
Dataset.Connection := Connection;
Dataset.ReadOnly := False;
// Dataset.CachedUpdates := True;
// make sure, we get the supported protocol names
cbxProtocol.Clear;
Connection.GetProtocolNames(cbxProtocol.Items);
cbxProtocol.Sorted := true;
dsMain.Dataset := Dataset;
PropertiesChange(Self);
end;
{**
Updates database properties.
@param Sender an event sender object reference.
}
procedure TfrmMain.PropertiesChange(Sender: TObject);
Var iIndex: Integer;
begin
Connection.Protocol := cbxProtocol.Text;
Connection.HostName := edtHostName.Text;
Connection.Database := edtDatabase.Text;
Connection.User := edtUserName.Text;
Connection.Password := edtPassword.Text;
Dataset.SQL.Text := 'SELECT * FROM ' + edtTableName.Text;
memText.DataField := edtMemoColumn.Text;
imgBlob.DataField := edtBlobColumn.Text;
cbxOidAsBlob.Enabled := (pos('postgre', cbxProtocol.Text) <> 0);
if cbxOidAsBlob.Enabled then
cbxOidAsBlobClick(Sender)
else
Connection.Properties.Clear;
end;
{**
Establishes a connection to SQL server.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
Connection.Connect;
end;
{**
Closes a connection to SQL server.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnDisconnectClick(Sender: TObject);
begin
Connection.Disconnect;
end;
{**
Opens a SQL query object.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnOpenClick(Sender: TObject);
var sTyp: String;
begin
Dataset.Open;
end;
{**
Closes a SQL query object.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
Dataset.Close;
end;
{**
Posts cached update to database from SQL query.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnApplyUpdatesClick(Sender: TObject);
begin
Dataset.Post;
// Dataset.CommitUpdates;
end;
{**
Cancel all previously made update in SQL query.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnCancelUpdatesClick(Sender: TObject);
begin
// Dataset.CancelUpdates;
end;
{**
Load an image from file and stores it into the blob column.
@param Sender an event sender object reference.
}
procedure TfrmMain.btnLoadImageClick(Sender: TObject);
var
BlobStream: TStream;
FileStream: TStream;
begin
if Dataset.Active then begin
dlgOpenFile.Filter := 'Bitmap files (*.bmp)|*.BMP';
if dlgOpenFile.Execute then begin
begin
if Dataset.State <> dsEdit then
Dataset.Edit;
BlobStream := Dataset.CreateBlobStream(
Dataset.FieldByName(edtBlobColumn.Text), bmWrite);
try
FileStream := TFileStream.Create(dlgOpenFile.FileName, fmOpenRead);
try
BlobStream.CopyFrom(FileStream, FileStream.Size);
finally
FileStream.Free;
end;
finally
BlobStream.Free;
end;
Dataset.Post;
end;
end;
end;
end;
procedure TfrmMain.cbxOidAsBlobClick(Sender: TObject);
begin
if cbxOidAsBlob.Checked then
Connection.Properties.Values[DSProps_OidAsBlob] := 'true'
else
Connection.Properties.Clear;
end;
end.