VenomGrave 2 Opublikowano 8 marca Udostępnij Opublikowano 8 marca (edytowane) HexVG-DatabaseAddon Addon do Skripta obsługujący operacje bazodanowe na serwerze VenomGrave O projekcie HexVG-DatabaseAddon to addon do Skripta stworzony na potrzeby serwera VenomGrave. Sporo pracy poszło w to żeby asynchroniczność działała porządnie — w pewnym momencie musieliśmy przepisać cały system zapytań żeby pozbyć się deadlocków które freezowały serwer. Plugin pozwala pisać skrypty które komunikują się z MySQL lub SQLite bez żadnej znajomości Javy. Połączenie, pula połączeń HikariCP, obsługa błędów, rollbacki transakcji, blokowanie graczy i tworzenie tabel — to wszystko jest po stronie pluginu. W Skripcie piszesz tylko co chcesz zrobić z danymi. Funkcje Obsługa MySQL i SQLite W pełni asynchroniczne zapytania — serwer nigdy nie freezuje Transakcje z automatycznym rollbackiem przy błędzie System blokowania graczy — zapobiega race conditions przy duplikatach komend Gwarantowane tworzenie tabel — db ensure table blokuje dopóki tabela nie istnieje, bez race conditions na starcie Integracja z PlaceholderAPI — wartości z bazy dostępne w scoreboardach, tablistach, hologramach Ochrona przed SQL injection przez PreparedStatement Walidacja nazw tabel i kolumn Cache wyników per gracz Tryb debug z logowaniem zapytań i czasem wykonania Wszystkie biblioteki spakowane w jarze — brak dodatkowych zależności Wymagania Wymaganie Wersja Paper 1.16.5+ Skript 2.6+ Java 11+ PlaceholderAPI opcjonalne Instalacja Wrzuć HexVG-DatabaseAddon.jar do folderu plugins/ Uruchom serwer — plugin wygeneruje config.yml Skonfiguruj połączenie z bazą danych Zrestartuj serwer Przy MySQL pamiętaj żeby wcześniej ręcznie utworzyć bazę: CREATE DATABASE nazwa_bazy; Konfiguracja debug: false database: type: SQLITE # SQLITE lub MYSQL sqlite: file: database.db mysql: host: localhost port: 3306 database: nazwa_bazy username: root password: "" pool-size: 5 Składnia Skript Tworzenie tabeli (zalecane) Blokuje dopóki tabela nie powstanie — bezpieczne w on skript load, bez wait ticks, bez race conditions nawet gdy kilku graczy dołączy jednocześnie. on skript load: db ensure table "players" with query "CREATE TABLE IF NOT EXISTS players (uuid VARCHAR(36) PRIMARY KEY, name VARCHAR(16), coins INT DEFAULT 0)" Pobieranie danych execute db query "SELECT * FROM players WHERE uuid = ?" with values {_uuid} wait 2 ticks set {_coins} to column "coins" from row 1 of last db query result set {_rows} to db row count of last db query result Dodawanie rekordu set {_cols::1} to "uuid" set {_cols::2} to "coins" set {_vals::1} to {_uuid} set {_vals::2} to "0" db insert into table "players" columns {_cols::*} values {_vals::*} Aktualizacja i usuwanie db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid} db delete from table "players" where "uuid" = {_uuid} Transakcje Kilka zapytań jako jedna atomowa operacja — albo wszystko się zapisuje, albo nic. db begin transaction db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid} wait 2 ticks db insert into table "purchases" columns {_cols::*} values {_vals::*} wait 2 ticks db commit transaction if last db transaction failed: send "&cCoś poszło nie tak. Coiny nie zostały pobrane." to player stop send "&aZakup zakończony sukcesem!" to player db begin transaction i db commit transaction nie wymagają wait — blokują wewnętrznie do czasu zakończenia operacji. Blokowanie gracza Zapobiega wielokrotnemu wywołaniu komendy zanim poprzednie wykonanie się skończy. if player is db locked: send "&cPoczekaj chwilę przed ponownym użyciem tej komendy." to player stop db lock player # ... zapytania ... db unlock player PlaceholderAPI Jeśli PlaceholderAPI jest zainstalowane, ekspansja rejestruje się automatycznie. Ustaw wartość ze Skripta po zapytaniu i działa wszędzie gdzie PAPI jest obsługiwane. execute db query "SELECT coins FROM players WHERE uuid = ?" with values {_uuid} wait 2 ticks set {_coins} to column "coins" from row 1 of last db query result db set placeholder "coins" to "%{_coins}%" for player Placeholder Opis %hexvgdb_<klucz>% wartość ustawiona przez db set placeholder %hexvgdb_connected% true / false — status połączenia z bazą %hexvgdb_locked% true / false — czy gracz ma aktywny lock Ważne — wait ticks Zwykłe zapytania są asynchroniczne, więc przed odczytaniem wyniku daj wait 2 ticks. db ensure table, db begin transaction i db commit transaction nie wymagają wait — blokują wewnętrznie. Komendy Komenda Opis Uprawnienie /hexvgdb status Status połączenia z bazą hexvg.database.admin /hexvgdb debug Włącza / wyłącza tryb debug hexvg.database.admin /hexvgdb reload Przeładowuje konfigurację hexvg.database.admin Domyślnie dostępne tylko dla operatorów. Przykładowe skrypty W repozytorium znajdują się dwa przykłady: example.sk — system coinów z SELECT, INSERT, UPDATE, DELETE, transakcjami i lockami example_papi.sk — system statystyk (coiny, kills, rank) z pełną integracją PlaceholderAPI Autorzy Stworzony dla serwera VenomGrave przez HexVG Team. Błędy i propozycje: https://github.com/VenomGrave/HexVG-DatabaseAddon/issues Edytowane 3 godziny temu przez VenomGrave Kormic 1 Cytuj Odnośnik do komentarza https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/ Udostępnij na innych stronach Więcej opcji udostępniania...
Fendi 193 Opublikowano 8 marca Udostępnij Opublikowano 8 marca Fajne, chociaż ja osobiście czekam aż ktoś calkiem przepisze system zapisywania zmiennych, bo trzymanie wszystkiego w jednym miejscu bez specjalnej kontroli zapisu jest troche ew Cytuj Odnośnik do komentarza https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/#findComment-347670 Udostępnij na innych stronach Więcej opcji udostępniania...
VenomGrave 2 Opublikowano 8 marca Autor Udostępnij Opublikowano 8 marca Godzinę temu, Fendi napisał: Fajne, chociaż ja osobiście czekam aż ktoś calkiem przepisze system zapisywania zmiennych, bo trzymanie wszystkiego w jednym miejscu bez specjalnej kontroli zapisu jest troche ew Dzięki za opinię. No właśnie dlatego ten plugin w ogóle powstał, bo domyślny system Skripta jest dość ograniczony jeśli chodzi o kontrolę nad danymi. Tutaj masz pełną kontrolę — własne tabele, własne zapytania, sam decydujesz kiedy i co zapisujesz. Co do aktualizacji — w najbliższym czasie wrzucimy nową wersję. Między innymi wchodzą transakcje, więc jeśli kilka zapytań musi wykonać się razem albo żadne, to plugin sam zadba o rollback gdy coś pójdzie nie tak. Cytuj Odnośnik do komentarza https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/#findComment-347671 Udostępnij na innych stronach Więcej opcji udostępniania...
VenomGrave 2 Opublikowano 12 marca Autor Udostępnij Opublikowano 12 marca Update v1.2.0 Spory update — cztery nowe rzeczy. 1. Transakcje Możesz teraz wykonać kilka zapytań jako jedną atomową operację — albo wszystko się zapisze, albo nic. Jeśli cokolwiek się posypie w trakcie, plugin automatycznie cofa wszystko i ustawia flagę którą możesz sprawdzić w Skripcie. db begin transaction db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid} wait 2 ticks db insert into table "purchases" columns {_cols::*} values {_vals::*} wait 2 ticks db commit transaction if last db transaction failed: send "&cCoś poszło nie tak." to player stop send "&aZakup udany!" to player 2. Blokowanie graczy Zapobiega race conditions gdy gracz wywołuje komendę kilka razy zanim poprzednia się skończy. Locki trzymane są w pamięci pluginu — żadnych zmiennych Skriptowych. if player is db locked: send "&cPoczekaj chwilę." to player stop db lock player # ... zapytania ... db unlock player 3. db ensure table Nowy efekt do tworzenia tabel który rozwiązuje problem z race conditions na starcie serwera. Blokuje wykonanie skryptu dopóki tabela faktycznie nie powstanie — nie trzeba już kombinować z wait ticks ani flagami. # Nowe on skript load: db ensure table "players" with query "CREATE TABLE IF NOT EXISTS players (...)" # Stare on skript load: check db table "players" wait 20 ticks if db table "players" doesn't exist: execute db query "CREATE TABLE IF NOT EXISTS players (...)" wait 5 ticks 4. PlaceholderAPI Jeśli macie PlaceholderAPI na serwerze, plugin automatycznie rejestruje własne placeholdery. Ustawiacie wartość ze Skripta po zapytaniu i działa wszędzie — scoreboard, tablist, hologramy, cokolwiek obsługuje PAPI. execute db query "SELECT coins FROM players WHERE uuid = ?" with values {_uuid} wait 2 ticks set {_coins} to column "coins" from row 1 of last db query result db set placeholder "coins" to "%{_coins}%" for player Od tej chwili %hexvgdb_coins% zwraca aktualną wartość dla gracza. Placeholder Opis %hexvgdb_<klucz>% wartość ustawiona ze Skripta %hexvgdb_connected% true / false — status połączenia z bazą %hexvgdb_locked% true / false — czy gracz ma aktywny lock PlaceholderAPI jest opcjonalne — bez niego plugin działa dokładnie tak samo jak wcześniej. W repozytorium są dwa przykładowe skrypty — example.sk z systemem coinów i nowy example_papi.sk pokazujący system statystyk z pełną integracją PlaceholderAPI. Jak coś nie działa albo macie pomysły — piszcie w komentarzach albo otwórzcie Issue na GitHubie. Cytuj Odnośnik do komentarza https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/#findComment-347682 Udostępnij na innych stronach Więcej opcji udostępniania...
VenomGrave 2 Opublikowano 3 godziny temu Autor Udostępnij Opublikowano 3 godziny temu HexVG-DatabaseAddon 1.2.1 – aktualizacja poprawkowa https://github.com/VenomGrave/HexVG-DatabaseAddon Zalecana dla wszystkich serwerów, szczególnie tych ze sklepami i ekonomią na Skripcie. Co naprawiono: - Zapytania do bazy nie zamrażają już serwera. Wcześniej każde zapytanie mogło zatrzymać serwer nawet na 5 sekund. - Wyniki zapytań w komendach, przy śmierci gracza czy w GUI trafiają teraz do właściwego gracza. Wcześniej gracze mogli „widzieć” nawzajem swoje dane. - Transakcje są w pełni bezpieczne: błąd dowolnego zapytania cofa wszystko, nie ma już częściowych zapisów (np. przedmiotu kupionego bez zapłaty). - Ochrona przed podwójnym zakupem przy spamowaniu komendy. - Porzucone transakcje i blokady (db lock) wygasają same po 30 sekundach. - Po restarcie MySQL plugin sam łączy się ponownie. - Poprawki dla MySQL i drobne optymalizacje. Ważne dla skryptów: - "wait" po zapytaniu nie jest już potrzebny, bo wynik jest dostępny od razu w następnej linijce. - Nie używajcie "wait" między "db begin transaction" a "db commit transaction". Cytuj Odnośnik do komentarza https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/#findComment-347946 Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.