source: tools/dbc_export/DBCExport.pas

Last change on this file was 443, checked in by george, 14 years ago
  • Upraveno: Přepracována a vylepšena třídy DBC. Nově je formát sloupců určen pomocí pole párů indexů a typů. Doplněny optimalizace předvytvoření prázdných polí se známou velikostí.
  • Upraveno: Přepracován systém určování textových sloupců DBC souborů dle verzí klienta. Vytvořena samostatná tabulka GroupItemDBC obsahující sloupce id verze klienta, id položky GroupItem a index v DBC souboru. Odstraněny podobné údaje z ClientVersion. Upraven DBC import a export.
  • Přidáno: Další překladové skupiny z DBC souborů.
  • Upraveno: Export přepracován pro jednoduchost zpět na PHP pomalou variantu. Bude později přepracován a zoptimalizován.
  • Přidáno: Zobrazení času úpravy překladu.
File size: 7.4 KB
Line 
1program DBCExport;
2
3{$mode Delphi}{$H+}
4
5uses
6 {$IFDEF UNIX}{$IFDEF UseCThreads}
7 cthreads,
8 {$ENDIF}{$ENDIF}
9 Classes, SysUtils, CustApp,
10 USqlDatabase, UDBC, Variants;
11
12type
13
14 { TDBCExport }
15 TDBCExport = class(TCustomApplication)
16 private
17 procedure ParseParameters;
18 protected
19 procedure DoRun; override;
20 public
21 DBC: TDBC;
22 Database: TSqlDatabase;
23 DBCFileName: string;
24 NewDBCFileName: string;
25 ColumnTypeDefinition: string;
26 LastIndexStringColumns: integer;
27 IndexTable: array of integer;
28 SQLquery: string;
29 DisplayData: Boolean;
30 constructor Create(TheOwner: TComponent); override;
31 destructor Destroy; override;
32 procedure WriteHelp; virtual;
33 procedure ShowDBC;
34 procedure LoadDBC;
35 procedure SaveDBC;
36 procedure ReplaceText;
37 procedure CreateIndexTable(var DbRows: TDbRows);
38 function GetIDbyEntry(Entry: Integer; var DBRows: TDBRows): Integer;
39 end;
40
41{ TDBCExport }
42
43procedure TDBCExport.ParseParameters;
44begin
45 if HasOption('h', 'help') then begin
46 WriteHelp;
47 Halt;
48 end;
49 if HasOption('f', 'file') then begin
50 DBCFileName := GetOptionValue('f', 'file');
51 NewDBCFileName := Copy(DBCFileName, 1, Length(DBCFileName) -
52 Length(ExtractFileExt(DBCFileName))) + '-2.dbc';
53 end else begin
54 WriteLn('Source DBC file not specified.');
55 Halt;
56 end;
57 if HasOption('n', 'newfile') then begin
58 NewDBCFileName := GetOptionValue('n', 'newfile');
59 end;
60 if HasOption('c', 'coltypedef') then begin
61 ColumnTypeDefinition := GetOptionValue('c', 'coltypedef');
62 end;
63 if HasOption('d', 'display') then begin
64 DisplayData := True;
65 end;
66
67 if HasOption('s', 'schema') then begin
68 Database.Database := GetOptionValue('s', 'schema');
69 end else Database.Database := 'wowpreklad';
70 if HasOption('u', 'user') then begin
71 Database.UserName := GetOptionValue('u', 'user');
72 end else Database.UserName := 'root';
73 if HasOption('p', 'password') then begin
74 Database.Password := GetOptionValue('p', 'password');
75 end else Database.Password := '';
76 if HasOption('t', 'host') then begin
77 Database.Hostname := GetOptionValue('t', 'host');
78 end else Database.Hostname := 'localhost';
79 if HasOption('a', 'Charset') then begin
80 Database.Encoding := GetOptionValue('a', 'Charset');
81 end else Database.Encoding := 'utf8';
82 if HasOption('q', 'sql_query') then begin
83 SQLquery := GetOptionValue('q', 'sql_query');
84 SQLquery := StringReplace(SQLquery, '\ ', ' ', [rfReplaceAll]);
85 SQLquery := StringReplace(SQLquery, '\`', '`', [rfReplaceAll]);
86 WriteLn(SQLquery);
87 end;
88end;
89
90procedure TDBCExport.DoRun;
91begin
92 ParseParameters;
93 LoadDBC;
94 ShowDBC;
95 ReplaceText;
96 SaveDBC;
97 Terminate; // Stop program loop
98end;
99
100constructor TDBCExport.Create(TheOwner: TComponent);
101begin
102 inherited Create(TheOwner);
103 StopOnException := True;
104 Database := TSqlDatabase.Create;
105end;
106
107destructor TDBCExport.Destroy;
108begin
109 Database.Destroy;
110 inherited Destroy;
111end;
112
113procedure TDBCExport.WriteHelp;
114begin
115 WriteLn('Usage: ', ExtractFileName(ExeName), ' [options]');
116 WriteLn(' -h --help Show this help');
117 WriteLn(' -u --user Database user name, default root');
118 WriteLn(' -p --password Database password name');
119 WriteLn(' -s --schema Database schema name, default wowpreklad');
120 WriteLn(' -t --host Database host name, default localhost');
121 WriteLn(' -a --Charset Database Charset, default utf8');
122 WriteLn(' -f --file Source DBC file name');
123 WriteLn(' -n --newfile New created DBC file name');
124 WriteLn(' -c --coltypedef DBC column type definition string (usage index1:type1, index2:type2,...)');
125 WriteLn(' where 0 - uint32, 1 - sint32, 2 - float, 3 - string, 4 - byte)');
126 WriteLn(' -d --display Display DBC data');
127 WriteLn(' -q --sql_query SQL select when entry is ID first column in dbc file and text1,text2... is texts columns');
128 // SELECT T.entry as entry,T.Text as text1 FROM (SELECT * FROM gametips WHERE (Complete = 1) AND ((Language = 1)) AND (User IN (459,670,602,462,1,400,638,592,624,610,769,331,131,704,2,499,641,660,578,337,304,277,208,613,768,754,590,606,26,618,739,503,601,607,585,596,765,320,547,687)) AND VersionStart <= 9947 AND VersionEnd >= 9947) AS T GROUP BY T.entry
129end;
130
131procedure TDBCExport.ShowDBC;
132var
133 X, Y: Integer;
134 Text: string;
135begin
136 with DBC do begin
137 // Display DBC data
138 if DisplayData then
139 for Y := 0 to Length(Cells) - 1 do begin
140 Text := '';
141 for X := 0 to Length(Cells[Y]) - 1 do
142 if VarIsStr(Cells[Y, X]) then Text := Text + '"' + Cells[Y, X] + '", '
143 else Text := Text + IntToStr(Cells[Y, X]) + ', ';
144 WriteLn(Text);
145 end;
146 end;
147end;
148
149procedure TDBCExport.LoadDBC;
150var
151 I: Integer;
152begin
153 DBC := TDBC.Create;
154 with DBC do begin
155 if FileExists(DBCFileName) then begin
156 LoadFromFile(DBCFileName);
157
158 // Load strings for string columns
159 for I := 1 to Length(ColumnTypeDefinition) do
160 if ColumnTypeDefinition[I] = 's' then begin
161 LoadColumnStrings(I - 1);
162 LastIndexStringColumns := I;
163 end;
164 end else WriteLn('File ' + DBCFileName + ' not exists.');
165 end;
166end;
167
168procedure TDBCExport.SaveDBC;
169begin
170 with DBC do begin
171 if FileExists(DBCFileName) then
172 if not DirectoryExists(ExtractFileDir(NewDBCFileName)) then
173 mkdir(ExtractFileDir(NewDBCFileName));
174 SaveToFile(NewDBCFileName);
175 Free;
176 end;
177end;
178
179// Function get data from database and replace text in DBC
180procedure TDBCExport.ReplaceText;
181var
182 DBRows : TDbRows;
183 Text: string;
184 X, Y, I, Entry: Integer;
185 IndexRowData: Integer;
186begin
187 with DBC do begin
188 if (SQLquery <> '') then begin
189 Database.Connect;
190 DBRows := Database.Query(SQLquery);
191
192 CreateIndexTable(DBRows);
193
194 for Y := 0 to Length(DBC.Cells) - 1 do begin
195 Entry := Cells[Y, 0];
196 if (Length(IndexTable) > Entry) then
197 IndexRowData := IndexTable[entry]
198 else IndexRowData := 0;
199
200 I := 1;
201 if (IndexRowData <> 0) then begin
202 for X := 1 to Length(ColumnTypeDefinition) do begin
203 if ColumnTypeDefinition[X] = 's' then begin
204 Text := DBRows.Data[IndexRowData - 1].Values['Text' + IntToStr(I)];
205 SetString(Y, X - 1, Text);
206 I := I + 1;
207 if (LastIndexStringColumns = X) then Break;
208 end;
209 end;
210 end;
211 end;
212 DBRows.Destroy;
213 end;
214 end;
215end;
216
217// Create table index = entry, value = Index-1 DBRows, notfound = 0
218procedure TDBCExport.CreateIndexTable(var DbRows: TDbRows);
219var
220 I: Integer;
221 Count, Entry: Integer;
222begin
223 try
224 Count := DBRows.Count;
225 for I := 1 to Count do begin
226 Entry := StrToInt(DBRows.Data[I - 1].Values['Entry']);
227
228 if (I = 127) then SetLength(IndexTable, Entry + 1);
229
230 if (Length(IndexTable) - 1 < Entry) then
231 SetLength(IndexTable, Entry + 1);
232
233 IndexTable[Entry] := I;
234 end;
235 except
236 end;
237end;
238
239function TDBCExport.GetIDbyEntry(Entry: Integer; var DBRows: TDBRows): Integer;
240var
241 I: Integer;
242begin
243 try
244 for I := 0 to DBRows.Count - 1 do begin
245 if (StrToInt(DBRows.Data[i].Values['Entry']) = Entry) then begin
246 Result := I;
247 Exit;
248 end;
249 end;
250 except
251 end;
252 Result := -1;
253end;
254
255var
256 Application: TDBCExport;
257
258{$IFDEF WINDOWS}{$R DBCExport.rc}{$ENDIF}
259
260{$R DBCExport.res}
261
262begin
263 Application := TDBCExport.Create(nil);
264 Application.Run;
265 Application.Free;
266end.
267
Note: See TracBrowser for help on using the repository browser.