Sakiau parašysiu pamoką apie BlueG MySQL Plugin ORM naudojimą. Parašiau :)
Patį plugin galite atsisiųsti iš čia(github)
Kodėl rinktis ORM?
Didelė dalis žmonių kurie nori naudoti MySQL nieko neišmano ir nenori išmanyti apie užklausas. ORM pašalina jų būtinumą. Jų tiesiog nebereikia! Tai taip pat reiškia kad nebus galimybės padaryti klaidų sintaksėje, nereikės rūpiintis dėl escape'inimo ir t.t.
Kaip tai atrodo Pawn?
Na supaprastinus yra keli žingsniai:
1. Sukuriamas ryšys tarp duomenų bazės lentelės ir ORM, iš jo gauname ID.(orm_create)
2. Surašomi kintamieji ir jų atitinkami stulpeliai kuriuos(orm_addvar_*)
3. Nustatomas skiriamasis stulpelis(orm_setkey). Tai gali būti vardas arba _geriau_ jei unikalus ID.
4. Galima pradėti naudoti duomenis
Pavyzdžiai
Pirmasis(ir kol kas vienintelis) pavyzdys bus įprastos žaidėjo informacijos saugojimas ir krovimas, bei dalis žaidėjo sukūrimo(užsiregistravimo).
Pirmiausia masyvas duomenims laikyti:
#define MAX_PLAYER_PASSWORD 129
enum E_PLAYER_DATA
{
ORM:OrmId,
Id,
Name[ MAX_PLAYER_NAME ],
Password[ MAX_PLAYER_PASSWORD ],
Money,
Float:Health
};
new PlayerData[ MAX_PLAYERS ][ E_PLAYER_DATA ];
Tikiuosi šio kodo nereikia aiškinti.
Mūsų įsivaizduojama žaidėjų informacijos lentelė MySQL atrodys taip:
CREATE TABLE IF NOT EXISTS players (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(24) NOT NULL,
password VARCHAR(128) NOT NULL,
money INT NOT NULL,
health FLOAT NOT NULL,
PRIMARY KEY(id)
);
Nepamirškite prisijungti prie duomenų bazės su mysql_connect
Gerai, dabar pereinam prie kodo skirto šiai pamokai. Jei pažiūrėsite aukščiau, pirmasis etapas yra pasakyti ORM kokius lentelės mes norim:
// Žinoma tai NEPRIVALO būti čia.
public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, PlayerData[ playerid ][ Name ], MAX_PLAYER_NAME);
PlayerData[ playerid ][ OrmId ] = orm_create("players"); // Štai ir tas ryšys. orm_create gražina ID kurio mums reikės vykdant bet kokias kitas ORM operacijas, tad nepameskite jo.
// Dabar susiejame mūsų masyvo kintamuosius su atitinkamais stulpeliais:
orm_addvar_int(PlayerData[ playerid ][ OrmId ], PlayerData[ playerid ][ Id ], "id");
orm_addvar_string(PlayerData[ playerid ][ OrmId ], PlayerData[ playerid ][ Name ], MAX_PLAYER_NAME, "name");
orm_addvar_string(PlayerData[ playerid ][ OrmId ], PlayerData[ playerid ][ Password ], MAX_PLAYER_PASSWORD, "password");
orm_addvar_int(PlayerData[ playerid ][ OrmId ], PlayerData[ playerid ][ Money ], "money");
orm_addvar_float(PlayerData[ playerid ][ OrmId ], PlayerData[ playerid ][ Health ], "health");
// Kadangi "id" vis dar yra tuščias, galime atskirti eilutes tik pagal vardą.
orm_setkey(PlayerData[ playerid ][ OrmId ], "name");
// Viskas, ORM paruoštas. Dabar reikia užpildyti tuos kintamuosius duomenimis, JEIGU jų yra. Sužinokime:
orm_select(PlayerData[ playerid ][ OrmId ], "OnPlayerDataLoad", "i", playerid);
// Funkcija OnPlayerDataLoad turi būti public.
}
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid)
{
// orm_errno gražins klaidos kodą.
switch(orm_errno(PlayerData[ playerid ][ OrmId ]))
{
case ERROR_NO_DATA:
{
// Tai reiškia kad duomenų nėra, kitaip tariant tokio žaidėjo duomenų bazėje nėra.
// Čia galima būtų parodyti kokią nors registraciją.
}
case ERROR_OK:
{
// Ši "klaida" reiškia kad viskas gerai. Tiksliau klaidų nėra.
}
}
// Jei duomenų buvo, jau jie bus pakrauti todėl galime pakeisti į unikalų ID.
orm_setkey(PlayerData[ playerid ][ OrmId ], "id");
}
orm_errno gali grąžinti tik tas dvi vertes. | Konstanta | Reikšmė | |---------------------| | ERROR_OK | Klaidų nebuvo, užklausa įvykdyta | | ERROR_NO_DATA | Iškilo klaida: duomenys nerasti |
Dabar įsivaizduokime kad turime kokią nors registraciją ir tvarkome lentelės atsakymą:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_REGISTRACIJA:
{
if(!response)
return 1;
// Dėl paprastumo tikslų šioje pamokoje netikrinsiu ką žaidėjas įvedė, koks to įvesto teksto ilgis ir panašiai.
// Tiesiog įsivaizduokime kad įveda slaptažodį ar kažką.
// Kopijuojame įvesta slaptažodį į mūsų kintamąjį.
format(PlayerData[ playerid ][ Password ], MAX_PLAYER_PASSWORD, inputtext);
// orm_insert įrašys naują eilutę į duomenų bazę.
orm_insert(PlayerData[ playerid ][ OrmId ], "OnPlayerRegister", "i", playerid);
return 1;
}
}
return 0;
}
forward OnPlayerRegister(playerid);
public OnPlayerRegister(playerid)
{
// Patikrinam ar viskas gerai įsirašė:
switch(orm_errno(PlayerData[ playerid ][ OrmId ]))
{
case ERROR_OK:
{
// Viskas sėkmingai sukurta. Problemų neiškilo.
}
}
}
Gerai, bet kaip atnaujinti jau esamus duomenis? Tai daug paprasčiau nei manote!
public OnPlayerDisconnect(playerid, reason)
{
// Gauname duomenis kuriuos norim saugoti.
PlayerData[ playerid ][ Money ] = GetPlayerMoney(playerid);
GetPlayerHealth(playerid, PlayerData[ playerid ][ Health ]);
// Viskas, ši viena eilutė išsaugo visus duomenis.
orm_update(PlayerData[ playerid ][ OrmId ]);
return 1;
}
Tai tiek. Pats paprasčiausias būdas laikyti duomenis. Norint kažką pridėti, tereikia pridėti orm_addvar eilutę.
Kilus neaiškumams, pasiūlymas ar klausimams rašykite.
Ron prieš 9 metus
Va čia man patiko! Atrodo viskas kur kas paprasčiau bei lengviau :) Tik va klausimas ar nėra jokio skirtumo kuriam mysql pluginui bus taikomas šis būdas?
f0cus prieš 9 metus
Ar tai ką nors duoda greičio atžvilgiu, ar neverta šituo pakeisti cache ir threadinimo?
Bebras prieš 9 metus
@aurimasko Skonio reikalas. Aš pats irgi jo nenaudoju nei vienam savo projekte. Turiu tam priežasčių:
- Aš nevisada noriu atnaujinti VISUS duomenis.
- Į mano SELECT užklausas dažnai įeina įvairūs JOIN, LIMIT ir t.t.
- ORM NEpalaiko unthreaded užklausų, o kartais jų prireikia.
@foxon prieš 8 metus
Kažkas neveikia...
Pas mane mysql R34
Eilute:
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid)
{
switch(orm_errno(pInfo[playerid][ORM_ID]))
{
case ERROR_NO_DATA:
{
}
case ERROR_OK:
{
}
orm_setkey(pInfo[playerid][ORM_ID], "id");
}
}
Klaida:
C:\*********************************.pwn(107) : error 002: only a single statement (or expression) can follow each "case"
C:\*********************************.pwn(107) : warning 215: expression has no effect
C:\*********************************.pwn(109) : error 054: unmatched closing brace ("}")
@foxon prieš 8 metus
Kodėl neužkrauna?
duomenų baze viskas ok, bet žaidime neužkrauna....
Kodas:
public OnPlayerConnect(playerid)
{
//////registracija
GetPlayerName(playerid,pInfo[playerid][Vardas],24);
pInfo[playerid][ORM_ID] = orm_create("vartotojai",DbHandle);
orm_addvar_int(pInfo[playerid][ORM_ID],pInfo[playerid][ID],"ID");
orm_addvar_string(pInfo[playerid][ORM_ID],pInfo[playerid][Vardas],24,"Vardas");
orm_addvar_string(pInfo[playerid][ORM_ID],pInfo[playerid][Slaptazodis],129,"Slaptazodis");
orm_addvar_int(pInfo[playerid][ORM_ID],pInfo[playerid][Pinigai],"Pinigai");
orm_addvar_int(pInfo[playerid][ORM_ID],pInfo[playerid][XP],"XP");
orm_addvar_float(pInfo[playerid][ORM_ID],pInfo[playerid][HP],"HP");
orm_addvar_float(pInfo[playerid][ORM_ID],pInfo[playerid][Health],"health");
orm_addvar_float(pInfo[playerid][ORM_ID],pInfo[playerid][SpawnX],"SpawnX");
orm_addvar_float(pInfo[playerid][ORM_ID],pInfo[playerid][SpawnY],"SpawnY");
orm_addvar_float(pInfo[playerid][ORM_ID],pInfo[playerid][SpawnZ],"SpawnZ");
orm_setkey(pInfo[playerid][ORM_ID],"Vardas");
orm_select(pInfo[playerid][ORM_ID],"OnPlayerCheck","d",playerid);
orm_select(pInfo[playerid][ORM_ID],"OnPlayerDataLoad","i",playerid);
return 1;
}
forward OnPlayerCheck(playerid);
public OnPlayerCheck(playerid)
{
switch(orm_errno(pInfo[playerid][ORM_ID]))
{
case ERROR_OK: ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Prisijungimas","Įveskite savo slaptažodį žemiau","Prisijungti","Išeiti");
case ERROR_NO_DATA: ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"Registracija","Įvesktie savo slaptažodį žemiau","Registruotis","Išeiti");
}
orm_setkey(pInfo[playerid][ORM_ID],"ID");
//serverio prisijungimo/registracijos textas
for(new i = 0; i < 10; i++) SendClientMessageToAll(woring," ");
SendClientMessage(playerid, balta, "Sveikas atvykęs į {B04245}samp{FFFFFF} serverį!");
SendClientMessage(playerid, balta, "buk sveikas.....!");
return 1;
}
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid)
{
switch(orm_errno(pInfo[ playerid ][ORM_ID]))
{
case ERROR_NO_DATA:
{
}
case ERROR_OK:
{
}
}
orm_setkey(pInfo[playerid][ORM_ID], "id");
}