Database ORM
Misiaczek ;c
30.06.2014
Database ORM
Wersja: 1.0.1b
Wydana: 27 Czerwiec 2014
Autor: Backstabnoob
Database ORM jest kompleksowym API przystosowany do obsługi rożnych pluginów w których chcemy zaimplementować zapis/odczyt danych z MySQL. API zostało stworzone z myślą o serwerach które są bardzo mocno obciążone przez zapytania do baz oraz o osobach które chciały by dodać zapis MySQL do pluginu lecz nie potrafią, dzięki API możemy w łatwi sposób ograniczyć ilość zapytań/połączeń oraz ogólnie zwiększyć wydajność MySQL. Do używania API zalecana jest średnia znajomość AMXX, ponieważ w przypadku złego zastosowania może to odnieś skutek odwrotny od zamierzonego
UWAGA: Należy pamiętać, że jest to wersja beta i prawdopodobnie zawiera kilka błędów. Przetestowałem to jak tylko mogłem sam, ale to jest trochę trudne bez symulacji w czasie rzeczywistym. Tak więc prosił bym osoby które tego używają na swoich serwera o zgłaszanie błędów itp.
Możliwości
System ten może być przydatny w wielu aspektach, ale są pewne rzeczy w których lepiej go nie wykorzystywać.
Możemy go wykorzystać do:
- Zapis Exp
- Statystyki Graczy
- Banki
- Statystyki Serwera
- Itp.
Nie zalecam używać go do:
- Proste rzeczy które mogą być zastąpione przez prosty config bądź też cvar.
Upraszczając: Używaj przy API zdrowego rozsądku, aby nie przesadzić
Wymagania
AMXX 1.8.3 ( do testów została użyta wersja git3921 ), na wersji 1.8.2 i niższej występują błędy.
Serwer Steam
Instalacja oraz Konfiguracja
Instalacja
Pobierz plik database_orm.sma po czym go skompiluj i wrzuć do folderu plugins.
Pobierz plik orm_config.ini po czym wrzuć go do folderu configs i uzupełnij poprawnie.
Konfiguracja
orm_hostname
Adres serwera bazy danych
orm_username
Użytkownik bazy danych
orm_password
Hasło użytkownika bazy danych
orm_database
Nazwa bazy danych
orm_saveperiod
Co ile ma być dokonywany zapis danych ( czas podajemy w sekundach ( domyślnie 1200.0 ( 20 minut ) )
Jeśli mamy serwer gdzie ciągle leci ta sama mapa 24/7/365 zostawiamy wartość tak jak jest bądź zwiększamy, jeśli mamy serwer normalny gdzie mapy zmieniają się co 20-30 min ustawiamy wartość na 0
orm_preparedquery
Opcje zapisu danych
- a - Kazdy gracz osobno ( przy wyjściu z serwera )
- b - Wszyscy na raz ( jest cvar orm_saveperiod jest różny od 0 )
- c - Statyczny ( przy jakiekolwiek zmianie w trakcie gry, działa podobnie do b i ma te same wymagania )
- d - W trakcie zmian ( zawsze kiedys cos usuniemy przez CSRP_Delete{ Player/Static }ClassItem( ) )
- e - Koniec Mapy ( Kiedy mapa jest zmieniana wszystko zostaje zapisane )
- f - Nuke ( gdy wystapi błąd w natywie CSRP_Nuke{ Player/Static }Class( ) )
orm_showsavemsg
Pokazuje wiadomośc o zapisanie danych, aktywne tylko gdy orm_saveperiod jest różny od 0
Podziękowania
Hawk552 - Pomysłodawca, pomoc z wieloma rzeczami, wspieranie
Black Rose - Dyskusja, pomysły, ogólna pomoc gdy była potrzebna, wsparcie
Lista Zmian
- 1.0.0
- Pierwsze Wydanie
- Data: 25 Czerwiec 2014
- 1.0.1b
- Zmiana client_connect na client_putinserver
- Poprawka UTIL_FindInX który czasem wysypał jakiś błąd
- Data: 27 Czerwiec 2014
Pobierz
Include
database_orm.inc 11,02 KB
179 Ilość pobrań
SMA
database_orm.sma 64,19 KB
218 Ilość pobrań
Konfiguracja
orm_config.ini 350 bajtów
171 Ilość pobrań
Źródło: https://forums.allie...ad.php?t=242833
Misiaczek ;c
30.06.2014
Przykład użycia
Prosty System Bankowy
#include <amxmodx> #include <database_orm> #include <cstrike> new Class: g_hBank new bool: g_bReady[ 33 ] enum _: DatabaseColumns { Bank_Money, Bank_CreationDate } new g_DatabaseColumns[ DatabaseColumns ][ ClassColumnStruct ] = { { "bank_money", Column_Int, 11 }, { "bank_created", Column_Int, 11 } } public plugin_init( ) { new Array: aColumns = ArrayCreate( ClassColumnStruct, DatabaseColumns ) for( new i; i < DatabaseColumns; i ++ ) { ArrayPushArray( aColumns, g_DatabaseColumns[ i ] ) } g_hBank = CSRP_CreatePlayerClass( "orm_examplebank", aColumns, -1, "_Callback" ) register_clcmd( "withdraw", "_cWithdraw" ) register_clcmd( "deposit", "_cDeposit" ) register_clcmd( "accountinfo", "_cAccountInfo" ) } public _cWithdraw( id ) { if( !g_bReady[ id ] ) { client_print( id, print_console, "Please wait for load." ) return PLUGIN_HANDLED } new szArgs[ 11 ] read_args( szArgs, charsmax( szArgs ) ) remove_quotes( szArgs ) trim( szArgs ) new iArgs = str_to_num( szArgs ) new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id ) new iBankMoney = ArrayGetCell( aBankAccount, Bank_Money ) if( iArgs > iBankMoney ) { client_print( id, print_console, "You don't have that much money in your account!" ) return PLUGIN_HANDLED } cs_set_user_money( id, cs_get_user_money( id ) + iArgs ) ArraySetCell( aBankAccount, Bank_Money, iBankMoney - iArgs ) client_print( id, print_console, "You have withdrawn $%d. You now have $%d in your account.", iArgs, iBankMoney - iArgs ) return PLUGIN_HANDLED } public _cDeposit( id ) { if( !g_bReady[ id ] ){ client_print( id, print_console, "Please wait for load." ) return PLUGIN_HANDLED } new szArgs[ 11 ] read_args( szArgs, charsmax( szArgs ) ) remove_quotes( szArgs ) trim( szArgs ) new iArgs = str_to_num( szArgs ) new iMoney = cs_get_user_money( id ) if( iMoney < iArgs ) { client_print( id, print_console, "You don't have that much money!" ) return PLUGIN_HANDLED } new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id ) new iBankMoney = ArrayGetCell( aBankAccount, Bank_Money ) ArraySetCell( aBankAccount, Bank_Money, iBankMoney + iArgs ) cs_set_user_money( id, iMoney - iArgs ) client_print( id, print_console, "You have deposited $%d. You now have $%d in your bank account.", iArgs, iBankMoney + iArgs ) return PLUGIN_HANDLED } public _cAccountInfo( id ) { if( !g_bReady[ id ] ){ client_print( id, print_console, "Please wait for load." ) return PLUGIN_HANDLED } new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id ) client_print( id, print_console, "Your account was created on %d.^nYou have $%d in your account.", ArrayGetCell( aBankAccount, Bank_CreationDate ), ArrayGetCell( aBankAccount, Bank_Money ) ) return PLUGIN_HANDLED } public CSRP_OnPlayerLoad( id ) { g_bReady[ id ] = true new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id ) if( aBankAccount == Invalid_Array ) { aBankAccount = ArrayCreate( 1, DatabaseColumns ) ArrayPushCell( aBankAccount, 0 ) ArrayPushCell( aBankAccount, get_systime( ) ) CSRP_PushPlayerClassItem( g_hBank, id, aBankAccount ) } } public client_disconnect( id ) { g_bReady[ id ] = false } public CSRP_OnSave( ) { if( g_hBank != Invalid_Class ) { CSRP_SavePlayerClass( g_hBank ) } } public _Callback( ) { }
Wynik
deposit 1300 You have deposited $1300. You now have $1300 in your bank account. withdraw 1300 You have withdrawn $1300. You now have $0 in your account. accountinfo Your account was created on 1403828050. You have $0 in your account.
Załączone pliki
ex0
01.07.2014
Ograniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?
sebul
01.07.2014
Kilka/naście małych zapytań < jedno większe zapytanieOgraniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?
A co do pluginu, to widzę tam fakemetę, ale wykorzystaną chyba tylko do rozłączania graczy, po co?
Misiaczek ;c
02.07.2014
Kilka/naście małych zapytań < jedno większe zapytanieOgraniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?
A co do pluginu, to widzę tam fakemetę, ale wykorzystaną chyba tylko do rozłączania graczy, po co?
z SMA
// FM_ClientDisconnect isn't called on mapchange, which is extremely helpful // as we don't want to save the data twice (once on client_disconnect and once on plugin_end)
MAGNET
03.07.2014
Mógłbyś wyjaśnić poszczególne funkcje i za co one odpowiadają, a także wytłumaczyć jak stworzyć swój zapis MySQL?
Misiaczek ;c
03.07.2014
Mógłbyś wyjaśnić poszczególne funkcje i za co one odpowiadają, a także wytłumaczyć jak stworzyć swój zapis MySQL?
Przykład zapisu masz w orm_bank, a opis poszczególnych funkcji masz w pliku inc.
Misiaczek ;c
03.07.2014
Jak ktoś może niech sprawdzi tą wersje
Powinien być zapis w niej na nick o ile dobrze edytowałem