fix(db): remove blocking SQL calls from connect/upgrade/fastquery paths - #9
Merged
Conversation
DB_TryConnect() used a synchronous SQLite_UseDatabase()/SQL_ConnectCustom() fallback when no "shop" entry existed in databases.cfg, blocking the game thread on every (re)connect attempt in that configuration. Database.Connect() already falls back to an implicit local SQLite database for an unknown config name, so a single async call now covers both cases. DB_FastQuery() used SQL_LockDatabase()/SQL_FastQuery(), and the legacy v1->v2 schema upgrade (DB_UgradeState_1) issued a nested, fully synchronous SQL_Query() per item category while iterating the old `items` table. Both now go through Database.Query(); the per-category upgrade fetches are dispatched together and joined with a pending counter before the migration continues. Bumped plugin version to 3.0E10.
SourcePawn requires globals to be declared before use in the same file; it was declared after DB_UgradeState_1(), which referenced it first, causing "undefined symbol" at compile time.
Rushaway
force-pushed
the
fix/async-db-connections
branch
from
August 27, 2026 07:00
bc1824b to
6b302ed
Compare
Removed the DB_EscapeString function that escapes strings for database queries.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
DB_TryConnect()fell back to a synchronousSQLite_UseDatabase()/SQL_ConnectCustom()connect whenever no"shop"entry existed indatabases.cfg, blocking the game thread on every (re)connect in that configuration.Database.Connect()already falls back to an implicit local SQLite database for an unrecognized config name, so a single async call now covers both the MySQL and SQLite cases.DB_FastQuery()usedSQL_LockDatabase()/SQL_FastQuery(); now routed throughDatabase.Query().DB_UgradeState_1) issued a nested, fully synchronousSQL_Query()per item category while iterating the olditemstable. The per-category fetches are now dispatched asynchronously together and joined with a pending counter before the migration continues (DROP TABLE/DB_CreateTables()).Test plan
"shop"databases.cfg entry: confirm it falls back to local SQLite without a main-thread stall.sm_shop_clear_dbstill works end to end (exercisesDB_FastQuerypath... actually via DB_TQuery, unaffected — sanity check regardless).shop.sqlite/DB with several item categories and confirm%sitems/%sboughtsget populated correctly andDB_CreateTables()still runs exactly once at the end.🤖 Generated with Claude Code