
Kod: Tümünü seç
type
TBackupMysql=Class
private
dbname:string;
Query:TZQuery; {Zeos bileşenlerini kullandığımdan dolayı bu şekilde tanımladım. Siz kendi kullandığınız bileşen ismini yazarsınız. TSqlQuery mesala.}
protected
function CheckTypeOfField(FieldType: TFieldType): Boolean;
public
constructor Create(ZQuery:TZQuery;databasename:string);
{Yukarıda da belirttiğim gibi kendi kullandığınız bileşen ismini yazın TZQuery yerine.}
destructor Destroy; override;
function dump_mysql_database():String;
end;
implementation
constructor TBackupMysql.Create(ZQuery:TZQuery;databasename:string);
begin
dbname:=databasename;
Query:=ZQuery;
end;
destructor TBackupMysql.Destroy;
begin
inherited;
end;
function TBackupMysql.CheckTypeOfField(FieldType: TFieldType): Boolean;
begin
If FieldType=ftInteger Then Result := true;
If FieldType=ftSmallInt Then Result := true;
If FieldType=ftBoolean Then Result := true;
If FieldType=ftFloat Then Result := true;
If FieldType=ftDate Then Result := true;
If FieldType=ftTime Then Result := true;
If FieldType=ftDateTime Then Result := true;
If FieldType=ftLargeint Then Result := true;
If FieldType=ftDataSet Then Result := true;
If FieldType=ftTimeStamp Then Result := true;
If FieldType=ftUnknown Then Result := false;
If FieldType=ftCurrency Then Result := false;
If FieldType=ftString Then Result := false;
If FieldType=ftWord Then Result := false;
If FieldType=ftBCD Then Result := false;
If FieldType=ftBytes Then Result := false;
If FieldType=ftVarBytes Then Result := false;
If FieldType=ftBlob Then Result := false;
If FieldType=ftMemo Then Result := false;
If FieldType=ftGraphic Then Result := false;
If FieldType=ftFmtMemo Then Result := false;
If FieldType=ftParadoxOle Then Result := false;
If FieldType=ftDBaseOle Then Result := false;
If FieldType=ftTypedBinary Then Result := false;
If FieldType=ftCursor Then Result := false;
If FieldType=ftWideString Then Result := false;
If FieldType=ftFixedChar Then Result := false;
If FieldType=ftADT Then Result := false;
If FieldType=ftArray Then Result := false;
If FieldType=ftReference Then Result := false;
If FieldType=ftOraBlob Then Result := false;
If FieldType=ftOraClob Then Result := false;
If FieldType=ftVariant Then Result := false;
If FieldType=ftInterface Then Result := false;
If FieldType=ftIDispatch Then Result := false;
If FieldType=ftGuid Then Result := false;
If FieldType=ftFMTBcd Then Result := false;
end;
function TBackupMysql.dump_mysql_database():String;
var
search_array:Array[1..6] of string=('\\','\''','\x00','\x0a','\x0d','\x1a');
replace_array:Array[1..6] of string=('\\\\','\\\''','\0','\n','\r','\Z');
tables: array of string;
generated_sql,last_key_name,default_str,null_str,extra_str,key_prefix,replacedtext:string;
i,x,y,arraylength,fieldcount,keycount:integer;
typeoffield:Boolean;
begin
generated_sql :='# MercilessDumper'+#13#10;
generated_sql :=generated_sql+'#---------------------------------------------'+#13#10;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('show tables FROM '+dbname);
Query.Open;
arraylength:=Query.RecordCount;
if arraylength=0 then
Result:='false';
SetLength(tables,arraylength);
x:=1;
while not Query.EOF do
begin
tables[x]:=Query.Fields[0].Text;
Query.Next;
Inc(x);
end;
for x:=1 to arraylength do
begin
last_key_name := '';
generated_sql := generated_sql+#13#10+'#'+#13#10+'# Tablo bilgisi ['+tables[x]+']'+#13#10+'#'+#13#10;
generated_sql := generated_sql+'CREATE TABLE IF NOT EXISTS '+tables[x]+' ('+#13#10;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SHOW FIELDS FROM '+tables[x]);
Query.Open;
fieldcount:=Query.RecordCount;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SHOW KEYS FROM '+tables[x]);
Query.Open;
keycount:=Query.RecordCount;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SHOW FIELDS FROM '+tables[x]);
Query.Open;
i:=1;
while not Query.EOF do
begin
if SameText(Query.FieldByName('Default').Text, 'NULL') or SameText(Query.FieldByName('Default').Text, '') then
default_str:=''
else
default_str:=' DEFAULT '''+Query.FieldByName('Default').Text+'''';
if not SameText(Query.FieldByName('Null').Text, 'YES') then
null_str:=''
else
null_str:=' NOT NULL';
if SameText(Query.FieldByName('Extra').Text, 'NULL') or SameText(Query.FieldByName('Extra').Text, '') then
extra_str:=''
else
extra_str:=' '+Query.FieldByName('Extra').Text;
generated_sql:=generated_sql+' '+Query.FieldByName('Field').Text+' '+Query.FieldByName('Type').Text+null_str+default_str+extra_str;
if (i+1<fieldcount) or (keycount>0) then
generated_sql :=generated_sql+ ' ,';
generated_sql :=generated_sql+#13#10;
Inc(i);
Query.Next;
end;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SHOW KEYS FROM '+tables[x]);
Query.Open;
while not Query.EOF do
begin
if not SameText(last_key_name, Query.FieldByName('Key_name').Text) then
begin
if not SameText(last_key_name,'') then
begin
generated_sql:=copy(generated_sql,0,length(generated_sql)-1);
generated_sql :=generated_sql+'),'+#13#10;
end;
if SameText(Query.FieldByName('Key_name').Text, 'PRIMARY') then
key_prefix := ' PRIMARY KEY'
else begin
if not SameText(Query.FieldByName('Non_unique').Text, '1') then
key_prefix :=' UNIQUE KEY '+Query.FieldByName('Key_name').Text
else
key_prefix := ' KEY '+Query.FieldByName('Key_name').Text;
end;
generated_sql := generated_sql+key_prefix+' (';
end;
generated_sql := generated_sql+Query.FieldByName('Column_name').Text+',';
last_key_name := Query.FieldByName('Key_name').Text;
Query.Next;
end;
if not SameText(last_key_name,'') then
begin
generated_sql:=copy(generated_sql,0,length(generated_sql)-1);
generated_sql :=generated_sql+')'+#13#10;
end;
generated_sql :=generated_sql+');'+#13#10;
generated_sql :=generated_sql+#13#10+'#'+#13#10+'# Veriler -- ['+tables[x]+']'+#13#10+'#'+#13#10;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SELECT * FROM '+tables[x]);
Query.Open;
if Query.RecordCount=0 then
generated_sql :=generated_sql+'# (no data in ['+tables[x]+'])'+#13#10;
while not Query.EOF do
begin
generated_sql :=generated_sql+ 'INSERT INTO '+tables[x]+' VALUES(';
for i:=0 to Query.Fields.Count-1 do
begin
if Query.Fields[i].IsNull=true then
generated_sql :=generated_sql+'NULL'
else begin
if SameText(Query.Fields[i].Text, '0') or not SameText(Query.Fields[i].Text,'') then begin
typeoffield:=CheckTypeOfField(Query.Fields[i].DataType);
if typeoffield=true then
generated_sql:=generated_sql+Query.Fields[i].Text
else begin
replacedtext:=Query.Fields[i].Text;
for y:=Low(search_array) to High(search_array) do
begin
replacedtext:=StringReplace(replacedtext,search_array[y],replace_array[y],[rfReplaceAll]);
end;
generated_sql:=generated_sql+''''+replacedtext+'''';
end;
end else
generated_sql:=generated_sql+''''+'''';
end;
if i+1<Query.Fields.Count then
generated_sql:=generated_sql+',';
end;
generated_sql:=generated_sql+ ');'+#13#10;
Query.Next;
end;
end;
Query.Close;
Query.SQL.Clear;
Result:=generated_sql;
end;