Programul `db` e „casierul” serverului: primește de la `game` tot ce se schimbă la personaje (iteme, nivel, yang) și scrie în MySQL. Dacă `db` se comportă greșit, poți pierde progresul jucătorilor. De aceea îl compilezi separat, pe serverul de test, și îl verifici atent înainte să ajungă pe live. Vestea bună: e mai mic decât `game` și se compilează repede, deci e un exercițiu bun de început.
db/src, citești Makefile-ul, rulezi gmake, verifici fișierul rezultat cu file și ldd, apoi îl încerci pe serverul de test cu login, personaje, iteme și relogare.Nivel: Avansat. Ce trebuie să știi înainte: mediul de compilare pregătit (inclusiv DBDIR schimbat spre un folder separat) și librăriile compilate.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Link (legare) | Ultimul pas al compilării: toate bucățile .o și librăriile .a sunt lipite într-un singur program. |
ldd | Comandă care arată de ce librării ale sistemului are nevoie un program ca să pornească. |
| SHA-256 | O „amprentă” a unui fișier. Dacă se schimbă un singur bit, amprenta e alta. |
| Cache | Memorie de lucru. db ține datele personajelor în memorie și le salvează periodic. |
Pasul 1: Citește rețeta lui db
cd /usr/home/sursa/db/src
grep -n "^CC\|^CFLAGS\|^LIBS\|^DBDIR\|^TARGET" MakefileÎn sursa pe care am verificat-o, ce contează:
| Rând | Ce înseamnă |
|---|---|
CC = clang++-devel | Compilatorul folosit (vezi lecția despre mediu). |
LIBS = -lthecore -lmysqlclient -lsql -lpoly -lgame -lm -lz | db folosește patru din librăriile compilate deja, plus clientul MySQL din etc/. |
TARGET = $(BINDIR)/db | Programul se numește db și apare întâi în folderul db/. |
DBDIR = ... | Folderul în care e mutat la final. Trebuie să fie /usr/home/build, nu serverul pornit. |
Verifică încă o dată rândul DBDIR. Dacă arată spre share/bin-ul unui server pornit, schimbă-l acum.
Pasul 2: Vezi ce va face, fără să facă
gmake -n | head -20-n înseamnă „arată-mi comenzile, dar nu le rula”. head -20 arată doar primele 20 de rânduri. E un fel de previzualizare: vezi dacă apar căile și compilatorul la care te aștepți.
Pasul 3: Compilează
touch Depend
gmake dep
gmake clean
gmake 2>&1 | tee /usr/home/build/db-build.logSunt aceiași pași ca la librării: dependențe, curățare, compilare cu log salvat.
Ce ar trebui să vezi: câte un rând compile ...cpp pentru fiecare fișier, apoi:
linking ../db....
Moving ../db to /usr/home/build
All done! Your db file moved to your server directory.Mesajul de final e scris în Makefile și spune „mutat în folderul serverului”. La tine, după pasul din lecția despre mediu, „folderul serverului” e de fapt /usr/home/build. Bine că e așa.
Pasul 4: Verifică programul rezultat
cd /usr/home/build
file db
ldd db
sha256 dbfiletrebuie să arate aceeași arhitectură ca vechiuldb(în pachetul verificat,ELF 32-bit ... Intel i386).lddarată librăriile de sistem. Dacă vreuna apare cunot found, programul nu va porni.sha256îți dă amprenta. Scrie-o în jurnalul tău de modificări, împreună cu data și ce sursă ai folosit.
Redenumește fișierul ca să știi ce e:
mv db db-2026-11-02-testPasul 5: Testează pe serverul de test
- Oprește serverul de test cu scriptul lui (în pachetul verificat,
close.sh). Detalii în oprire și restart. - Din folderul serverului de test (de exemplu
/usr/home/game), fă copie la vechiuldb:cp -p share/bin/db share/bin/db.bak-2026-11-02. - Copiază
/usr/home/build/db-2026-11-02-testpesteshare/bin/dbși pune aceleași permisiuni ca înainte (le vezi culs -lpe copie). - Pornește întâi MySQL și așteaptă să fie gata, apoi
db, apoi restul. Undbpornit înainte ca MySQL să termine de încărcat poate cădea imediat. - Citește
syserrdin folderuldb.
Apoi, în joc, cu un cont de test: intri, alegi personajul, muți un item, iei yang, ieși, intri din nou. Itemul și yang-ul trebuie să fie acolo.
Ce ar trebui să vezi: syserr gol sau fără erori noi, iar personajul exact cum l-ai lăsat după relogare.
Ce nu facem
- Nu înlocuim
dbpe live cât timp rulează. Datele din memoria lui s-ar pierde. - Nu schimbăm în același timp și structura tabelelor MySQL. O schimbare o dată.
- Nu combinăm un
dbdintr-o sursă cu ungamedin altă sursă. Cele două vorbesc între ele prin mesaje definite în folderulcommon/. Dacă diferă, apar erori ciudate sau date stricate.
Greșeli des întâlnite
- Uiți de
DBDIRși compilarea îți mută programul direct peste serverul pornit. - Testezi doar că pornește. Un
dbpoate porni și totuși să salveze greșit. Testează relogarea. - Nu notezi amprenta și data. Peste o lună nu mai știi ce versiune rulează.
- Ștergi vechiul
db. Fără el nu mai poți reveni repede.
Întrebări frecvente
De ce nu are db opțiunea -m32 ca game?
În sursa verificată, CFLAGS pentru db nu conține -m32. Pe un sistem i386 nu contează, totul iese pe 32 de biți. Pe un sistem amd64 ar ieși pe 64 de biți. E unul dintre motivele pentru care recomandăm un sistem de test cu aceeași arhitectură ca binarele tale.
Ce fac dacă db cade imediat după pornire?
Revino la copia veche, pornește serverul și analizează pe test. Caută un fișier db.core în folderul db: îl poți citi cu gdb, ca în lecția despre depanarea unui crash.
Trebuie recompilat db când schimb doar game?
Nu, dacă nu ai atins nimic din common/ sau din mesajele dintre ele. Dacă ai atins, compilezi amândouă.
Ce urmează
Mergi la compilarea game. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.