Skip to content

Enhance export features, refactor capabilities, and improve auth pages - #975

Open
qianmoQ wants to merge 273 commits into
devlive-community:devfrom
qianmoQ:2026.0.0
Open

qianmoQ wants to merge 273 commits into
devlive-community:devfrom
qianmoQ:2026.0.0

Conversation

@qianmoQ

@qianmoQ qianmoQ commented Nov 1, 2026

Copy link
Copy Markdown
Member

Changelog category (leave one)

  • New Feature
  • Bug Fix
  • Documentation (changelog entry is not required)
  • Other

Changelog entry (Details of this change)

If there is an issue connection, write it to the end of the question
e.g: issue-7
Please delete this information when submitting

  • e.g: Support xxxx

Affected version

  • e.g: latest version

A label around each provider field also caught clicks on the client
secret's show button; the fields are plain blocks with accessible names
now, and the read-only callback address gets one too.
Sign-in and sign-up, the mail server and third-party sign-in are tabs on
the left, each with how much of it is on; the chosen group fills the
right with its own heading and the save button. The tab is kept in the
address, and a save that fails a check opens the tab with the error.
The driver read values with Redisson's binary codec, so keys set by
redis-cli or applications failed to decode. Values are plain strings
now. SELECT takes quoted keys (`test:list`), reads an exact key, a
pattern or, as before, the keys starting with the name, keeps only the
selected columns, and returns its columns even when nothing matches.
SELECT version() reports the server's redis_version.
SpotBugs failed the test module on unclosed result sets and instanceof
assertions in the Redis compatibility tests.
RedisE2ETest writes keys with plain commands, reads them back with SQL
and browses them as the source tree does. The connector page lists the
verified versions and the SQL the driver understands.
…he source

execute() always answered false, so MetaForge, which runs every
statement through it, got an update count of 0 instead of rows. It now
leaves the result set, and an empty result still has metadata. The
database comes from the property or the URL path (admin otherwise), and
getMetaData() lists databases, collections and the fields of their
first documents through the SQL driver foundation.
The plugin passes the configured database in the URL, which it built
and then dropped, lists metadata through the driver's JDBC metadata as
the other MetaForge drivers do, and declares database:list, table:list
and column:read, so the query page and the source workbench show a
tree.
MongoE2ETest writes documents with another client, lists them as
databases, collections and fields and reads them back with SQL. The new
connector page lists the verified versions.
Sources with namespaces but no databases, such as Redis, showed no
metadata on the query page. The tree now lists their databases and keys
a page at a time with a load-more entry, and clicking a key copies a
query for it.
PostgreSQLE2ETest creates a schema, table and rows with SQL, lists them
as a database, table and columns and reads the rows back. The new
connector page lists the verified versions.
A disabled button lets clicks through to the dropdown wrapper, so its
menu still opened. MfDropdown does not open while its trigger button is
disabled or when it is disabled itself.
…menu

The side panel body is a scrolling column, so long lists shrank its
search fields; its parts keep their height now. The apply-to-dataset
menu stays closed while a dataset can not be created.
TimescaleE2ETest creates a hypertable with SQL, lists it as a table with
its columns and reads its rows back on PostgreSQL 16 and 17 images. The
connector pages list the verified versions.
ParadeDBE2ETest creates a table with a BM25 index, lists it with its
columns and searches it on PostgreSQL 16 and 17 images. The connector
pages list the verified versions.
Redis now lists databases, tables and columns like every other source,
so the query page tree needs no separate key browsing.

This reverts commit d47d84d.
getMetaData() lists the numbered databases (CONFIG GET databases, 16
when refused), the keys of each as tables and key, type and value as
columns, through the SQL driver foundation. A connection opens other
databases on demand, and SELECT reads a key qualified with its database
(`2`.`user:1`), as the workbench writes it, and honours LIMIT.
…pace

The plugin lists databases, tables and columns from the driver's JDBC
metadata and declares the capabilities ZooKeeper does, so the workbench
shows the database picker and table tree; the separate key browser and
its Lua scripts are gone. RedisE2ETest checks the listing and the
workbench's qualified SELECT on Redis 6.2 and 7.4.
Neo4j reported only query:execute, so it had no tree. The plugin lists
the database it connects to, node labels as tables and their properties
as columns from the JDBC driver's metadata, and answers the version with
Cypher. Neo4jE2ETest verifies it on Neo4j 4.4 and 5.
Constraints and indexes need index:read, foreign keys and usage need
foreign-key:read, so a source like Redis shows only the basic tab, and
the primary and unique rows leave the basic panel when indexes are not
declared.
The JDBC metadata fallback read IS_AUTOINCREMENT from getColumns(), a
JDBC 4.1 column that drivers such as MonetDB's do not return, so listing
a table's columns failed. Treat a missing column as not auto-increment.
MonetDB has no version() function, so the default validator failed and
the source could not be checked. Read monet_version instead.
MonetDBE2ETest creates a schema, table and rows with SQL, lists them as
a database, table and columns and reads the rows back. The new connector
page lists the verified versions.
Each query opens and closes its own connection, and H2 drops an
in-memory database when its last connection closes, so tables created
by one query were gone in the next. Connect with DB_CLOSE_DELAY=-1 to
jdbc:h2:mem:<database>.
H2 upper-cases unquoted aliases, so the information_schema queries
returned rows keyed OBJECT_NAME and the tree showed nothing. Read them
from JDBC metadata, which keys rows as the web reads them.
H2E2ETest runs the in-memory engine in process: a schema, table and rows
created with SQL are listed and read back by later queries. H2 runs
inside the server, so the connector page lists the bundled version and
says why no container is needed.
H2 upper-cases unquoted aliases, so the information_schema queries
returned rows keyed OBJECT_NAME and the tree showed nothing. Read them
from JDBC metadata, which keys rows as the web reads them.
H2TCPE2ETest starts an H2 TCP server in process, creates a schema, table
and rows with SQL, lists them and reads the rows back. The new connector
page lists the verified version.
The host field holds a directory, but the URL was built as host:port and
the JDBC URL guard rejects a path as a host, so no DuckDB source could
connect. Build jdbc:duckdb:<directory>/<database> instead, checking the
directory for URL option characters and the file name with the guard.
DuckDB reports tables as BASE TABLE, which JDBC metadata lookups for
TABLE miss, so the tree showed no tables. Read them from
information_schema.tables.
DuckDBE2ETest opens a database file in a temporary directory, creates a
schema, table and rows with SQL, lists them and reads the rows back.
DuckDB runs inside the server, so the connector page lists the bundled
version and says why no container is needed.
…nd cut the fault proxy halfway

Two e2e failures surfaced once the suite ran long enough to reach the
executor test module: the seatunnel plugin test resolved its plugins
directory through PluginPathUtils.findProjectRoot, which inside a
surefire fork stops at the first directory with a pom — the test module
itself or the installed artifact in the local repository — and neither
contains the executor, so the plugin never loaded; the test now walks
up from the working directory and skips when the module is not built.
The fault e2e dropped the proxy five thousand rows in, which a fast
runner finishes before — the pipeline read-ahead is bounded, so cutting
at half the rows always lands inside the run and the failure path is
exercised for real.
The fault e2e kept finishing successfully on the ci runner: the executor
materializes the whole source read before the throttled write, so every
threshold keyed on the written rows fired after the source connection
was already gone, and the default writeRetries rewrote the failed batch
on a fresh connection. The proxy now exposes its open connection count,
the test cuts it the moment the source connection is being forwarded,
and the request pins writeRetries to zero so a lost connection surfaces
as the retryable failure the test asserts.
The server and the store catalogue read from cdn.north.devlive.org, the Tencent COS bucket, but releases uploaded to Aliyun OSS, so a new version stayed invisible until it was synced by hand. Plugin packages, the server distribution (the build job's, which embeds the web UI) and metadata.json now go to COS through a pinned COSCLI, as in ToolForge, and the server distribution is attached to the GitHub release.
The packaged application.properties still used the legacy stats.devlive.org alias.
The fault e2e cut the proxy once and kept losing the race against the
sync: the source read is materialized before the throttled write on two
of the engine pairs, and the writeRetries rewrote the failed batch on a
fresh connection, so the runs kept finishing successfully. The test now
cuts for good (down=true rejects every reconnect while dropAll severs
the live connections), pins writeRetries to zero so the loss surfaces
as the retryable failure the test asserts, and accepts that an
immediate cut leaves no checkpoint because nothing was written yet.
ChaosProxy gains the open connection count and a per-buffer throttle
the test uses to stretch the source reads.
- findProjectRoot parsed the file: classpath URL as a relative
  File, which anchored the search at the working directory and
  made every module resolve as the project root
- LocalSchedulerModuleTest then looked for the scheduler plugin
  under the test module directory and failed on an empty Optional
- trust only multi-module root markers (mvnw, .git) for the root
  check, cover kotlin module layouts when skipping module dirs,
  and give the scheduler test an explicit scan depth

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant