v1.0.0-beta
2026-05-11 Latest Beta
First public release. Ledger is now available for general use. Previously developed privately as DBForge between December 2025 and May 2026, now rebranded and validated outside of internal use. Expect rough edges on PHP versions, MariaDB forks, and hosting environments other than the development setup. Please file issues for anything that breaks.
Rebrand
- DBForge → Ledger. 428 references swept across the codebase in three case forms. New logo (brackets framing three horizontal bars). JS globals
DBForge.*are nowLedger.*. Install path moves to the repo root. Cookies andlocalStoragekeys formerly prefixeddbforge_are nowledger_. Existing users log in once and re-pick their theme.
New features
- Multi-statement execution in the SQL editor. Paste a full migration with multiple
CREATE TABLE,INSERT,ALTERstatements separated by semicolons. Each runs in sequence with its own result card showing row counts, errors, and timing. Execution stops on the first failure — useSTART TRANSACTION/COMMITfor atomicity. - DELIMITER directive support. The splitter handles
DELIMITER //blocks correctly, so stored procedure definitions withBEGIN ... END//bodies parse cleanly. - USE works in the SQL editor. Paste
USE mydb; CREATE TABLE foo (...); INSERT INTO foo ...and it executes correctly. Previously the second and third statements ran against the wrong database because each statement reconnected and lost the USE context. - Bootstrapping scripts work. Paste
CREATE DATABASE new; USE new; CREATE TABLE t (...);and it runs end-to-end. Previously the initial connection tonewfailed because the database didn't exist yet. - Index management overhaul. Composite indexes display on a single row with kind badges (PRIMARY/UNIQUE/INDEX/FULLTEXT/SPATIAL). Add Index form with click-to-select column picker and numbered order badges. Per-index Drop button with confirmation.
- phpMyAdmin-compatible export style. New style selector below the mode radio. The phpMyAdmin format produces a 4-pass output (tables → data → indexes → constraints) that imports cleanly on servers where
FOREIGN_KEY_CHECKScan't be disabled. - ER diagram Reset button. Red button with confirmation deletes the saved layout for the current database and rebuilds from auto-layout against the live schema. Useful when tables have been added or removed since the layout was saved.
Fixed
- Multi-statement read-only enforcement.
isWriteQuery()previously only checked the first keyword in the input, so a read-only user pastingUSE foo; DROP TABLE bar;would have the DROP slip through. Every statement in the batch is now checked. - Stale ER diagram schema. AJAX responses were being cached indefinitely because no cache-control headers were sent. Schema changes (adding/removing tables) didn't reflect in the diagram without a hard refresh. Added
Cache-Control: no-store,Pragma: no-cache, andExpires: 0globally to all 70+ AJAX endpoints.
Internal
- New
Database::executeQueries()routes single statements through the existing fast path (backward-compatible) and multi-statement input through a per-statement loop with aggregated results. Connects once and reuses one PDO across all statements in the batch, preserving session state. - New public
Database::splitSqlStatements()handles backtick-quoted identifiers, doubled-quote string escapes ('it''s'), hash comments (#), DELIMITER directives, and pure-comment lines. The old private splitter is removed; theexecuteSqlDumpimporter uses the new one transparently. - When input contains
CREATE DATABASE,DROP DATABASE, orUSE, the batch connects without a target database to avoid "unknown database" errors at connect time. If the original URL had a database set, aUSEis issued after connect to restore intended context. USE,CREATE/DROP DATABASE,CREATE/DROP SCHEMA, andSETnow route throughPDO::exec()instead ofprepare() + execute(). PHP-PDO mishandles preparedUSEon some MySQL versions.- Added
WITH(CTE) to the SELECT detector so CTEs are recognized as resultset queries.
Project infrastructure
SECURITY.md— vulnerability disclosure policy with supported versions table, in-scope / out-of-scope rules, and responsible-disclosure expectations.CONTRIBUTING.md— bug-report expectations, what won't be merged (no Composer, no npm, no build step), code style by language.CODE_OF_CONDUCT.md— Contributor Covenant 2.1, rewritten in plain language with a maintainer-accountability paragraph.- Issue and PR templates under
.github/— structured bug-report and feature-request forms, PR checklist that catches no-dependencies and no-build-step rules, config that disables blank issues and routes security reports to the private advisory channel. .github/FUNDING.ymlscaffold for optional sponsor links (commented out — uncomment to activate).- Repository structure flattened. Git repo root and install root are now the same directory. Previously a wrapper
ledger/subfolder forced users to dig in after extracting a release zip.