This is an automated email from the ASF dual-hosted git repository.

david-streamlio pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar-connectors.git


The following commit(s) were added to refs/heads/master by this push:
     new 3ee99c49 [feat][io] Add Debezium MariaDB source connector (#69)
3ee99c49 is described below

commit 3ee99c4969893e786e2056c8078cdc49d75a2af3
Author: David Kjerrumgaard <[email protected]>
AuthorDate: Thu Jul 9 14:30:58 2026 -0700

    [feat][io] Add Debezium MariaDB source connector (#69)
    
    Debezium ships a MariaDB source connector but this repository did not
    wrap it. Add pulsar-io-debezium-mariadb, following the structure of the
    existing MySQL module: both connectors build on Debezium's shared
    binlog base.
    
    Includes a unit suite covering the connector/task class defaulting and
    validation, and a Testcontainers integration test that runs the source
    against a real MariaDB server and asserts the initial snapshot produces
    CDC records.
---
 debezium/mariadb/build.gradle.kts                  |  32 ++++
 .../io/debezium/mariadb/DebeziumMariaDbSource.java |  42 +++++
 .../pulsar/io/debezium/mariadb/package-info.java   |  19 +++
 .../resources/META-INF/services/pulsar-io.yaml     |  22 +++
 .../resources/debezium-mariadb-source-config.yaml  |  41 +++++
 .../mariadb/DebeziumMariaDbSourceConfigTest.java   | 108 +++++++++++++
 .../mariadb/DebeziumMariaDbSourceTest.java         | 173 +++++++++++++++++++++
 distribution/io/build.gradle.kts                   |   1 +
 distribution/io/src/assemble/io.xml                |   1 +
 docker/pulsar-all/build.gradle.kts                 |   1 +
 docs/build.gradle.kts                              |   1 +
 gradle/libs.versions.toml                          |   1 +
 settings.gradle.kts                                |   2 +
 13 files changed, 444 insertions(+)

diff --git a/debezium/mariadb/build.gradle.kts 
b/debezium/mariadb/build.gradle.kts
new file mode 100644
index 00000000..6535ecf5
--- /dev/null
+++ b/debezium/mariadb/build.gradle.kts
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+plugins {
+    id("pulsar-connectors.java-conventions")
+    id("pulsar-connectors.nar-conventions")
+}
+dependencies {
+    implementation(libs.pulsar.io.core)
+    implementation(project(":debezium:pulsar-io-debezium-core"))
+    implementation(libs.debezium.connector.mariadb)
+
+    testImplementation(libs.testcontainers)
+    testImplementation(libs.testcontainers.pulsar)
+    testImplementation(libs.pulsar.client)
+}
diff --git 
a/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSource.java
 
b/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSource.java
new file mode 100644
index 00000000..809b894f
--- /dev/null
+++ 
b/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSource.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.io.debezium.mariadb;
+
+import java.util.Map;
+import org.apache.kafka.connect.runtime.ConnectorConfig;
+import org.apache.kafka.connect.runtime.TaskConfig;
+import org.apache.pulsar.io.debezium.DebeziumSource;
+
+/**
+ * A pulsar source that runs debezium mariadb source.
+ */
+public class DebeziumMariaDbSource extends DebeziumSource {
+    private static final String DEFAULT_CONNECTOR = 
"io.debezium.connector.mariadb.MariaDbConnector";
+    private static final String DEFAULT_TASK = 
"io.debezium.connector.mariadb.MariaDbConnectorTask";
+
+    @Override
+    public void setDbConnectorClass(Map<String, Object> config) throws 
Exception {
+        throwExceptionIfConfigNotMatch(config, 
ConnectorConfig.CONNECTOR_CLASS_CONFIG, DEFAULT_CONNECTOR);
+    }
+
+    @Override
+    public void setDbConnectorTask(Map<String, Object> config) throws 
Exception {
+        throwExceptionIfConfigNotMatch(config, TaskConfig.TASK_CLASS_CONFIG, 
DEFAULT_TASK);
+    }
+}
diff --git 
a/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/package-info.java
 
b/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/package-info.java
new file mode 100644
index 00000000..9c9a2abc
--- /dev/null
+++ 
b/debezium/mariadb/src/main/java/org/apache/pulsar/io/debezium/mariadb/package-info.java
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.io.debezium.mariadb;
diff --git 
a/debezium/mariadb/src/main/resources/META-INF/services/pulsar-io.yaml 
b/debezium/mariadb/src/main/resources/META-INF/services/pulsar-io.yaml
new file mode 100644
index 00000000..8586681c
--- /dev/null
+++ b/debezium/mariadb/src/main/resources/META-INF/services/pulsar-io.yaml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name: debezium-mariadb
+description: Debezium MariaDb Source
+sourceClass: org.apache.pulsar.io.debezium.mariadb.DebeziumMariaDbSource
diff --git 
a/debezium/mariadb/src/main/resources/debezium-mariadb-source-config.yaml 
b/debezium/mariadb/src/main/resources/debezium-mariadb-source-config.yaml
new file mode 100644
index 00000000..4a4cbf68
--- /dev/null
+++ b/debezium/mariadb/src/main/resources/debezium-mariadb-source-config.yaml
@@ -0,0 +1,41 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+tenant: "test"
+namespace: "test-namespace"
+name: "debezium-mariadb-source"
+topicName: "debezium-mariadb-topic"
+archive: "connectors/pulsar-io-debezium-mariadb-2.4.0-SNAPSHOT.nar"
+
+parallelism: 1
+
+configs:
+  ## config for mariadb, docker image: mariadb:11.4
+  database.hostname: "localhost"
+  database.port: "3306"
+  database.user: "debezium"
+  database.password: "dbz"
+  database.server.id: "184054"
+  database.include.list: "inventory"
+  topic.prefix: "dbserver1"
+
+  schema.history.internal.pulsar.topic: "mariadb-history-topic"
+  schema.history.internal.pulsar.service.url: "pulsar://127.0.0.1:6650"
+  offset.storage.topic: "mariadb-offset-topic"
+  connector.class: "io.debezium.connector.mariadb.MariaDbConnector"
diff --git 
a/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceConfigTest.java
 
b/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceConfigTest.java
new file mode 100644
index 00000000..365f0472
--- /dev/null
+++ 
b/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceConfigTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.io.debezium.mariadb;
+
+import static org.testng.Assert.assertEquals;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.kafka.connect.runtime.ConnectorConfig;
+import org.apache.kafka.connect.runtime.TaskConfig;
+import org.testng.annotations.Test;
+
+/**
+ * Unit tests for the connector and task class wiring of {@link 
DebeziumMariaDbSource}.
+ *
+ * <p>These run without a database: they cover the defaulting and validation 
behavior that
+ * {@code DebeziumSource#throwExceptionIfConfigNotMatch} applies to the 
connector/task class
+ * config keys. Getting either class name wrong is a silent misconfiguration 
that would only
+ * surface at runtime, so it is pinned here.
+ */
+public class DebeziumMariaDbSourceConfigTest {
+
+    private static final String MARIADB_CONNECTOR = 
"io.debezium.connector.mariadb.MariaDbConnector";
+    private static final String MARIADB_TASK = 
"io.debezium.connector.mariadb.MariaDbConnectorTask";
+
+    @Test
+    public void testConnectorClassDefaultedWhenAbsent() throws Exception {
+        Map<String, Object> config = new HashMap<>();
+
+        new DebeziumMariaDbSource().setDbConnectorClass(config);
+
+        assertEquals(config.get(ConnectorConfig.CONNECTOR_CLASS_CONFIG), 
MARIADB_CONNECTOR);
+    }
+
+    @Test
+    public void testTaskClassDefaultedWhenAbsent() throws Exception {
+        Map<String, Object> config = new HashMap<>();
+
+        new DebeziumMariaDbSource().setDbConnectorTask(config);
+
+        assertEquals(config.get(TaskConfig.TASK_CLASS_CONFIG), MARIADB_TASK);
+    }
+
+    @Test
+    public void testExplicitMatchingConnectorClassIsAccepted() throws 
Exception {
+        Map<String, Object> config = new HashMap<>();
+        config.put(ConnectorConfig.CONNECTOR_CLASS_CONFIG, MARIADB_CONNECTOR);
+
+        new DebeziumMariaDbSource().setDbConnectorClass(config);
+
+        assertEquals(config.get(ConnectorConfig.CONNECTOR_CLASS_CONFIG), 
MARIADB_CONNECTOR);
+    }
+
+    @Test
+    public void testExplicitMatchingTaskClassIsAccepted() throws Exception {
+        Map<String, Object> config = new HashMap<>();
+        config.put(TaskConfig.TASK_CLASS_CONFIG, MARIADB_TASK);
+
+        new DebeziumMariaDbSource().setDbConnectorTask(config);
+
+        assertEquals(config.get(TaskConfig.TASK_CLASS_CONFIG), MARIADB_TASK);
+    }
+
+    /**
+     * Guards against pointing the MariaDB source at the MySQL connector, 
which is an easy
+     * mistake now that both connectors share Debezium's binlog base.
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void testMismatchedConnectorClassIsRejected() throws Exception {
+        Map<String, Object> config = new HashMap<>();
+        config.put(ConnectorConfig.CONNECTOR_CLASS_CONFIG, 
"io.debezium.connector.mysql.MySqlConnector");
+
+        new DebeziumMariaDbSource().setDbConnectorClass(config);
+    }
+
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void testMismatchedTaskClassIsRejected() throws Exception {
+        Map<String, Object> config = new HashMap<>();
+        config.put(TaskConfig.TASK_CLASS_CONFIG, 
"io.debezium.connector.mysql.MySqlConnectorTask");
+
+        new DebeziumMariaDbSource().setDbConnectorTask(config);
+    }
+
+    /**
+     * The class names are string literals, so a typo would compile. Resolve 
them to prove
+     * they name real classes on the connector's runtime classpath.
+     */
+    @Test
+    public void testConnectorAndTaskClassesResolve() throws Exception {
+        assertEquals(Class.forName(MARIADB_CONNECTOR).getName(), 
MARIADB_CONNECTOR);
+        assertEquals(Class.forName(MARIADB_TASK).getName(), MARIADB_TASK);
+    }
+}
diff --git 
a/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceTest.java
 
b/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceTest.java
new file mode 100644
index 00000000..cc60d488
--- /dev/null
+++ 
b/debezium/mariadb/src/test/java/org/apache/pulsar/io/debezium/mariadb/DebeziumMariaDbSourceTest.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.io.debezium.mariadb;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.common.schema.KeyValue;
+import org.apache.pulsar.functions.api.Record;
+import org.apache.pulsar.io.core.SourceContext;
+import org.awaitility.Awaitility;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.PulsarContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.DockerImageName;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+@Slf4j
+public class DebeziumMariaDbSourceTest {
+
+    private static final String PULSAR_IMAGE =
+            System.getenv().getOrDefault("PULSAR_TEST_IMAGE", 
"apachepulsar/pulsar:4.1.3");
+
+    private static final int MARIADB_PORT = 3306;
+
+    private GenericContainer<?> mariadbContainer;
+    private PulsarContainer pulsarContainer;
+    private PulsarClient pulsarClient;
+    private DebeziumMariaDbSource source;
+
+    @BeforeMethod
+    public void setup() throws Exception {
+        // GenericContainer rather than MariaDBContainer: debezium-bom pins 
Testcontainers core
+        // to 2.x, while the specialized modules still target 1.21.x and 
reference shaded classes
+        // removed in 2.x. Root access is also needed for Debezium's 
REPLICATION SLAVE/CLIENT
+        // privileges. Same approach as DebeziumMysqlSourceTest.
+        mariadbContainer = new 
GenericContainer<>(DockerImageName.parse("mariadb:11.4"))
+                .withExposedPorts(MARIADB_PORT)
+                .withEnv("MARIADB_ROOT_PASSWORD", "rootpw")
+                .withEnv("MARIADB_DATABASE", "testdb")
+                .withCommand(
+                        "--log-bin=mariadb-bin",
+                        "--binlog-format=ROW",
+                        "--server-id=1"
+                )
+                .waitingFor(Wait.forLogMessage(".*ready for connections.*\\s", 
2));
+        mariadbContainer.start();
+
+        pulsarContainer = new 
PulsarContainer(DockerImageName.parse(PULSAR_IMAGE));
+        pulsarContainer.start();
+
+        pulsarClient = PulsarClient.builder()
+                .serviceUrl(pulsarContainer.getPulsarBrokerUrl())
+                .build();
+
+        // The MariaDB 3.x driver only registers the jdbc:mariadb: scheme; it 
no longer
+        // handles jdbc:mysql: URLs. The driver arrives transitively with the 
connector.
+        String jdbcUrl = "jdbc:mariadb://" + mariadbContainer.getHost() + ":"
+                + mariadbContainer.getMappedPort(MARIADB_PORT) + "/testdb";
+
+        // Create test table and insert initial data (root has all privileges)
+        try (Connection conn = DriverManager.getConnection(jdbcUrl, "root", 
"rootpw");
+             Statement stmt = conn.createStatement()) {
+            stmt.execute("CREATE TABLE products ("
+                    + "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, "
+                    + "name VARCHAR(255) NOT NULL, "
+                    + "description VARCHAR(512))");
+            stmt.execute("INSERT INTO products (name, description) VALUES 
('widget', 'A small widget')");
+            stmt.execute("INSERT INTO products (name, description) VALUES 
('gadget', 'A fancy gadget')");
+        }
+
+        source = new DebeziumMariaDbSource();
+    }
+
+    @AfterMethod(alwaysRun = true)
+    public void cleanup() throws Exception {
+        if (source != null) {
+            try {
+                source.close();
+            } catch (Exception e) {
+                log.warn("Failed to close source", e);
+            }
+        }
+        if (pulsarClient != null) {
+            pulsarClient.close();
+        }
+        if (pulsarContainer != null) {
+            pulsarContainer.stop();
+        }
+        if (mariadbContainer != null) {
+            mariadbContainer.stop();
+        }
+    }
+
+    /**
+     * Bounds the whole test: {@code source.read()} blocks, so a connector 
that never emits
+     * would otherwise hang until the CI job's own timeout.
+     */
+    @Test(timeOut = 300_000)
+    public void testMariaDbCdcEvents() throws Exception {
+        String pulsarServiceUrl = pulsarContainer.getPulsarBrokerUrl();
+
+        SourceContext sourceContext = mock(SourceContext.class);
+        when(sourceContext.getPulsarClient()).thenReturn(pulsarClient);
+        when(sourceContext.getPulsarClientBuilder()).thenReturn(
+                PulsarClient.builder().serviceUrl(pulsarServiceUrl));
+        when(sourceContext.getTenant()).thenReturn("public");
+        when(sourceContext.getNamespace()).thenReturn("default");
+        
when(sourceContext.getSourceName()).thenReturn("debezium-mariadb-test");
+        when(sourceContext.getSecret(anyString())).thenReturn(null);
+
+        Map<String, Object> config = new HashMap<>();
+        config.put("database.hostname", mariadbContainer.getHost());
+        config.put("database.port", 
String.valueOf(mariadbContainer.getMappedPort(MARIADB_PORT)));
+        config.put("database.user", "root");
+        config.put("database.password", "rootpw");
+        config.put("database.server.id", "12345");
+        config.put("topic.prefix", "dbserver1");
+        config.put("include.schema.changes", "false");
+        config.put("schema.history.internal.pulsar.service.url", 
pulsarServiceUrl);
+
+        source.open(config, sourceContext);
+
+        // Debezium performs an initial snapshot of existing data.
+        // We should receive CDC records for the 2 rows we inserted.
+        Awaitility.await()
+                .atMost(60, TimeUnit.SECONDS)
+                .pollInterval(500, TimeUnit.MILLISECONDS)
+                .untilAsserted(() -> {
+                    int recordCount = 0;
+                    Record<KeyValue<byte[], byte[]>> record;
+                    while ((record = source.read()) != null) {
+                        assertNotNull(record.getValue());
+                        log.info("Received CDC record: key={}", 
record.getKey().orElse(null));
+                        recordCount++;
+                        record.ack();
+                        if (recordCount >= 2) {
+                            break;
+                        }
+                    }
+                    assertTrue(recordCount >= 2,
+                            "Expected at least 2 CDC records from initial 
snapshot, got " + recordCount);
+                });
+    }
+}
diff --git a/distribution/io/build.gradle.kts b/distribution/io/build.gradle.kts
index 66f3a6c7..a43d4085 100644
--- a/distribution/io/build.gradle.kts
+++ b/distribution/io/build.gradle.kts
@@ -57,6 +57,7 @@ dependencies {
     connectorNars(project(":canal"))
     connectorNars(project(":netty"))
     connectorNars(project(":mongo"))
+    connectorNars(project(":debezium:pulsar-io-debezium-mariadb"))
     connectorNars(project(":debezium:pulsar-io-debezium-mysql"))
     connectorNars(project(":debezium:pulsar-io-debezium-postgres"))
     connectorNars(project(":debezium:pulsar-io-debezium-oracle"))
diff --git a/distribution/io/src/assemble/io.xml 
b/distribution/io/src/assemble/io.xml
index 3e4ed50d..01ed22fb 100644
--- a/distribution/io/src/assemble/io.xml
+++ b/distribution/io/src/assemble/io.xml
@@ -68,6 +68,7 @@
     
<file><source>${basedir}/../../pulsar-io/canal/target/pulsar-io-canal-${project.version}.nar</source></file>
     
<file><source>${basedir}/../../pulsar-io/netty/target/pulsar-io-netty-${project.version}.nar</source></file>
     
<file><source>${basedir}/../../pulsar-io/mongo/target/pulsar-io-mongo-${project.version}.nar</source></file>
+    
<file><source>${basedir}/../../pulsar-io/debezium/mariadb/target/pulsar-io-debezium-mariadb-${project.version}.nar</source></file>
     
<file><source>${basedir}/../../pulsar-io/debezium/mysql/target/pulsar-io-debezium-mysql-${project.version}.nar</source></file>
     
<file><source>${basedir}/../../pulsar-io/debezium/postgres/target/pulsar-io-debezium-postgres-${project.version}.nar</source></file>
     
<file><source>${basedir}/../../pulsar-io/debezium/oracle/target/pulsar-io-debezium-oracle-${project.version}.nar</source></file>
diff --git a/docker/pulsar-all/build.gradle.kts 
b/docker/pulsar-all/build.gradle.kts
index 448d3d1f..81a0f848 100644
--- a/docker/pulsar-all/build.gradle.kts
+++ b/docker/pulsar-all/build.gradle.kts
@@ -60,6 +60,7 @@ dependencies {
     connectorNars(project(":canal"))
     connectorNars(project(":netty"))
     connectorNars(project(":mongo"))
+    connectorNars(project(":debezium:pulsar-io-debezium-mariadb"))
     connectorNars(project(":debezium:pulsar-io-debezium-mysql"))
     connectorNars(project(":debezium:pulsar-io-debezium-postgres"))
     connectorNars(project(":debezium:pulsar-io-debezium-oracle"))
diff --git a/docs/build.gradle.kts b/docs/build.gradle.kts
index 0f89397b..f8921971 100644
--- a/docs/build.gradle.kts
+++ b/docs/build.gradle.kts
@@ -29,6 +29,7 @@ dependencies {
     implementation(project(":aerospike"))
     implementation(project(":canal"))
     implementation(project(":cassandra"))
+    implementation(project(":debezium:pulsar-io-debezium-mariadb"))
     implementation(project(":debezium:pulsar-io-debezium-mysql"))
     implementation(project(":debezium:pulsar-io-debezium-postgres"))
     implementation(project(":debezium:pulsar-io-debezium-mongodb"))
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index fd1b5ac5..4b6d3500 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -462,6 +462,7 @@ elasticsearch-java = { module = 
"co.elastic.clients:elasticsearch-java", version
 debezium-bom = { module = "io.debezium:debezium-bom", version.ref = "debezium" 
}
 debezium-core = { module = "io.debezium:debezium-core" }
 debezium-connector-mysql = { module = "io.debezium:debezium-connector-mysql" }
+debezium-connector-mariadb = { module = 
"io.debezium:debezium-connector-mariadb" }
 debezium-connector-mongodb = { module = 
"io.debezium:debezium-connector-mongodb" }
 debezium-connector-postgres = { module = 
"io.debezium:debezium-connector-postgres" }
 debezium-connector-oracle = { module = "io.debezium:debezium-connector-oracle" 
}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index cdef2105..cd7176f3 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -111,6 +111,8 @@ include("debezium:pulsar-io-debezium-mongodb")
 project(":debezium:pulsar-io-debezium-mongodb").projectDir = 
file("debezium/mongodb")
 include("debezium:pulsar-io-debezium-mssql")
 project(":debezium:pulsar-io-debezium-mssql").projectDir = 
file("debezium/mssql")
+include("debezium:pulsar-io-debezium-mariadb")
+project(":debezium:pulsar-io-debezium-mariadb").projectDir = 
file("debezium/mariadb")
 include("debezium:pulsar-io-debezium-mysql")
 project(":debezium:pulsar-io-debezium-mysql").projectDir = 
file("debezium/mysql")
 include("debezium:pulsar-io-debezium-oracle")

Reply via email to