I. Wstęp
Poziom trudności: średni+
Wymagane programy
- Mozilla Firefox - http://www.mozilla-e...org/pl/firefox/
- Wtyczka SQLite Manager - https://addons.mozil...efox/addon/5817
- Jakiś edytor tekstu, ja działałem na Notepad++ który polecam - http://notepad-plus....net/uk/site.htm
Konwersja w poradniku zostanie opisana na pliku vNault z serwera z modem War3FT, choć wszędzie wygląda ona podobnie.
II. Wyciąganie bazy z zakodowanego pliku
Każdy kto próbował wyedytować plik vNault w zwykłym edytorze tekstu wie iż nie zobaczy nic prócz całej masy krzaczków:
Plik ten jest tworzony przy wykorzystaniu SQLite 3, system ten zabezpiecza plik przed wścibskimi to raz, a dwa znacznie ogranicza jego wagę, dla przykładu plik vNault warzący 0,5mb, w wersji MySQL może osiągnąć nawet 1,5mb. Jednym z powodów takiej różnicy jest usunięcie wszystkich tabel które są zupełnie zbędne jeśli chodzi o zapis do pliku.
Żeby zobaczyć odpowiedni kod należy posłużyć się kilkoma sztuczkami, instalujemy program MozillaFirefox, a następnie doinstalowujemy wtyczkę SQLite Manager. Następnie wchodzimy odpowiednio w zakładkę Narzędzia i otwieramy okno wtyczki:
Naszym oczom ukarze się okno programu w którym od tej pory będziemy pracować, wskazujemy plik z bazą danych którą chcemy wyedytować:
Po otworzeniu ukarze się nam struktura pliku i prawie idealna składnia zapytań które musimy wydać, wybieramy z menu po lewej stronie którąś z tabel, ja jako przykład wybiorę wc3_player
Jak widać na screenie program daje nam możliwość bezpośredniej edycji rekordów, usuwanie obecnych, edycji, czy dodania nowych, nas jednak interesuje przycisk Export
Wybieramy odpowiednio zakładkę SQL -> Zaznaczamy obie dostępne opcje -> Klikamy przycisk OK.
Ukarze nam się okno w którym wybieramy gdzie ma być wgrana już prawie gotowa kopia bazy danych (dlaczego prawie, o tym potem), żeby było prosto i żebyśmy nie musieli szukać wybieramy Pulpit i klikamy Zapisz.
III. Poprawa zapytań
Odnajdujemy zapisany plik i otwieramy go w dowolnym edytorze tekstu (w przykładzie użyłem Notepad++
Widzimy już rozkodowaną składnie MySQL, 90% prac już za nami, jednak żeby poprawnie wgrać taką baze należy ją edytować, zapytanie niestety są źle wydane, stąd błąd który będzie pojawiał się przy imporcie w PhpMyAdminie.
Zacznijmy od zapytania które odpowiada za usunięcie tabeli (jeśli istnieje) i utworzenie nowej.
DROP TABLE IF EXISTS "wc3_player"; CREATE TABLE `wc3_player` ( `player_id` INTEGER PRIMARY KEY AUTOINCREMENT, `player_steamid` varchar(25) NOT NULL default '', `player_ip` varchar(20) NOT NULL default '', `player_name` varchar(35) NOT NULL default '', `time` timestamp(14) NOT NULL DEFAULT CURRENT_TIMESTAMP );
Bardziej doświadczeni użytkownicy i Ci którzy mieli styczność z bazami danych na pierwszy rzut oka zauważą błędy w składni, jednak żeby nie było masy pytań "co jest nie tak" zaznaczę błędne elementy
W tej lini wystarczy usunąć znaki ", tak aby zapytanie wyglądało następująco:DROP TABLE IF EXISTS "wc3_player";
DROP TABLE IF EXISTS wc3_player;
W kolejnej lini:
Na zielono zaznaczony jest błąd składni, zaznaczony tekst należy zamienić na auto_incrementCREATE TABLE `wc3_player` ( `player_id` INTEGER PRIMARY KEY AUTOINCREMENT, `player_steamid` varchar(25) NOT NULL default '', `player_ip` varchar(20) NOT NULL default '', `player_name` varchar(35) NOT NULL default '', `time` timestamp(14) NOT NULL DEFAULT CURRENT_TIMESTAMP );
Zaznaczone na czerwono zapytania należy usunąć, bowiem parametr default trzeba czymś zapełnić, w naszym przypadku jest to zbędne. Poprawne zapytanie wygląda tak:
CREATE TABLE `wc3_player` ( `player_id` INTEGER PRIMARY KEY auto_increment, `player_steamid` varchar(25) NOT NULL, `player_ip` varchar(20) NOT NULL, `player_name` varchar(35) NOT NULL, `time` timestamp(14) NOT NULL DEFAULT CURRENT_TIMESTAMP );
Myślę że większego problemu z edycją kodu w/w zapytań nie będzie, więcej zabawy może być z edycją zapytań rekordów. Niestety wyeksportowane rekordy są źle sformułowane, brakuje w nich odpowiednio zdefiniowanych pól, stąd błąd przy imporcie. Podstawową kwestią jest wyciągnięcie z zapytania tworzącego tabele nazw pól, które musimy osadzić w zapytaniu. Na przykładzie zaznaczyłem pola na kolor zielony:
CREATE TABLE `wc3_player` ( `player_id` INTEGER PRIMARY KEY auto_increment, `player_steamid` varchar(25) NOT NULL, `player_ip` varchar(20) NOT NULL, `player_name` varchar(35) NOT NULL, `time` timestamp(14) NOT NULL DEFAULT CURRENT_TIMESTAMP );
Skoro mamy już nazwy tabel zajmijmy się edycja rekordów, świeżo rozkodowana baza wygląda mniej więcej tak:
INSERT INTO "wc3_player" VALUES(1,'','','Portek',07.07.2009);Brakuje w niej tak jak pisałem wcześniej zdefiniowanych pól do których maja być dodane dane, poprawiamy więc odpowiednio kod:
Na pierwszy rzut oka widać co zostało dodane, "wc3_player" zostało zamienione na 'wc3_player', oraz dodane zostały nazwy pól (UWAGA! Ważne żeby nazwy pól były podawane między znakami 'a', oraz było w dokładnie takiej samej kolejności jak w zapytanie tworzącym tabele!).INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`)VALUES(1,'','','Portek',07.07.2009);
Nie pozostało nam nic innego jak edycja wszystkich zapytań, ręczna edycja wszystkiego mija się z celem, komu chciało by się to wszystko wstawiać, posłużymy się więc opcją "Zamień". Edytujemy odpowiednio pierwszą linijkę, zaznaczamy stary kod który musimy zamienić, naciskamy klawisze CTRL+H, w pierwszym polu powinien pojawić się stary kod, następnie klikamy na pole poniżej, oraz zaznaczamy wyedytowaną i poprawna już część kodu, ukarze się ona w polu poniżej. Nie pozostaje już nic innego jak kliknąć przycisk Zamień wszystkie
Wyedytowany cały kod, który można poprawnie i bez problemów importować do bazy danych wygląda tak:
DROP TABLE IF EXISTS wc3_player; CREATE TABLE `wc3_player` ( `player_id` INTEGER PRIMARY KEY auto_increment, `player_steamid` varchar(25) NOT NULL, `player_ip` varchar(20) NOT NULL, `player_name` varchar(35) NOT NULL, `time` timestamp(14) NOT NULL DEFAULT CURRENT_TIMESTAMP ); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`)VALUES(1,'','','Portek',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(2,'','','Portek2',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(3,'','','Portek3',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(4,'','','Portek4',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(5,'','','Portek5',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(6,'','','Portek6',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(7,'','','Portek7',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(8,'','','Portek8',07.07.2009); INSERT INTO `wc3_player` (`player_id` ,`player_steamid` ,`player_ip` ,`player_name` ,`time`) VALUES(9,'','','Portek9',07.07.2009);
Poradnik uważam za skończony, nie należy on do łatwiejszych bo i cała operacja nie jest łatwa. Wymagana jest znajomość struktury baz danych, zapytań SQL. W razie problemów proszę o kontakt w tym temacie lub poprzez Prywatną Wiadomość, będę pomagał
Poradnik wykonany dla www.amxx.pl
Copyright � 2009 Portek. Kopiowanie zabronione.
Mówi o tym USTAWA ART.16