From 1205845ea6ae29b83f5bedf3ed5db6137df39450 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 00:44:25 +0300 Subject: [PATCH 01/84] RavenDB-26046 - Add CDC Sink documentation Adds full CDC Sink ongoing task documentation in Docusaurus MDX format: - 16 core pages: overview, how-it-works, schema-design, embedded-tables, linked-tables, column-mapping, patching, delete-strategies, property-retention, attachment-handling, configuration-reference, api-reference, monitoring, failover-and-consistency, troubleshooting, server-configuration - 9 PostgreSQL pages: prerequisites-checklist, wal-configuration, permissions-and-roles, initial-setup, replica-identity, replica-identity-manual-setup, cleanup-and-maintenance, monitoring-postgres, studio-ui - 4 PostgreSQL examples: simple-migration, denormalization, event-sourcing, complex-nesting - 1 SQL Server stub: overview - 4 _category_.json navigation files --- .../ongoing-tasks/cdc-sink/_category_.json | 1 + .../ongoing-tasks/cdc-sink/api-reference.mdx | 222 +++++++++++ .../cdc-sink/attachment-handling.mdx | 153 ++++++++ .../ongoing-tasks/cdc-sink/column-mapping.mdx | 192 +++++++++ .../cdc-sink/configuration-reference.mdx | 181 +++++++++ .../cdc-sink/delete-strategies.mdx | 290 ++++++++++++++ .../cdc-sink/embedded-tables.mdx | 295 ++++++++++++++ .../cdc-sink/failover-and-consistency.mdx | 172 +++++++++ .../ongoing-tasks/cdc-sink/how-it-works.mdx | 206 ++++++++++ .../ongoing-tasks/cdc-sink/linked-tables.mdx | 178 +++++++++ .../ongoing-tasks/cdc-sink/monitoring.mdx | 113 ++++++ .../ongoing-tasks/cdc-sink/overview.mdx | 151 ++++++++ .../ongoing-tasks/cdc-sink/patching.mdx | 364 ++++++++++++++++++ .../cdc-sink/postgres/_category_.json | 1 + .../postgres/cleanup-and-maintenance.mdx | 227 +++++++++++ .../postgres/examples/_category_.json | 1 + .../examples/example-complex-nesting.mdx | 230 +++++++++++ .../examples/example-denormalization.mdx | 202 ++++++++++ .../examples/example-event-sourcing.mdx | 185 +++++++++ .../examples/example-simple-migration.mdx | 128 ++++++ .../cdc-sink/postgres/initial-setup.mdx | 217 +++++++++++ .../cdc-sink/postgres/monitoring-postgres.mdx | 120 ++++++ .../postgres/permissions-and-roles.mdx | 149 +++++++ .../postgres/prerequisites-checklist.mdx | 157 ++++++++ .../replica-identity-manual-setup.mdx | 141 +++++++ .../cdc-sink/postgres/replica-identity.mdx | 166 ++++++++ .../cdc-sink/postgres/studio-ui.mdx | 96 +++++ .../cdc-sink/postgres/wal-configuration.mdx | 128 ++++++ .../cdc-sink/property-retention.mdx | 155 ++++++++ .../ongoing-tasks/cdc-sink/schema-design.mdx | 328 ++++++++++++++++ .../cdc-sink/server-configuration.mdx | 77 ++++ .../cdc-sink/sql-server/_category_.json | 1 + .../cdc-sink/sql-server/overview.mdx | 38 ++ .../cdc-sink/troubleshooting.mdx | 195 ++++++++++ 34 files changed, 5460 insertions(+) create mode 100644 docs/server/ongoing-tasks/cdc-sink/_category_.json create mode 100644 docs/server/ongoing-tasks/cdc-sink/api-reference.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/monitoring.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/overview.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/patching.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/property-retention.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/schema-design.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json create mode 100644 docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx diff --git a/docs/server/ongoing-tasks/cdc-sink/_category_.json b/docs/server/ongoing-tasks/cdc-sink/_category_.json new file mode 100644 index 0000000000..9edf48317b --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/_category_.json @@ -0,0 +1 @@ +{"position": 2, "label": "CDC Sink"} diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx new file mode 100644 index 0000000000..8be425736a --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -0,0 +1,222 @@ +--- +title: "CDC Sink: API Reference" +sidebar_label: API Reference +description: "Documents the Client API operations for creating, updating, querying, toggling, and deleting CDC Sink tasks programmatically." +sidebar_position: 11 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: API Reference + + + +* CDC Sink tasks can be created, updated, and managed programmatically using + the RavenDB Client API. + +* In this page: + * [Add a CDC Sink Task](#add-a-cdc-sink-task) + * [Update a CDC Sink Task](#update-a-cdc-sink-task) + * [Get Task Info](#get-task-info) + * [Toggle Task State](#toggle-task-state) + * [Delete a Task](#delete-a-task) + + + +--- + +## Add a CDC Sink Task + +Use `AddCdcSinkOperation` to create a new CDC Sink task: + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + \{ + new CdcSinkTableConfig + \{ + Name = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = new List \{ "id" \}, + ColumnsMapping = new Dictionary + \{ + ["id"] = "Id", + ["customer_name"] = "CustomerName", + ["total"] = "Total" + \} + \} + \} +\}; + +var result = await store.Maintenance.SendAsync( + new AddCdcSinkOperation(config)); + +long taskId = result.TaskId; +`} + + + + +`AddCdcSinkOperationResult`: + +| Property | Type | Description | +|----------|------|-------------| +| `TaskId` | `long` | Assigned task ID | +| `RaftCommandIndex` | `long` | Raft index of the command | + +--- + +## Update a CDC Sink Task + +Use `UpdateCdcSinkOperation` to modify an existing task. +Pass the full updated configuration including the `TaskId`: + + + + +{`config.TaskId = taskId; // Must be set +config.Tables.Add(new CdcSinkTableConfig +\{ + Name = "Customers", + SourceTableName = "customers", + PrimaryKeyColumns = new List \{ "id" \}, + ColumnsMapping = new Dictionary + \{ + ["id"] = "Id", + ["name"] = "Name", + ["email"] = "Email" + \} +\}); + +await store.Maintenance.SendAsync( + new UpdateCdcSinkOperation(taskId, config)); +`} + + + + + +**PostgreSQL — table changes affect the publication:** + +The replication slot and publication names are fixed at task creation and do not +change when you update the task. However, the **publication** controls which tables +CDC Sink receives changes for, so table changes require database-level updates: + +* **Adding tables** — If CDC Sink has the necessary permissions, it will automatically + run `ALTER PUBLICATION ADD TABLE ;` when the task is updated. If it + does not have permissions, a database administrator must run this manually. +* **Removing tables** — `ALTER PUBLICATION DROP TABLE ;` must be + run manually by a database administrator. CDC Sink does not remove tables from the + publication automatically. + +If the slot and publication were auto-named, a database administrator can look up +the current names from the task error log or from PostgreSQL: + +```sql +SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; +SELECT pubname FROM pg_publication WHERE pubname LIKE 'rvn_cdc_p_%'; +``` + +See [Initial Setup](./postgres/initial-setup.mdx) for +guidance on slot and publication management. + +Dropped or orphaned slots and publications must be cleaned up manually by the +database administrator. +See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). + + +--- + +## Get Task Info + +Use `GetOngoingTaskInfoOperation` to retrieve the current state of a CDC Sink task: + + + + +{`var taskInfo = await store.Maintenance.SendAsync( + new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); +`} + + + + +--- + +## Toggle Task State + +Pause or resume a CDC Sink task using `ToggleOngoingTaskStateOperation`: + + + + +{`// Pause the task +await store.Maintenance.SendAsync( + new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: true)); + +// Resume the task +await store.Maintenance.SendAsync( + new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: false)); +`} + + + + + +**PostgreSQL:** Pausing a CDC Sink task stops the replication slot from being consumed. +PostgreSQL retains WAL segments for unconsumed slots, so pausing for an extended period +causes WAL to accumulate on disk. Monitor disk usage if a task is paused for more than +a short time. +See [Monitoring PostgreSQL](./postgres/monitoring-postgres.mdx). + +**SQL Server:** Pausing a CDC Sink task for an extended period (days) may cause SQL Server +to trim the CDC change tables, removing rows that have not yet been consumed. A short +pause is safe. If the task is paused long enough that trimming occurs, CDC Sink will +report an error on resume — the task may need to be recreated rather than simply resumed. + + +--- + +## Delete a Task + +Use `DeleteOngoingTaskOperation` to delete a CDC Sink task: + + + + +{`await store.Maintenance.SendAsync( + new DeleteOngoingTaskOperation(taskId, OngoingTaskType.CdcSink)); +`} + + + + + +Deleting the task in RavenDB does **not** drop the replication slot or publication +in the source database. These must be cleaned up manually by the database administrator. +See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). + + +--- + +## Related Articles + +### CDC Sink + +- [Configuration Reference](./configuration-reference.mdx) +- [Overview](./overview.mdx) + +### Client API + +- [Operations: How to Send Operations](../../../client-api/operations/how-to/send-multiple-operations) +- [Ongoing Task Operations](../../../client-api/operations/maintenance/ongoing-tasks/ongoing-task-operations) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx new file mode 100644 index 0000000000..1f60880eab --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -0,0 +1,153 @@ +--- +title: "CDC Sink: Attachment Handling" +sidebar_label: Attachment Handling +description: "Explains how to store binary SQL columns as RavenDB attachments using AttachmentNameMapping on root and embedded table configurations." +sidebar_position: 9 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Attachment Handling + + + +* Binary SQL columns can be stored as RavenDB **attachments** instead of document + properties using `AttachmentNameMapping`. + +* This applies to both root tables and embedded tables. + +* In this page: + * [Root Table Attachments](#root-table-attachments) + * [Embedded Table Attachments](#embedded-table-attachments) + * [Attachment Naming](#attachment-naming) + * [Attachment Lifecycle](#attachment-lifecycle) + + + +--- + +## Root Table Attachments + +Use `AttachmentNameMapping` to map a binary SQL column to a RavenDB attachment: + + + + +{`new CdcSinkTableConfig +\{ + Name = "Files", + SourceTableName = "files", + PrimaryKeyColumns = ["id"], + ColumnsMapping = new Dictionary + \{ + ["id"] = "Id", + ["filename"] = "Filename", + ["mime_type"] = "MimeType" + \}, + AttachmentNameMapping = new Dictionary + \{ + ["content"] = "file" // SQL column "content" → attachment named "file" + \} +\} +`} + + + + +The binary `content` column is stored as an attachment named `"file"` on the document. +The attachment is stored with content type `application/octet-stream`. + +--- + +## Embedded Table Attachments + +Binary columns on embedded tables are stored as attachments on the **parent** document. +The attachment name is automatically prefixed to ensure uniqueness: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "photos", + PropertyName = "Photos", + PrimaryKeyColumns = ["photo_num"], + JoinColumns = ["product_id"], + ColumnsMapping = new Dictionary + \{ + ["photo_num"] = "PhotoNum", + ["caption"] = "Caption" + \}, + AttachmentNameMapping = new Dictionary + \{ + ["thumbnail"] = "thumb" + \} +\} +`} + + + + +A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the +parent document. The prefix `"Photos/1/"` is generated from the `PropertyName` and +the primary key value. + +--- + +## Attachment Naming + +**Root table attachments:** + +The attachment name is exactly the value you specify in `AttachmentNameMapping`. + +``` +AttachmentNameMapping = { ["content"] = "file" } +→ Attachment name: "file" +``` + +**Embedded table attachments:** + +The attachment name is prefixed with `{PropertyName}/{pkValue}/`: + +``` +PropertyName = "Photos" +PrimaryKeyColumns = ["photo_num"] → photo_num = 1 +AttachmentNameMapping = { ["thumbnail"] = "thumb" } +→ Attachment name: "Photos/1/thumb" +``` + +For composite primary keys, all key values are joined: + +``` +PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 +→ Attachment name: "Photos/2024-01/3/thumb" +``` + +--- + +## Attachment Lifecycle + +* **INSERT** — Attachment is created on the document +* **UPDATE** — Attachment is replaced with the new binary data +* **DELETE (embedded item)** — All attachments for that item are automatically removed + from the parent document +* **DELETE (root document)** — Document and all its attachments are deleted + +--- + +## Related Articles + +### CDC Sink + +- [Column Mapping](./column-mapping.mdx) +- [Embedded Tables](./embedded-tables.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### Document Extensions + +- [Attachments: What are Attachments](../../../document-extensions/attachments/what-are-attachments) diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx new file mode 100644 index 0000000000..4eaab62609 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -0,0 +1,192 @@ +--- +title: "CDC Sink: Column Mapping" +sidebar_label: Column Mapping +description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using ColumnsMapping and AttachmentNameMapping." +sidebar_position: 5 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Column Mapping + + + +* Column mapping controls which SQL columns appear in the RavenDB document and + under what property names. + +* In this page: + * [Mapping Columns to Properties](#mapping-columns-to-properties) + * [Unmapped Columns](#unmapped-columns) + * [Attachment Mapping](#attachment-mapping) + * [Schema (Source Table Schema)](#schema-source-table-schema) + + + +--- + +## Mapping Columns to Properties + +`ColumnsMapping` is a `Dictionary` where each entry maps a SQL column +name to a RavenDB document property name: + + + + +{`ColumnsMapping = new Dictionary +\{ + ["id"] = "Id", + ["customer_name"] = "CustomerName", + ["order_date"] = "OrderDate", + ["total_amount"] = "TotalAmount" +\} +`} + + + + +**Key:** SQL column name (case-insensitive match against the column names in CDC events) +**Value:** Property name in the RavenDB document + + +The primary key column(s) do not need to be mapped. When included in `ColumnsMapping`, +they become a regular document property. When omitted, the PK values are still used +to build the document ID — they just won't appear as a named property. + +Including the PK in the mapping is generally useful so the document carries its own +identifier, but it is not required. + + +**Type conversions:** SQL numeric, boolean, and date types are converted to their +JSON equivalents. SQL `NULL` becomes JSON `null`. If you need custom type handling +or derived values, use a `Patch` script. + +**At least one mapping is required.** An empty `ColumnsMapping` is a validation error. + +The same rules apply to embedded table column mappings. + +--- + +## Unmapped Columns + +Columns not listed in `ColumnsMapping` are **not stored** in the document, but they +are available in patch scripts via `$row`. + +This allows you to use data for computations without permanently storing raw SQL values: + + + + +{`ColumnsMapping = new Dictionary +\{ + ["id"] = "Id", + ["name"] = "Name" + // base_price and tax_rate are NOT mapped — won't appear in document +\}, +Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" +`} + + + + +In this example, `base_price` and `tax_rate` are available during the patch but +not stored as document properties. Only the computed `FinalPrice` is stored. + + +**Naming context:** +Property names (the values in `ColumnsMapping`) become properties on the RavenDB +document — accessible as `this.FinalPrice` inside a patch script. + +Column names (the keys in `ColumnsMapping`, plus any unmapped columns) are accessible +in patch scripts via `$row.base_price` (for the current row's values) and +`$old?.base_price` (for the previous row's values on UPDATE events). + + +--- + +## Attachment Mapping + +Binary SQL columns (e.g., PostgreSQL `BYTEA`) can be stored as RavenDB attachments +instead of document properties using `AttachmentNameMapping`: + + + + +{`new CdcSinkTableConfig +\{ + Name = "Files", + SourceTableName = "files", + PrimaryKeyColumns = ["id"], + ColumnsMapping = \{ ["id"] = "Id", ["filename"] = "Filename" \}, + AttachmentNameMapping = new Dictionary + \{ + ["content"] = "file" // SQL column "content" → attachment named "file" + \} +\} +`} + + + + +The binary column `content` becomes an attachment named `"file"` on the document. + +**Embedded table attachments:** + +Binary columns on embedded tables are also supported. The attachment name is prefixed +with the embedded property path and primary key to ensure uniqueness: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "photos", + PropertyName = "Photos", + PrimaryKeyColumns = ["photo_num"], + AttachmentNameMapping = \{ ["thumbnail"] = "thumb" \} +\} +`} + + + + +A photo with `photo_num = 1` creates attachment `"Photos/1/thumb"` on the parent document. +When the embedded item is deleted, its attachments are automatically removed. + +--- + +## Schema (Source Table Schema) + +`SourceTableSchema` specifies the SQL schema containing the table. It defaults to +`"public"` for PostgreSQL if omitted. + + + + +{`new CdcSinkTableConfig +\{ + SourceTableSchema = "sales", // Table is in the "sales" schema + SourceTableName = "orders", + // ... +\} +`} + + + + +For most PostgreSQL setups using the default `public` schema, this can be omitted. + +--- + +## Related Articles + +### CDC Sink + +- [Schema Design](./schema-design.mdx) +- [Patching](./patching.mdx) +- [Attachment Handling](./attachment-handling.mdx) +- [Configuration Reference](./configuration-reference.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx new file mode 100644 index 0000000000..2ec550a6e2 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -0,0 +1,181 @@ +--- +title: "CDC Sink: Configuration Reference" +sidebar_label: Configuration Reference +description: "Documents all configuration classes used to define a CDC Sink task, including CdcSinkConfiguration, table configs, and relation types." +sidebar_position: 10 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Configuration Reference + + + +* This page documents all configuration classes used to define a CDC Sink task. + +* In this page: + * [CdcSinkConfiguration](#cdcsinkconfiguration) + * [CdcSinkPostgresSettings](#cdcsinkpostgressettings) + * [CdcSinkTableConfig](#cdcsinktableconfig) + * [CdcSinkEmbeddedTableConfig](#cdcsinkembeddedtableconfig) + * [CdcSinkLinkedTableConfig](#cdcsinklinkedtableconfig) + * [CdcSinkOnDeleteConfig](#cdcsinkondeleteconfig) + * [CdcSinkRelationType](#cdcsinkrelationtype) + + + +--- + +## CdcSinkConfiguration + +The top-level configuration object for a CDC Sink task. + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `Name` | `string` | ✓ | Unique task name | +| `ConnectionStringName` | `string` | ✓ | Name of the SQL connection string | +| `Tables` | `List` | ✓ | Root table configurations (at least one required) | +| `Postgres` | `CdcSinkPostgresSettings` | | PostgreSQL-specific settings (slot and publication names) | +| `SkipInitialLoad` | `bool` | | When `true`, skip the initial full-table scan and start streaming CDC changes immediately. Only applies on first startup — has no effect once the initial load has completed. Default: `false` | +| `Disabled` | `bool` | | Pause the task without deleting it. Default: `false` | +| `MentorNode` | `string` | | Preferred cluster node for execution | +| `PinToMentorNode` | `bool` | | Pin the task to the mentor node. Default: `false` | +| `TaskId` | `long` | | Set by the server on creation | + +--- + +## CdcSinkPostgresSettings + +PostgreSQL-specific settings. Assigned to `CdcSinkConfiguration.Postgres`. +Leave `null` for non-PostgreSQL connections. + +| Property | Type | Description | +|----------|------|-------------| +| `SlotName` | `string` | Name of the PostgreSQL logical replication slot. If omitted on creation, a deterministic hash-based name is used. Immutable once set. Max 63 characters, alphanumeric and underscores only. | +| `PublicationName` | `string` | Name of the PostgreSQL publication. Same auto-fill and immutability rules as `SlotName`. | + +Setting these explicitly is useful when: +- A database administrator pre-creates the slot and publication with human-readable names +- Migrating from a previous CDC Sink task and reusing an existing slot +- Running multiple environments (dev/staging/prod) with predictable names + +See [Initial Setup](./postgres/initial-setup.mdx) for details. + + +For embedded tables where the join columns are not part of the primary key, the +PostgreSQL table must have `REPLICA IDENTITY` configured so that DELETE events include +the join column values. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). + + +--- + +## CdcSinkTableConfig + +Configures a root table — one SQL table mapped to one RavenDB collection. + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `Name` | `string` | ✓ | RavenDB collection name (e.g., `"Orders"`) | +| `SourceTableName` | `string` | ✓ | SQL table name (e.g., `"orders"`) | +| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `PrimaryKeyColumns` | `List` | ✓ | SQL columns used for document ID generation | +| `ColumnsMapping` | `Dictionary` | ✓ | SQL column → document property | +| `AttachmentNameMapping` | `Dictionary` | | Binary SQL column → attachment name | +| `Patch` | `string` | | JavaScript patch for INSERT and UPDATE | +| `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior. Default: delete document | +| `EmbeddedTables` | `List` | | Nested table configurations | +| `LinkedTables` | `List` | | Foreign key reference configurations | +| `Disabled` | `bool` | | Skip this table. Default: `false` | + +--- + +## CdcSinkEmbeddedTableConfig + +Configures a table whose rows are embedded as nested objects within a parent document. + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `SourceTableName` | `string` | ✓ | SQL table name | +| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `PropertyName` | `string` | ✓ | Property name in the parent document (e.g., `"Lines"`) | +| `Type` | `CdcSinkRelationType` | ✓ | `Array`, `Map`, or `Value` | +| `JoinColumns` | `List` | ✓ | FK columns referencing parent's `PrimaryKeyColumns` | +| `PrimaryKeyColumns` | `List` | ✓ | PK columns for matching items on UPDATE/DELETE | +| `ColumnsMapping` | `Dictionary` | ✓ | SQL column → embedded property | +| `AttachmentNameMapping` | `Dictionary` | | Binary SQL column → attachment name | +| `Patch` | `string` | | JavaScript patch on **parent** document for INSERT/UPDATE | +| `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior for embedded items | +| `CaseSensitiveKeys` | `bool` | | Case-sensitive PK matching. Default: `false` | +| `EmbeddedTables` | `List` | | Nested embedded tables | +| `Disabled` | `bool` | | Skip this table. Default: `false` | + +--- + +## CdcSinkLinkedTableConfig + +Configures a foreign key reference that becomes a document ID in the parent document. + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `SourceTableName` | `string` | ✓ | SQL table name of the referenced table | +| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `PropertyName` | `string` | ✓ | Property name in the parent document (e.g., `"Customer"`) | +| `LinkedCollectionName` | `string` | ✓ | Target RavenDB collection for ID generation (e.g., `"Customers"`) | +| `Type` | `CdcSinkRelationType` | ✓ | `Value` (single reference) or `Array` (multiple references) | +| `JoinColumns` | `List` | ✓ | FK columns used to build the referenced document ID | + +--- + +## CdcSinkOnDeleteConfig + +Controls how DELETE events are handled for a table or embedded table. + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `Patch` | `string` | null | JavaScript patch that runs when a DELETE event arrives | +| `IgnoreDeletes` | `bool` | `false` | When `true`, skip the delete — document/item is kept | + +**Available patch variables for OnDelete:** + +* `this` — the document (root or parent for embedded) +* `$row` — all SQL columns from the DELETE event +* `$old` — the embedded item's last known state (for embedded tables) + +**Behavior matrix:** + +| IgnoreDeletes | Patch | Result | +|---------------|-------|--------| +| `false` | null | Normal delete (default) | +| `false` | set | Patch runs, then delete proceeds | +| `true` | null | DELETE discarded silently | +| `true` | set | Patch runs, delete skipped | + +--- + +## CdcSinkRelationType + +Specifies the structure of embedded or linked data in the document. + +| Value | Description | +|-------|-------------| +| `Array` | One-to-many: stored as a JSON array. Items matched by PK for UPDATE/DELETE | +| `Map` | One-to-many: stored as a JSON object keyed by PK value(s) | +| `Value` | Many-to-one: stored as a single embedded object or document reference | + +--- + +## Related Articles + +### CDC Sink + +- [Schema Design](./schema-design.mdx) +- [Embedded Tables](./embedded-tables.mdx) +- [Linked Tables](./linked-tables.mdx) +- [Patching](./patching.mdx) +- [Delete Strategies](./delete-strategies.mdx) +- [API Reference](./api-reference.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx new file mode 100644 index 0000000000..c8beb3d9a2 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx @@ -0,0 +1,290 @@ +--- +title: "CDC Sink: Delete Strategies" +sidebar_label: Delete Strategies +description: "Documents configurable behavior for DELETE events in CDC Sink, including archive, audit trail, and silent ignore patterns." +sidebar_position: 7 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Delete Strategies + + + +* CDC Sink provides configurable behavior for DELETE events through the + `CdcSinkOnDeleteConfig` object on both root and embedded table configurations. + +* By default, a DELETE event deletes the corresponding RavenDB document or removes + the embedded item. The `OnDelete` configuration changes this. + +* In this page: + * [Default Behavior](#default-behavior) + * [OnDelete Configuration](#ondelete-configuration) + * [Pattern: Archive](#pattern-archive) + * [Pattern: Audit Trail](#pattern-audit-trail) + * [Pattern: Silent Ignore](#pattern-silent-ignore) + * [OnDelete for Embedded Tables](#ondelete-for-embedded-tables) + * [Behavior Summary](#behavior-summary) + * [DELETE Routing and REPLICA IDENTITY](#delete-routing-and-replica-identity) + + + +--- + +## Default Behavior + +When `OnDelete` is `null` (or not set): + +* **Root table DELETE** — The corresponding RavenDB document is deleted +* **Embedded table DELETE (Array/Map)** — The item is removed from the parent document's array or map +* **Embedded table DELETE (Value)** — The `Value`-type property on the parent document is set to `null` + +--- + +## OnDelete Configuration + +`CdcSinkOnDeleteConfig` has two properties: + + + + +{`public class CdcSinkOnDeleteConfig +\{ + // JavaScript patch that runs when a DELETE event arrives + // Available variables: this, $row, $old + public string Patch \{ get; set; \} + + // When true, the delete is not applied — document/item is kept + public bool IgnoreDeletes \{ get; set; \} +\} +`} + + + + +* If `Patch` is set, it runs **before** the delete decision is made +* If `IgnoreDeletes = true`, the deletion is skipped after the patch runs +* If `IgnoreDeletes = false` (default), the deletion proceeds after the patch runs + + +When `IgnoreDeletes = true`, CDC Sink skips the delete but still **saves any changes +made to `this`** in the patch. This means a patch can modify the document (e.g., +set an `Archived` flag) and those changes are written to RavenDB even though the +document is not deleted. + + +--- + +## Pattern: Archive + +Keep the document in RavenDB but mark it as deleted. The patch runs to mark it, +and `IgnoreDeletes = true` prevents the actual deletion: + + + + +{`OnDelete = new CdcSinkOnDeleteConfig +\{ + IgnoreDeletes = true, + Patch = @" + this.Archived = true; + this.ArchivedAt = new Date().toISOString(); + " +\} +`} + + + + +The document remains in RavenDB with `Archived = true`. Queries can filter on this +field to exclude archived records. + +--- + +## Pattern: Audit Trail (Root Document) + +When a root document is deleted, write an audit record to a separate RavenDB +collection using `put()` before the deletion proceeds. + +The document is deleted after the patch runs, so any writes to `this` are lost. +Use `put()` to create a document that survives the deletion: + + + + +{`OnDelete = new CdcSinkOnDeleteConfig +\{ + // IgnoreDeletes defaults to false — delete proceeds after patch + Patch = @" + // Create a permanent audit record in a separate collection + put('DeletedOrders/' + this.Id, \{ + OriginalId: this.Id, + Customer: this.Customer, + Total: this.Total, + DeletedAt: new Date().toISOString() + \}); + " +\} +`} + + + + +The patch creates a document in `DeletedOrders/` before `this` is deleted. +The audit record persists permanently. + +--- + +## Pattern: Silent Ignore + +Discard DELETE events without running any patch. Use this for append-only data +where deletes should never result in document removal: + + + + +{`OnDelete = new CdcSinkOnDeleteConfig +\{ + IgnoreDeletes = true + // No patch — DELETE events are silently discarded +\} +`} + + + + +--- + +## OnDelete for Embedded Tables + +The same `OnDelete` configuration works on embedded tables. For embedded tables: + +* `Patch` runs on the **parent document** (not the embedded item) +* `$old` contains the embedded item's last known state before deletion +* `IgnoreDeletes = true` prevents the item from being removed from the array/map + +**Example: Keep deleted items in an audit array** + +Rather than removing a deleted line item from the array, move it to a separate +`DeletedLines` property: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "order_lines", + PropertyName = "Lines", + // ... + OnDelete = new CdcSinkOnDeleteConfig + \{ + IgnoreDeletes = true, + Patch = @" + // Remove from active Lines + this.Lines = (this.Lines || []) + .filter(l => l.LineId !== $old?.LineId); + + // Add to DeletedLines audit array + this.DeletedLines = this.DeletedLines || []; + this.DeletedLines.push(\{ + LineId: $old?.LineId, + Product: $old?.Product, + Quantity: $old?.Quantity, + DeletedAt: new Date().toISOString() + \}); + " + \} +\} +`} + + + + +With `IgnoreDeletes = true`, CDC Sink does not automatically remove the item — +the patch takes full control of both the `Lines` array and the `DeletedLines` audit trail. + +**Example: Run a patch but still remove the item** + +To run some logic on DELETE while still removing the item from the array, +use `IgnoreDeletes = false` (default) — CDC Sink handles the removal, and the patch +runs before it: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "order_lines", + PropertyName = "Lines", + // ... + OnDelete = new CdcSinkOnDeleteConfig + \{ + // IgnoreDeletes = false (default) — CDC Sink removes the item after patch + Patch = @" + // Log total for the line being removed + this.RemovedTotal = (this.RemovedTotal || 0) + + ($old?.UnitPrice || 0) * ($old?.Qty || 0); + " + \} +\} +`} + + + + +The `Lines` item is removed by CDC Sink. The patch only needs to handle the +side-effect logic. + +--- + +## Behavior Summary + +| IgnoreDeletes | Patch | Behavior | +|---------------|-------|----------| +| `false` | null | Normal delete (default) | +| `false` | set | Patch runs, then delete proceeds | +| `true` | null | DELETE event discarded silently | +| `true` | set | Patch runs, then delete is skipped | + +--- + +## DELETE Routing and REPLICA IDENTITY + +For CDC Sink to route a DELETE event to the correct document or embedded item, +the source database must include the necessary column values in the DELETE event. + +For embedded tables where the join column is not in the primary key, the source +database may need additional configuration. + + +The REPLICA IDENTITY requirement described below is **PostgreSQL-specific**. +Other databases may have different requirements or may not need any extra +configuration for DELETE routing. + + +See: + +* [REPLICA IDENTITY](./postgres/replica-identity.mdx) (PostgreSQL) + +**Skipping REPLICA IDENTITY requirements:** Set `OnDelete.IgnoreDeletes = true` +to discard DELETE events for an embedded table entirely. This skips the REPLICA +IDENTITY check, since delete routing is no longer needed. + +--- + +## Related Articles + +### CDC Sink + +- [Patching](./patching.mdx) +- [Embedded Tables](./embedded-tables.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### PostgreSQL + +- [REPLICA IDENTITY](./postgres/replica-identity.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx new file mode 100644 index 0000000000..813c702111 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -0,0 +1,295 @@ +--- +title: "CDC Sink: Embedded Tables" +sidebar_label: Embedded Tables +description: "Covers configuration options, nesting constraints, and how embedded items are updated and deleted in CDC Sink." +sidebar_position: 3 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Embedded Tables + + + +* Embedded tables allow CDC Sink to nest SQL table data inside a parent document as + arrays, maps, or single objects. + +* This page covers configuration options, nesting constraints, and how embedded items + are updated and deleted. + +* In this page: + * [Basic Configuration](#basic-configuration) + * [Join Columns and Primary Key Interaction](#join-columns-and-primary-key-interaction) + * [Matching Items on Update and Delete](#matching-items-on-update-and-delete) + * [Deep Nesting](#deep-nesting) + * [Attachments on Embedded Items](#attachments-on-embedded-items) + * [Disabling an Embedded Table](#disabling-an-embedded-table) + + + +--- + +## Basic Configuration + +`CdcSinkEmbeddedTableConfig` is placed inside a root table's `EmbeddedTables` list: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableSchema = "public", // SQL schema (optional) + SourceTableName = "order_lines", // SQL table name + PropertyName = "Lines", // Property name in parent document + Type = CdcSinkRelationType.Array, // Array, Map, or Value + JoinColumns = ["order_id"], // FK to parent's PrimaryKeyColumns + PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE + ColumnsMapping = new Dictionary + \{ + ["line_id"] = "LineId", + ["product"] = "Product", + ["quantity"] = "Quantity" + \} +\} +`} + + + + +--- + +## Join Columns and Primary Key Interaction + +### Purpose of JoinColumns + +`JoinColumns` specifies the foreign key columns in the embedded table that reference +the parent's primary key. CDC Sink uses these columns to route each row to the correct +parent document. + +The `JoinColumns` values must exactly match the parent's `PrimaryKeyColumns`: + + + + +{`// Parent root table: +PrimaryKeyColumns = ["order_id"] + +// Embedded table - correct: +JoinColumns = ["order_id"] // References parent's PK column + +// Embedded table - INCORRECT: +JoinColumns = ["customer_id"] // Does not reference the parent's PK +`} + + + + +### DELETE Events + +For DELETE events, the source database must include the join column values so CDC Sink +can route the delete to the correct parent document. + +By default, many databases only include primary key columns in DELETE events. If the +join column is _not_ in the embedded table's primary key, additional source database +configuration is required. + +**PostgreSQL:** See [REPLICA IDENTITY](./postgres/replica-identity.mdx) +for how CDC Sink handles this automatically when it has sufficient permissions, or how +a DBA can configure it manually. + +### Avoiding REPLICA IDENTITY Requirements + +The cleanest solution is to include the join column in the embedded table's primary key: + + + + +{`-- SQL schema: +CREATE TABLE order_lines ( + order_id INT NOT NULL REFERENCES orders(id), + line_id INT NOT NULL, + product VARCHAR(200), + PRIMARY KEY (order_id, line_id) -- order_id in PK means DELETE events include it +); +`} + + + + + + + +{`// Configuration: +PrimaryKeyColumns = ["order_id", "line_id"] +JoinColumns = ["order_id"] +`} + + + + +With `order_id` in the primary key, DELETE events include it by default and no additional +source database configuration is needed. + +Alternatively, set `OnDelete.IgnoreDeletes = true` to skip delete routing entirely +if deletes on that embedded table don't need to be processed. +See [Delete Strategies](./delete-strategies.mdx). + +--- + +## Matching Items on Update and Delete + +When an UPDATE or DELETE arrives for an embedded row, CDC Sink must find the correct +item within the parent document's array or map. + +Items are matched by their full `PrimaryKeyColumns` composite key: + +* **INSERT** — New item appended to array / added to map +* **UPDATE** — Item found by PK match; mapped columns overwritten +* **DELETE** — Item found by PK match; removed from array/map (or OnDelete behavior applied) + +**Composite PKs** work the same way — all PK columns must match: + + + + +{`PrimaryKeyColumns = ["invoice_date", "invoice_seq"] + +// UPDATE event for (invoice_date='2024-01-15', invoice_seq=3) +// → Finds and updates the item where both columns match +`} + + + + +**Case sensitivity:** By default, PK matching is case-insensitive. Set +`CaseSensitiveKeys = true` on `CdcSinkEmbeddedTableConfig` if your keys are +case-sensitive. + +--- + +## Deep Nesting + +Embedded tables can contain their own `EmbeddedTables`, creating hierarchies +with multiple levels. + +**Key constraint:** Every descendant table must carry the **root table's primary key** +as a denormalized column. This is required because CDC Sink routes each row to its +root document in a single pass. + +**Example: Company → Departments → Employees** + +The `employees` table must have `company_id` (the root PK) even though it only +directly joins to `departments`: + + + + +{`CREATE TABLE employees ( + company_id INT NOT NULL, -- Denormalized root PK + dept_id INT NOT NULL, + emp_id INT NOT NULL, + PRIMARY KEY (company_id, dept_id, emp_id) +); +`} + + + + + + + +{`// Configuration for the employees embedded table: +JoinColumns = ["company_id", "dept_id"] // Root PK + parent PK +PrimaryKeyColumns = ["emp_id"] +`} + + + + +**Why is the root PK required?** + +When a CDC Sink event arrives for an `employees` row, CDC Sink needs to: + +1. Find the root document: `Companies/\{company_id\}` +2. Navigate to the correct `Departments` array item: `Departments.find(d => d.dept_id == dept_id)` +3. Add or update the `Employees` array item: `Employees.find(e => e.emp_id == emp_id)` + +Without `company_id` in the event, CDC Sink cannot identify the root document +without an additional lookup, which is not supported. + +--- + +## Attachments on Embedded Items + +Binary columns from embedded tables can be stored as RavenDB attachments using +`AttachmentNameMapping`. + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "photos", + PropertyName = "Photos", + PrimaryKeyColumns = ["photo_num"], + JoinColumns = ["product_id"], + ColumnsMapping = \{ ["photo_num"] = "PhotoNum", ["caption"] = "Caption" \}, + AttachmentNameMapping = \{ ["thumbnail"] = "thumb" \} +\} +`} + + + + +A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the +parent document. The attachment name is prefixed with the embedded path and PK to +ensure uniqueness within the document. + +When the embedded item is deleted, its attachments are automatically removed. + +--- + +## Disabling an Embedded Table + +Set `Disabled = true` to pause processing for a specific embedded table without +removing it from the configuration: + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "audit_log", + PropertyName = "AuditLog", + Disabled = true, + // ... other config +\} +`} + + + + +Changes from the source table are ignored while `Disabled = true`. When re-enabled, +CDC Sink resumes from the current position — it does not backfill missed events. + +--- + +## Related Articles + +### CDC Sink + +- [Schema Design](./schema-design.mdx) +- [Linked Tables](./linked-tables.mdx) +- [Delete Strategies](./delete-strategies.mdx) +- [Attachment Handling](./attachment-handling.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### PostgreSQL + +- [REPLICA IDENTITY](./postgres/replica-identity.mdx) +- [REPLICA IDENTITY Manual Setup](./postgres/replica-identity-manual-setup.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx new file mode 100644 index 0000000000..5298f4d3a4 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx @@ -0,0 +1,172 @@ +--- +title: "CDC Sink: Failover and Consistency" +sidebar_label: Failover and Consistency +description: "Explains how CDC Sink handles node failover, what consistency guarantees it provides, and why patches must be designed to be idempotent." +sidebar_position: 13 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Failover and Consistency + + + +* This page explains how CDC Sink handles node failover, what consistency guarantees + it provides, and why patches must be designed to be idempotent. + +* In this page: + * [State Storage](#state-storage) + * [Failover Behavior](#failover-behavior) + * [Re-Reading Changes](#re-reading-changes) + * [Consistency Guarantee](#consistency-guarantee) + * [Idempotency Requirements](#idempotency-requirements) + + + +--- + +## State Storage + +CDC Sink persists its progress as a **document in RavenDB** alongside your data. + +This state document records: + +* The last acknowledged position in the source database's change log +* Per-table initial load progress (which tables have completed, and the last key scanned) + +Like any RavenDB document, this state document is subject to **normal replication behavior**. +Different nodes in a cluster may have different versions of this document at any given moment. + +--- + +## Failover Behavior + +When the cluster elects a new mentor node for a CDC Sink task, the new node reads +the **replicated state** — which may be older than the work the previous mentor +completed but had not yet replicated. + +**Example:** + + + + +{`Before failure: +├─ Node A (Mentor) — Processed up to position X, state document not yet replicated +├─ Node B (Replica) — State document shows position X-100 (older, replicated state) +└─ Node C (Replica) — State document shows position X-100 + +Node A crashes. +Node B is elected new mentor. +Node B reads its state document: position X-100. +Node B resumes CDC Sink from position X-100. +`} + + + + +Changes between positions X-100 and X may already be in RavenDB (written by Node A), +or they may not be (if Node A crashed before writing). Node B will re-read and re-apply +them either way. + +--- + +## Re-Reading Changes + +**CDC Sink guarantees that no changes are lost, but some changes may be re-read.** + +When the new mentor resumes from an older position: + +* Changes that were already processed and fully replicated — re-applied (idempotent merge) +* Changes that were processed but not yet replicated — applied for the "first time" on new node +* New changes not yet seen — applied normally + +Re-reading is normal and expected. The document merge strategy ensures that re-applying +an INSERT or UPDATE with the same values is safe — properties are simply overwritten +with the same values they already have. + + +Patches that are not idempotent can produce incorrect results when a change is +re-read after a failover. See [Idempotency Requirements](#idempotency-requirements) below. + + +--- + +## Consistency Guarantee + +CDC Sink provides **at-least-once delivery** with **eventual consistency**: + +* ✓ No changes are lost +* ✓ Changes are applied in source transaction order +* ✓ After failover, progress resumes from the last replicated state +* ✓ Idempotent patches ensure re-reads are safe +* ✗ No "exactly once" guarantee — the same change may be applied more than once + +This is the same model used by other ongoing tasks in RavenDB. + +--- + +## Idempotency Requirements + +A patch is **idempotent** if applying it multiple times produces the same result as +applying it once. + +**Column mapping is always idempotent** — overwriting a property with the same value +is a no-op. + +**Patches that use absolute values are idempotent:** + + + + +{`// Idempotent — always sets to the current SQL value +this.Status = $row.is_active ? 'Active' : 'Inactive'; +this.ViewCount = $row.view_count; +`} + + + + +**Patches that increment are NOT idempotent:** + + + + +{`// NOT idempotent — increments again on re-read +this.ViewCount = (this.ViewCount || 0) + 1; +`} + + + + +**Delta patches using $old are idempotent** because `$old` reflects the previous +embedded item state, not the document's accumulated value: + + + + +{`// Idempotent — delta is recomputed correctly on re-read +const oldAmount = $old?.Amount || 0; +const newAmount = $row.amount || 0; +this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); +`} + + + + +On re-read, `$old` still reflects the state before the update, and `$row` still +reflects the new state — so the delta is the same as on the first read. + +--- + +## Related Articles + +### CDC Sink + +- [How It Works](./how-it-works.mdx) +- [Patching](./patching.mdx) +- [Monitoring](./monitoring.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx new file mode 100644 index 0000000000..0fe36c9b28 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -0,0 +1,206 @@ +--- +title: "CDC Sink: How It Works" +sidebar_label: How It Works +description: "Describes the internal operation of CDC Sink — how it connects to the source database, loads initial data, streams changes, and handles failover." +sidebar_position: 1 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: How It Works + + + +* This page describes the internal operation of CDC Sink — how it connects to the + source database, loads initial data, streams changes, and handles failover. + +* Understanding these mechanics is important when designing patches, planning for + failover, and setting up monitoring. + +* In this page: + * [Startup and Verification](#startup-and-verification) + * [Initial Load](#initial-load) + * [Change Streaming](#change-streaming) + * [Transaction Ordering](#transaction-ordering) + * [State Persistence and Failover](#state-persistence-and-failover) + * [Child Before Parent](#child-before-parent) + + + +--- + +## Startup and Verification + +When a CDC Sink task starts, it first verifies that the source database is properly +configured. For PostgreSQL, this includes checking: + +* WAL level is set to `logical` +* The connecting user has sufficient privileges +* REPLICA IDENTITY is configured correctly for embedded tables that need delete routing + +If any check fails, CDC Sink reports the exact issue and the SQL an administrator +needs to run to fix it. The task does not start until all checks pass. + +After verification, CDC Sink creates the necessary change-tracking infrastructure +in the source database, then begins the initial load. + +See the [PostgreSQL Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) +for the full list of requirements. + +--- + +## Initial Load + +Before streaming live changes, CDC Sink performs a full scan of every configured table +(root, embedded, and linked) using keyset pagination ordered by primary key. + +**Progress tracking:** Initial load progress is persisted per-table as a document in +RavenDB. If the task is restarted, it resumes from the last processed key rather than +re-scanning the entire table. + +**Batch pipelining:** While one batch is being written to RavenDB, the next batch is +being read from the source database, keeping both systems busy. + +**Ordering:** Tables are scanned in dependency order. Root tables are loaded first, +then embedded tables. This minimises the number of stub documents created (see +[Child Before Parent](#child-before-parent) below). + + +**Change tracking is set up before the initial load begins — but CDC streaming does +not start until after the initial load completes.** The sequence is: + +1. Change-tracking infrastructure is created in the source database (e.g., a replication + slot and publication for PostgreSQL, or CDC capture for SQL Server) +2. The full initial table scan runs — changes made during this time are captured by the + source database but not yet consumed +3. Once the initial load is complete, CDC streaming starts from the position captured in step 1 + +This guarantees no changes are missed: anything that happened during the initial load +is retained by the source database and will be processed immediately after. + +For very large databases this means the source database must retain sufficient change +history for the duration of the initial load (e.g., enough WAL disk space on PostgreSQL, +or a long enough retention window on SQL Server CDC tables). Plan accordingly before +starting the initial load on large tables. + + +--- + +## Change Streaming + +After the initial load completes, CDC Sink begins consuming changes from the source +database's change log, starting from the position captured **before** the initial load began. + +Changes arrive grouped by source database transaction, preserving the exact order +of operations. A transaction is only applied to RavenDB after it is fully committed +in the source database — partial transactions are never written. + +**Document merging:** When an UPDATE arrives, CDC Sink merges the new column values +onto the existing RavenDB document. Properties that are not part of the column mapping +are preserved. This allows RavenDB-side annotations and computed fields to coexist with +CDC-managed properties. + +See [Property Retention](./property-retention.mdx) for details. + +--- + +## Transaction Ordering + +CDC Sink preserves the full order of operations within a source database transaction. +If a single transaction performs multiple operations on the same row, all operations +are applied in order. + +**Example:** A source transaction that does: + + + + +{`BEGIN; +INSERT INTO items (id, name) VALUES (1, 'Alpha'); +UPDATE items SET name = 'Beta' WHERE id = 1; +DELETE FROM items WHERE id = 1; +INSERT INTO items (id, name) VALUES (1, 'Gamma'); +UPDATE items SET name = 'Delta' WHERE id = 1; +COMMIT; +`} + + + + +CDC Sink applies all five operations in order. The final document state is `name = 'Delta'`. + +Multiple documents modified in the same transaction are also applied atomically within +a single RavenDB batch. + +--- + +## State Persistence and Failover + +### State Storage + +CDC Sink persists its progress as a **document in RavenDB**, alongside your data. +This document records: + +* The last acknowledged position in the source database's change log (LSN for PostgreSQL) +* Per-table initial load progress (which tables completed, and the last key scanned) + +Like any RavenDB document, this state document is subject to normal replication behavior. +Different nodes in a cluster may have different versions of this document at any point in time. + +### Failover Behavior + +When the cluster elects a new mentor node for the CDC Sink task, the new node reads +the **replicated** state document — which may be older than the work the previous +mentor had completed but not yet replicated. + +The new mentor resumes from that replicated state. This means: + +* **No data is lost** — CDC Sink resumes from a known position and the source database + retains all changes from that position onward +* **Some changes may be re-read** — Changes between the replicated state and the + previous mentor's actual progress will be processed again + +Re-reading is normal and expected. The document merge strategy means that re-applying +the same INSERT or UPDATE is safe — column values are simply overwritten with the same values. + + +Patches that are not idempotent can produce incorrect results if the same change is +re-read after a failover. Design patches to handle re-processing safely. +See [Patching](./patching.mdx) for guidance. + + +--- + +## Child Before Parent + +If an embedded row arrives before its parent row exists in RavenDB — which can happen +during initial load when tables are scanned in parallel, or due to relaxed foreign key +constraints in the source database — CDC Sink creates a **stub document** containing +only the embedded data. + +When the parent row arrives later, its columns are merged onto the stub document. +The final document contains both the parent fields and all embedded items that arrived earlier. + +This ensures no data is lost regardless of the order in which rows are processed. + +--- + +## Related Articles + +### CDC Sink + +- [Overview](./overview.mdx) +- [Schema Design](./schema-design.mdx) +- [Patching](./patching.mdx) +- [Property Retention](./property-retention.mdx) +- [Failover and Consistency](./failover-and-consistency.mdx) + +### PostgreSQL + +- [Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) +- [Initial Setup](./postgres/initial-setup.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx new file mode 100644 index 0000000000..c90c521685 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -0,0 +1,178 @@ +--- +title: "CDC Sink: Linked Tables" +sidebar_label: Linked Tables +description: "Explains how linked tables create document ID references in parent documents by converting foreign key values into RavenDB document IDs." +sidebar_position: 4 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Linked Tables + + + +* A **linked table** creates a document ID reference in the parent document rather + than embedding data. A foreign key value becomes a RavenDB document ID pointing + to a related collection. + +* In this page: + * [Basic Configuration](#basic-configuration) + * [Composite Foreign Keys](#composite-foreign-keys) + * [Array References](#array-references) + * [Linked vs Embedded](#linked-vs-embedded) + + + +--- + +## Basic Configuration + +`CdcSinkLinkedTableConfig` is placed inside a root table's `LinkedTables` list: + + + + +{`new CdcSinkTableConfig +\{ + Name = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + ColumnsMapping = \{ ["id"] = "Id", ["customer_id"] = "CustomerId" \}, + LinkedTables = + [ + new CdcSinkLinkedTableConfig + \{ + SourceTableName = "customers", + PropertyName = "Customer", // Property name in document + LinkedCollectionName = "Customers", // Target collection for ID + Type = CdcSinkRelationType.Value, // Single reference + JoinColumns = ["customer_id"] // FK used to build the document ID + \} + ] +\} +`} + + + + +With `customer_id = 42`, the Orders document gets: + + + + +{`\{ + "Id": 1, + "CustomerId": 42, + "Customer": "Customers/42" +\} +`} + + + + +The `Customer` property is a RavenDB document ID. Load the referenced document using +[includes](../../../client-api/session/loading-entities#load-with-includes) to avoid +a second network call. + +--- + +## Composite Foreign Keys + +When the target table has a composite primary key, the linked reference includes +all parts of that key: + + + + +{`new CdcSinkLinkedTableConfig +\{ + SourceTableName = "customers", + PropertyName = "Customer", + LinkedCollectionName = "Customers", + Type = CdcSinkRelationType.Value, + JoinColumns = ["customer_region", "customer_id"] // Must match Customers PK order +\} +`} + + + + +With `customer_region = 'US'` and `customer_id = 42`, the document gets: + +``` +"Customer": "Customers/US/42" +``` + +--- + +## Array References + +Use `Type = CdcSinkRelationType.Array` for one-to-many references, where a parent +row has multiple foreign keys pointing to the same collection: + + + + +{`new CdcSinkLinkedTableConfig +\{ + SourceTableName = "tags", + PropertyName = "Tags", + LinkedCollectionName = "Tags", + Type = CdcSinkRelationType.Array, + JoinColumns = ["tag_id"] +\} +`} + + + + +This creates an array of document references: + + + + +{`\{ + "Tags": ["Tags/primary", "Tags/urgent", "Tags/follow-up"] +\} +`} + + + + +--- + +## Linked vs Embedded + +| Consideration | Embedded | Linked | +|--------------|----------|--------| +| Data stored | Full nested object/array inside document | Document ID reference only | +| Load pattern | Single document load | Load parent + include references | +| Document size | Grows with embedded items | Parent document stays small | +| Updates to referenced data | Reflected via CDC | Reflected via CDC on the referenced collection | +| Independence | Child has no meaning without parent | Referenced entity exists independently | +| Typical use | Orders own LineItems | Orders reference Customers | + +**Choose embedded** when the child data belongs to the parent and is always read +together with it. + +**Choose linked** when the referenced entity is independently meaningful and shared +across many parents, and you want to avoid duplicating data. + +--- + +## Related Articles + +### CDC Sink + +- [Schema Design](./schema-design.mdx) +- [Embedded Tables](./embedded-tables.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### Client API + +- [Load with Includes](../../../client-api/session/loading-entities#load-with-includes) diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx new file mode 100644 index 0000000000..cbacbf99f8 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -0,0 +1,113 @@ +--- +title: "CDC Sink: Monitoring" +sidebar_label: Monitoring +description: "Explains how to monitor a CDC Sink task — its running state, progress, fallback behavior, and statistics available through Management Studio and the API." +sidebar_position: 12 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Monitoring + + + +* This page explains how to monitor a CDC Sink task — its running state, progress, + fallback behavior, and statistics available through the Management Studio and API. + +* In this page: + * [Task State](#task-state) + * [Fallback Mode](#fallback-mode) + * [Statistics](#statistics) + * [Notifications](#notifications) + + + +--- + +## Task State + +A CDC Sink task can be in one of the following states: + +| State | Description | +|-------|-------------| +| `Active` | Running normally — streaming changes or waiting for new changes | +| `ActiveByAnotherNode` | Another cluster node is the mentor; this node is a replica | +| `Disabled` | Manually disabled via Studio or API | +| `Error` | The task encountered an error and stopped | +| `FallbackMode` | Connection to the source database was lost; retrying | +| `NotOnThisNode` | This node does not hold the task | + +The current state is visible in the **Ongoing Tasks** view in the Management Studio. + +--- + +## Fallback Mode + +When CDC Sink cannot reach the source database, it enters **fallback mode** rather +than failing immediately. + +In fallback mode: +* The task continues retrying the connection at regular intervals +* No changes are applied while the connection is down +* The task automatically resumes streaming once the source is reachable again + +The maximum time the task will remain in fallback mode before reporting an error +is controlled by the `CdcSink.MaxFallbackTimeInSec` configuration key. +See [Server Configuration](./server-configuration.mdx). + +--- + +## Statistics + +CDC Sink exposes runtime statistics through the `GetOngoingTaskInfoOperation`: + + + + +{`var taskInfo = await store.Maintenance.SendAsync( + new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); +`} + + + + +The returned object includes: + +| Field | Description | +|-------|-------------| +| `TaskState` | Current state of the task | +| `MentorNode` | Configured preferred node | +| `ResponsibleNode` | Node currently running the task | +| `Error` | Error message if the task is in error state | + +Detailed per-table statistics — including row counts and last processed position — +are available through the Management Studio's ongoing tasks detail view. + +--- + +## Notifications + +CDC Sink participates in RavenDB's standard alert system. If the task enters an +error state or fallback mode, an alert is raised and visible in: + +* The **Notification Center** in the Management Studio (bell icon) +* The cluster's alert log + +Alerts include the error message and which table or operation triggered the failure, +making it straightforward to diagnose the root cause. + +--- + +## Related Articles + +### CDC Sink + +- [How It Works](./how-it-works.mdx) +- [Failover and Consistency](./failover-and-consistency.mdx) +- [Server Configuration](./server-configuration.mdx) +- [Troubleshooting](./troubleshooting.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx new file mode 100644 index 0000000000..a8716827a5 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -0,0 +1,151 @@ +--- +title: "CDC Sink: Overview" +sidebar_label: Overview +description: "An introduction to CDC Sink, the RavenDB ongoing task that reads Change Data Capture streams from a relational database and writes documents into RavenDB." +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Overview + + + +* **CDC Sink** is a RavenDB ongoing task that reads **Change Data Capture (CDC)** + streams from a relational database and writes the resulting documents into RavenDB. + +* CDC Sink is the reverse of ETL: instead of pushing data _from_ RavenDB _to_ SQL, + CDC Sink _pulls_ data _from_ SQL _into_ RavenDB. + The relational database is the source of truth; RavenDB receives a continuously-updated + document model derived from it. + +* CDC Sink maps normalized relational tables into rich, nested RavenDB documents — + automatically and in real time. + +* Supported source databases: + * **PostgreSQL** — via logical replication + * Additional source databases planned for future versions + +* In this page: + * [Why Use CDC Sink](#why-use-cdc-sink) + * [How It Works](#how-it-works) + * [Task Lifecycle](#task-lifecycle) + * [Licensing](#licensing) + + + +--- + +## Why Use CDC Sink + +CDC Sink solves the problem of moving data from a relational database into RavenDB +without requiring changes to the source system. + +* **Migrate from SQL to RavenDB** + Transform normalized SQL tables (orders, order_lines, customers) into rich RavenDB + documents where an Order contains embedded LineItems and a reference to the Customer — + automatically and continuously, without changing your SQL application. + +* **Build a read-optimized view** + Your transactional system uses a relational database, but your API layer needs + denormalized documents. CDC Sink creates and maintains those documents without + touching your existing application. + +* **Gradual migration** + Keep your SQL application running while RavenDB documents are built in the background. + Applications can start reading from RavenDB while writes still go to the relational database. + +* **Event-driven side effects** + Using JavaScript patches, every INSERT, UPDATE, or DELETE in the source database can + trigger custom logic in RavenDB — computing derived fields, maintaining running totals, + or writing custom transformations. + +--- + +## How It Works + +A CDC Sink task continuously reads changes from the source relational database and +applies them to RavenDB documents. + +### Initial Load + +When a CDC Sink task starts for the first time, it performs a full scan of every +configured table using keyset pagination. This populates RavenDB with the current +state of the data before streaming begins. + +Initial load progress is persisted per-table. If the task is restarted, it resumes +from where it left off rather than re-scanning. + +### Change Streaming + +After the initial load, CDC Sink switches to streaming changes in real time. +Changes are grouped into transactions, preserving the exact order of operations +from the source database. Partial transactions are never written to RavenDB — +all changes within a source database transaction are applied together. + +### Document Model + +The relational model is mapped to RavenDB documents through configuration: + +* **Root tables** map to RavenDB collections (one document per row) +* **Embedded tables** become nested arrays or objects within parent documents +* **Linked tables** become document ID references + +See [Schema Design](./schema-design.mdx) for details. + +--- + +## Task Lifecycle + +1. **Create** — Define the task in Studio or via the Client API + Specify the connection string, table mappings, and transformation options + +2. **Verify** — CDC Sink verifies the source database is properly configured + Checks permissions, replication prerequisites, and table configuration + +3. **Initial Load** — Full table scan populates RavenDB with current data + Progress is tracked per-table and persists across restarts + +4. **Stream** — Real-time change streaming begins + All INSERTs, UPDATEs, and DELETEs are applied to RavenDB documents as they occur + +5. **Monitor** — View statistics, errors, and progress in Studio + +6. **Retire** — Delete the task in RavenDB when no longer needed + PostgreSQL artifacts (replication slot, publication) must be cleaned up by + the database administrator separately + +--- + +## Licensing + + +CDC Sink is available on an **Enterprise** license. + + +Learn more about licensing [here](../../../start/licensing/licensing-overview). + +--- + +## Related Articles + +### CDC Sink + +- [How It Works](./how-it-works.mdx) +- [Schema Design](./schema-design.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### PostgreSQL + +- [Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) +- [Initial Setup](./postgres/initial-setup.mdx) + +### Server + +- [ETL Basics](../etl/basics) +- [Queue Sink Overview](../queue-sink/overview) diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx new file mode 100644 index 0000000000..0a03290f52 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -0,0 +1,364 @@ +--- +title: "CDC Sink: Patching" +sidebar_label: Patching +description: "Explains how JavaScript patch scripts work in CDC Sink, covering available variables, patch scope, common scenarios, idempotency, and limitations." +sidebar_position: 6 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Patching + + + +* A **patch** is a JavaScript snippet that runs on a document after column mapping is applied. + Patches let you transform data, compute derived fields, maintain aggregates, load related + documents, and control document metadata. + +* Patches are defined per-table (root or embedded) and per-operation (INSERT/UPDATE + or DELETE via `OnDelete.Patch`). + +* In this page: + * [When Patches Run](#when-patches-run) + * [Available Variables](#available-variables) + * [Patch Scope: Root vs Embedded](#patch-scope-root-vs-embedded) + * [Scenario: Column Transformation](#scenario-column-transformation) + * [Scenario: Aggregation with Embedded Tables](#scenario-aggregation-with-embedded-tables) + * [Scenario: Delta Computations](#scenario-delta-computations) + * [Scenario: Computed Derived Fields](#scenario-computed-derived-fields) + * [Scenario: Document Metadata](#scenario-document-metadata) + * [Scenario: Loading Related Documents](#scenario-loading-related-documents) + * [Idempotency and Failover](#idempotency-and-failover) + * [Step Limit](#step-limit) + * [Capabilities and Limitations](#capabilities-and-limitations) + + + +--- + +## When Patches Run + +| Event | Patch property | Runs? | +|-------|---------------|-------| +| INSERT | `Patch` | ✓ After column mapping | +| UPDATE | `Patch` | ✓ After column mapping, on merged document | +| DELETE (root table) | `OnDelete.Patch` | ✓ Before document is deleted | +| DELETE (embedded table) | `OnDelete.Patch` | ✓ On parent document before item is removed | + +The `Patch` property on a table handles INSERT and UPDATE. +The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. + +--- + +## Available Variables + +| Variable | Available | Type | Description | +|----------|-----------|------|-------------| +| `this` | Always | object | The document being modified (root or parent for embedded) | +| `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | +| `$old` | UPDATE only | object \| null | Previous state of the item; null for INSERT | +| `get(id)` | Always | function | Load a RavenDB document by ID | + +--- + +## Patch Scope: Root vs Embedded + +**Root table patches** operate on the root document: + + + + +{`Patch = "this.Status = $row.is_active ? 'Active' : 'Inactive';" +`} + + + + +`this` is the Orders (or whatever root collection) document. + +**Embedded table patches** operate on the **parent** document, not the embedded item: + + + + +{`// Patch on order_lines embedded table +Patch = "this.TotalQuantity = (this.Lines || []).reduce((s, l) => s + l.Quantity, 0);" +`} + + + + +`this` is the parent Orders document. This lets you recompute parent-level aggregates +whenever an embedded item changes. + +--- + +## Scenario: Column Transformation + +Transform or combine SQL columns into RavenDB properties: + + + + +{`this.FullName = ($row.first_name + ' ' + $row.last_name).trim(); +this.Status = $row.is_active ? 'Active' : 'Inactive'; +this.CreatedAt = new Date($row.created_unix * 1000).toISOString(); +`} + + + + +--- + +## Scenario: Aggregation with Embedded Tables + +Recompute parent-level totals whenever an embedded item is added or updated. + + +If you use a `Patch` to maintain an aggregate, you **must** also provide an +`OnDelete.Patch` that reverses the aggregate when an item is deleted. +Without it, deletes will leave the aggregate in an incorrect state. + + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "order_lines", + PropertyName = "Lines", + PrimaryKeyColumns = ["line_id"], + JoinColumns = ["order_id"], + ColumnsMapping = \{ ["line_id"] = "LineId", ["quantity"] = "Quantity" \}, + + // Runs on INSERT and UPDATE — recomputes total from current Lines array + Patch = @" + this.TotalQuantity = (this.Lines || []) + .reduce((sum, line) => sum + (line.Quantity || 0), 0); + ", + + // REQUIRED: Runs on DELETE — recomputes after item is removed from array + OnDelete = new CdcSinkOnDeleteConfig + \{ + Patch = @" + this.TotalQuantity = (this.Lines || []) + .reduce((sum, line) => sum + (line.Quantity || 0), 0); + " + \} +\} +`} + + + + +The OnDelete patch runs after the item has already been removed from the array, +so re-summing `this.Lines` gives the correct post-deletion total. + +--- + +## Scenario: Delta Computations + +Use `$old` to compute a delta when an embedded item changes, keeping a running total +without recomputing from scratch. + + +Running total patches using `$old` must have a matching `OnDelete.Patch` that subtracts +the deleted item's value. Without it, deletes leave the running total incorrect. + + + + + +{`new CdcSinkEmbeddedTableConfig +\{ + SourceTableName = "invoice_lines", + PropertyName = "Lines", + PrimaryKeyColumns = ["line_id"], + JoinColumns = ["invoice_id"], + ColumnsMapping = \{ ["line_id"] = "LineId", ["amount"] = "Amount" \}, + + // INSERT: $old is null, so delta = new amount (0 → new) + // UPDATE: $old has previous Amount, delta = new - old + Patch = @" + const oldAmount = $old?.Amount || 0; + const newAmount = $row.amount || 0; + this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); + ", + + // REQUIRED: Subtract the deleted item's amount using $old + OnDelete = new CdcSinkOnDeleteConfig + \{ + Patch = @" + const deletedAmount = $old?.Amount || 0; + this.RunningTotal = (this.RunningTotal || 0) - deletedAmount; + " + \} +\} +`} + + + + +The `$old` variable in the OnDelete patch contains the item's last known state before deletion. + +--- + +## Scenario: Computed Derived Fields + +Compute fields from unmapped columns that you don't want to store directly: + + + + +{`ColumnsMapping = \{ ["id"] = "Id", ["name"] = "Name" \}, +// base_price and tax_rate are NOT in ColumnsMapping +Patch = @" + this.FinalPrice = $row.base_price * (1 + $row.tax_rate); + this.Discount = $row.is_vip ? $row.base_price * 0.1 : 0; +" +`} + + + + +--- + +## Scenario: Document Metadata + +Patches can set RavenDB document metadata, including expiration: + + + + +{`this['@metadata'] = this['@metadata'] || \{\}; + +if ($row.expires_at) \{ + this['@metadata']['@expires'] = new Date($row.expires_at).toISOString(); +\} + +this['@metadata']['SourceTable'] = 'orders'; +`} + + + + +--- + +## Scenario: Loading Related Documents + +Use `get()` to load a related RavenDB document and denormalize its data: + + + + +{`const customer = get('Customers/' + $row.customer_id); + +if (customer) \{ + this.CustomerName = customer.Name; + this.CustomerEmail = customer.Email; + this.CustomerTier = customer.Tier; +\} else \{ + // Document doesn't exist yet — race condition or not yet synced + this.CustomerName = null; + this.CustomerEmail = null; +\} +`} + + + + +`get()` returns `null` if the document does not exist or has not yet been created +by CDC Sink (race condition when multiple tables are loading in parallel). +Always check for null before accessing properties. + +**When to use `get()`:** + +* Denormalizing slowly-changing reference data (customer name, category, region) +* Capturing a snapshot of related data at insert time + +**Prefer linked tables** for simple foreign key references — they are cleaner and +do not have the null-handling complexity of `get()`. + +--- + +## Idempotency and Failover + +After a failover, CDC Sink resumes from the replicated state, which may be older +than the last work the previous mentor node completed. Some changes may be re-read +and re-applied. + +**Patches that are not idempotent can produce incorrect results when re-applied.** + + + + +{`// NOT idempotent — increments again on re-read +this.ViewCount = (this.ViewCount || 0) + 1; + +// Idempotent — absolute value from SQL source +this.ViewCount = $row.view_count; + +// Idempotent — delta via $old (both first-read and re-read produce same result) +const oldVal = $old?.Amount || 0; +const newVal = $row.amount || 0; +this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); +`} + + + + +Column mapping itself is idempotent — overwriting a property with the same value +is always safe. + +--- + +## Step Limit + +Patch scripts are bounded by a **step quota** rather than a time limit. Each operation +in the script (assignment, loop iteration, function call) consumes steps. + +The limit is controlled by the `Patching.MaxStepsForScript` configuration setting. +See [Patching Configuration](../../../server/configuration/patching-configuration). + +If a patch exceeds the limit, the CDC operation fails and is retried. + +Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nested loops. + +--- + +## Capabilities and Limitations + +**What patches can do:** + +* Access `this`, `$row`, `$old` +* Load related documents with `get()` +* Compute and transform property values +* Set and modify document metadata +* Conditional logic, loops, array methods +* Use built-in JavaScript: `Date`, `Math`, `JSON`, `Array` + +**What patches cannot do:** + +* Make HTTP calls or API requests +* Access the file system +* Load documents from other RavenDB databases + +--- + +## Related Articles + +### CDC Sink + +- [Delete Strategies](./delete-strategies.mdx) +- [Column Mapping](./column-mapping.mdx) +- [Property Retention](./property-retention.mdx) +- [Failover and Consistency](./failover-and-consistency.mdx) + +### Server + +- [Patching Configuration](../../../server/configuration/patching-configuration) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json b/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json new file mode 100644 index 0000000000..697a3e48e5 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json @@ -0,0 +1 @@ +{"position": 16, "label": "PostgreSQL"} \ No newline at end of file diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx new file mode 100644 index 0000000000..c83a62e5c0 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx @@ -0,0 +1,227 @@ +--- +title: "CDC Sink for PostgreSQL: Cleanup and Maintenance" +sidebar_label: Cleanup and Maintenance +description: "How to identify and remove orphaned PostgreSQL replication slots and publications after a CDC Sink task is deleted, and how to avoid slot accumulation." +sidebar_position: 6 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Cleanup and Maintenance + + + +* When a CDC Sink task is deleted from RavenDB, the associated PostgreSQL objects + — the replication slot and publication — are **not** automatically removed. + +* These must be cleaned up manually by a database administrator. + +* In this page: + * [Why Manual Cleanup Is Required](#why-manual-cleanup-is-required) + * [Finding Orphaned Slots and Publications](#finding-orphaned-slots-and-publications) + * [Dropping a Replication Slot](#dropping-a-replication-slot) + * [Dropping a Publication](#dropping-a-publication) + * [Too Many Replication Slots](#too-many-replication-slots) + * [Configuration Changes That Rename Slots](#configuration-changes-that-rename-slots) + + + +--- + +## Why Manual Cleanup Is Required + +An active replication slot prevents PostgreSQL from discarding WAL segments that +have not yet been consumed. If a slot is not being consumed (because the CDC Sink +task was deleted), PostgreSQL will accumulate WAL on disk indefinitely. + +This can lead to: + +* Disk space exhaustion on the PostgreSQL server +* Degraded performance as old WAL segments pile up + +A database administrator must drop unused replication slots. + + +**Why RavenDB does not drop slots automatically:** + +There are valid reasons to keep a slot after a task is deleted. For example, you +may want to create a new CDC Sink task that resumes from the same position (by +reusing the existing slot), or you may want to review what changes are pending +before cleaning up. The CDC Sink user may also not have the permissions required +to drop replication slots, even if it had the permissions to create them. + +For these reasons, slot and publication lifecycle management is the responsibility +of the database administrator. + + +--- + +## Finding Orphaned Slots and Publications + +List all CDC Sink replication slots: + + + + +{`SELECT slot_name, active, confirmed_flush_lsn +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; +`} + + + + +An `active = false` slot is not being consumed. Compare the list to your active CDC +Sink tasks in RavenDB — any slot whose corresponding task no longer exists is orphaned. + +List all CDC Sink publications: + + + + +{`SELECT p.pubname, c.relname AS table_name +FROM pg_publication p +JOIN pg_publication_rel pr ON pr.prpubid = p.oid +JOIN pg_class c ON c.oid = pr.prrelid +WHERE p.pubname LIKE 'rvn_cdc_p_%' +ORDER BY p.pubname, c.relname; +`} + + + + +--- + +## Dropping a Replication Slot + + + + +{`SELECT pg_drop_replication_slot('rvn_cdc_s_'); +`} + + + + + +You cannot drop an active replication slot (one with `active = true`). The CDC Sink +task must be stopped or deleted in RavenDB before the slot can be dropped. + + +--- + +## Dropping a Publication + + + + +{`DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; +`} + + + + +Publications are not consumed like slots — they do not accumulate data or hold WAL +segments. However, they should still be dropped to keep the database clean. + +--- + +## Too Many Replication Slots + +PostgreSQL limits the total number of replication slots to `max_replication_slots`. +If you exceed this limit, no new CDC Sink tasks can start (they will fail with a +connection error). + +Check how many slots are in use: + + + + +{`SELECT count(*) FROM pg_replication_slots; +SHOW max_replication_slots; +`} + + + + +To resolve this: + +1. Identify inactive slots: + + + + +{`SELECT slot_name, active +FROM pg_replication_slots +WHERE active = false; +`} + + + + +2. Drop slots for tasks that no longer exist: + + + + +{`SELECT pg_drop_replication_slot('rvn_cdc_s_'); +`} + + + + +3. If needed, increase `max_replication_slots` in `postgresql.conf` and restart + PostgreSQL. + +--- + +## Configuration Changes That Rename Slots + +The replication slot name is derived from the task name, database name, and table +names. If you update a CDC Sink task in a way that changes any of these — such as +adding a table, removing a table, or renaming the task — the expected slot and +publication names change. + +What happens: + +* CDC Sink will look for a slot/publication with the new name +* If it has permissions, it will create them +* The old slot and publication are **not deleted** — they become orphaned + +After updating a task configuration that changes table membership: + +1. Let the task restart and create the new slot/publication +2. Identify the old slot (it will be inactive): + + + + +{`SELECT slot_name, active +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%' + AND active = false; +`} + + + + +3. Drop the old slot and publication + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Initial Setup](./initial-setup.mdx) +- [Monitoring PostgreSQL](./monitoring-postgres.mdx) +- [WAL Configuration](./wal-configuration.mdx) + +### CDC Sink + +- [API Reference](../api-reference.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json new file mode 100644 index 0000000000..4d070cfb37 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json @@ -0,0 +1 @@ +{"position": 9, "label": "Examples"} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx new file mode 100644 index 0000000000..6bcc58b0b4 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -0,0 +1,230 @@ +--- +title: "CDC Sink Example: Complex Nesting with Linked Tables" +sidebar_label: Complex Nesting with Linked Tables +description: "Multi-level embedded table structure combined with linked table references, representing a product catalog with variants, attributes, and a category reference." +sidebar_position: 3 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink Example: Complex Nesting with Linked Tables + + + +* This example shows a multi-level embedded table structure combined with linked + table references, representing a product catalog with variants, attributes, and + a category reference. + +* In this page: + * [Source Schema](#source-schema) + * [REPLICA IDENTITY Setup](#replica-identity-setup) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + + + +## Source Schema + + + + +{`CREATE TABLE categories ( + category_id SERIAL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE products ( + product_id SERIAL PRIMARY KEY, + name TEXT NOT NULL, + category_id INT REFERENCES categories(category_id) +); + +CREATE TABLE product_variants ( + variant_id SERIAL PRIMARY KEY, + product_id INT NOT NULL REFERENCES products(product_id), + sku TEXT NOT NULL, + price NUMERIC(10,2) +); + +CREATE TABLE variant_attributes ( + attr_id SERIAL PRIMARY KEY, + product_id INT NOT NULL REFERENCES products(product_id), -- denormalized root PK (required for deep nesting) + variant_id INT NOT NULL REFERENCES product_variants(variant_id), + attr_name TEXT NOT NULL, + attr_value TEXT NOT NULL +); +`} + + + + +## REPLICA IDENTITY Setup + +Both `product_variants` and `variant_attributes` have surrogate PKs with join +columns that are not part of their primary keys. Rather than `REPLICA IDENTITY FULL` +(which includes all columns), we use targeted unique indexes covering just the join +and PK columns: + + + + +{`-- product_variants: join column is product_id, PK is variant_id +CREATE UNIQUE INDEX product_variants_replica_idx + ON product_variants (product_id, variant_id); +ALTER TABLE product_variants + REPLICA IDENTITY USING INDEX product_variants_replica_idx; + +-- variant_attributes: join columns are product_id + variant_id, PK is attr_id +CREATE UNIQUE INDEX variant_attributes_replica_idx + ON variant_attributes (product_id, variant_id, attr_id); +ALTER TABLE variant_attributes + REPLICA IDENTITY USING INDEX variant_attributes_replica_idx; +`} + + + + +See [REPLICA IDENTITY](../replica-identity.mdx) for more details. + +## Task Configuration + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "ProductCatalogSync", + ConnectionStringName = "MyPostgresConnection", + Tables = + [ + new CdcSinkTableConfig + \{ + Name = "Products", + SourceTableName = "products", + PrimaryKeyColumns = ["product_id"], + ColumnsMapping = new Dictionary + \{ + ["product_id"] = "ProductId", + ["name"] = "Name" + \}, + // Linked table: category_id FK → document ID in Categories collection + LinkedTables = + [ + new CdcSinkLinkedTableConfig + \{ + SourceTableName = "categories", + PropertyName = "Category", + LinkedCollectionName = "Categories", + Type = CdcSinkRelationType.Value, + JoinColumns = ["category_id"] + \} + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "product_variants", + PropertyName = "Variants", + Type = CdcSinkRelationType.Array, + JoinColumns = ["product_id"], + PrimaryKeyColumns = ["variant_id"], + ColumnsMapping = new Dictionary + \{ + ["variant_id"] = "VariantId", + ["sku"] = "Sku", + ["price"] = "Price" + \}, + // Deep-nested: attributes within each variant + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "variant_attributes", + PropertyName = "Attributes", + Type = CdcSinkRelationType.Array, + // JoinColumns must include the ROOT PK for deep nesting + JoinColumns = ["product_id", "variant_id"], + PrimaryKeyColumns = ["attr_id"], + ColumnsMapping = new Dictionary + \{ + ["attr_id"] = "AttrId", + ["attr_name"] = "Name", + ["attr_value"] = "Value" + \} + \} + ] + \} + ] + \} + ] +\}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +`} + + + + +## Resulting Documents + + + + +{`\{ + "ProductId": 42, + "Name": "Hiking Boot", + "Category": "categories/3", + "Variants": [ + \{ + "VariantId": 101, + "Sku": "HB-BLK-10", + "Price": 89.99, + "Attributes": [ + \{ "AttrId": 1, "Name": "Color", "Value": "Black" \}, + \{ "AttrId": 2, "Name": "Size", "Value": "10" \} + ] + \}, + \{ + "VariantId": 102, + "Sku": "HB-BRN-11", + "Price": 89.99, + "Attributes": [ + \{ "AttrId": 3, "Name": "Color", "Value": "Brown" \}, + \{ "AttrId": 4, "Name": "Size", "Value": "11" \} + ] + \} + ], + "@metadata": \{ "@collection": "Products" \} +\} +`} + + + + + +The `Categories` collection is also synced by CDC Sink (it would be a separate +root table configuration). `"categories/3"` is a standard RavenDB document ID +that enables the use of RavenDB includes when querying products. + + +--- + +## Related Articles + +### CDC Sink Examples + +- [Simple Migration](./example-simple-migration.mdx) +- [Denormalization](./example-denormalization.mdx) +- [Event Sourcing](./example-event-sourcing.mdx) + +### CDC Sink + +- [Schema Design](../../schema-design.mdx) +- [Embedded Tables](../../embedded-tables.mdx) +- [Linked Tables](../../linked-tables.mdx) +- [REPLICA IDENTITY](../replica-identity.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx new file mode 100644 index 0000000000..9213a85115 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -0,0 +1,202 @@ +--- +title: "CDC Sink Example: Denormalization with Embedded Tables" +sidebar_label: Denormalization with Embedded Tables +description: "How to merge a normalized SQL schema (orders + order_lines) into denormalized RavenDB documents with embedded arrays using CDC Sink." +sidebar_position: 1 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink Example: Denormalization with Embedded Tables + + + +* This example shows how to merge a normalized SQL schema (orders + order_lines) + into denormalized RavenDB documents with embedded arrays. + +* In this page: + * [Source Schema](#source-schema) + * [REPLICA IDENTITY Setup](#replica-identity-setup) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + * [What Happens on Change Events](#what-happens-on-change-events) + + + +## Source Schema + + + + +{`CREATE TABLE orders ( + order_id SERIAL PRIMARY KEY, + customer TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE order_lines ( + line_id SERIAL PRIMARY KEY, + order_id INT NOT NULL REFERENCES orders(order_id), + product TEXT NOT NULL, + qty INT NOT NULL, + unit_price NUMERIC(10,2) NOT NULL +); +`} + + + + +## REPLICA IDENTITY Setup + +`order_lines` has a surrogate PK (`line_id`). The join column `order_id` is not +part of the primary key. Without `REPLICA IDENTITY FULL`, DELETE events for +`order_lines` rows would not include `order_id`, and CDC Sink could not find +the parent document. + + + + +{`ALTER TABLE order_lines REPLICA IDENTITY FULL; +`} + + + + +See [REPLICA IDENTITY](../replica-identity.mdx). + +## Task Configuration + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + \{ + new CdcSinkTableConfig + \{ + Name = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = new List \{ "order_id" \}, + ColumnsMapping = new Dictionary + \{ + ["order_id"] = "OrderId", + ["customer"] = "Customer", + ["status"] = "Status", + ["created_at"] = "CreatedAt" + \}, + EmbeddedTables = new List + \{ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "order_lines", + PropertyName = "Lines", + Type = CdcSinkRelationType.Array, + JoinColumns = new List \{ "order_id" \}, + PrimaryKeyColumns = new List \{ "line_id" \}, + ColumnsMapping = new Dictionary + \{ + ["line_id"] = "LineId", + ["product"] = "Product", + ["qty"] = "Qty", + ["unit_price"] = "UnitPrice" + \} + \} + \} + \} + \} +\}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +`} + + + + +## Resulting Documents + +SQL rows: + + + + +{`orders: order_id=1, customer='Acme Corp', status='pending' +order_lines: line_id=1, order_id=1, product='Widget A', qty=3, unit_price=9.99 +order_lines: line_id=2, order_id=1, product='Widget B', qty=1, unit_price=24.99 +`} + + + + +RavenDB document `orders/1`: + + + + +{`\{ + "OrderId": 1, + "Customer": "Acme Corp", + "Status": "pending", + "CreatedAt": "2024-06-01T09:00:00+00:00", + "Lines": [ + \{ + "LineId": 1, + "Product": "Widget A", + "Qty": 3, + "UnitPrice": 9.99 + \}, + \{ + "LineId": 2, + "Product": "Widget B", + "Qty": 1, + "UnitPrice": 24.99 + \} + ], + "@metadata": \{ "@collection": "Orders" \} +\} +`} + + + + +## What Happens on Change Events + +**INSERT into `order_lines`:** +A new item is appended to the `Lines` array. + +**UPDATE to `order_lines`:** +CDC Sink finds the item by `line_id` within the `Lines` array and updates its properties. + +**DELETE from `order_lines`:** +CDC Sink finds the item by `line_id` and removes it from the array. +(Requires `REPLICA IDENTITY FULL` as configured above.) + +**UPDATE to `orders`:** +Only the root document properties (`Status`, etc.) are updated. The `Lines` array +is not affected. + +**DELETE from `orders`:** +The entire `orders/1` document is deleted, including all embedded lines. + +--- + +## Related Articles + +### CDC Sink Examples + +- [Simple Migration](./example-simple-migration.mdx) +- [Complex Nesting](./example-complex-nesting.mdx) + +### CDC Sink + +- [Embedded Tables](../../embedded-tables.mdx) +- [REPLICA IDENTITY](../replica-identity.mdx) +- [Delete Strategies](../../delete-strategies.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx new file mode 100644 index 0000000000..df7ace832d --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx @@ -0,0 +1,185 @@ +--- +title: "CDC Sink Example: Event Sourcing with Aggregation" +sidebar_label: Event Sourcing with Aggregation +description: "How to use CDC Sink patches to maintain a computed aggregate on a RavenDB document as individual event rows arrive from PostgreSQL." +sidebar_position: 2 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink Example: Event Sourcing with Aggregation + + + +* This example shows how to use CDC Sink patches to maintain a computed aggregate + on a RavenDB document as individual event rows arrive from PostgreSQL. + +* In this page: + * [Source Schema](#source-schema) + * [Goal](#goal) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + * [Handling Deletes](#handling-deletes) + + + +## Source Schema + +An accounts table and a transactions table: + + + + +{`CREATE TABLE accounts ( + account_id SERIAL PRIMARY KEY, + owner TEXT NOT NULL, + currency TEXT NOT NULL DEFAULT 'USD' +); + +CREATE TABLE transactions ( + txn_id SERIAL PRIMARY KEY, + account_id INT NOT NULL REFERENCES accounts(account_id), + amount NUMERIC(12,2) NOT NULL, + type TEXT NOT NULL, -- 'credit' or 'debit' + created_at TIMESTAMPTZ DEFAULT now() +); +`} + + + + +## Goal + +Store each account as a RavenDB document with a `Balance` field that reflects the +running total of all transactions. Transaction rows are embedded as an array for +history, and `Balance` is maintained using patch logic. + +## Task Configuration + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "AccountsSync", + ConnectionStringName = "MyPostgresConnection", + Tables = + [ + new CdcSinkTableConfig + \{ + Name = "Accounts", + SourceTableName = "accounts", + PrimaryKeyColumns = ["account_id"], + ColumnsMapping = new Dictionary + \{ + ["account_id"] = "AccountId", + ["owner"] = "Owner", + ["currency"] = "Currency" + \}, + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "transactions", + PropertyName = "Transactions", + Type = CdcSinkRelationType.Array, + JoinColumns = ["account_id"], + PrimaryKeyColumns = ["txn_id"], + ColumnsMapping = new Dictionary + \{ + ["txn_id"] = "TxnId", + ["amount"] = "Amount", + ["type"] = "Type", + ["created_at"] = "CreatedAt" + \}, + // Patch runs on the parent document for INSERT/UPDATE + Patch = """ + const oldAmount = $old?.Amount || 0; + const newAmount = $row.amount || 0; + const sign = $row.type === 'credit' ? 1 : -1; + const oldSign = $old?.Type === 'credit' ? 1 : -1; + this.Balance = (this.Balance || 0) + - (oldSign * oldAmount) + + (sign * newAmount); + """, + OnDelete = new CdcSinkOnDeleteConfig + \{ + Patch = """ + const deletedAmount = $old?.Amount || 0; + const sign = $old?.Type === 'credit' ? 1 : -1; + this.Balance = (this.Balance || 0) - (sign * deletedAmount); + """ + \} + \} + ] + \} + ] +\}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +`} + + + + +## Resulting Documents + +After three transactions (credit 100, debit 30, credit 50): + + + + +{`\{ + "AccountId": 1, + "Owner": "Alice", + "Currency": "USD", + "Balance": 120.00, + "Transactions": [ + \{ "TxnId": 1, "Amount": 100.00, "Type": "credit", "CreatedAt": "..." \}, + \{ "TxnId": 2, "Amount": 30.00, "Type": "debit", "CreatedAt": "..." \}, + \{ "TxnId": 3, "Amount": 50.00, "Type": "credit", "CreatedAt": "..." \} + ], + "@metadata": \{ "@collection": "Accounts" \} +\} +`} + + + + +## Handling Deletes + +The `OnDelete.Patch` reverses the contribution of the deleted transaction to +`Balance`. This uses `$old` (the embedded item's last known state) rather than +`$row`, because for a DELETE event the embedded item's mapped values are in `$old`. + +Without the `OnDelete.Patch`, deleting a transaction row from SQL would remove +it from the `Transactions` array but leave `Balance` stale. The delete patch +keeps `Balance` consistent. + + +The patch uses delta logic (`$old` → `$row`) for idempotency. If a change is +re-applied after a failover, `$old` still reflects the state before the original +update, so the delta produces the same result. +See [Failover and Consistency](../../failover-and-consistency.mdx). + + +--- + +## Related Articles + +### CDC Sink Examples + +- [Simple Migration](./example-simple-migration.mdx) +- [Denormalization](./example-denormalization.mdx) +- [Complex Nesting](./example-complex-nesting.mdx) + +### CDC Sink + +- [Patching](../../patching.mdx) +- [Delete Strategies](../../delete-strategies.mdx) +- [Failover and Consistency](../../failover-and-consistency.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx new file mode 100644 index 0000000000..aad066f6bd --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -0,0 +1,128 @@ +--- +title: "CDC Sink Example: Simple Table Migration" +sidebar_label: Simple Table Migration +description: "Minimal setup to replicate a single SQL table into a RavenDB collection using CDC Sink." +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink Example: Simple Table Migration + + + +* This example shows the minimal setup to replicate a single SQL table into a + RavenDB collection. + +* In this page: + * [Source Schema](#source-schema) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + + + +## Source Schema + +A simple customers table: + + + + +{`CREATE TABLE customers ( + id SERIAL PRIMARY KEY, + name TEXT NOT NULL, + email TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() +); +`} + + + + +## Task Configuration + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "CustomersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + \{ + new CdcSinkTableConfig + \{ + Name = "Customers", + SourceTableName = "customers", + PrimaryKeyColumns = new List \{ "id" \}, + ColumnsMapping = new Dictionary + \{ + ["id"] = "Id", + ["name"] = "Name", + ["email"] = "Email", + ["created_at"] = "CreatedAt" + \} + \} + \} +\}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +`} + + + + +## Resulting Documents + +SQL row: + + + + +{`id=1, name='Alice', email='alice@example.com', created_at='2024-01-15 10:30:00+00' +`} + + + + +RavenDB document in collection `Customers` with ID `customers/1`: + + + + +{`\{ + "Id": 1, + "Name": "Alice", + "Email": "alice@example.com", + "CreatedAt": "2024-01-15T10:30:00+00:00", + "@metadata": \{ + "@collection": "Customers" + \} +\} +`} + + + + +Document IDs are generated as `{collection}/{pk}` — for example, `customers/1` +for a row with `id = 1`. + +--- + +## Related Articles + +### CDC Sink Examples + +- [Denormalization](./example-denormalization.mdx) +- [Event Sourcing](./example-event-sourcing.mdx) +- [Complex Nesting](./example-complex-nesting.mdx) + +### CDC Sink + +- [Schema Design](../../schema-design.mdx) +- [Column Mapping](../../column-mapping.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx new file mode 100644 index 0000000000..28e9872ddd --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx @@ -0,0 +1,217 @@ +--- +title: "CDC Sink for PostgreSQL: Initial Setup" +sidebar_label: Initial Setup +description: "How CDC Sink creates and verifies the replication slot and publication on startup, with options for automatic or manual setup and custom naming." +sidebar_position: 3 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Initial Setup + + + +* When CDC Sink starts, it verifies and (if it has the necessary permissions) creates + the **replication slot** and **publication** required for logical replication. + +* If the CDC Sink user does not have permission to create these objects, a database + administrator must create them manually before the task can start. + +* In this page: + * [Automatic Setup](#automatic-setup) + * [Manual Setup](#manual-setup) + * [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names) + * [Slot and Publication Naming (Auto-generated)](#slot-and-publication-naming-auto-generated) + * [Verifying Setup](#verifying-setup) + + + +--- + +## Automatic Setup + +If the CDC Sink user has the required permissions (see +[Permissions and Roles](./permissions-and-roles.mdx)), +CDC Sink will: + +1. Generate the replication slot and publication names (a GUID-based identifier) and store them with the task +2. Check whether they already exist +3. Create them if they do not exist +4. Begin the initial load + +No manual database administration is needed in this case. + +--- + +## Manual Setup + +If the CDC Sink user does not have permission to create replication slots or +publications, a database administrator must create them before the task is started. + +**Step 1: Determine the slot and publication names** + +The simplest approach is to specify the names explicitly in `CdcSinkPostgresSettings` +so both you and the database administrator know what names to use. +See [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names). + +If using auto-generated names (no `Postgres` settings), CDC Sink generates names +using the `rvn_cdc_s_` and `rvn_cdc_p_` prefixes followed by a GUID. +See [Slot and Publication Naming](#slot-and-publication-naming-auto-generated) +for the naming scheme. + +You can also find the names CDC Sink expects by creating the task (it will fail to start) +and reading the error message, which includes the expected names. + +**Step 2: Create the publication** + +Create a publication that includes all the tables CDC Sink will replicate: + + + + +{`CREATE PUBLICATION rvn_cdc_p_ +FOR TABLE orders, order_lines, customers; +`} + + + + +The publication must include all tables from the task's root and embedded table +configurations. + +**Step 3: Create the replication slot** + + + + +{`SELECT pg_create_logical_replication_slot( + 'rvn_cdc_s_', + 'pgoutput' +); +`} + + + + +**Step 4: Start the CDC Sink task** + +Once the slot and publication exist, CDC Sink will detect them on startup and +proceed with the initial load. + + +The slot and publication names are determined at task creation time and do not change +when you later modify the task. If you created these objects manually, the same names +will continue to be used regardless of subsequent configuration changes. + + +--- + +## Specifying Custom Slot and Publication Names + +You can explicitly specify the replication slot and publication names by setting +`CdcSinkPostgresSettings` on the task configuration: + + + + +{`var config = new CdcSinkConfiguration +\{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Postgres = new CdcSinkPostgresSettings + \{ + SlotName = "orders_sync_slot", + PublicationName = "orders_sync_pub" + \}, + Tables = [ ... ] +\}; +`} + + + + +Custom names are useful when: + +* A database administrator pre-creates the slot and publication with human-readable + names before starting the task +* You are migrating from a previous CDC Sink task and want to reuse an existing slot + to avoid re-reading history +* You need predictable names across environments (dev/staging/prod) + +**Immutability:** Once set, `SlotName` and `PublicationName` are fixed for the +lifetime of the task. If you need different names, delete the task and create a new one. + +--- + +## Slot and Publication Naming (Auto-generated) + +When `CdcSinkPostgresSettings` is not set (or `SlotName`/`PublicationName` are null), +CDC Sink generates unique names at task creation time using a GUID: + +* **Slot name**: `rvn_cdc_s_` +* **Publication name**: `rvn_cdc_p_` + +The GUID is generated once when the task is first created and stored with the task. + +**Example:** + + + + +{`rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 +rvn_cdc_p_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 +`} + + + + +The slot and publication share the same identifier, making it easy to match them to +a specific task. + + +The slot and publication names are generated **once at task creation** and then stored +with the task. Subsequent modifications to the task (adding tables, changing mappings, +etc.) do not change the slot or publication names — the original names are always used. + + +--- + +## Verifying Setup + +To verify the slot and publication were created: + + + + +{`-- View CDC Sink replication slots +SELECT slot_name, plugin, slot_type, active +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; + +-- View CDC Sink publications +SELECT p.pubname, c.relname AS table_name +FROM pg_publication p +JOIN pg_publication_rel pr ON pr.prpubid = p.oid +JOIN pg_class c ON c.oid = pr.prrelid +WHERE p.pubname LIKE 'rvn_cdc_p_%' +ORDER BY p.pubname, c.relname; +`} + + + + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Prerequisites Checklist](./prerequisites-checklist.mdx) +- [Permissions and Roles](./permissions-and-roles.mdx) +- [REPLICA IDENTITY](./replica-identity.mdx) +- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx new file mode 100644 index 0000000000..78390309b6 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx @@ -0,0 +1,120 @@ +--- +title: "CDC Sink for PostgreSQL: Monitoring PostgreSQL" +sidebar_label: Monitoring PostgreSQL +description: "PostgreSQL-side monitoring for CDC Sink, including replication slot health, replication lag, and WAL disk usage queries." +sidebar_position: 7 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Monitoring PostgreSQL + + + +* This page covers PostgreSQL-side monitoring for CDC Sink — replication slot health, + lag, and WAL usage. + +* For RavenDB-side monitoring, see [Monitoring](../monitoring.mdx). + +* In this page: + * [Replication Slot Health](#replication-slot-health) + * [Replication Lag](#replication-lag) + * [WAL Disk Usage](#wal-disk-usage) + + + +--- + +## Replication Slot Health + +Check that CDC Sink replication slots are active and being consumed: + + + + +{`SELECT slot_name, active, confirmed_flush_lsn +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; +`} + + + + +| Column | Meaning | +|--------|---------| +| `active` | `true` if CDC Sink is connected and consuming; `false` if the connection is down | +| `confirmed_flush_lsn` | The LSN up to which changes have been confirmed as consumed | + +A slot with `active = false` means CDC Sink is not currently connected. This is +expected during failover or when the task is paused. If the slot remains inactive +for an extended period, investigate the task state in RavenDB Studio. + +--- + +## Replication Lag + +Replication lag measures how far behind the slot is relative to the current WAL position: + + + + +{`SELECT slot_name, + pg_current_wal_lsn() - confirmed_flush_lsn AS lag_bytes +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; +`} + + + + +A consistently growing `lag_bytes` means CDC Sink is not keeping up with the rate +of changes in the source database. Consider: + +* Increasing `CdcSink.MaxBatchSize` to process more changes per batch +* Reducing load on the source database +* Checking the per-table processing statistics in the Management Studio for slow scripts — + complex patch scripts are a common cause of processing slowdowns + +--- + +## WAL Disk Usage + +PostgreSQL retains WAL segments until all replication slots have consumed them. +An inactive or slow slot can cause WAL to accumulate on disk. + +Check approximate WAL retained per slot: + + + + +{`SELECT slot_name, active, + pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS retained_wal_bytes +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; +`} + + + + +High `retained_wal_bytes` on an inactive slot indicates the slot is not being +consumed and is holding WAL. If the slot corresponds to a deleted or abandoned +CDC Sink task, drop it. +See [Cleanup and Maintenance](./cleanup-and-maintenance.mdx). + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) + +### CDC Sink + +- [Monitoring](../monitoring.mdx) +- [Failover and Consistency](../failover-and-consistency.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx new file mode 100644 index 0000000000..beb6b070d4 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx @@ -0,0 +1,149 @@ +--- +title: "CDC Sink for PostgreSQL: Permissions and Roles" +sidebar_label: Permissions and Roles +description: "PostgreSQL permissions required by the CDC Sink user, including minimum privileges, automatic setup permissions, and dedicated user creation examples." +sidebar_position: 2 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Permissions and Roles + + + +* This page documents the PostgreSQL permissions required by the CDC Sink user, + and how to grant them. + +* In this page: + * [Minimum Permissions](#minimum-permissions) + * [Permissions for Automatic Setup](#permissions-for-automatic-setup) + * [Creating a Dedicated CDC User](#creating-a-dedicated-cdc-user) + + + +--- + +## Minimum Permissions + +At a minimum, the CDC Sink user needs: + +* **`REPLICATION`** attribute — allows the user to initiate logical replication +* **`SELECT`** on each table being replicated — required for the initial load phase + +Example: + + + + +{`-- Grant replication privilege +ALTER USER cdc_user REPLICATION; + +-- Grant SELECT on each table +GRANT SELECT ON TABLE orders TO cdc_user; +GRANT SELECT ON TABLE order_lines TO cdc_user; +GRANT SELECT ON TABLE customers TO cdc_user; +`} + + + + +With only these permissions, a database administrator must manually create the +replication slot and publication before starting the CDC Sink task. +See [Initial Setup](./initial-setup.mdx). + +--- + +## Permissions for Automatic Setup + +If you want CDC Sink to create and manage the replication slot and publication +automatically, the user needs additional permissions: + +**Create/drop replication slots:** + +PostgreSQL 14+: + + + + +{`GRANT pg_replication_slot_admin TO cdc_user; +`} + + + + +PostgreSQL 10–13: Replication slot management requires `SUPERUSER`. + +**Create/drop publications:** + +The user must either own the tables being published, or have `SUPERUSER`. + +Alternatively, you can grant `CREATE` on the database: + + + + +{`GRANT CREATE ON DATABASE mydb TO cdc_user; +`} + + + + + +Granting `SUPERUSER` gives the user unrestricted access to the database server. +For production environments, prefer granting only the specific privileges listed +above rather than `SUPERUSER`. + + + +For added security in production, consider having your database administrator create +the replication slot and publication manually with the minimal permissions shown above, +rather than granting CDC Sink the ability to manage them automatically. The CDC Sink +user then only needs `REPLICATION` privilege and `SELECT` on the relevant tables. +See [Initial Setup](./initial-setup.mdx). + + +--- + +## Creating a Dedicated CDC User + +It is recommended to use a dedicated database user for CDC Sink rather than an +application or admin user. + +Example setup: + + + + +{`-- Create the user +CREATE USER cdc_user WITH PASSWORD 'secure_password' REPLICATION; + +-- Grant SELECT on tables to replicate +GRANT SELECT ON TABLE orders TO cdc_user; +GRANT SELECT ON TABLE order_lines TO cdc_user; + +-- If using PostgreSQL 14+ and want automatic slot management: +GRANT pg_replication_slot_admin TO cdc_user; + +-- If user needs to create publications (requires table ownership or superuser): +-- Option A: Grant ownership of tables +ALTER TABLE orders OWNER TO cdc_user; +-- Option B: Create publications as a superuser before starting the task +`} + + + + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Prerequisites Checklist](./prerequisites-checklist.mdx) +- [Initial Setup](./initial-setup.mdx) +- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx new file mode 100644 index 0000000000..ef223b2502 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx @@ -0,0 +1,157 @@ +--- +title: "CDC Sink for PostgreSQL: Prerequisites Checklist" +sidebar_label: Prerequisites Checklist +description: "Verify all requirements before creating a CDC Sink task for PostgreSQL, including WAL configuration, user permissions, table requirements, and network access." +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Prerequisites Checklist + + + +* Before creating a CDC Sink task for PostgreSQL, verify that each of these requirements + is in place. + +* In this page: + * [Source Database Requirements](#source-database-requirements) + * [User Permissions](#user-permissions) + * [Table Requirements](#table-requirements) + * [Network Access](#network-access) + + + +--- + +## Source Database Requirements + +* **PostgreSQL version**: 10 or later (logical replication introduced in version 10) + +* **WAL level**: `wal_level` must be set to `logical` + + Verify with: + + + + +{`SHOW wal_level; +`} + + + + + If the result is not `logical`, see [WAL Configuration](./wal-configuration.mdx). + +* **`max_replication_slots`**: Must be at least 1 (one slot per CDC Sink task) + + Verify with: + + + + +{`SHOW max_replication_slots; +`} + + + + +* **`max_wal_senders`**: Must be at least 1 + + Verify with: + + + + +{`SHOW max_wal_senders; +`} + + + + +--- + +## User Permissions + +The database user in the connection string must have sufficient permissions. + +**Minimum required permissions:** + + + + +{`-- Replication privilege (required for logical replication) +ALTER USER cdc_user REPLICATION; + +-- SELECT on each table CDC Sink will read +GRANT SELECT ON TABLE orders TO cdc_user; +GRANT SELECT ON TABLE order_lines TO cdc_user; +`} + + + + +**Optional (allows CDC Sink to configure replication automatically):** + + + + +{`-- Create/drop replication slots +-- This requires SUPERUSER or membership in pg_replication_slot_admin (PG 14+) + +-- Create/drop publications +-- This requires ownership of the tables being published, or SUPERUSER +`} + + + + +If the CDC Sink user does not have permission to create publications and replication +slots, a database administrator must set them up manually. +See [Initial Setup](./initial-setup.mdx). + +Full details: [Permissions and Roles](./permissions-and-roles.mdx). + +--- + +## Table Requirements + +* **Primary key**: Each root table and each embedded table must have a primary key + (or a unique index used as a replica identity). + +* **REPLICA IDENTITY**: For embedded tables where the join columns are not part of + the primary key, the table must have `REPLICA IDENTITY FULL` or a replica identity + index that includes the join columns. Without this, DELETE events will not include + the old row values, and CDC Sink cannot identify which embedded item to remove. + + See [REPLICA IDENTITY](./replica-identity.mdx). + +* **Published columns**: All columns referenced in `PrimaryKeyColumns`, `JoinColumns`, + and `ColumnsMapping` must exist in the SQL table. + +--- + +## Network Access + +* The RavenDB server must be able to open a TCP connection to the PostgreSQL host + on the configured port (default: 5432). + +* The connection must remain open for the duration of the replication stream. + Ensure that firewalls, proxies, and load balancers do not terminate idle or + long-lived connections. + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [WAL Configuration](./wal-configuration.mdx) +- [Permissions and Roles](./permissions-and-roles.mdx) +- [Initial Setup](./initial-setup.mdx) +- [REPLICA IDENTITY](./replica-identity.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx new file mode 100644 index 0000000000..d1172cad60 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx @@ -0,0 +1,141 @@ +--- +title: "CDC Sink for PostgreSQL: Manual REPLICA IDENTITY Setup" +sidebar_label: Manual REPLICA IDENTITY Setup +description: "Step-by-step instructions for a database administrator to configure REPLICA IDENTITY manually when CDC Sink lacks permission to alter tables." +sidebar_position: 5 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Manual REPLICA IDENTITY Setup + + + +* When CDC Sink does not have permission to alter tables, a database administrator + must configure `REPLICA IDENTITY` manually before the task starts. + +* In this page: + * [When Manual Setup Is Required](#when-manual-setup-is-required) + * [Setting REPLICA IDENTITY FULL](#setting-replica-identity-full) + * [Using an Index Instead of FULL](#using-an-index-instead-of-full) + * [Verifying the Configuration](#verifying-the-configuration) + + + +--- + +## When Manual Setup Is Required + +CDC Sink attempts to set `REPLICA IDENTITY FULL` automatically on any embedded +table whose join columns are not part of the primary key. This requires: + +* The CDC Sink user owns the table, **or** +* The CDC Sink user has `SUPERUSER` + +If neither condition is met, CDC Sink will start but embedded table deletes may +not work correctly. A database administrator must configure `REPLICA IDENTITY` +manually. + +--- + +## Setting REPLICA IDENTITY FULL + +The simplest approach is to set `REPLICA IDENTITY FULL` on all embedded tables +that CDC Sink will replicate: + + + + +{`ALTER TABLE order_lines REPLICA IDENTITY FULL; +ALTER TABLE line_attributes REPLICA IDENTITY FULL; +`} + + + + +`REPLICA IDENTITY FULL` includes all column values in DELETE and UPDATE events. +This is the most compatible option but increases WAL volume for tables with many +or large columns. + +--- + +## Using an Index Instead of FULL + +If WAL size is a concern, you can use a specific unique index that covers both +the join columns and PK columns of the embedded table. + +**Step 1: Create a unique index covering the required columns** + + + + +{`-- For order_lines: join column is order_id, PK is line_id +CREATE UNIQUE INDEX order_lines_replica_idx + ON order_lines (order_id, line_id); +`} + + + + +**Step 2: Set REPLICA IDENTITY to use this index** + + + + +{`ALTER TABLE order_lines + REPLICA IDENTITY USING INDEX order_lines_replica_idx; +`} + + + + +This instructs PostgreSQL to include only those indexed columns in DELETE and +UPDATE events, rather than all columns. + + +The index must be `UNIQUE` and `NOT DEFERRABLE`. It cannot include expressions +or partial predicates. All columns in the index must be `NOT NULL`. + + +--- + +## Verifying the Configuration + +Confirm that the desired `REPLICA IDENTITY` mode is set: + + + + +{`SELECT c.relname, c.relreplident, + CASE c.relreplident + WHEN 'd' THEN 'DEFAULT' + WHEN 'f' THEN 'FULL' + WHEN 'i' THEN 'INDEX' + WHEN 'n' THEN 'NOTHING' + END AS mode +FROM pg_class c +JOIN pg_namespace n ON n.oid = c.relnamespace +WHERE c.relkind = 'r' + AND n.nspname = 'public' +ORDER BY c.relname; +`} + + + + +Tables configured with `FULL` or `INDEX` are ready for CDC Sink embedded table +delete processing. + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [REPLICA IDENTITY](./replica-identity.mdx) +- [Initial Setup](./initial-setup.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx new file mode 100644 index 0000000000..571d76a7fb --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx @@ -0,0 +1,166 @@ +--- +title: "CDC Sink for PostgreSQL: REPLICA IDENTITY" +sidebar_label: REPLICA IDENTITY +description: "How PostgreSQL REPLICA IDENTITY affects CDC Sink's ability to process DELETE events for embedded tables, and when it must be configured." +sidebar_position: 4 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: REPLICA IDENTITY + + + +* **REPLICA IDENTITY** controls what column values PostgreSQL includes in DELETE + (and UPDATE) events in the logical replication stream. + +* CDC Sink requires old row values in DELETE events to identify which embedded + item to remove from a parent document. Without them, embedded table deletes + cannot be routed correctly. + +* In this page: + * [Why REPLICA IDENTITY Matters](#why-replica-identity-matters) + * [REPLICA IDENTITY Options](#replica-identity-options) + * [When Is REPLICA IDENTITY Required?](#when-is-replica-identity-required) + * [Checking Current Setting](#checking-current-setting) + * [Automatic vs Manual Configuration](#automatic-vs-manual-configuration) + + + +--- + +## Why REPLICA IDENTITY Matters + +When CDC Sink receives a DELETE event for an embedded table, it needs to: + +1. Find the parent document (using the join column values from the old row) +2. Find the matching item within the embedded array or map (using the PK column values) +3. Remove it + +If the DELETE event does not include old row values for the join columns and PK +columns, CDC Sink cannot perform steps 1 or 2. + +By default, PostgreSQL only includes the primary key columns in DELETE events. +If the embedded table's join columns are part of the primary key, this is sufficient. +If they are not — which is the common case when a table has a surrogate PK — the +DELETE event will be missing the columns needed to route it. + +--- + +## REPLICA IDENTITY Options + +PostgreSQL supports four REPLICA IDENTITY modes: + +| Mode | What's included in DELETE/UPDATE events | Notes | +|------|----------------------------------------|-------| +| `DEFAULT` | Primary key columns only | Default for tables with a PK | +| `FULL` | All columns | Works for any table structure; increases WAL size | +| `INDEX` | Columns covered by a specific unique index | More targeted than FULL | +| `NOTHING` | No old values | Insufficient for CDC Sink embedded table deletes | + +For CDC Sink, `FULL` is the simplest and most compatible choice. +`INDEX` works if the index covers both the join columns and PK columns. + +--- + +## When Is REPLICA IDENTITY Required? + +| Scenario | REPLICA IDENTITY needed? | +|----------|------------------------| +| Root table deletes | No — root documents are deleted by document ID | +| Embedded table deletes where join columns ARE part of the PK | No — `DEFAULT` is sufficient | +| Embedded table deletes where join columns are NOT part of the PK | **Yes** — `DEFAULT` is insufficient | +| Deep-nested embedded tables | Depends on the join column placement | + +**Example where REPLICA IDENTITY is needed:** + + + + +{`-- order_lines has a surrogate PK (line_id), with order_id as foreign key +-- order_id is NOT part of the primary key +CREATE TABLE order_lines ( + line_id SERIAL PRIMARY KEY, -- PK + order_id INT NOT NULL, -- FK to orders (not part of PK) + product TEXT, + qty INT +); + +-- Without REPLICA IDENTITY FULL, a DELETE event only contains line_id. +-- CDC Sink cannot determine which parent document (order_id) to update. +ALTER TABLE order_lines REPLICA IDENTITY FULL; +`} + + + + +**Example where REPLICA IDENTITY is NOT needed:** + + + + +{`-- If order_id is part of a composite PK, DEFAULT is sufficient +CREATE TABLE order_lines ( + order_id INT NOT NULL, + line_num INT NOT NULL, + product TEXT, + qty INT, + PRIMARY KEY (order_id, line_num) +); +`} + + + + +--- + +## Checking Current Setting + + + + +{`SELECT c.relname, c.relreplident +FROM pg_class c +JOIN pg_namespace n ON n.oid = c.relnamespace +WHERE c.relkind = 'r' + AND n.nspname = 'public' +ORDER BY c.relname; +`} + + + + +The `relreplident` column: + +| Value | Meaning | +|-------|---------| +| `d` | DEFAULT (primary key only) | +| `f` | FULL (all columns) | +| `i` | INDEX (specific unique index) | +| `n` | NOTHING | + +--- + +## Automatic vs Manual Configuration + +If the CDC Sink user has sufficient permissions (table ownership or `SUPERUSER`), +CDC Sink will automatically set `REPLICA IDENTITY FULL` on embedded tables that +require it. + +If the CDC Sink user does not have permission to alter tables, a database +administrator must configure `REPLICA IDENTITY` before starting the task. +See [Manual Setup](./replica-identity-manual-setup.mdx). + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Manual REPLICA IDENTITY Setup](./replica-identity-manual-setup.mdx) +- [Initial Setup](./initial-setup.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx new file mode 100644 index 0000000000..0cedc92e5f --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx @@ -0,0 +1,96 @@ +--- +title: "CDC Sink for PostgreSQL: Studio UI" +sidebar_label: Studio UI +description: "How to create, monitor, and edit CDC Sink tasks for PostgreSQL through the RavenDB Management Studio Ongoing Tasks interface." +sidebar_position: 8 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Studio UI + + + +* CDC Sink tasks are created and managed through the **Ongoing Tasks** section of the + Management Studio. + +* In this page: + * [Creating a CDC Sink Task](#creating-a-cdc-sink-task) + * [Monitoring Task State](#monitoring-task-state) + * [Editing a Task](#editing-a-task) + + + +--- + +## Creating a CDC Sink Task + +To create a CDC Sink task in the Studio: + +1. Navigate to **Databases** → your database → **Ongoing Tasks** +2. Click **Add Task** and select **CDC Sink** +3. Configure the connection string pointing to the PostgreSQL source +4. Add one or more root tables with their column mappings +5. (Optional) Add embedded tables and linked tables for each root table +6. (Optional) Configure patches for INSERT/UPDATE/DELETE events +7. Click **Save** + +--- + +## Monitoring Task State + +The task list shows: + +* **Task name** and **connection string name** +* **State** — Active, Disabled, Error, or FallbackMode +* **Responsible node** — the cluster node currently running the task +* **Progress** — during initial load, shows which tables have been scanned + +Clicking on a task opens the detail view with per-table statistics. + +--- + +## Editing a Task + +To edit a task, click its name in the Ongoing Tasks list. The same configuration +form used for creation opens in edit mode. + + +The replication slot and publication names are **fixed at task creation** and do not +change when you edit the task — regardless of whether names were auto-generated or +specified explicitly. + +When you add or remove tables, CDC Sink continues using the same slot and publication +names. The **publication** in PostgreSQL controls which tables are replicated and must +be kept in sync with the task configuration: + +* **Adding a table:** If CDC Sink has the necessary permissions, it will automatically + run `ALTER PUBLICATION ADD TABLE ;` when the task is saved. If it does + not have permissions, a database administrator must run this manually. +* **Removing a table:** `ALTER PUBLICATION DROP TABLE
;` must be run + manually by a database administrator — CDC Sink does not remove tables from the + publication automatically. + +Orphaned slots and publications must be dropped manually by the database administrator. +See [Cleanup and Maintenance](./cleanup-and-maintenance.mdx). + + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Initial Setup](./initial-setup.mdx) +- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) + +### CDC Sink + +- [Monitoring](../monitoring.mdx) +- [API Reference](../api-reference.mdx) +- [Configuration Reference](../configuration-reference.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx new file mode 100644 index 0000000000..e4263bfdf8 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx @@ -0,0 +1,128 @@ +--- +title: "CDC Sink for PostgreSQL: WAL Configuration" +sidebar_label: WAL Configuration +description: "How to verify and configure the PostgreSQL Write-Ahead Log level to enable logical replication required by CDC Sink." +sidebar_position: 1 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: WAL Configuration + + + +* CDC Sink uses PostgreSQL **logical replication**, which requires the Write-Ahead Log + (WAL) to be configured at the `logical` level. + +* This page explains how to verify the current setting and change it if needed. + +* In this page: + * [Check Current WAL Level](#check-current-wal-level) + * [Enable Logical Replication](#enable-logical-replication) + * [Other Required Settings](#other-required-settings) + + + +--- + +## Check Current WAL Level + +Connect to your PostgreSQL instance and run: + + + + +{`SHOW wal_level; +`} + + + + +If the result is `logical`, no changes are needed. + +If the result is `replica` or `minimal`, logical replication is not enabled and +must be configured before CDC Sink can run. + +--- + +## Enable Logical Replication + +Edit `postgresql.conf` and set the following: + + + + +{`wal_level = logical +`} + + + + +This change requires a **PostgreSQL restart**. + +After restarting, verify the change took effect: + + + + +{`SHOW wal_level; +-- Should return: logical +`} + + + + + +Changing `wal_level` requires a full server restart, not just a configuration reload. +Plan for a brief maintenance window. + + +--- + +## Other Required Settings + +CDC Sink uses one replication slot per task. Ensure the following settings are +sufficient for the number of CDC Sink tasks you plan to run: + + + + +{`max_replication_slots = 10 -- at least 1 per CDC Sink task +max_wal_senders = 10 -- at least 1 per active replication connection +`} + + + + +The defaults in a standard PostgreSQL installation are typically sufficient for +a small number of tasks, but you may need to increase them if you have many +concurrent CDC Sink tasks or other replication consumers. + +Check current values: + + + + +{`SHOW max_replication_slots; +SHOW max_wal_senders; +`} + + + + +These settings also require a **server restart** if changed. + +--- + +## Related Articles + +### CDC Sink for PostgreSQL + +- [Prerequisites Checklist](./prerequisites-checklist.mdx) +- [Permissions and Roles](./permissions-and-roles.mdx) +- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx new file mode 100644 index 0000000000..e150618ccf --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -0,0 +1,155 @@ +--- +title: "CDC Sink: Property Retention" +sidebar_label: Property Retention +description: "Explains how CDC Sink merges UPDATE events onto existing RavenDB documents, preserving properties that are not part of the column mapping." +sidebar_position: 8 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Property Retention + + + +* When CDC Sink applies an UPDATE to an existing RavenDB document, it **merges** + the new values onto the existing document rather than replacing it entirely. + +* Properties that are not part of the column mapping are preserved across updates. + This allows RavenDB-side data to coexist safely with CDC-managed properties. + +* In this page: + * [How Merging Works](#how-merging-works) + * [What Is and Isn't Preserved](#what-is-and-isnt-preserved) + * [Editing Documents Directly in RavenDB](#editing-documents-directly-in-ravendb) + * [Implications for Patches](#implications-for-patches) + + + +--- + +## How Merging Works + +When a CDC UPDATE arrives for a document that already exists: + +1. The existing document is loaded +2. Mapped column values from the CDC event overwrite the corresponding properties +3. All other properties on the document are left unchanged +4. The merged document is written back + +**Example:** + +Initial SQL row → initial document: + + + + +{`\{ + "Id": 1, + "Name": "Alice", + "Email": "alice@example.com", + "InternalNotes": "VIP customer", + "@metadata": \{ "@collection": "Customers" \} +\} +`} + + + + +SQL UPDATE: `UPDATE customers SET email = 'alice.new@example.com' WHERE id = 1` + +Document after CDC UPDATE: + + + + +{`\{ + "Id": 1, + "Name": "Alice", + "Email": "alice.new@example.com", + "InternalNotes": "VIP customer", + "@metadata": \{ "@collection": "Customers" \} +\} +`} + + + + +`Email` is updated from SQL, while `InternalNotes` (not in `ColumnsMapping`) is preserved. + +--- + +## What Is and Isn't Preserved + +**Preserved across CDC updates:** + +* Properties not listed in `ColumnsMapping` +* Properties set in RavenDB directly (annotations, computed values, flags) +* Document metadata (unless the patch explicitly modifies it) + +**Overwritten on CDC update:** + +* Any property mapped via `ColumnsMapping` — always updated to match the current SQL value + +If you manually edit a property that is part of `ColumnsMapping`, the next CDC UPDATE +for that row will overwrite your edit with the SQL value. + +--- + +## Editing Documents Directly in RavenDB + +You can safely add properties to CDC-managed documents: + + + + +{`\{ + "Id": 1, + "Name": "Alice", + "Email": "alice@ex.com", + "InternalNotes": "...", + "ReviewedAt": "...", + "Tags": ["vip"] +\} +`} + + + + +Properties managed by CDC (those in `ColumnsMapping`) will be overwritten on +the next UPDATE from the source database. Do not rely on manual edits to mapped +properties surviving future CDC updates. + +**CDC Sink does not detect or protect manual edits to mapped properties.** +If you need to preserve a value that comes from SQL, consider adding a separate +RavenDB-only property for your annotation and leaving the SQL-mapped property as-is. + +--- + +## Implications for Patches + +Patches run after column mapping and can set additional properties that are not +from `ColumnsMapping`. These patch-computed properties follow the same merge rules: + +* If a patch sets `this.ComputedField = ...`, that value persists across future events + where the patch doesn't explicitly change it +* If a patch sets a property that is also in `ColumnsMapping`, the column mapping + value takes precedence (mapping is applied before patching) + +For aggregates maintained via patches (e.g., `RunningTotal`), the patch itself +is responsible for keeping the value correct across INSERT, UPDATE, and DELETE events. +See [Patching](./patching.mdx). + +--- + +## Related Articles + +### CDC Sink + +- [Column Mapping](./column-mapping.mdx) +- [Patching](./patching.mdx) +- [How It Works](./how-it-works.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx new file mode 100644 index 0000000000..e874dbeeeb --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -0,0 +1,328 @@ +--- +title: "CDC Sink: Schema Design" +sidebar_label: Schema Design +description: "Explains how CDC Sink maps a relational schema to a RavenDB document model using root tables, embedded tables, and linked tables." +sidebar_position: 2 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Schema Design + + + +* CDC Sink maps a relational schema to a RavenDB document model through configuration. + This page explains the three building blocks — root tables, embedded tables, and + linked tables — and how to combine them. + +* In this page: + * [Root Tables](#root-tables) + * [Embedded Tables](#embedded-tables) + * [Linked Tables](#linked-tables) + * [Primary Key and Join Column Requirements](#primary-key-and-join-column-requirements) + * [Multi-Level Nesting](#multi-level-nesting) + * [Relation Types](#relation-types) + * [Choosing Between Embedded and Linked](#choosing-between-embedded-and-linked) + + + +--- + +## Root Tables + +A **root table** maps a SQL table to a RavenDB collection. Each row in the SQL table +becomes one document. + + + + +{`new CdcSinkTableConfig +\{ + Name = "Orders", // RavenDB collection name + SourceTableSchema = "public", // SQL schema (optional, default: "public") + SourceTableName = "orders", // SQL table name + PrimaryKeyColumns = ["id"], // Used for document ID generation + ColumnsMapping = new Dictionary + \{ + ["id"] = "Id", + ["customer_name"] = "CustomerName", + ["total"] = "Total" + \} +\} +`} + + + + +**Document ID generation:** `\{CollectionName\}/\{pk1\}/\{pk2\}/...` +A row with `id = 42` and collection `Orders` becomes document `Orders/42`. +A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. + +**Column mapping:** Only mapped columns appear in the document. Unmapped columns are +still available in patch scripts via `$row` but are not stored in the document. + +--- + +## Embedded Tables + +An **embedded table** creates nested data within a parent document. For example, a +SQL `order_lines` table becomes an array inside each `Orders` document. + + + + +{`new CdcSinkTableConfig +\{ + Name = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + ColumnsMapping = \{ ["id"] = "Id", ["customer_name"] = "CustomerName" \}, + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "order_lines", + PropertyName = "Lines", // Property in parent document + Type = CdcSinkRelationType.Array, // Array of items + JoinColumns = ["order_id"], // FK referencing parent's PK + PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete + ColumnsMapping = + \{ + ["line_id"] = "LineId", + ["product"] = "Product", + ["quantity"] = "Quantity" + \} + \} + ] +\} +`} + + + + +This produces documents like: + + + + +{`\{ + "Id": 1, + "CustomerName": "Alice", + "Lines": [ + \{ "LineId": 1, "Product": "Apples", "Quantity": 5 \}, + \{ "LineId": 2, "Product": "Bananas", "Quantity": 3 \} + ], + "@metadata": \{ "@collection": "Orders" \} +\} +`} + + + + +--- + +## Linked Tables + +A **linked table** creates a document ID reference rather than embedding data. +A foreign key in the source row becomes a RavenDB document ID. + + + + +{`new CdcSinkTableConfig +\{ + Name = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + ColumnsMapping = \{ ["id"] = "Id", ["customer_id"] = "CustomerId" \}, + LinkedTables = + [ + new CdcSinkLinkedTableConfig + \{ + SourceTableName = "customers", + PropertyName = "Customer", // Property in parent document + LinkedCollectionName = "Customers", // Target collection for ID + Type = CdcSinkRelationType.Value, // Single reference + JoinColumns = ["customer_id"] // FK used to build the ID + \} + ] +\} +`} + + + + +With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. + +--- + +## Primary Key and Join Column Requirements + +### Root Tables + +The `PrimaryKeyColumns` list defines which SQL columns are used to generate the document ID. +All PK columns must be present in every INSERT, UPDATE, and DELETE event. + +### Embedded Tables (One Level) + +An embedded table needs: + +* **PrimaryKeyColumns** — Used to match items within the parent's array for UPDATE and DELETE +* **JoinColumns** — Foreign key referencing the parent's `PrimaryKeyColumns` + +The `JoinColumns` must exactly match the parent's `PrimaryKeyColumns`: + +| Parent PK | Required JoinColumns | Valid? | +|-----------|---------------------|--------| +| `[id]` | `[order_id]` where `order_id` = parent's `id` | ✓ | +| `[id, year]` | `[order_id, order_year]` | ✓ | +| `[id]` | `[customer_id, order_id]` | ✗ Extra column not from parent PK | +| `[id, year]` | `[order_id]` | ✗ Missing `order_year` | + +### DELETE Events and REPLICA IDENTITY + +For DELETE events, the source database must include the join column values so CDC Sink +can route the delete to the correct parent document. + +If the join column is not part of the SQL table's primary key, the source database may +need additional configuration to include it in DELETE events. + +See [REPLICA IDENTITY](./postgres/replica-identity.mdx) for +the PostgreSQL-specific requirement and how CDC Sink handles it automatically. + +--- + +## Multi-Level Nesting + +Embedded tables can themselves have embedded tables, creating arbitrarily deep hierarchies. + +**Example: Company → Departments → Employees** + + + + +{`new CdcSinkTableConfig +\{ + Name = "Companies", + SourceTableName = "companies", + PrimaryKeyColumns = ["company_id"], + ColumnsMapping = \{ ["company_id"] = "CompanyId", ["name"] = "Name" \}, + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "departments", + PropertyName = "Departments", + Type = CdcSinkRelationType.Array, + JoinColumns = ["company_id"], // Root FK + PrimaryKeyColumns = ["dept_id"], + ColumnsMapping = \{ ["dept_id"] = "DeptId", ["dept_name"] = "DeptName" \}, + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + \{ + SourceTableName = "employees", + PropertyName = "Employees", + Type = CdcSinkRelationType.Array, + JoinColumns = ["company_id", "dept_id"], // Root FK + parent FK + PrimaryKeyColumns = ["emp_id"], + ColumnsMapping = \{ ["emp_id"] = "EmpId", ["emp_name"] = "EmpName" \} + \} + ] + \} + ] +\} +`} + + + + +**Critical requirement for deep nesting:** All descendant tables must carry the root +table's primary key as a denormalized column. The `employees` table must have +`company_id` even though it joins directly to `departments` via `dept_id`. + +This is required because CDC Sink needs to route every row to the correct root document +in a single pass, without additional lookups. + +**SQL schema to support this:** + + + + +{`CREATE TABLE employees ( + company_id INT NOT NULL, -- Denormalized root FK + dept_id INT NOT NULL, -- Parent FK + emp_id INT NOT NULL, -- Local PK + emp_name VARCHAR(200), + PRIMARY KEY (company_id, dept_id, emp_id) +); +`} + + + + +Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY +configuration — the default DELETE events include all PK columns. + +--- + +## Relation Types + +The `Type` property on embedded and linked tables controls the document structure: + +| Type | Use Case | Document Structure | +|------|----------|--------------------| +| `Array` | One-to-many: parent has many children | `"Lines": [\{ ... \}, \{ ... \}]` | +| `Map` | One-to-many with direct key lookup | `"Lines": \{ "1": \{ ... \}, "2": \{ ... \} \}` | +| `Value` | Many-to-one: parent has one child/reference | `"Customer": \{ ... \}` or `"Customer": "Customers/42"` | + +**Array** — Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. +Use when you need to iterate over all items. + +**Map** — Items are stored as a JSON object keyed by the primary key value(s). +Use when you need fast direct-key access within the document. + +**Value** — Stores a single embedded object or document reference. +Use for many-to-one relationships (many orders share one customer). + +--- + +## Choosing Between Embedded and Linked + +| Consideration | Embedded | Linked | +|--------------|----------|--------| +| Data location | Stored inside parent document | Stored in a separate document | +| Access pattern | Read parent to get all data | Load parent, then load referenced doc | +| Updates | Automatic via CDC | Automatic via CDC for each table | +| Document size | Grows with embedded items | Parent stays small | +| Use case | Parent owns child (orders own lines) | Independent entities (orders reference customers) | + +**Use embedded tables** when: +* The child entity has no meaning outside the parent (order lines without an order) +* You always read the parent and child together +* You want a single-document read + +**Use linked tables** when: +* The referenced entity is independently meaningful (customers exist without orders) +* The referenced entity is shared by many parents +* You want RavenDB's include loading to handle the join + +--- + +## Related Articles + +### CDC Sink + +- [Embedded Tables](./embedded-tables.mdx) +- [Linked Tables](./linked-tables.mdx) +- [Column Mapping](./column-mapping.mdx) +- [Configuration Reference](./configuration-reference.mdx) + +### PostgreSQL + +- [REPLICA IDENTITY](./postgres/replica-identity.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx new file mode 100644 index 0000000000..c3e33d951d --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -0,0 +1,77 @@ +--- +title: "CDC Sink: Server Configuration" +sidebar_label: Server Configuration +description: "Documents the RavenDB server configuration keys that control CDC Sink task behavior, including batch size, fallback timeout, and poll interval." +sidebar_position: 15 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Server Configuration + + + +* This page documents the RavenDB server configuration keys that control CDC Sink + task behavior. + +* In this page: + * [Configuration Keys](#configuration-keys) + + + +--- + +## Configuration Keys + +These keys can be set in `settings.json` or passed as environment variables. +See [Configuration Overview](../../../server/configuration/configuration-options). + +--- + +#### `CdcSink.MaxBatchSize` + +**Default:** `1024` + +The maximum number of change events processed in a single batch. Larger values +increase throughput but also increase memory usage per batch. + +--- + +#### `CdcSink.MaxFallbackTimeInSec` + +**Default:** `900` (15 minutes) + +How long the task will remain in fallback mode (continuously retrying) after losing +connection to the source database before reporting an error. + +Set to `0` to disable fallback mode entirely — the task will move to error state +immediately on connection failure. + +--- + +#### `CdcSink.PollIntervalInSec` + +**Default:** `1` + +How frequently CDC Sink polls the source database for new change events when the +stream is idle. A shorter interval reduces latency but increases polling load on +the source. + +--- + +## Related Articles + +### CDC Sink + +- [Overview](./overview.mdx) +- [Monitoring](./monitoring.mdx) +- [Failover and Consistency](./failover-and-consistency.mdx) + +### Server Configuration + +- [Configuration Overview](../../../server/configuration/configuration-options) diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json b/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json new file mode 100644 index 0000000000..53959810fc --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json @@ -0,0 +1 @@ +{"position": 17, "label": "SQL Server"} diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx new file mode 100644 index 0000000000..0552dc23a4 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx @@ -0,0 +1,38 @@ +--- +title: "CDC Sink for SQL Server: Overview" +sidebar_label: Overview +description: "Overview of CDC Sink support for SQL Server, including planned availability and links to existing PostgreSQL documentation." +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for SQL Server: Overview + + + +* CDC Sink support for SQL Server is planned for a future release. + + + + +This section will cover the prerequisites, setup, and SQL Server-specific +configuration for CDC Sink when SQL Server support is available. + +In the meantime, see the [PostgreSQL documentation](../postgres/prerequisites-checklist.mdx) +for the full CDC Sink feature documentation. + + +--- + +## Related Articles + +### CDC Sink + +- [Overview](../overview.mdx) +- [PostgreSQL: Prerequisites Checklist](../postgres/prerequisites-checklist.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx new file mode 100644 index 0000000000..8afe70e1e3 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -0,0 +1,195 @@ +--- +title: "CDC Sink: Troubleshooting" +sidebar_label: Troubleshooting +description: "Covers common problems encountered when running CDC Sink tasks and how to resolve them, including startup failures, error states, and missing documents." +sidebar_position: 14 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Troubleshooting + + + +* This page covers common problems encountered when running CDC Sink tasks and how + to resolve them. + +* In this page: + * [Task Won't Start](#task-wont-start) + * [Task Enters Error State](#task-enters-error-state) + * [Documents Not Appearing](#documents-not-appearing) + * [Embedded Items Missing or Incorrect](#embedded-items-missing-or-incorrect) + * [DELETE Not Applied](#delete-not-applied) + * [Patch Errors](#patch-errors) + + + +--- + +## Task Won't Start + +**Symptom:** Task remains in `Error` state immediately after creation. + +**Common causes:** + +* **Invalid connection string** — verify the connection string name matches one defined + in the SQL connection strings section of the Management Studio. + +* **Connection refused** — the source database is unreachable from the RavenDB server. + Verify host, port, and firewall rules. + +* **Authentication failure** — the credentials in the connection string are incorrect + or the user does not have the required permissions. + See the PostgreSQL [Permissions and Roles](./postgres/permissions-and-roles.mdx) page. + +* **WAL level not set to `logical`** — CDC Sink requires logical replication enabled + on the source. + See [WAL Configuration](./postgres/wal-configuration.mdx). + +Check the error message in the Notification Center (bell icon in Studio) for the +specific failure reason. + +--- + +## Task Enters Error State + +**Symptom:** Task was running, then stopped with an error. + +**Common causes:** + +* **Replication slot dropped** — if the PostgreSQL replication slot was dropped + externally, CDC Sink cannot resume. The task must be deleted and recreated (a new + slot will be created on next start). + +* **Source table schema changed** — adding or removing columns from the SQL table + may cause mapping errors. Update the task configuration to match the new schema. + +* **Replication lag too large** — if CDC Sink falls behind significantly, PostgreSQL + may retain WAL segments that fill the disk. See your PostgreSQL documentation on + `wal_keep_size` and replication slot lag. + +* **Exceeded fallback timeout** — the source was unreachable for longer than + `CdcSink.MaxFallbackTimeInSec`. The task moves to error state after this timeout. + Restore connectivity and re-enable the task. + +--- + +## Documents Not Appearing + +**Symptom:** SQL rows exist but corresponding RavenDB documents are not created. + +**Check:** + +1. **Initial load in progress** — CDC Sink performs a full table scan before streaming. + For large tables this can take time. Check the task progress in Studio. + +2. **Table is disabled** — verify `Disabled` is not set to `true` on the `CdcSinkTableConfig`. + +3. **Primary key mismatch** — the columns listed in `PrimaryKeyColumns` must match the + actual SQL primary key. If they don't match, CDC Sink cannot generate a document ID. + +4. **ColumnsMapping is empty** — at least one column must be mapped. A table with no + column mappings will produce empty documents. + +5. **Task is paused** — check that the task state is `Active`, not `Disabled`. + +--- + +## Embedded Items Missing or Incorrect + +**Symptom:** Parent document exists but embedded array/map is empty or items are missing. + +**Check:** + +1. **JoinColumns mismatch** — the `JoinColumns` in `CdcSinkEmbeddedTableConfig` must + reference the same columns (by name) that the SQL foreign key uses. Verify these + match the parent table's `PrimaryKeyColumns`. + +2. **PrimaryKeyColumns wrong** — the embedded table's `PrimaryKeyColumns` are used to + match items on UPDATE and DELETE. If they're wrong, new items may be created as + duplicates or existing items may not be found. + +3. **DELETE not reflected** — if embedded item rows are being deleted in SQL but the + items remain in RavenDB, check whether `REPLICA IDENTITY` is configured for the + embedded table. Without it, PostgreSQL does not include the old row values in the + DELETE event, and CDC Sink cannot identify which item to remove. + See [REPLICA IDENTITY](./postgres/replica-identity.mdx). + +4. **Type mismatch (Array vs Map)** — if the `Type` was changed from `Array` to `Map` + or vice versa after documents were already created, existing documents retain the + old structure. Re-process from scratch or migrate existing documents. + +--- + +## DELETE Not Applied + +**Symptom:** A row was deleted from SQL but the RavenDB document still exists. + +**Check:** + +1. **`IgnoreDeletes = true`** — if `OnDelete.IgnoreDeletes` is set to `true`, the + delete is intentionally discarded. Verify this is the intended behavior. + +2. **Missing REPLICA IDENTITY (embedded tables)** — for embedded table items, + PostgreSQL must include old row values in DELETE events so CDC Sink knows which + parent document to update. If `REPLICA IDENTITY` is not set to `FULL` (or to + an index that includes join columns), the DELETE event may be missing the columns + needed to route it. + See [REPLICA IDENTITY](./postgres/replica-identity.mdx). + +3. **Custom patch returns without deleting** — if an `OnDelete.Patch` is configured + that does not allow the delete to proceed (combined with `IgnoreDeletes = true`), + the document is kept. Review the patch logic. + +--- + +## Patch Errors + +**Symptom:** Task enters error state with a message referencing a JavaScript patch failure. + +**Check:** + +1. **Script syntax error** — test the patch script in the Management Studio's patch + editor before using it in CDC Sink. + +2. **Null reference** — `$row` properties and `$old` may be `null` for certain event + types. Use optional chaining: `$old?.Amount || 0`. + +3. **`get()` returns null** — a document loaded with `get()` may not exist yet if CDC + Sink processes tables out of dependency order. Guard with a null check: + + + + +{`const related = get("Collection/123"); +if (related) \{ ... \} +`} + + + + +4. **Step limit exceeded** — patch scripts have a step quota. If the script is very + long-running or loops over large arrays, it may hit `Patching.MaxStepsForScript`. + See the [configuration reference](../../../server/configuration/patching-configuration) for this setting. + +--- + +## Related Articles + +### CDC Sink + +- [How It Works](./how-it-works.mdx) +- [Monitoring](./monitoring.mdx) +- [Patching](./patching.mdx) +- [Failover and Consistency](./failover-and-consistency.mdx) + +### PostgreSQL + +- [WAL Configuration](./postgres/wal-configuration.mdx) +- [Permissions and Roles](./postgres/permissions-and-roles.mdx) +- [REPLICA IDENTITY](./postgres/replica-identity.mdx) From 92456748957076de84e71522805b36394905d130 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:17:54 +0300 Subject: [PATCH 02/84] RavenDB-26046 - Update CDC Sink docs for new Columns API and additional features - Replace ColumnsMapping (Dictionary) + AttachmentNameMapping (Dictionary) with unified Columns list of CdcColumnMapping { Column, Name, Type } across all files - Add CdcColumnType enum documentation (Default, Json, Attachment) - Add REST API endpoints table to configuration-reference - Add CdcSink.PollIntervalInSec to server-configuration - Add error handling details to monitoring (threshold, fallback, exponential backoff) - Add ALTER PUBLICATION auto-fix note to postgres/initial-setup - Fix how-it-works: sequential scan description, Child Before Parent section - Fix Startup and Verification: split into per-database subsections - Update all prose references from ColumnsMapping to Columns list --- .../ongoing-tasks/cdc-sink/api-reference.mdx | 24 ++-- .../cdc-sink/attachment-handling.mdx | 51 ++++--- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 131 ++++++++---------- .../cdc-sink/configuration-reference.mdx | 53 ++++++- .../cdc-sink/embedded-tables.mdx | 24 ++-- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 36 +++-- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 6 +- .../ongoing-tasks/cdc-sink/monitoring.mdx | 21 +++ .../ongoing-tasks/cdc-sink/patching.mdx | 12 +- .../examples/example-complex-nesting.mdx | 34 ++--- .../examples/example-denormalization.mdx | 28 ++-- .../examples/example-event-sourcing.mdx | 26 ++-- .../examples/example-simple-migration.mdx | 14 +- .../cdc-sink/postgres/initial-setup.mdx | 3 +- .../postgres/prerequisites-checklist.mdx | 2 +- .../cdc-sink/property-retention.mdx | 14 +- .../ongoing-tasks/cdc-sink/schema-design.mdx | 36 ++--- .../cdc-sink/server-configuration.mdx | 2 + .../cdc-sink/troubleshooting.mdx | 2 +- 19 files changed, 289 insertions(+), 230 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index 8be425736a..94af8e2688 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -48,12 +48,12 @@ Use `AddCdcSinkOperation` to create a new CDC Sink task: Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = new List \{ "id" \}, - ColumnsMapping = new Dictionary - \{ - ["id"] = "Id", - ["customer_name"] = "CustomerName", - ["total"] = "Total" - \} + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "customer_name", Name = "CustomerName" \}, + new() \{ Column = "total", Name = "Total" \}, + ] \} \} \}; @@ -90,12 +90,12 @@ config.Tables.Add(new CdcSinkTableConfig Name = "Customers", SourceTableName = "customers", PrimaryKeyColumns = new List \{ "id" \}, - ColumnsMapping = new Dictionary - \{ - ["id"] = "Id", - ["name"] = "Name", - ["email"] = "Email" - \} + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "name", Name = "Name" \}, + new() \{ Column = "email", Name = "Email" \}, + ] \}); await store.Maintenance.SendAsync( diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 1f60880eab..5a77cb1cbd 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Attachment Handling" sidebar_label: Attachment Handling -description: "Explains how to store binary SQL columns as RavenDB attachments using AttachmentNameMapping on root and embedded table configurations." +description: "Explains how to store binary SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." sidebar_position: 9 --- @@ -16,8 +16,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* Binary SQL columns can be stored as RavenDB **attachments** instead of document - properties using `AttachmentNameMapping`. +* Binary SQL columns (bytea, varbinary, etc.) can be stored as RavenDB **attachments** + by setting `Type = CdcColumnType.Attachment` on the column mapping entry. * This applies to both root tables and embedded tables. @@ -33,7 +33,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; ## Root Table Attachments -Use `AttachmentNameMapping` to map a binary SQL column to a RavenDB attachment: +Set `Type = CdcColumnType.Attachment` on a `Columns` entry to store a binary SQL +column as a RavenDB attachment: @@ -43,16 +44,13 @@ Use `AttachmentNameMapping` to map a binary SQL column to a RavenDB attachment: Name = "Files", SourceTableName = "files", PrimaryKeyColumns = ["id"], - ColumnsMapping = new Dictionary - \{ - ["id"] = "Id", - ["filename"] = "Filename", - ["mime_type"] = "MimeType" - \}, - AttachmentNameMapping = new Dictionary - \{ - ["content"] = "file" // SQL column "content" → attachment named "file" - \} + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "filename", Name = "Filename" \}, + new() \{ Column = "mime_type", Name = "MimeType" \}, + new() \{ Column = "content", Name = "file", Type = CdcColumnType.Attachment \}, + ] \} `} @@ -60,7 +58,8 @@ Use `AttachmentNameMapping` to map a binary SQL column to a RavenDB attachment: The binary `content` column is stored as an attachment named `"file"` on the document. -The attachment is stored with content type `application/octet-stream`. +The `Name` value becomes the attachment name. The attachment is stored with content +type `application/octet-stream`. --- @@ -78,15 +77,12 @@ The attachment name is automatically prefixed to ensure uniqueness: PropertyName = "Photos", PrimaryKeyColumns = ["photo_num"], JoinColumns = ["product_id"], - ColumnsMapping = new Dictionary - \{ - ["photo_num"] = "PhotoNum", - ["caption"] = "Caption" - \}, - AttachmentNameMapping = new Dictionary - \{ - ["thumbnail"] = "thumb" - \} + Columns = + [ + new() \{ Column = "photo_num", Name = "PhotoNum" \}, + new() \{ Column = "caption", Name = "Caption" \}, + new() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + ] \} `} @@ -103,10 +99,11 @@ the primary key value. **Root table attachments:** -The attachment name is exactly the value you specify in `AttachmentNameMapping`. +The attachment name is exactly the `Name` value on the mapping entry with +`Type = CdcColumnType.Attachment`. ``` -AttachmentNameMapping = { ["content"] = "file" } +Column = "content", Name = "file", Type = CdcColumnType.Attachment → Attachment name: "file" ``` @@ -117,7 +114,7 @@ The attachment name is prefixed with `{PropertyName}/{pkValue}/`: ``` PropertyName = "Photos" PrimaryKeyColumns = ["photo_num"] → photo_num = 1 -AttachmentNameMapping = { ["thumbnail"] = "thumb" } +Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment → Attachment name: "Photos/1/thumb" ``` diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 4eaab62609..3c2e95e8d8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Column Mapping" sidebar_label: Column Mapping -description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using ColumnsMapping and AttachmentNameMapping." +description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using the Columns list of CdcColumnMapping entries." sidebar_position: 5 --- @@ -16,13 +16,15 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* Column mapping controls which SQL columns appear in the RavenDB document and - under what property names. +* Column mapping controls which SQL columns appear in the RavenDB document, + under what property names, and how they are stored. It uses a `Columns` list + of `CdcColumnMapping` objects (not a dictionary). * In this page: * [Mapping Columns to Properties](#mapping-columns-to-properties) + * [Column Types](#column-types) * [Unmapped Columns](#unmapped-columns) - * [Attachment Mapping](#attachment-mapping) + * [Validation Rules](#validation-rules) * [Schema (Source Table Schema)](#schema-source-table-schema) @@ -31,29 +33,29 @@ import LanguageContent from "@site/src/components/LanguageContent"; ## Mapping Columns to Properties -`ColumnsMapping` is a `Dictionary` where each entry maps a SQL column -name to a RavenDB document property name: +`Columns` is a `List` where each entry maps a SQL column +to a RavenDB document property: -{`ColumnsMapping = new Dictionary -\{ - ["id"] = "Id", - ["customer_name"] = "CustomerName", - ["order_date"] = "OrderDate", - ["total_amount"] = "TotalAmount" -\} +{`Columns = +[ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "customer_name", Name = "CustomerName" \}, + new() \{ Column = "order_date", Name = "OrderDate" \}, + new() \{ Column = "total_amount", Name = "TotalAmount" \}, +] `} -**Key:** SQL column name (case-insensitive match against the column names in CDC events) -**Value:** Property name in the RavenDB document +**`Column`:** SQL column name (case-insensitive match against the column names in CDC events) +**`Name`:** Property name in the RavenDB document -The primary key column(s) do not need to be mapped. When included in `ColumnsMapping`, +The primary key column(s) do not need to be mapped. When included in `Columns`, they become a regular document property. When omitted, the PK values are still used to build the document ID — they just won't appear as a named property. @@ -61,19 +63,38 @@ Including the PK in the mapping is generally useful so the document carries its identifier, but it is not required. -**Type conversions:** SQL numeric, boolean, and date types are converted to their -JSON equivalents. SQL `NULL` becomes JSON `null`. If you need custom type handling -or derived values, use a `Patch` script. +--- -**At least one mapping is required.** An empty `ColumnsMapping` is a validation error. +## Column Types -The same rules apply to embedded table column mappings. +Each `CdcColumnMapping` entry has an optional `Type` property of type `CdcColumnType` +that controls how the SQL value is stored in RavenDB: + + + + +{`Columns = +[ + new() \{ Column = "order_id", Name = "OrderId" \}, + new() \{ Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json \}, // Parsed as native JSON + new() \{ Column = "receipt", Name = "receipt.pdf", Type = CdcColumnType.Attachment \}, // Stored as attachment +] +`} + + + + +| Type | Behavior | +|------|----------| +| `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. This is the default when `Type` is omitted. | +| `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | +| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary, `string`→UTF-8 text, `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | --- ## Unmapped Columns -Columns not listed in `ColumnsMapping` are **not stored** in the document, but they +Columns not listed in `Columns` are **not stored** in the document, but they are available in patch scripts via `$row`. This allows you to use data for computations without permanently storing raw SQL values: @@ -81,12 +102,12 @@ This allows you to use data for computations without permanently storing raw SQL -{`ColumnsMapping = new Dictionary -\{ - ["id"] = "Id", - ["name"] = "Name" +{`Columns = +[ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "name", Name = "Name" \}, // base_price and tax_rate are NOT mapped — won't appear in document -\}, +], Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" `} @@ -98,64 +119,24 @@ not stored as document properties. Only the computed `FinalPrice` is stored. **Naming context:** -Property names (the values in `ColumnsMapping`) become properties on the RavenDB +Property names (the `Name` values in `Columns`) become properties on the RavenDB document — accessible as `this.FinalPrice` inside a patch script. -Column names (the keys in `ColumnsMapping`, plus any unmapped columns) are accessible +Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible in patch scripts via `$row.base_price` (for the current row's values) and `$old?.base_price` (for the previous row's values on UPDATE events). --- -## Attachment Mapping +## Validation Rules -Binary SQL columns (e.g., PostgreSQL `BYTEA`) can be stored as RavenDB attachments -instead of document properties using `AttachmentNameMapping`: - - - - -{`new CdcSinkTableConfig -\{ - Name = "Files", - SourceTableName = "files", - PrimaryKeyColumns = ["id"], - ColumnsMapping = \{ ["id"] = "Id", ["filename"] = "Filename" \}, - AttachmentNameMapping = new Dictionary - \{ - ["content"] = "file" // SQL column "content" → attachment named "file" - \} -\} -`} - - - - -The binary column `content` becomes an attachment named `"file"` on the document. - -**Embedded table attachments:** - -Binary columns on embedded tables are also supported. The attachment name is prefixed -with the embedded property path and primary key to ensure uniqueness: - - - - -{`new CdcSinkEmbeddedTableConfig -\{ - SourceTableName = "photos", - PropertyName = "Photos", - PrimaryKeyColumns = ["photo_num"], - AttachmentNameMapping = \{ ["thumbnail"] = "thumb" \} -\} -`} - - - +The following rules apply to both root table and embedded table column mappings: -A photo with `photo_num = 1` creates attachment `"Photos/1/thumb"` on the parent document. -When the embedded item is deleted, its attachments are automatically removed. +- Each `Column` name must be unique within a table (no duplicate SQL column entries). +- Each `Name` must be unique within a table (no duplicate property or attachment names). +- Both `Column` and `Name` are required and must be non-empty strings. +- At least one entry is required — an empty `Columns` list is a validation error. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index 2ec550a6e2..60e0224f6d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -26,6 +26,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [CdcSinkLinkedTableConfig](#cdcsinklinkedtableconfig) * [CdcSinkOnDeleteConfig](#cdcsinkondeleteconfig) * [CdcSinkRelationType](#cdcsinkrelationtype) + * [CdcColumnMapping](#cdccolumnmapping) + * [CdcColumnType](#cdccolumntype) + * [REST API Endpoints](#rest-api-endpoints) @@ -56,14 +59,17 @@ Leave `null` for non-PostgreSQL connections. | Property | Type | Description | |----------|------|-------------| -| `SlotName` | `string` | Name of the PostgreSQL logical replication slot. If omitted on creation, a deterministic hash-based name is used. Immutable once set. Max 63 characters, alphanumeric and underscores only. | -| `PublicationName` | `string` | Name of the PostgreSQL publication. Same auto-fill and immutability rules as `SlotName`. | +| `SlotName` | `string` | Name of the PostgreSQL logical replication slot. If omitted on creation, auto-generated as `rvn_cdc_s_{guid}` on task creation. Immutable once set. Max 63 characters, alphanumeric and underscores only. | +| `PublicationName` | `string` | Name of the PostgreSQL publication. Same auto-generated naming and immutability rules as `SlotName`. | Setting these explicitly is useful when: - A database administrator pre-creates the slot and publication with human-readable names - Migrating from a previous CDC Sink task and reusing an existing slot - Running multiple environments (dev/staging/prod) with predictable names +If tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` +automatically on startup (requires sufficient permissions). + See [Initial Setup](./postgres/initial-setup.mdx) for details. @@ -84,8 +90,7 @@ Configures a root table — one SQL table mapped to one RavenDB collection. | `SourceTableName` | `string` | ✓ | SQL table name (e.g., `"orders"`) | | `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | | `PrimaryKeyColumns` | `List` | ✓ | SQL columns used for document ID generation | -| `ColumnsMapping` | `Dictionary` | ✓ | SQL column → document property | -| `AttachmentNameMapping` | `Dictionary` | | Binary SQL column → attachment name | +| `Columns` | `List` | ✓ | Column mappings — each entry defines a SQL column, its document property name, and how to store it | | `Patch` | `string` | | JavaScript patch for INSERT and UPDATE | | `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior. Default: delete document | | `EmbeddedTables` | `List` | | Nested table configurations | @@ -106,8 +111,7 @@ Configures a table whose rows are embedded as nested objects within a parent doc | `Type` | `CdcSinkRelationType` | ✓ | `Array`, `Map`, or `Value` | | `JoinColumns` | `List` | ✓ | FK columns referencing parent's `PrimaryKeyColumns` | | `PrimaryKeyColumns` | `List` | ✓ | PK columns for matching items on UPDATE/DELETE | -| `ColumnsMapping` | `Dictionary` | ✓ | SQL column → embedded property | -| `AttachmentNameMapping` | `Dictionary` | | Binary SQL column → attachment name | +| `Columns` | `List` | ✓ | Column mappings — each entry defines a SQL column, its document property name, and how to store it | | `Patch` | `string` | | JavaScript patch on **parent** document for INSERT/UPDATE | | `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior for embedded items | | `CaseSensitiveKeys` | `bool` | | Case-sensitive PK matching. Default: `false` | @@ -131,6 +135,30 @@ Configures a foreign key reference that becomes a document ID in the parent docu --- +## CdcColumnMapping + +A single column mapping entry within a `Columns` list. + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `Column` | `string` | ✓ | SQL column name (case-insensitive) | +| `Name` | `string` | ✓ | Document property name (or attachment name when `Type = Attachment`) | +| `Type` | `CdcColumnType` | | How to store the value. Default: `Default` | + +--- + +## CdcColumnType + +Controls how a SQL column value is stored in RavenDB. + +| Value | Behavior | +|-------|----------| +| `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. | +| `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | +| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary, `string`→UTF-8 text, `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | + +--- + ## CdcSinkOnDeleteConfig Controls how DELETE events are handled for a table or embedded table. @@ -169,6 +197,19 @@ Specifies the structure of embedded or linked data in the document. --- +## REST API Endpoints + +| Method | Path | Auth | Description | +|--------|------|------|-------------| +| PUT | `/databases/{db}/admin/cdc-sink` | DatabaseAdmin | Create CDC Sink task | +| PUT | `/databases/{db}/admin/cdc-sink?id={taskId}` | DatabaseAdmin | Update CDC Sink task | +| POST | `/databases/{db}/admin/cdc-sink/test` | DatabaseAdmin | Test a patch script | +| POST | `/databases/{db}/admin/cdc-sink/verify` | DatabaseAdmin | Verify source database connectivity and CDC setup | +| GET | `/databases/{db}/cdc-sink/performance` | ValidUser | Get performance stats | +| GET | `/databases/{db}/cdc-sink/performance/live` | ValidUser | WebSocket for live performance stats | + +--- + ## Related Articles ### CDC Sink diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index 813c702111..d7ed2734b5 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -49,12 +49,12 @@ import LanguageContent from "@site/src/components/LanguageContent"; Type = CdcSinkRelationType.Array, // Array, Map, or Value JoinColumns = ["order_id"], // FK to parent's PrimaryKeyColumns PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE - ColumnsMapping = new Dictionary - \{ - ["line_id"] = "LineId", - ["product"] = "Product", - ["quantity"] = "Quantity" - \} + Columns = + [ + new() \{ Column = "line_id", Name = "LineId" \}, + new() \{ Column = "product", Name = "Product" \}, + new() \{ Column = "quantity", Name = "Quantity" \}, + ] \} `} @@ -226,8 +226,8 @@ without an additional lookup, which is not supported. ## Attachments on Embedded Items -Binary columns from embedded tables can be stored as RavenDB attachments using -`AttachmentNameMapping`. +Binary columns from embedded tables can be stored as RavenDB attachments by adding +them to `Columns` with `Type = CdcColumnType.Attachment`. @@ -238,8 +238,12 @@ Binary columns from embedded tables can be stored as RavenDB attachments using PropertyName = "Photos", PrimaryKeyColumns = ["photo_num"], JoinColumns = ["product_id"], - ColumnsMapping = \{ ["photo_num"] = "PhotoNum", ["caption"] = "Caption" \}, - AttachmentNameMapping = \{ ["thumbnail"] = "thumb" \} + Columns = + [ + new() \{ Column = "photo_num", Name = "PhotoNum" \}, + new() \{ Column = "caption", Name = "Caption" \}, + new() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + ] \} `} diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index 0fe36c9b28..ef8c24ba26 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -24,6 +24,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * In this page: * [Startup and Verification](#startup-and-verification) + * [PostgreSQL](#postgresql) * [Initial Load](#initial-load) * [Change Streaming](#change-streaming) * [Transaction Ordering](#transaction-ordering) @@ -36,19 +37,21 @@ import LanguageContent from "@site/src/components/LanguageContent"; ## Startup and Verification -When a CDC Sink task starts, it first verifies that the source database is properly -configured. For PostgreSQL, this includes checking: +When a CDC Sink task starts, it verifies that the source database is properly configured +before doing anything else. If any check fails, CDC Sink reports the exact issue and the +SQL an administrator needs to run to fix it. The task does not start until all checks pass. + +After verification, CDC Sink creates the necessary change-tracking infrastructure +in the source database, then begins the initial load. + +### PostgreSQL + +CDC Sink checks: * WAL level is set to `logical` * The connecting user has sufficient privileges * REPLICA IDENTITY is configured correctly for embedded tables that need delete routing -If any check fails, CDC Sink reports the exact issue and the SQL an administrator -needs to run to fix it. The task does not start until all checks pass. - -After verification, CDC Sink creates the necessary change-tracking infrastructure -in the source database, then begins the initial load. - See the [PostgreSQL Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) for the full list of requirements. @@ -178,15 +181,18 @@ See [Patching](./patching.mdx) for guidance. ## Child Before Parent -If an embedded row arrives before its parent row exists in RavenDB — which can happen -during initial load when tables are scanned in parallel, or due to relaxed foreign key -constraints in the source database — CDC Sink creates a **stub document** containing -only the embedded data. +Tables are scanned one at a time during the initial load. This means a child table can +contain rows that reference a parent row inserted *after* the parent table scan had +already completed. For example: Orders are fully scanned, then while scanning OrderLines, +an OrderLine is encountered that points to an Order that was inserted after the Orders +scan finished. -When the parent row arrives later, its columns are merged onto the stub document. -The final document contains both the parent fields and all embedded items that arrived earlier. +In this case, CDC Sink creates a **stub document** for the parent containing only the +embedded child data. When CDC streaming begins after the initial load, it picks up the +missing parent row and merges its columns onto the stub document. -This ensures no data is lost regardless of the order in which rows are processed. +The final document will contain both the parent fields and all embedded items. No data +is lost — the brief intermediate state is resolved automatically once streaming starts. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index c90c521685..67b44711a4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -42,7 +42,11 @@ import LanguageContent from "@site/src/components/LanguageContent"; Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - ColumnsMapping = \{ ["id"] = "Id", ["customer_id"] = "CustomerId" \}, + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "customer_id", Name = "CustomerId" \}, + ], LinkedTables = [ new CdcSinkLinkedTableConfig diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index cbacbf99f8..010c0f4381 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -103,6 +103,27 @@ making it straightforward to diagnose the root cause. --- +## Error Handling + +CDC Sink tolerates individual document processing errors — each failure is logged +and recorded, but processing continues for the remaining documents in the batch. +The CDC position advances as long as the error ratio stays within acceptable bounds. + +**Error threshold:** +When cumulative errors reach **100** and also exceed the number of successes, +the batch throws and the task enters fallback mode. + +**Fallback mode on error:** +The task enters exponential backoff, starting at 5 seconds and doubling on each +retry, up to the limit set by `CdcSink.MaxFallbackTimeInSec` (default 15 minutes). +See [Server Configuration](./server-configuration.mdx) and [Fallback Mode](#fallback-mode). + +**Patch errors:** +Patch errors — including `MaxSteps exceeded` — fail only the affected document. +The rest of the batch continues normally. + +--- + ## Related Articles ### CDC Sink diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 0a03290f52..75fce25b1c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -61,7 +61,7 @@ The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. |----------|-----------|------|-------------| | `this` | Always | object | The document being modified (root or parent for embedded) | | `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | -| `$old` | UPDATE only | object \| null | Previous state of the item; null for INSERT | +| `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | | `get(id)` | Always | function | Load a RavenDB document by ID | --- @@ -134,7 +134,7 @@ Without it, deletes will leave the aggregate in an incorrect state. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["order_id"], - ColumnsMapping = \{ ["line_id"] = "LineId", ["quantity"] = "Quantity" \}, + Columns = [ new() \{ Column = "line_id", Name = "LineId" \}, new() \{ Column = "quantity", Name = "Quantity" \} ], // Runs on INSERT and UPDATE — recomputes total from current Lines array Patch = @" @@ -180,7 +180,7 @@ the deleted item's value. Without it, deletes leave the running total incorrect. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["invoice_id"], - ColumnsMapping = \{ ["line_id"] = "LineId", ["amount"] = "Amount" \}, + Columns = [ new() \{ Column = "line_id", Name = "LineId" \}, new() \{ Column = "amount", Name = "Amount" \} ], // INSERT: $old is null, so delta = new amount (0 → new) // UPDATE: $old has previous Amount, delta = new - old @@ -215,8 +215,8 @@ Compute fields from unmapped columns that you don't want to store directly: -{`ColumnsMapping = \{ ["id"] = "Id", ["name"] = "Name" \}, -// base_price and tax_rate are NOT in ColumnsMapping +{`Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "name", Name = "Name" \} ], +// base_price and tax_rate are NOT in Columns Patch = @" this.FinalPrice = $row.base_price * (1 + $row.tax_rate); this.Discount = $row.is_vip ? $row.base_price * 0.1 : 0; @@ -337,6 +337,8 @@ Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nes * Access `this`, `$row`, `$old` * Load related documents with `get()` +* Create or replace documents with `put()` +* Delete documents with `del()` * Compute and transform property values * Set and modify document metadata * Conditional logic, loops, array methods diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 6bcc58b0b4..060e210d4f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -107,11 +107,11 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. Name = "Products", SourceTableName = "products", PrimaryKeyColumns = ["product_id"], - ColumnsMapping = new Dictionary - \{ - ["product_id"] = "ProductId", - ["name"] = "Name" - \}, + Columns = + [ + new() \{ Column = "product_id", Name = "ProductId" \}, + new() \{ Column = "name", Name = "Name" \}, + ], // Linked table: category_id FK → document ID in Categories collection LinkedTables = [ @@ -133,12 +133,12 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. Type = CdcSinkRelationType.Array, JoinColumns = ["product_id"], PrimaryKeyColumns = ["variant_id"], - ColumnsMapping = new Dictionary - \{ - ["variant_id"] = "VariantId", - ["sku"] = "Sku", - ["price"] = "Price" - \}, + Columns = + [ + new() \{ Column = "variant_id", Name = "VariantId" \}, + new() \{ Column = "sku", Name = "Sku" \}, + new() \{ Column = "price", Name = "Price" \}, + ], // Deep-nested: attributes within each variant EmbeddedTables = [ @@ -150,12 +150,12 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. // JoinColumns must include the ROOT PK for deep nesting JoinColumns = ["product_id", "variant_id"], PrimaryKeyColumns = ["attr_id"], - ColumnsMapping = new Dictionary - \{ - ["attr_id"] = "AttrId", - ["attr_name"] = "Name", - ["attr_value"] = "Value" - \} + Columns = + [ + new() \{ Column = "attr_id", Name = "AttrId" \}, + new() \{ Column = "attr_name", Name = "Name" \}, + new() \{ Column = "attr_value", Name = "Value" \}, + ] \} ] \} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx index 9213a85115..772d2a5042 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -86,13 +86,13 @@ See [REPLICA IDENTITY](../replica-identity.mdx). Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = new List \{ "order_id" \}, - ColumnsMapping = new Dictionary - \{ - ["order_id"] = "OrderId", - ["customer"] = "Customer", - ["status"] = "Status", - ["created_at"] = "CreatedAt" - \}, + Columns = + [ + new() \{ Column = "order_id", Name = "OrderId" \}, + new() \{ Column = "customer", Name = "Customer" \}, + new() \{ Column = "status", Name = "Status" \}, + new() \{ Column = "created_at", Name = "CreatedAt" \}, + ], EmbeddedTables = new List \{ new CdcSinkEmbeddedTableConfig @@ -102,13 +102,13 @@ See [REPLICA IDENTITY](../replica-identity.mdx). Type = CdcSinkRelationType.Array, JoinColumns = new List \{ "order_id" \}, PrimaryKeyColumns = new List \{ "line_id" \}, - ColumnsMapping = new Dictionary - \{ - ["line_id"] = "LineId", - ["product"] = "Product", - ["qty"] = "Qty", - ["unit_price"] = "UnitPrice" - \} + Columns = + [ + new() \{ Column = "line_id", Name = "LineId" \}, + new() \{ Column = "product", Name = "Product" \}, + new() \{ Column = "qty", Name = "Qty" \}, + new() \{ Column = "unit_price", Name = "UnitPrice" \}, + ] \} \} \} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx index df7ace832d..ecd57e96f8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx @@ -75,12 +75,12 @@ history, and `Balance` is maintained using patch logic. Name = "Accounts", SourceTableName = "accounts", PrimaryKeyColumns = ["account_id"], - ColumnsMapping = new Dictionary - \{ - ["account_id"] = "AccountId", - ["owner"] = "Owner", - ["currency"] = "Currency" - \}, + Columns = + [ + new() \{ Column = "account_id", Name = "AccountId" \}, + new() \{ Column = "owner", Name = "Owner" \}, + new() \{ Column = "currency", Name = "Currency" \}, + ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -90,13 +90,13 @@ history, and `Balance` is maintained using patch logic. Type = CdcSinkRelationType.Array, JoinColumns = ["account_id"], PrimaryKeyColumns = ["txn_id"], - ColumnsMapping = new Dictionary - \{ - ["txn_id"] = "TxnId", - ["amount"] = "Amount", - ["type"] = "Type", - ["created_at"] = "CreatedAt" - \}, + Columns = + [ + new() \{ Column = "txn_id", Name = "TxnId" \}, + new() \{ Column = "amount", Name = "Amount" \}, + new() \{ Column = "type", Name = "Type" \}, + new() \{ Column = "created_at", Name = "CreatedAt" \}, + ], // Patch runs on the parent document for INSERT/UPDATE Patch = """ const oldAmount = $old?.Amount || 0; diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index aad066f6bd..de82dc81e0 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -60,13 +60,13 @@ A simple customers table: Name = "Customers", SourceTableName = "customers", PrimaryKeyColumns = new List \{ "id" \}, - ColumnsMapping = new Dictionary - \{ - ["id"] = "Id", - ["name"] = "Name", - ["email"] = "Email", - ["created_at"] = "CreatedAt" - \} + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "name", Name = "Name" \}, + new() \{ Column = "email", Name = "Email" \}, + new() \{ Column = "created_at", Name = "CreatedAt" \}, + ] \} \} \}; diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx index 28e9872ddd..d491506ee1 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx @@ -42,7 +42,8 @@ CDC Sink will: 1. Generate the replication slot and publication names (a GUID-based identifier) and store them with the task 2. Check whether they already exist 3. Create them if they do not exist -4. Begin the initial load +4. If configured tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` automatically (requires the user to have publication ownership or superuser access) +5. Begin the initial load No manual database administration is needed in this case. diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx index ef223b2502..04f24fc05e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx @@ -132,7 +132,7 @@ Full details: [Permissions and Roles](./permissions-and-roles.mdx). See [REPLICA IDENTITY](./replica-identity.mdx). * **Published columns**: All columns referenced in `PrimaryKeyColumns`, `JoinColumns`, - and `ColumnsMapping` must exist in the SQL table. + and `Columns` entries must exist in the SQL table. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index e150618ccf..95fd92e5ff 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -79,7 +79,7 @@ Document after CDC UPDATE: -`Email` is updated from SQL, while `InternalNotes` (not in `ColumnsMapping`) is preserved. +`Email` is updated from SQL, while `InternalNotes` (not in `the `Columns` list`) is preserved. --- @@ -87,15 +87,15 @@ Document after CDC UPDATE: **Preserved across CDC updates:** -* Properties not listed in `ColumnsMapping` +* Properties not listed in `the `Columns` list` * Properties set in RavenDB directly (annotations, computed values, flags) * Document metadata (unless the patch explicitly modifies it) **Overwritten on CDC update:** -* Any property mapped via `ColumnsMapping` — always updated to match the current SQL value +* Any property mapped via `the `Columns` list` — always updated to match the current SQL value -If you manually edit a property that is part of `ColumnsMapping`, the next CDC UPDATE +If you manually edit a property that is part of `the `Columns` list`, the next CDC UPDATE for that row will overwrite your edit with the SQL value. --- @@ -120,7 +120,7 @@ You can safely add properties to CDC-managed documents: -Properties managed by CDC (those in `ColumnsMapping`) will be overwritten on +Properties managed by CDC (those in `the `Columns` list`) will be overwritten on the next UPDATE from the source database. Do not rely on manual edits to mapped properties surviving future CDC updates. @@ -133,11 +133,11 @@ RavenDB-only property for your annotation and leaving the SQL-mapped property as ## Implications for Patches Patches run after column mapping and can set additional properties that are not -from `ColumnsMapping`. These patch-computed properties follow the same merge rules: +from `the `Columns` list`. These patch-computed properties follow the same merge rules: * If a patch sets `this.ComputedField = ...`, that value persists across future events where the patch doesn't explicitly change it -* If a patch sets a property that is also in `ColumnsMapping`, the column mapping +* If a patch sets a property that is also in `the `Columns` list`, the column mapping value takes precedence (mapping is applied before patching) For aggregates maintained via patches (e.g., `RunningTotal`), the patch itself diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index e874dbeeeb..2aa35d58a4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -47,12 +47,12 @@ becomes one document. SourceTableSchema = "public", // SQL schema (optional, default: "public") SourceTableName = "orders", // SQL table name PrimaryKeyColumns = ["id"], // Used for document ID generation - ColumnsMapping = new Dictionary - \{ - ["id"] = "Id", - ["customer_name"] = "CustomerName", - ["total"] = "Total" - \} + Columns = + [ + new() \{ Column = "id", Name = "Id" \}, + new() \{ Column = "customer_name", Name = "CustomerName" \}, + new() \{ Column = "total", Name = "Total" \}, + ] \} `} @@ -63,7 +63,7 @@ becomes one document. A row with `id = 42` and collection `Orders` becomes document `Orders/42`. A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. -**Column mapping:** Only mapped columns appear in the document. Unmapped columns are +**Column mapping:** Only columns listed in `Columns` appear in the document. Unmapped columns are still available in patch scripts via `$row` but are not stored in the document. --- @@ -81,7 +81,7 @@ SQL `order_lines` table becomes an array inside each `Orders` document. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - ColumnsMapping = \{ ["id"] = "Id", ["customer_name"] = "CustomerName" \}, + Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "customer_name", Name = "CustomerName" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -91,12 +91,12 @@ SQL `order_lines` table becomes an array inside each `Orders` document. Type = CdcSinkRelationType.Array, // Array of items JoinColumns = ["order_id"], // FK referencing parent's PK PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete - ColumnsMapping = - \{ - ["line_id"] = "LineId", - ["product"] = "Product", - ["quantity"] = "Quantity" - \} + Columns = + [ + new() \{ Column = "line_id", Name = "LineId" \}, + new() \{ Column = "product", Name = "Product" \}, + new() \{ Column = "quantity", Name = "Quantity" \}, + ] \} ] \} @@ -139,7 +139,7 @@ A foreign key in the source row becomes a RavenDB document ID. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - ColumnsMapping = \{ ["id"] = "Id", ["customer_id"] = "CustomerId" \}, + Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "customer_id", Name = "CustomerId" \} ], LinkedTables = [ new CdcSinkLinkedTableConfig @@ -211,7 +211,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Name = "Companies", SourceTableName = "companies", PrimaryKeyColumns = ["company_id"], - ColumnsMapping = \{ ["company_id"] = "CompanyId", ["name"] = "Name" \}, + Columns = [ new() \{ Column = "company_id", Name = "CompanyId" \}, new() \{ Column = "name", Name = "Name" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -221,7 +221,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id"], // Root FK PrimaryKeyColumns = ["dept_id"], - ColumnsMapping = \{ ["dept_id"] = "DeptId", ["dept_name"] = "DeptName" \}, + Columns = [ new() \{ Column = "dept_id", Name = "DeptId" \}, new() \{ Column = "dept_name", Name = "DeptName" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -231,7 +231,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id", "dept_id"], // Root FK + parent FK PrimaryKeyColumns = ["emp_id"], - ColumnsMapping = \{ ["emp_id"] = "EmpId", ["emp_name"] = "EmpName" \} + Columns = [ new() \{ Column = "emp_id", Name = "EmpId" \}, new() \{ Column = "emp_name", Name = "EmpName" \} ] \} ] \} diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index c3e33d951d..34780fe361 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -62,6 +62,8 @@ How frequently CDC Sink polls the source database for new change events when the stream is idle. A shorter interval reduces latency but increases polling load on the source. +PostgreSQL uses logical replication streaming and ignores this setting. + --- ## Related Articles diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 8afe70e1e3..030c7b355b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -93,7 +93,7 @@ specific failure reason. 3. **Primary key mismatch** — the columns listed in `PrimaryKeyColumns` must match the actual SQL primary key. If they don't match, CDC Sink cannot generate a document ID. -4. **ColumnsMapping is empty** — at least one column must be mapped. A table with no +4. **Columns list is empty** — at least one column must be mapped. A table with no column mappings will produce empty documents. 5. **Task is paused** — check that the task state is `Active`, not `Disabled`. From 173c224bcfbdcc927fbef18cb2dfc0b7a23ecaa2 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:20:33 +0300 Subject: [PATCH 03/84] Use explicit CdcColumnMapping() class name; note text columns in attachment handling - Replace all new() shorthand with new CdcColumnMapping() across all files - attachment-handling: clarify that text columns (text, nvarchar, etc.) as well as binary columns can use Type = CdcColumnType.Attachment --- .../ongoing-tasks/cdc-sink/api-reference.mdx | 12 +++++----- .../cdc-sink/attachment-handling.mdx | 21 +++++++++--------- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 18 +++++++-------- .../cdc-sink/embedded-tables.mdx | 12 +++++----- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 4 ++-- .../ongoing-tasks/cdc-sink/patching.mdx | 6 ++--- .../examples/example-complex-nesting.mdx | 16 +++++++------- .../examples/example-denormalization.mdx | 16 +++++++------- .../examples/example-event-sourcing.mdx | 14 ++++++------ .../examples/example-simple-migration.mdx | 8 +++---- .../ongoing-tasks/cdc-sink/schema-design.mdx | 22 +++++++++---------- 11 files changed, 75 insertions(+), 74 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index 94af8e2688..448aa7b634 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -50,9 +50,9 @@ Use `AddCdcSinkOperation` to create a new CDC Sink task: PrimaryKeyColumns = new List \{ "id" \}, Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "customer_name", Name = "CustomerName" \}, - new() \{ Column = "total", Name = "Total" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + new CdcColumnMapping() \{ Column = "total", Name = "Total" \}, ] \} \} @@ -92,9 +92,9 @@ config.Tables.Add(new CdcSinkTableConfig PrimaryKeyColumns = new List \{ "id" \}, Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "name", Name = "Name" \}, - new() \{ Column = "email", Name = "Email" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() \{ Column = "email", Name = "Email" \}, ] \}); diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 5a77cb1cbd..25415e7dc2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Attachment Handling" sidebar_label: Attachment Handling -description: "Explains how to store binary SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." +description: "Explains how to store binary or text SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." sidebar_position: 9 --- @@ -16,8 +16,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* Binary SQL columns (bytea, varbinary, etc.) can be stored as RavenDB **attachments** - by setting `Type = CdcColumnType.Attachment` on the column mapping entry. +* SQL columns — binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) + — can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` + on the column mapping entry. * This applies to both root tables and embedded tables. @@ -46,10 +47,10 @@ column as a RavenDB attachment: PrimaryKeyColumns = ["id"], Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "filename", Name = "Filename" \}, - new() \{ Column = "mime_type", Name = "MimeType" \}, - new() \{ Column = "content", Name = "file", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "filename", Name = "Filename" \}, + new CdcColumnMapping() \{ Column = "mime_type", Name = "MimeType" \}, + new CdcColumnMapping() \{ Column = "content", Name = "file", Type = CdcColumnType.Attachment \}, ] \} `} @@ -79,9 +80,9 @@ The attachment name is automatically prefixed to ensure uniqueness: JoinColumns = ["product_id"], Columns = [ - new() \{ Column = "photo_num", Name = "PhotoNum" \}, - new() \{ Column = "caption", Name = "Caption" \}, - new() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, + new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, + new CdcColumnMapping() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, ] \} `} diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 3c2e95e8d8..0ada70e559 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -41,10 +41,10 @@ to a RavenDB document property: {`Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "customer_name", Name = "CustomerName" \}, - new() \{ Column = "order_date", Name = "OrderDate" \}, - new() \{ Column = "total_amount", Name = "TotalAmount" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + new CdcColumnMapping() \{ Column = "order_date", Name = "OrderDate" \}, + new CdcColumnMapping() \{ Column = "total_amount", Name = "TotalAmount" \}, ] `} @@ -75,9 +75,9 @@ that controls how the SQL value is stored in RavenDB: {`Columns = [ - new() \{ Column = "order_id", Name = "OrderId" \}, - new() \{ Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json \}, // Parsed as native JSON - new() \{ Column = "receipt", Name = "receipt.pdf", Type = CdcColumnType.Attachment \}, // Stored as attachment + new CdcColumnMapping() \{ Column = "order_id", Name = "OrderId" \}, + new CdcColumnMapping() \{ Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json \}, // Parsed as native JSON + new CdcColumnMapping() \{ Column = "receipt", Name = "receipt.pdf", Type = CdcColumnType.Attachment \}, // Stored as attachment ] `} @@ -104,8 +104,8 @@ This allows you to use data for computations without permanently storing raw SQL {`Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, // base_price and tax_rate are NOT mapped — won't appear in document ], Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index d7ed2734b5..3af139bee0 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -51,9 +51,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE Columns = [ - new() \{ Column = "line_id", Name = "LineId" \}, - new() \{ Column = "product", Name = "Product" \}, - new() \{ Column = "quantity", Name = "Quantity" \}, + new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, + new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, + new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, ] \} `} @@ -240,9 +240,9 @@ them to `Columns` with `Type = CdcColumnType.Attachment`. JoinColumns = ["product_id"], Columns = [ - new() \{ Column = "photo_num", Name = "PhotoNum" \}, - new() \{ Column = "caption", Name = "Caption" \}, - new() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, + new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, + new CdcColumnMapping() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, ] \} `} diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index 67b44711a4..003b7aa55b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -44,8 +44,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; PrimaryKeyColumns = ["id"], Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "customer_id", Name = "CustomerId" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \}, ], LinkedTables = [ diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 75fce25b1c..eefdc9ebe3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -134,7 +134,7 @@ Without it, deletes will leave the aggregate in an incorrect state. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["order_id"], - Columns = [ new() \{ Column = "line_id", Name = "LineId" \}, new() \{ Column = "quantity", Name = "Quantity" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \} ], // Runs on INSERT and UPDATE — recomputes total from current Lines array Patch = @" @@ -180,7 +180,7 @@ the deleted item's value. Without it, deletes leave the running total incorrect. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["invoice_id"], - Columns = [ new() \{ Column = "line_id", Name = "LineId" \}, new() \{ Column = "amount", Name = "Amount" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \} ], // INSERT: $old is null, so delta = new amount (0 → new) // UPDATE: $old has previous Amount, delta = new - old @@ -215,7 +215,7 @@ Compute fields from unmapped columns that you don't want to store directly: -{`Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "name", Name = "Name" \} ], +{`Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "name", Name = "Name" \} ], // base_price and tax_rate are NOT in Columns Patch = @" this.FinalPrice = $row.base_price * (1 + $row.tax_rate); diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 060e210d4f..5766906484 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -109,8 +109,8 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. PrimaryKeyColumns = ["product_id"], Columns = [ - new() \{ Column = "product_id", Name = "ProductId" \}, - new() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() \{ Column = "product_id", Name = "ProductId" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, ], // Linked table: category_id FK → document ID in Categories collection LinkedTables = @@ -135,9 +135,9 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. PrimaryKeyColumns = ["variant_id"], Columns = [ - new() \{ Column = "variant_id", Name = "VariantId" \}, - new() \{ Column = "sku", Name = "Sku" \}, - new() \{ Column = "price", Name = "Price" \}, + new CdcColumnMapping() \{ Column = "variant_id", Name = "VariantId" \}, + new CdcColumnMapping() \{ Column = "sku", Name = "Sku" \}, + new CdcColumnMapping() \{ Column = "price", Name = "Price" \}, ], // Deep-nested: attributes within each variant EmbeddedTables = @@ -152,9 +152,9 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. PrimaryKeyColumns = ["attr_id"], Columns = [ - new() \{ Column = "attr_id", Name = "AttrId" \}, - new() \{ Column = "attr_name", Name = "Name" \}, - new() \{ Column = "attr_value", Name = "Value" \}, + new CdcColumnMapping() \{ Column = "attr_id", Name = "AttrId" \}, + new CdcColumnMapping() \{ Column = "attr_name", Name = "Name" \}, + new CdcColumnMapping() \{ Column = "attr_value", Name = "Value" \}, ] \} ] diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx index 772d2a5042..5cae4c6008 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -88,10 +88,10 @@ See [REPLICA IDENTITY](../replica-identity.mdx). PrimaryKeyColumns = new List \{ "order_id" \}, Columns = [ - new() \{ Column = "order_id", Name = "OrderId" \}, - new() \{ Column = "customer", Name = "Customer" \}, - new() \{ Column = "status", Name = "Status" \}, - new() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() \{ Column = "order_id", Name = "OrderId" \}, + new CdcColumnMapping() \{ Column = "customer", Name = "Customer" \}, + new CdcColumnMapping() \{ Column = "status", Name = "Status" \}, + new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, ], EmbeddedTables = new List \{ @@ -104,10 +104,10 @@ See [REPLICA IDENTITY](../replica-identity.mdx). PrimaryKeyColumns = new List \{ "line_id" \}, Columns = [ - new() \{ Column = "line_id", Name = "LineId" \}, - new() \{ Column = "product", Name = "Product" \}, - new() \{ Column = "qty", Name = "Qty" \}, - new() \{ Column = "unit_price", Name = "UnitPrice" \}, + new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, + new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, + new CdcColumnMapping() \{ Column = "qty", Name = "Qty" \}, + new CdcColumnMapping() \{ Column = "unit_price", Name = "UnitPrice" \}, ] \} \} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx index ecd57e96f8..4045733e3c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx @@ -77,9 +77,9 @@ history, and `Balance` is maintained using patch logic. PrimaryKeyColumns = ["account_id"], Columns = [ - new() \{ Column = "account_id", Name = "AccountId" \}, - new() \{ Column = "owner", Name = "Owner" \}, - new() \{ Column = "currency", Name = "Currency" \}, + new CdcColumnMapping() \{ Column = "account_id", Name = "AccountId" \}, + new CdcColumnMapping() \{ Column = "owner", Name = "Owner" \}, + new CdcColumnMapping() \{ Column = "currency", Name = "Currency" \}, ], EmbeddedTables = [ @@ -92,10 +92,10 @@ history, and `Balance` is maintained using patch logic. PrimaryKeyColumns = ["txn_id"], Columns = [ - new() \{ Column = "txn_id", Name = "TxnId" \}, - new() \{ Column = "amount", Name = "Amount" \}, - new() \{ Column = "type", Name = "Type" \}, - new() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() \{ Column = "txn_id", Name = "TxnId" \}, + new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, + new CdcColumnMapping() \{ Column = "type", Name = "Type" \}, + new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, ], // Patch runs on the parent document for INSERT/UPDATE Patch = """ diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index de82dc81e0..9503109eea 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -62,10 +62,10 @@ A simple customers table: PrimaryKeyColumns = new List \{ "id" \}, Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "name", Name = "Name" \}, - new() \{ Column = "email", Name = "Email" \}, - new() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() \{ Column = "email", Name = "Email" \}, + new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, ] \} \} diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 2aa35d58a4..334e86ddec 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -49,9 +49,9 @@ becomes one document. PrimaryKeyColumns = ["id"], // Used for document ID generation Columns = [ - new() \{ Column = "id", Name = "Id" \}, - new() \{ Column = "customer_name", Name = "CustomerName" \}, - new() \{ Column = "total", Name = "Total" \}, + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + new CdcColumnMapping() \{ Column = "total", Name = "Total" \}, ] \} `} @@ -81,7 +81,7 @@ SQL `order_lines` table becomes an array inside each `Orders` document. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "customer_name", Name = "CustomerName" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -93,9 +93,9 @@ SQL `order_lines` table becomes an array inside each `Orders` document. PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete Columns = [ - new() \{ Column = "line_id", Name = "LineId" \}, - new() \{ Column = "product", Name = "Product" \}, - new() \{ Column = "quantity", Name = "Quantity" \}, + new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, + new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, + new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, ] \} ] @@ -139,7 +139,7 @@ A foreign key in the source row becomes a RavenDB document ID. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - Columns = [ new() \{ Column = "id", Name = "Id" \}, new() \{ Column = "customer_id", Name = "CustomerId" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \} ], LinkedTables = [ new CdcSinkLinkedTableConfig @@ -211,7 +211,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Name = "Companies", SourceTableName = "companies", PrimaryKeyColumns = ["company_id"], - Columns = [ new() \{ Column = "company_id", Name = "CompanyId" \}, new() \{ Column = "name", Name = "Name" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "company_id", Name = "CompanyId" \}, new CdcColumnMapping() \{ Column = "name", Name = "Name" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -221,7 +221,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id"], // Root FK PrimaryKeyColumns = ["dept_id"], - Columns = [ new() \{ Column = "dept_id", Name = "DeptId" \}, new() \{ Column = "dept_name", Name = "DeptName" \} ], + Columns = [ new CdcColumnMapping() \{ Column = "dept_id", Name = "DeptId" \}, new CdcColumnMapping() \{ Column = "dept_name", Name = "DeptName" \} ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -231,7 +231,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id", "dept_id"], // Root FK + parent FK PrimaryKeyColumns = ["emp_id"], - Columns = [ new() \{ Column = "emp_id", Name = "EmpId" \}, new() \{ Column = "emp_name", Name = "EmpName" \} ] + Columns = [ new CdcColumnMapping() \{ Column = "emp_id", Name = "EmpId" \}, new CdcColumnMapping() \{ Column = "emp_name", Name = "EmpName" \} ] \} ] \} From 8e4220b6cf95ab2c2766a4a07ee768f4c0dbf490 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:21:07 +0300 Subject: [PATCH 04/84] attachment-handling: add SQL schema examples for root and embedded table sections --- .../cdc-sink/attachment-handling.mdx | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 25415e7dc2..0045001cb2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -34,8 +34,23 @@ import LanguageContent from "@site/src/components/LanguageContent"; ## Root Table Attachments -Set `Type = CdcColumnType.Attachment` on a `Columns` entry to store a binary SQL -column as a RavenDB attachment: +Given a SQL table with a binary column: + + + + +{`CREATE TABLE files ( + id SERIAL PRIMARY KEY, + filename TEXT NOT NULL, + mime_type TEXT NOT NULL, + content BYTEA NOT NULL -- binary attachment +); +`} + + + + +Set `Type = CdcColumnType.Attachment` on the `content` column entry: @@ -58,7 +73,7 @@ column as a RavenDB attachment: -The binary `content` column is stored as an attachment named `"file"` on the document. +The `content` column is stored as an attachment named `"file"` on the document. The `Name` value becomes the attachment name. The attachment is stored with content type `application/octet-stream`. @@ -67,7 +82,31 @@ type `application/octet-stream`. ## Embedded Table Attachments Binary columns on embedded tables are stored as attachments on the **parent** document. -The attachment name is automatically prefixed to ensure uniqueness: +The attachment name is automatically prefixed to ensure uniqueness. + +Given a parent `products` table and a child `photos` table: + + + + +{`CREATE TABLE products ( + product_id SERIAL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE photos ( + product_id INT NOT NULL REFERENCES products(product_id), + photo_num INT NOT NULL, + caption TEXT, + thumbnail BYTEA, -- binary attachment + PRIMARY KEY (product_id, photo_num) +); +`} + + + + +Configure the embedded table with `Type = CdcColumnType.Attachment` on the binary column: From 2249ddbc359fac377ffa4107bc8bef2d3a3d5c9f Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:21:40 +0300 Subject: [PATCH 05/84] attachment-handling: text columns use text/plain content type, binary uses application/octet-stream --- docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx | 5 +++-- docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx | 2 +- .../ongoing-tasks/cdc-sink/configuration-reference.mdx | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 0045001cb2..f384239070 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -74,8 +74,9 @@ Set `Type = CdcColumnType.Attachment` on the `content` column entry: The `content` column is stored as an attachment named `"file"` on the document. -The `Name` value becomes the attachment name. The attachment is stored with content -type `application/octet-stream`. +The `Name` value becomes the attachment name. The content type is determined by the +SQL column type: `application/octet-stream` for binary columns, `text/plain` for +text columns. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 0ada70e559..f3a0d19888 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -88,7 +88,7 @@ that controls how the SQL value is stored in RavenDB: |------|----------| | `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. This is the default when `Type` is omitted. | | `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | -| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary, `string`→UTF-8 text, `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | +| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | --- diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index 60e0224f6d..a03dda95a1 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -155,7 +155,7 @@ Controls how a SQL column value is stored in RavenDB. |-------|----------| | `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. | | `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | -| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary, `string`→UTF-8 text, `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | +| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | --- From 74224bb5ef7b7ee8383c17a8930b14bee428291f Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:24:46 +0300 Subject: [PATCH 06/84] CdcColumnType.Json: any JSON value, not just objects/arrays --- docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx | 2 +- docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index f3a0d19888..9968856040 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -87,7 +87,7 @@ that controls how the SQL value is stored in RavenDB: | Type | Behavior | |------|----------| | `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. This is the default when `Type` is omitted. | -| `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | +| `Json` | Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | | `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | --- diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index a03dda95a1..ddc9355e98 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -154,7 +154,7 @@ Controls how a SQL column value is stored in RavenDB. | Value | Behavior | |-------|----------| | `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. | -| `Json` | Parses the string value as a native JSON object or array in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | +| `Json` | Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | | `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | --- From 542657c8a60eac75abbef57e3953f84d9b8117ec Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:28:50 +0300 Subject: [PATCH 07/84] patching, troubleshooting: replace get() with load() for loading related documents --- docs/server/ongoing-tasks/cdc-sink/patching.mdx | 12 ++++++------ .../ongoing-tasks/cdc-sink/troubleshooting.mdx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index eefdc9ebe3..c78a843f64 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -251,12 +251,12 @@ this['@metadata']['SourceTable'] = 'orders'; ## Scenario: Loading Related Documents -Use `get()` to load a related RavenDB document and denormalize its data: +Use `load()` to load a related RavenDB document and denormalize its data: -{`const customer = get('Customers/' + $row.customer_id); +{`const customer = load('Customers/' + $row.customer_id); if (customer) \{ this.CustomerName = customer.Name; @@ -272,17 +272,17 @@ if (customer) \{ -`get()` returns `null` if the document does not exist or has not yet been created +`load()` returns `null` if the document does not exist or has not yet been created by CDC Sink (race condition when multiple tables are loading in parallel). Always check for null before accessing properties. -**When to use `get()`:** +**When to use `load()`:** * Denormalizing slowly-changing reference data (customer name, category, region) * Capturing a snapshot of related data at insert time **Prefer linked tables** for simple foreign key references — they are cleaner and -do not have the null-handling complexity of `get()`. +do not have the null-handling complexity of `load()`. --- @@ -336,7 +336,7 @@ Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nes **What patches can do:** * Access `this`, `$row`, `$old` -* Load related documents with `get()` +* Load related documents with `load()` * Create or replace documents with `put()` * Delete documents with `del()` * Compute and transform property values diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 030c7b355b..90816bcdf0 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -160,13 +160,13 @@ specific failure reason. 2. **Null reference** — `$row` properties and `$old` may be `null` for certain event types. Use optional chaining: `$old?.Amount || 0`. -3. **`get()` returns null** — a document loaded with `get()` may not exist yet if CDC +3. **`load()` returns null** — a document loaded with `load()` may not exist yet if CDC Sink processes tables out of dependency order. Guard with a null check: -{`const related = get("Collection/123"); +{`const related = load("Collection/123"); if (related) \{ ... \} `} From b7694fd5caf42ad7138995b5a60d2bd177c10870 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Fri, 3 Apr 2026 05:32:47 +0300 Subject: [PATCH 08/84] Reformat long lines in code blocks; fix CdcColumnMapping Type= continuation style --- .../cdc-sink/attachment-handling.mdx | 12 ++++++-- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 14 +++++++-- .../cdc-sink/embedded-tables.mdx | 6 +++- .../ongoing-tasks/cdc-sink/patching.mdx | 18 +++++++++-- .../examples/example-complex-nesting.mdx | 3 +- .../ongoing-tasks/cdc-sink/schema-design.mdx | 30 +++++++++++++++---- 6 files changed, 69 insertions(+), 14 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index f384239070..1b52eefd36 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -65,7 +65,11 @@ Set `Type = CdcColumnType.Attachment` on the `content` column entry: new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "filename", Name = "Filename" \}, new CdcColumnMapping() \{ Column = "mime_type", Name = "MimeType" \}, - new CdcColumnMapping() \{ Column = "content", Name = "file", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() + \{ + Column = "content", Name = "file", + Type = CdcColumnType.Attachment + \}, ] \} `} @@ -122,7 +126,11 @@ Configure the embedded table with `Type = CdcColumnType.Attachment` on the binar [ new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, - new CdcColumnMapping() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() + \{ + Column = "thumbnail", Name = "thumb", + Type = CdcColumnType.Attachment + \}, ] \} `} diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 9968856040..22222da6ba 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -76,8 +76,18 @@ that controls how the SQL value is stored in RavenDB: {`Columns = [ new CdcColumnMapping() \{ Column = "order_id", Name = "OrderId" \}, - new CdcColumnMapping() \{ Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json \}, // Parsed as native JSON - new CdcColumnMapping() \{ Column = "receipt", Name = "receipt.pdf", Type = CdcColumnType.Attachment \}, // Stored as attachment + // Parsed as a native JSON value + new CdcColumnMapping() + \{ + Column = "metadata", Name = "Metadata", + Type = CdcColumnType.Json + \}, + // Stored as an attachment + new CdcColumnMapping() + \{ + Column = "receipt", Name = "receipt.pdf", + Type = CdcColumnType.Attachment + \}, ] `} diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index 3af139bee0..a50058f60e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -242,7 +242,11 @@ them to `Columns` with `Type = CdcColumnType.Attachment`. [ new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, - new CdcColumnMapping() \{ Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment \}, + new CdcColumnMapping() + \{ + Column = "thumbnail", Name = "thumb", + Type = CdcColumnType.Attachment + \}, ] \} `} diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index c78a843f64..d71b97d3e2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -134,7 +134,11 @@ Without it, deletes will leave the aggregate in an incorrect state. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["order_id"], - Columns = [ new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, + new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, + ], // Runs on INSERT and UPDATE — recomputes total from current Lines array Patch = @" @@ -180,7 +184,11 @@ the deleted item's value. Without it, deletes leave the running total incorrect. PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["invoice_id"], - Columns = [ new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, + new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, + ], // INSERT: $old is null, so delta = new amount (0 → new) // UPDATE: $old has previous Amount, delta = new - old @@ -215,7 +223,11 @@ Compute fields from unmapped columns that you don't want to store directly: -{`Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "name", Name = "Name" \} ], +{`Columns = +[ + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, +], // base_price and tax_rate are NOT in Columns Patch = @" this.FinalPrice = $row.base_price * (1 + $row.tax_rate); diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 5766906484..60988a0428 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -53,7 +53,8 @@ CREATE TABLE product_variants ( CREATE TABLE variant_attributes ( attr_id SERIAL PRIMARY KEY, - product_id INT NOT NULL REFERENCES products(product_id), -- denormalized root PK (required for deep nesting) + -- denormalized root PK (required for deep nesting) + product_id INT NOT NULL REFERENCES products(product_id), variant_id INT NOT NULL REFERENCES product_variants(variant_id), attr_name TEXT NOT NULL, attr_value TEXT NOT NULL diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 334e86ddec..e9a59e82d8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -81,7 +81,11 @@ SQL `order_lines` table becomes an array inside each `Orders` document. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -139,7 +143,11 @@ A foreign key in the source row becomes a RavenDB document ID. Name = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], - Columns = [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \}, + ], LinkedTables = [ new CdcSinkLinkedTableConfig @@ -211,7 +219,11 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Name = "Companies", SourceTableName = "companies", PrimaryKeyColumns = ["company_id"], - Columns = [ new CdcColumnMapping() \{ Column = "company_id", Name = "CompanyId" \}, new CdcColumnMapping() \{ Column = "name", Name = "Name" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "company_id", Name = "CompanyId" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -221,7 +233,11 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id"], // Root FK PrimaryKeyColumns = ["dept_id"], - Columns = [ new CdcColumnMapping() \{ Column = "dept_id", Name = "DeptId" \}, new CdcColumnMapping() \{ Column = "dept_name", Name = "DeptName" \} ], + Columns = + [ + new CdcColumnMapping() \{ Column = "dept_id", Name = "DeptId" \}, + new CdcColumnMapping() \{ Column = "dept_name", Name = "DeptName" \}, + ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig @@ -231,7 +247,11 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h Type = CdcSinkRelationType.Array, JoinColumns = ["company_id", "dept_id"], // Root FK + parent FK PrimaryKeyColumns = ["emp_id"], - Columns = [ new CdcColumnMapping() \{ Column = "emp_id", Name = "EmpId" \}, new CdcColumnMapping() \{ Column = "emp_name", Name = "EmpName" \} ] + Columns = + [ + new CdcColumnMapping() \{ Column = "emp_id", Name = "EmpId" \}, + new CdcColumnMapping() \{ Column = "emp_name", Name = "EmpName" \}, + ] \} ] \} From 13d4627f79ce58e1a099cb0b1400794dae6bdf4b Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Sat, 4 Apr 2026 00:39:43 +0300 Subject: [PATCH 09/84] RavenDB-26046 - CDC Sink: add PostgreSQL type mapping page, fix $row/$old documentation - Add postgres/type-mapping.mdx: full reference table of PostgreSQL column types and their JavaScript/CLR equivalents (scalars, arrays, json/jsonb, bytea, pgvector) - Add patching.mdx "$row and $old: Names and Types" - Fix cleanup-and-maintenance.mdx: replace obsolete "Configuration Changes That Rename Slots" section (described hash-based naming, no longer accurate) with correct "Slot and Publication Names Are Immutable" section reflecting enforced immutability --- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 35 ++++- .../ongoing-tasks/cdc-sink/patching.mdx | 127 ++++++++++++++++++ .../postgres/cleanup-and-maintenance.mdx | 39 ++---- .../postgres/examples/_category_.json | 2 +- 4 files changed, 169 insertions(+), 34 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 22222da6ba..29949bf9e5 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -94,11 +94,32 @@ that controls how the SQL value is stored in RavenDB: -| Type | Behavior | -|------|----------| -| `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. This is the default when `Type` is omitted. | -| `Json` | Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | -| `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | +**`CdcColumnType.Default`** — Standard SQL-to-JSON type conversion. This is the default when `Type` is omitted. +Type conversions are source-database-specific. For PostgreSQL: + +* `smallint` / `integer` / `oid` → `long` +* `bigint` → `long` +* `real` → `float` +* `double precision` → `double` +* `numeric` / `decimal` → `decimal` +* `boolean` → `bool` +* `date` → `DateOnly` +* `timestamp` / `timestamptz` → `DateTime` (UTC) +* `uuid` → `string` +* `varchar` / `text` / `char` → `string` +* `json` / `jsonb` → `string` (raw JSON text, not parsed) +* SQL arrays → JSON arrays +* `vector` (pgvector) → `float[]` + +See [PostgreSQL Type Mapping](./postgres/type-mapping.mdx) for the full reference table. + +**`CdcColumnType.Json`** — Parses the string value as a native JSON value (object, array, +string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or +SQL Server `nvarchar(max)` with JSON content. + +**`CdcColumnType.Attachment`** — Stores the raw column value as a RavenDB attachment. +`byte[]` → binary (`application/octet-stream`), `string` → UTF-8 text (`text/plain`), +`float[]`/`double[]` → raw vector data. The `Name` field becomes the attachment name. --- @@ -181,3 +202,7 @@ For most PostgreSQL setups using the default `public` schema, this can be omitte - [Patching](./patching.mdx) - [Attachment Handling](./attachment-handling.mdx) - [Configuration Reference](./configuration-reference.mdx) + +### PostgreSQL + +- [Type Mapping](./postgres/type-mapping.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index d71b97d3e2..4bec406439 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -26,6 +26,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; * In this page: * [When Patches Run](#when-patches-run) * [Available Variables](#available-variables) + * [$row and $old: Names and Types](#row-and-old-names-and-types) + * [$row Column Types](#row-column-types) * [Patch Scope: Root vs Embedded](#patch-scope-root-vs-embedded) * [Scenario: Column Transformation](#scenario-column-transformation) * [Scenario: Aggregation with Embedded Tables](#scenario-aggregation-with-embedded-tables) @@ -66,6 +68,127 @@ The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. --- +## $row and $old: Names and Types + +`$row` and `$old` look similar but represent fundamentally different things: + +| | `$row` | `$old` | +|--|--------|--------| +| **Contains** | The incoming SQL row from the CDC event | The previous state of the RavenDB document (or embedded item) | +| **Property names** | Original SQL column names (`customer_name`) | Mapped RavenDB property names (`CustomerName`) | +| **Value types** | Raw SQL types (see [$row Column Types](#row-column-types)) | Stored JSON types (whatever was last written to RavenDB) | +| **Available on INSERT** | ✓ | ✗ (null) | +| **Available on UPDATE** | ✓ | ✓ | +| **Available on DELETE** | ✓ | ✓ | + +Given this column mapping: + + + + +{`Columns = +[ + new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, +] +`} + + + + +In the patch script: + + + + +{`// $row — SQL column names, raw SQL types +$row.customer_name // string +$row.amount // number (from numeric/decimal column) + +// $old — mapped property names, stored JSON types +$old.CustomerName // string (as stored in RavenDB) +$old.Amount // number (as stored in RavenDB) + +// this — the document after column mapping has been applied for this event +this.CustomerName // string (just set from $row.customer_name) +this.Amount // number (just set from $row.amount) +`} + + + + + +Unmapped columns — those not listed in `Columns` — appear in `$row` but are never +written to the document and therefore never appear in `$old`. + + +--- + +## $row Column Types + +`$row` exposes all SQL columns using their **original column names** (not the mapped +RavenDB property names). The JavaScript type of each value depends on the source +database type. + +### PostgreSQL + +| PostgreSQL Type | JavaScript Type in `$row` | Notes | +|----------------|--------------------------|-------| +| `integer` / `bigint` | `number` | | +| `real` / `double precision` | `number` | | +| `numeric` | `number` | | +| `boolean` | `boolean` | | +| `date` / `timestamp` / `timestamptz` | `string` | Formatted date string | +| `uuid` | `string` | | +| `varchar` / `text` / `char` | `string` | | +| `bytea` | `string` | Base64-encoded | +| `json` / `jsonb` | `string` | Raw JSON text — call `JSON.parse()` to access as an object / array | +| `text[]` / `varchar[]` / `int[]` / etc. | `Array` | Elements are always strings, even for numeric array types | +| `vector` (pgvector) | `Array` | Elements are JavaScript numbers (floats) | + +**JSON/JSONB columns require explicit parsing:** + + + + +{`var meta = JSON.parse($row.metadata); +this.Priority = meta.priority; +this.Label = meta.label; +`} + + + + +**Array columns:** + + + + +{`this.TagCount = $row.tags.length; +this.FirstTag = $row.tags[0]; +this.Tags = $row.tags; + +// INT[] elements are strings — parse explicitly if numeric arithmetic is needed +var first = parseInt($row.scores[0], 10); +`} + + + + +**pgvector columns (elements are numbers, not strings):** + + + + +{`this.EmbeddingSum = $row.embedding.reduce(function(a, b) \{ return a + b; \}, 0); +this.Embedding = $row.embedding; +`} + + + + +--- + ## Patch Scope: Root vs Embedded **Root table patches** operate on the root document: @@ -373,6 +496,10 @@ Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nes - [Property Retention](./property-retention.mdx) - [Failover and Consistency](./failover-and-consistency.mdx) +### PostgreSQL + +- [Type Mapping](./postgres/type-mapping.mdx) + ### Server - [Patching Configuration](../../../server/configuration/patching-configuration) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx index c83a62e5c0..538fb59942 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx @@ -180,37 +180,20 @@ WHERE active = false; --- -## Configuration Changes That Rename Slots +## Slot and Publication Names Are Immutable -The replication slot name is derived from the task name, database name, and table -names. If you update a CDC Sink task in a way that changes any of these — such as -adding a table, removing a table, or renaming the task — the expected slot and -publication names change. +The replication slot name and publication name are generated **once at task creation** +using a GUID and stored with the task. They do not change when you modify the task — +adding or removing tables, renaming the task, or changing any other configuration +always reuses the same slot and publication. -What happens: +Attempting to specify a different `SlotName` or `PublicationName` when updating a +task results in an error. -* CDC Sink will look for a slot/publication with the new name -* If it has permissions, it will create them -* The old slot and publication are **not deleted** — they become orphaned - -After updating a task configuration that changes table membership: - -1. Let the task restart and create the new slot/publication -2. Identify the old slot (it will be inactive): - - - - -{`SELECT slot_name, active -FROM pg_replication_slots -WHERE slot_name LIKE 'rvn_cdc_s_%' - AND active = false; -`} - - - - -3. Drop the old slot and publication +If you need to use a different slot or publication, delete the task and create a new one. +The old slot and publication from the deleted task must then be cleaned up manually — +see [Dropping a Replication Slot](#dropping-a-replication-slot) and +[Dropping a Publication](#dropping-a-publication) below. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json index 4d070cfb37..10c3f5c05e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json @@ -1 +1 @@ -{"position": 9, "label": "Examples"} +{"position": 10, "label": "Examples"} From 4235bfeb3932d7d52b02bc897e1f6fbf39523a89 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 01:10:01 +0300 Subject: [PATCH 10/84] RavenDB-26046 - Align CDC Sink docs with actual code API from PR #4698 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Name → CollectionName on CdcSinkTableConfig across all files - Remove Type from CdcSinkLinkedTableConfig (linked tables have no relation type) - Remove Disabled from CdcSinkEmbeddedTableConfig, add LinkedTables - Add FactoryName table (Npgsql, SqlClient, MySql) to configuration-reference - Add CdcColumnMapping and CdcColumnType reference sections - Add put(id, document) and del(id) to patch capabilities - Add JSON Columns section to column-mapping - Remove non-existent Array References section from linked-tables - Remove non-existent Disabling an Embedded Table section from embedded-tables - Update server-configuration descriptions (MaxBatchSize, MaxFallbackTimeInSec, PollIntervalInSec applies to SQL Server only) - Fix licensing link in overview - Add SQL Server and MySQL/MariaDB as supported source databases --- .../ongoing-tasks/cdc-sink/api-reference.mdx | 4 +- .../cdc-sink/attachment-handling.mdx | 2 +- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 30 +++++++++++++ .../cdc-sink/configuration-reference.mdx | 25 +++++++---- .../cdc-sink/embedded-tables.mdx | 26 ----------- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 43 +------------------ .../ongoing-tasks/cdc-sink/overview.mdx | 5 ++- .../ongoing-tasks/cdc-sink/patching.mdx | 8 ++-- .../examples/example-complex-nesting.mdx | 3 +- .../examples/example-denormalization.mdx | 2 +- .../examples/example-event-sourcing.mdx | 2 +- .../examples/example-simple-migration.mdx | 2 +- .../cdc-sink/property-retention.mdx | 14 +++--- .../ongoing-tasks/cdc-sink/schema-design.mdx | 15 +++---- .../cdc-sink/server-configuration.mdx | 17 +++----- 15 files changed, 83 insertions(+), 115 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index 448aa7b634..f2def3578a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -45,7 +45,7 @@ Use `AddCdcSinkOperation` to create a new CDC Sink task: \{ new CdcSinkTableConfig \{ - Name = "Orders", + CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = new List \{ "id" \}, Columns = @@ -87,7 +87,7 @@ Pass the full updated configuration including the `TaskId`: {`config.TaskId = taskId; // Must be set config.Tables.Add(new CdcSinkTableConfig \{ - Name = "Customers", + CollectionName = "Customers", SourceTableName = "customers", PrimaryKeyColumns = new List \{ "id" \}, Columns = diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 1b52eefd36..f7645bca8b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -57,7 +57,7 @@ Set `Type = CdcColumnType.Attachment` on the `content` column entry: {`new CdcSinkTableConfig \{ - Name = "Files", + CollectionName = "Files", SourceTableName = "files", PrimaryKeyColumns = ["id"], Columns = diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 29949bf9e5..1e63b66fc5 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -24,6 +24,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [Mapping Columns to Properties](#mapping-columns-to-properties) * [Column Types](#column-types) * [Unmapped Columns](#unmapped-columns) + * [JSON Columns](#json-columns) * [Validation Rules](#validation-rules) * [Schema (Source Table Schema)](#schema-source-table-schema) @@ -160,6 +161,35 @@ in patch scripts via `$row.base_price` (for the current row's values) and --- +## JSON Columns + +SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, SQL Server `nvarchar` +with JSON content) can be parsed into native JSON objects or arrays using +`CdcColumnType.Json`: + + + + +{`Columns = +[ + new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, + new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() + \{ + Column = "metadata", Name = "Metadata", + Type = CdcColumnType.Json + \}, +] +`} + + + + +Without `CdcColumnType.Json`, the JSON column value would be stored as a raw string. +With it, the value is parsed and stored as a nested object or array in the document. + +--- + ## Validation Rules The following rules apply to both root table and embedded table column mappings: diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index ddc9355e98..ac255fa74f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Configuration Reference" sidebar_label: Configuration Reference -description: "Documents all configuration classes used to define a CDC Sink task, including CdcSinkConfiguration, table configs, and relation types." +description: "Documents all configuration classes used to define a CDC Sink task, including CdcSinkConfiguration, table configs, CdcColumnMapping, and related types." sidebar_position: 10 --- @@ -24,10 +24,10 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [CdcSinkTableConfig](#cdcsinktableconfig) * [CdcSinkEmbeddedTableConfig](#cdcsinkembeddedtableconfig) * [CdcSinkLinkedTableConfig](#cdcsinklinkedtableconfig) - * [CdcSinkOnDeleteConfig](#cdcsinkondeleteconfig) - * [CdcSinkRelationType](#cdcsinkrelationtype) * [CdcColumnMapping](#cdccolumnmapping) * [CdcColumnType](#cdccolumntype) + * [CdcSinkOnDeleteConfig](#cdcsinkondeleteconfig) + * [CdcSinkRelationType](#cdcsinkrelationtype) * [REST API Endpoints](#rest-api-endpoints) @@ -41,7 +41,7 @@ The top-level configuration object for a CDC Sink task. | Property | Type | Required | Description | |----------|------|----------|-------------| | `Name` | `string` | ✓ | Unique task name | -| `ConnectionStringName` | `string` | ✓ | Name of the SQL connection string | +| `ConnectionStringName` | `string` | ✓ | Name of the SQL connection string (uses the existing `SqlConnectionString` type — the same as SQL ETL). The connection string's `FactoryName` determines the source database engine. | | `Tables` | `List` | ✓ | Root table configurations (at least one required) | | `Postgres` | `CdcSinkPostgresSettings` | | PostgreSQL-specific settings (slot and publication names) | | `SkipInitialLoad` | `bool` | | When `true`, skip the initial full-table scan and start streaming CDC changes immediately. Only applies on first startup — has no effect once the initial load has completed. Default: `false` | @@ -50,6 +50,14 @@ The top-level configuration object for a CDC Sink task. | `PinToMentorNode` | `bool` | | Pin the task to the mentor node. Default: `false` | | `TaskId` | `long` | | Set by the server on creation | +**Supported `FactoryName` values (set on the connection string):** + +| FactoryName | Database Engine | +|-------------|-----------------| +| `Npgsql` | PostgreSQL | +| `System.Data.SqlClient` or `Microsoft.Data.SqlClient` | SQL Server | +| `MySql.Data.MySqlClient` or `MySqlConnector.MySqlConnectorFactory` | MySQL / MariaDB | + --- ## CdcSinkPostgresSettings @@ -86,7 +94,7 @@ Configures a root table — one SQL table mapped to one RavenDB collection. | Property | Type | Required | Description | |----------|------|----------|-------------| -| `Name` | `string` | ✓ | RavenDB collection name (e.g., `"Orders"`) | +| `CollectionName` | `string` | ✓ | RavenDB collection name (e.g., `"Orders"`) | | `SourceTableName` | `string` | ✓ | SQL table name (e.g., `"orders"`) | | `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | | `PrimaryKeyColumns` | `List` | ✓ | SQL columns used for document ID generation | @@ -116,7 +124,7 @@ Configures a table whose rows are embedded as nested objects within a parent doc | `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior for embedded items | | `CaseSensitiveKeys` | `bool` | | Case-sensitive PK matching. Default: `false` | | `EmbeddedTables` | `List` | | Nested embedded tables | -| `Disabled` | `bool` | | Skip this table. Default: `false` | +| `LinkedTables` | `List` | | Linked tables within embedded items | --- @@ -130,7 +138,6 @@ Configures a foreign key reference that becomes a document ID in the parent docu | `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | | `PropertyName` | `string` | ✓ | Property name in the parent document (e.g., `"Customer"`) | | `LinkedCollectionName` | `string` | ✓ | Target RavenDB collection for ID generation (e.g., `"Customers"`) | -| `Type` | `CdcSinkRelationType` | ✓ | `Value` (single reference) or `Array` (multiple references) | | `JoinColumns` | `List` | ✓ | FK columns used to build the referenced document ID | --- @@ -187,13 +194,13 @@ Controls how DELETE events are handled for a table or embedded table. ## CdcSinkRelationType -Specifies the structure of embedded or linked data in the document. +Specifies the structure of embedded data in the document. | Value | Description | |-------|-------------| | `Array` | One-to-many: stored as a JSON array. Items matched by PK for UPDATE/DELETE | | `Map` | One-to-many: stored as a JSON object keyed by PK value(s) | -| `Value` | Many-to-one: stored as a single embedded object or document reference | +| `Value` | Many-to-one: stored as a single embedded object | --- diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index a50058f60e..dde63a2bef 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -28,7 +28,6 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [Matching Items on Update and Delete](#matching-items-on-update-and-delete) * [Deep Nesting](#deep-nesting) * [Attachments on Embedded Items](#attachments-on-embedded-items) - * [Disabling an Embedded Table](#disabling-an-embedded-table) @@ -262,31 +261,6 @@ When the embedded item is deleted, its attachments are automatically removed. --- -## Disabling an Embedded Table - -Set `Disabled = true` to pause processing for a specific embedded table without -removing it from the configuration: - - - - -{`new CdcSinkEmbeddedTableConfig -\{ - SourceTableName = "audit_log", - PropertyName = "AuditLog", - Disabled = true, - // ... other config -\} -`} - - - - -Changes from the source table are ignored while `Disabled = true`. When re-enabled, -CDC Sink resumes from the current position — it does not backfill missed events. - ---- - ## Related Articles ### CDC Sink diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index 003b7aa55b..e0ecc863fa 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -23,7 +23,6 @@ import LanguageContent from "@site/src/components/LanguageContent"; * In this page: * [Basic Configuration](#basic-configuration) * [Composite Foreign Keys](#composite-foreign-keys) - * [Array References](#array-references) * [Linked vs Embedded](#linked-vs-embedded) @@ -32,14 +31,14 @@ import LanguageContent from "@site/src/components/LanguageContent"; ## Basic Configuration -`CdcSinkLinkedTableConfig` is placed inside a root table's `LinkedTables` list: +`CdcSinkLinkedTableConfig` is placed inside a root table's (or embedded table's) `LinkedTables` list: {`new CdcSinkTableConfig \{ - Name = "Orders", + CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = @@ -54,7 +53,6 @@ import LanguageContent from "@site/src/components/LanguageContent"; SourceTableName = "customers", PropertyName = "Customer", // Property name in document LinkedCollectionName = "Customers", // Target collection for ID - Type = CdcSinkRelationType.Value, // Single reference JoinColumns = ["customer_id"] // FK used to build the document ID \} ] @@ -98,7 +96,6 @@ all parts of that key: SourceTableName = "customers", PropertyName = "Customer", LinkedCollectionName = "Customers", - Type = CdcSinkRelationType.Value, JoinColumns = ["customer_region", "customer_id"] // Must match Customers PK order \} `} @@ -114,42 +111,6 @@ With `customer_region = 'US'` and `customer_id = 42`, the document gets: --- -## Array References - -Use `Type = CdcSinkRelationType.Array` for one-to-many references, where a parent -row has multiple foreign keys pointing to the same collection: - - - - -{`new CdcSinkLinkedTableConfig -\{ - SourceTableName = "tags", - PropertyName = "Tags", - LinkedCollectionName = "Tags", - Type = CdcSinkRelationType.Array, - JoinColumns = ["tag_id"] -\} -`} - - - - -This creates an array of document references: - - - - -{`\{ - "Tags": ["Tags/primary", "Tags/urgent", "Tags/follow-up"] -\} -`} - - - - ---- - ## Linked vs Embedded | Consideration | Embedded | Linked | diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index a8716827a5..7a2adb1909 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -29,7 +29,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; * Supported source databases: * **PostgreSQL** — via logical replication - * Additional source databases planned for future versions + * **SQL Server** — via native CDC (polling change tables) + * **MySQL / MariaDB** — via binlog replication * In this page: * [Why Use CDC Sink](#why-use-cdc-sink) @@ -128,7 +129,7 @@ See [Schema Design](./schema-design.mdx) for details. CDC Sink is available on an **Enterprise** license. -Learn more about licensing [here](../../../start/licensing/licensing-overview). +Learn more about licensing [here](../../../licensing/overview). --- diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 4bec406439..1b3579b912 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -64,7 +64,7 @@ The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. | `this` | Always | object | The document being modified (root or parent for embedded) | | `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | | `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | -| `get(id)` | Always | function | Load a RavenDB document by ID | +| `load(id)` | Always | function | Load a RavenDB document by ID | --- @@ -471,9 +471,9 @@ Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nes **What patches can do:** * Access `this`, `$row`, `$old` -* Load related documents with `load()` -* Create or replace documents with `put()` -* Delete documents with `del()` +* Load related documents with `load(id)` +* Create or replace documents with `put(id, document)` +* Delete documents with `del(id)` * Compute and transform property values * Set and modify document metadata * Conditional logic, loops, array methods diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 60988a0428..9520887f56 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -105,7 +105,7 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. [ new CdcSinkTableConfig \{ - Name = "Products", + CollectionName = "Products", SourceTableName = "products", PrimaryKeyColumns = ["product_id"], Columns = @@ -121,7 +121,6 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. SourceTableName = "categories", PropertyName = "Category", LinkedCollectionName = "Categories", - Type = CdcSinkRelationType.Value, JoinColumns = ["category_id"] \} ], diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx index 5cae4c6008..73cd1c7dfb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -83,7 +83,7 @@ See [REPLICA IDENTITY](../replica-identity.mdx). \{ new CdcSinkTableConfig \{ - Name = "Orders", + CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = new List \{ "order_id" \}, Columns = diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx index 4045733e3c..a5c8304f71 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx @@ -72,7 +72,7 @@ history, and `Balance` is maintained using patch logic. [ new CdcSinkTableConfig \{ - Name = "Accounts", + CollectionName = "Accounts", SourceTableName = "accounts", PrimaryKeyColumns = ["account_id"], Columns = diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index 9503109eea..b6634e057e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -57,7 +57,7 @@ A simple customers table: \{ new CdcSinkTableConfig \{ - Name = "Customers", + CollectionName = "Customers", SourceTableName = "customers", PrimaryKeyColumns = new List \{ "id" \}, Columns = diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 95fd92e5ff..8f64d7c68e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -79,7 +79,7 @@ Document after CDC UPDATE: -`Email` is updated from SQL, while `InternalNotes` (not in `the `Columns` list`) is preserved. +`Email` is updated from SQL, while `InternalNotes` (not in the `Columns` list) is preserved. --- @@ -87,15 +87,15 @@ Document after CDC UPDATE: **Preserved across CDC updates:** -* Properties not listed in `the `Columns` list` +* Properties not listed in the `Columns` list * Properties set in RavenDB directly (annotations, computed values, flags) * Document metadata (unless the patch explicitly modifies it) **Overwritten on CDC update:** -* Any property mapped via `the `Columns` list` — always updated to match the current SQL value +* Any property mapped via the `Columns` list — always updated to match the current SQL value -If you manually edit a property that is part of `the `Columns` list`, the next CDC UPDATE +If you manually edit a property that is part of the `Columns` list, the next CDC UPDATE for that row will overwrite your edit with the SQL value. --- @@ -120,7 +120,7 @@ You can safely add properties to CDC-managed documents: -Properties managed by CDC (those in `the `Columns` list`) will be overwritten on +Properties managed by CDC (those in the `Columns` list) will be overwritten on the next UPDATE from the source database. Do not rely on manual edits to mapped properties surviving future CDC updates. @@ -133,11 +133,11 @@ RavenDB-only property for your annotation and leaving the SQL-mapped property as ## Implications for Patches Patches run after column mapping and can set additional properties that are not -from `the `Columns` list`. These patch-computed properties follow the same merge rules: +from the `Columns` list. These patch-computed properties follow the same merge rules: * If a patch sets `this.ComputedField = ...`, that value persists across future events where the patch doesn't explicitly change it -* If a patch sets a property that is also in `the `Columns` list`, the column mapping +* If a patch sets a property that is also in the `Columns` list, the column mapping value takes precedence (mapping is applied before patching) For aggregates maintained via patches (e.g., `RunningTotal`), the patch itself diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index e9a59e82d8..3958b38dca 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -43,7 +43,7 @@ becomes one document. {`new CdcSinkTableConfig \{ - Name = "Orders", // RavenDB collection name + CollectionName = "Orders", // RavenDB collection name SourceTableSchema = "public", // SQL schema (optional, default: "public") SourceTableName = "orders", // SQL table name PrimaryKeyColumns = ["id"], // Used for document ID generation @@ -78,7 +78,7 @@ SQL `order_lines` table becomes an array inside each `Orders` document. {`new CdcSinkTableConfig \{ - Name = "Orders", + CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = @@ -140,7 +140,7 @@ A foreign key in the source row becomes a RavenDB document ID. {`new CdcSinkTableConfig \{ - Name = "Orders", + CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = @@ -155,7 +155,6 @@ A foreign key in the source row becomes a RavenDB document ID. SourceTableName = "customers", PropertyName = "Customer", // Property in parent document LinkedCollectionName = "Customers", // Target collection for ID - Type = CdcSinkRelationType.Value, // Single reference JoinColumns = ["customer_id"] // FK used to build the ID \} ] @@ -216,7 +215,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h {`new CdcSinkTableConfig \{ - Name = "Companies", + CollectionName = "Companies", SourceTableName = "companies", PrimaryKeyColumns = ["company_id"], Columns = @@ -293,13 +292,13 @@ configuration — the default DELETE events include all PK columns. ## Relation Types -The `Type` property on embedded and linked tables controls the document structure: +The `Type` property on embedded tables controls the document structure: | Type | Use Case | Document Structure | |------|----------|--------------------| | `Array` | One-to-many: parent has many children | `"Lines": [\{ ... \}, \{ ... \}]` | | `Map` | One-to-many with direct key lookup | `"Lines": \{ "1": \{ ... \}, "2": \{ ... \} \}` | -| `Value` | Many-to-one: parent has one child/reference | `"Customer": \{ ... \}` or `"Customer": "Customers/42"` | +| `Value` | Many-to-one: parent has one child | `"Customer": \{ ... \}` | **Array** — Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. Use when you need to iterate over all items. @@ -307,7 +306,7 @@ Use when you need to iterate over all items. **Map** — Items are stored as a JSON object keyed by the primary key value(s). Use when you need fast direct-key access within the document. -**Value** — Stores a single embedded object or document reference. +**Value** — Stores a single embedded object. Use for many-to-one relationships (many orders share one customer). --- diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index 34780fe361..fe680783b2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -37,8 +37,9 @@ See [Configuration Overview](../../../server/configuration/configuration-options **Default:** `1024` -The maximum number of change events processed in a single batch. Larger values -increase throughput but also increase memory usage per batch. +Target number of change rows processed in a single batch before writing to RavenDB. A batch may exceed this size when a source database transaction contains more rows, since transactions are never split across batches. + +Larger values increase throughput but also increase memory usage per batch. --- @@ -46,11 +47,9 @@ increase throughput but also increase memory usage per batch. **Default:** `900` (15 minutes) -How long the task will remain in fallback mode (continuously retrying) after losing -connection to the source database before reporting an error. +Maximum number of seconds the CDC Sink process will stay in fallback mode after a failure before retrying. Fallback duration doubles on each consecutive failure, up to this cap. -Set to `0` to disable fallback mode entirely — the task will move to error state -immediately on connection failure. +Set to `0` to disable fallback mode entirely — the task will retry immediately on each failure without exponential backoff. --- @@ -58,11 +57,9 @@ immediately on connection failure. **Default:** `1` -How frequently CDC Sink polls the source database for new change events when the -stream is idle. A shorter interval reduces latency but increases polling load on -the source. +How frequently (in seconds) the CDC Sink polls the source database for new change rows. This setting applies to **SQL Server** only, which uses polling-based change capture. -PostgreSQL uses logical replication streaming and ignores this setting. +PostgreSQL and MySQL use streaming replication and ignore this setting. --- From c48a94ef892e3b2fda2609eb493f7831b7a39ec0 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 01:10:11 +0300 Subject: [PATCH 11/84] RavenDB-26046 - Add PostgreSQL, SQL Server, and MySQL overview pages - postgres/overview.mdx: connection string, logical replication explanation, prerequisites summary, section index - sql-server/overview.mdx: expand from stub to full page with connection string, CDC prerequisites, polling behavior, SourceTableSchema default - mysql/overview.mdx + _category_.json: connection string, binlog prerequisites, streaming behavior, required privileges --- .../cdc-sink/mysql/_category_.json | 4 + .../ongoing-tasks/cdc-sink/mysql/overview.mdx | 110 ++++++++++++++++ .../cdc-sink/postgres/overview.mdx | 123 ++++++++++++++++++ .../cdc-sink/sql-server/overview.mdx | 78 +++++++++-- 4 files changed, 307 insertions(+), 8 deletions(-) create mode 100644 docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json create mode 100644 docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json b/docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json new file mode 100644 index 0000000000..8ae06a8e97 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 18, + "label": "MySQL" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx new file mode 100644 index 0000000000..6c92f20c39 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx @@ -0,0 +1,110 @@ +--- +title: "CDC Sink for MySQL: Overview" +sidebar_label: Overview +description: "CDC Sink support for MySQL and MariaDB — using binlog replication to stream changes into RavenDB in real time." +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for MySQL: Overview + + + +* CDC Sink supports MySQL and MariaDB as source databases using + [binary log (binlog) replication](https://dev.mysql.com/doc/refman/8.0/en/replication.html). + +* MySQL streams row-level changes in real time through the binlog. CDC Sink consumes + this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB documents as they + occur. + + + +--- + +## Connection String + +Use a `SqlConnectionString` with `FactoryName` set to `"MySql.Data.MySqlClient"` or +`"MySqlConnector.MySqlConnectorFactory"`: + + + + +{`store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + \{ + Name = "MyMySqlConnection", + FactoryName = "MySqlConnector.MySqlConnectorFactory", + ConnectionString = "Server=myserver;Port=3306;Database=mydb;User=ravendb_cdc;Password=..." + \})); +`} + + + + +--- + +## Prerequisites + +MySQL must have binary logging enabled with row-based format: + + + + +{`# my.cnf / my.ini +[mysqld] +log-bin = mysql-bin +binlog_format = ROW +binlog_row_image = FULL +server-id = 1 +`} + + + + +The CDC Sink user needs the following privileges: + + + + +{`GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'ravendb_cdc'@'%'; +GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; +`} + + + + +* `REPLICATION SLAVE` — required to read the binlog stream +* `REPLICATION CLIENT` — required to query binlog status +* `SELECT` — required for the initial full-table load + +--- + +## Streaming Behavior + +Like PostgreSQL, MySQL CDC Sink uses streaming replication (via the binlog), not +polling. The `CdcSink.PollIntervalInSec` server configuration setting does not +apply to MySQL. + +--- + +## Configuration + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../configuration-reference.mdx) for full details. + +The `SourceTableSchema` corresponds to the MySQL database name. + +--- + +## Related Articles + +### CDC Sink + +- [Overview](../overview.mdx) +- [Configuration Reference](../configuration-reference.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx new file mode 100644 index 0000000000..ef07f3bd6d --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx @@ -0,0 +1,123 @@ +--- +title: "CDC Sink for PostgreSQL: Overview" +sidebar_label: Overview +description: "CDC Sink support for PostgreSQL — using logical replication to stream changes into RavenDB in real time." +sidebar_position: -1 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink for PostgreSQL: Overview + + + +* CDC Sink supports PostgreSQL as a source database using + [logical replication](https://www.postgresql.org/docs/current/logical-replication.html). + +* PostgreSQL streams row-level changes in real time through a logical replication slot. + CDC Sink consumes this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB + documents as they occur. + + + +--- + +## Connection String + +Use a `SqlConnectionString` with `FactoryName` set to `"Npgsql"`: + + + + +{`store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + \{ + Name = "MyPostgresConnection", + FactoryName = "Npgsql", + ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=ravendb_cdc;Password=..." + \})); +`} + + + + +--- + +## How It Works + +PostgreSQL CDC Sink uses logical replication, which provides a continuous stream of +changes without polling. This gives low-latency, near-real-time replication. + +Key PostgreSQL concepts: + +* **Replication slot** — a server-side cursor that tracks how far a consumer has read. + CDC Sink creates and manages one automatically. +* **Publication** — defines which tables are included in the replication stream. + CDC Sink creates one automatically for the configured tables. +* **WAL (Write-Ahead Log)** — PostgreSQL retains WAL segments as long as a replication + slot has not consumed them. An inactive or paused task causes WAL to accumulate. + +--- + +## Prerequisites + +PostgreSQL requires several configuration settings and permissions before CDC Sink +can connect. See [Prerequisites Checklist](./prerequisites-checklist.mdx) for the +full list, including: + +* WAL level set to `logical` +* Sufficient `max_replication_slots` and `max_wal_senders` +* A database user with `REPLICATION` privilege +* `REPLICA IDENTITY` configuration for embedded tables with surrogate keys + +--- + +## PostgreSQL-Specific Settings + +The `CdcSinkPostgresSettings` object on `CdcSinkConfiguration` controls the replication +slot and publication names: + + + + +{`Postgres = new CdcSinkPostgresSettings +\{ + SlotName = "my_slot", + PublicationName = "my_publication" +\} +`} + + + + +If omitted, deterministic hash-based names are generated automatically. +See [Initial Setup](./initial-setup.mdx) for details. + +--- + +## Configuration + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../configuration-reference.mdx) for full details. + +The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. + +--- + +## In This Section + +* [Prerequisites Checklist](./prerequisites-checklist.mdx) — what to verify before creating a task +* [Initial Setup](./initial-setup.mdx) — creating the replication slot and publication +* [WAL Configuration](./wal-configuration.mdx) — PostgreSQL WAL settings +* [Permissions and Roles](./permissions-and-roles.mdx) — required database permissions +* [REPLICA IDENTITY](./replica-identity.mdx) — configuring DELETE event content +* [Monitoring PostgreSQL](./monitoring-postgres.mdx) — replication lag and WAL monitoring +* [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) — dropping orphaned slots +* [Studio UI](./studio-ui.mdx) — creating tasks through the Studio interface + +--- diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx index 0552dc23a4..8bb1add581 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink for SQL Server: Overview" sidebar_label: Overview -description: "Overview of CDC Sink support for SQL Server, including planned availability and links to existing PostgreSQL documentation." +description: "CDC Sink support for SQL Server — using native SQL Server Change Data Capture to stream changes into RavenDB." sidebar_position: 0 --- @@ -16,17 +16,78 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* CDC Sink support for SQL Server is planned for a future release. +* CDC Sink supports SQL Server as a source database using native + [SQL Server Change Data Capture](https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server). + +* SQL Server CDC captures row-level changes from the transaction log and stores them + in change tables. CDC Sink polls these change tables to stream INSERTs, UPDATEs, + and DELETEs into RavenDB documents. - -This section will cover the prerequisites, setup, and SQL Server-specific -configuration for CDC Sink when SQL Server support is available. +--- -In the meantime, see the [PostgreSQL documentation](../postgres/prerequisites-checklist.mdx) -for the full CDC Sink feature documentation. - +## Connection String + +Use a `SqlConnectionString` with `FactoryName` set to `"System.Data.SqlClient"` or +`"Microsoft.Data.SqlClient"`: + + + + +{`store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + \{ + Name = "MySqlServerConnection", + FactoryName = "Microsoft.Data.SqlClient", + ConnectionString = "Server=myserver;Database=mydb;Trusted_Connection=True;" + \})); +`} + + + + +--- + +## Prerequisites + +SQL Server CDC must be enabled on the source database and on each table you want +to capture: + + + + +{`-- Enable CDC on the database +EXEC sys.sp_cdc_enable_db; + +-- Enable CDC on a table +EXEC sys.sp_cdc_enable_table + @source_schema = N'dbo', + @source_name = N'orders', + @role_name = NULL; +`} + + + + +The SQL Server Agent service must be running for CDC to function. + +--- + +## Polling Behavior + +Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. +The `CdcSink.PollIntervalInSec` server configuration key controls how frequently +the task polls for new changes. See [Server Configuration](../server-configuration.mdx). + +--- + +## Configuration + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../configuration-reference.mdx) for full details. + +The `SourceTableSchema` defaults to `"dbo"` when using SQL Server. --- @@ -35,4 +96,5 @@ for the full CDC Sink feature documentation. ### CDC Sink - [Overview](../overview.mdx) +- [Configuration Reference](../configuration-reference.mdx) - [PostgreSQL: Prerequisites Checklist](../postgres/prerequisites-checklist.mdx) From 4eeaacf84f76b8228cf02f0f67e8b7e8e938ff08 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 01:10:17 +0300 Subject: [PATCH 12/84] RavenDB-26046 - Add Source Schema Changes and Partial Export/Import troubleshooting sections - Source Schema Changes: how each database engine handles DDL changes on source tables while CDC Sink is running (adding/removing/renaming columns, SQL Server capture instance limitations) - Partial Export/Import and State Loss: @cdc-states collection, recovery guidance, SkipInitialLoad workaround, LSN editing risks --- .../cdc-sink/troubleshooting.mdx | 166 +++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 90816bcdf0..2d4daf3c14 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -26,6 +26,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [Embedded Items Missing or Incorrect](#embedded-items-missing-or-incorrect) * [DELETE Not Applied](#delete-not-applied) * [Patch Errors](#patch-errors) + * [Source Schema Changes](#source-schema-changes) + * [Partial Export/Import and State Loss](#partial-exportimport-and-state-loss) @@ -67,7 +69,7 @@ specific failure reason. slot will be created on next start). * **Source table schema changed** — adding or removing columns from the SQL table - may cause mapping errors. Update the task configuration to match the new schema. + may cause mapping errors. See [Source Schema Changes](#source-schema-changes) below. * **Replication lag too large** — if CDC Sink falls behind significantly, PostgreSQL may retain WAL segments that fill the disk. See your PostgreSQL documentation on @@ -179,6 +181,168 @@ if (related) \{ ... \} --- +## Source Schema Changes + +CDC Sink resolves column metadata (names, types, positions) when the task starts or +restarts. **Schema changes on the source table while the task is running are not +detected mid-stream.** The behavior depends on the type of change and the database +engine. + +### Adding a Column (Unmapped) + +If a new column is added to the source table but is not referenced in the CDC Sink +configuration, it is **silently ignored** across all database engines. No action is +needed — the new column simply does not appear in the RavenDB document. + +The new column is still available in patch scripts via `$row` after the task is +restarted. + +### Removing a Mapped Column + +If a column that is referenced in the `Columns` mapping is dropped from the source +table: + +* **On next restart:** CDC Sink validates all mapped column names against the source + table and raises an error: `"Column 'X' not found in source columns"`. The task + enters error state and retries with exponential backoff until the configuration is + updated to remove the missing column. + +* **Mid-stream (before restart):** Behavior varies by engine: + * **PostgreSQL** — the cached column list from the replication stream becomes stale. + This may cause incorrect value mapping or errors. The task will recover the correct + state on the next restart. + * **SQL Server** — the CDC change table is independent of the source table schema and + still contains the old column, so no immediate error occurs. The column continues + to appear in change rows until the capture instance is recreated. + * **MySQL** — the missing column is silently treated as null in the document. No error + is raised until the task restarts. + +**Resolution:** Update the CDC Sink task configuration to remove the column from the +`Columns` list, then re-enable the task. + +### Renaming a Column + +A column rename is effectively a remove + add. The old mapped column name will fail +validation on restart (same as removing a mapped column). Update the `Columns` mapping +to use the new column name. + +### SQL Server: Capture Instance Limitations + +SQL Server CDC uses **capture instances** — snapshots of the table schema at the time +`sp_cdc_enable_table` was executed. The CDC change tables reflect the schema as it +was when the capture instance was created, **not** the current table schema. + +This means: + +* **Adding a column** to the source table does not add it to the CDC change table. + To capture the new column, you must create a new capture instance: + + + + +{`-- Disable the old capture instance +EXEC sys.sp_cdc_disable_table + @source_schema = N'dbo', + @source_name = N'orders', + @capture_instance = N'dbo_orders'; + +-- Re-enable with the updated schema +EXEC sys.sp_cdc_enable_table + @source_schema = N'dbo', + @source_name = N'orders', + @role_name = NULL; +`} + + + + + After recreating the capture instance, restart the CDC Sink task so it picks up the + new column list. + +* **Removing a column** from the source table does not remove it from the existing + capture instance — the change table still reports the old column with null values + for new rows. No immediate error occurs, but the data is stale. + + + +When planning schema migrations on a SQL Server source database, account for the +capture instance lifecycle. The recommended sequence is: + +1. Disable the CDC Sink task in RavenDB +2. Apply the schema change (`ALTER TABLE`) +3. Recreate the capture instance (`sp_cdc_disable_table` + `sp_cdc_enable_table`) +4. Update the CDC Sink task configuration if column mappings changed +5. Re-enable the CDC Sink task + + + +### General Recommendation + +For any schema change on the source database that affects mapped columns: + +1. Disable the CDC Sink task +2. Apply the schema change on the source database +3. Update the CDC Sink task configuration to match +4. Re-enable the task + +This avoids mid-stream mismatches and ensures a clean restart with validated column +metadata. + +--- + +## Partial Export/Import and State Loss + +**Symptom:** After importing a database export, CDC Sink re-reads all data from the +source database from the beginning, performing a full initial load even though the +task configuration is present and the data already exists in RavenDB. + +**Cause:** + +CDC Sink stores two separate pieces of information: + +* **Task configuration** — stored in the cluster-wide **database record**. This is + always included in any export/import because it is part of the database definition. +* **Processing state (last LSN)** — stored as a **document** in the `@cdc-states` + system collection. This tracks the last position read from the source database + (e.g., the PostgreSQL LSN or SQL Server change tracking version). It also tracks + per-table initial load progress. + +If you export and import the database but **skip importing documents** (or skip system +documents), the task configuration is restored from the database record — but the +processing state document is missing. CDC Sink sees a valid configuration with no +recorded position and starts from the beginning: performing a full initial load of +every configured table, then streaming all changes from the start. + +For large source databases, this can take a significant amount of time and place +heavy load on both the source database and RavenDB. + +**How to avoid this:** + +* When exporting a database that has CDC Sink tasks, always include documents in the + export — specifically the `@cdc-states` collection. +* If using Smuggler or the REST API for selective export/import, ensure system + documents are included. +* If state loss has already occurred and the data in RavenDB is already up to date, + you can delete and recreate the task with `SkipInitialLoad = true` to skip the full + table scan and begin streaming from the current position. Note that imported tasks + are restored in a **disabled** state by default — you must explicitly enable the task + after import. This gives you the opportunity to inspect and correct the configuration + before the task starts processing. + + + +There is no _supported_ way to manually set the last LSN position. While the state +document in `@cdc-states` can technically be edited, doing so is risky: setting an +incorrect LSN can cause CDC Sink to skip over changes (data loss) or land in the +middle of a transaction boundary, producing errors or inconsistent documents. If the +state document is lost, the safest options are to re-read from the beginning or to +recreate the task with `SkipInitialLoad` (which skips the initial load but may miss +changes that occurred between the export and the recreation). + + + +--- + ## Related Articles ### CDC Sink From d4753e2c678ddf8c29b1c95028efae8f662d27aa Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 14:08:02 +0300 Subject: [PATCH 13/84] RavenDB-26056 Fix broken links, address PR comments, document config update behavior MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Broken links fixed: - api-reference: send-multiple-operations → what-are-operations - attachment-handling: what-are-attachments → attachments/overview - column-mapping, patching: postgres/type-mapping.mdx (nonexistent) → cross-reference to patching.mdx#row-column-types PR comment fixes: - MySQL overview: rename MyMySqlConnection → MySqlConnection - Postgres overview: slot/publication names are GUID-based on first use, not deterministic hash-based New content: - how-it-works: "Updating the Task Configuration" section explaining that config changes only apply to new CDC events going forward. Existing documents are not retroactively re-processed. To apply changes to all documents, delete and recreate the task. --- .../ongoing-tasks/cdc-sink/api-reference.mdx | 2 +- .../cdc-sink/attachment-handling.mdx | 2 +- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 4 +-- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 35 ++++++++++++++++++- .../ongoing-tasks/cdc-sink/mysql/overview.mdx | 2 +- .../ongoing-tasks/cdc-sink/patching.mdx | 2 +- .../cdc-sink/postgres/overview.mdx | 2 +- 7 files changed, 41 insertions(+), 8 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index f2def3578a..c5074617f6 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -218,5 +218,5 @@ See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). ### Client API -- [Operations: How to Send Operations](../../../client-api/operations/how-to/send-multiple-operations) +- [What are Operations](../../../client-api/operations/what-are-operations) - [Ongoing Task Operations](../../../client-api/operations/maintenance/ongoing-tasks/ongoing-task-operations) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index f7645bca8b..208e03d497 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -196,4 +196,4 @@ PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 ### Document Extensions -- [Attachments: What are Attachments](../../../document-extensions/attachments/what-are-attachments) +- [Attachments Overview](../../../document-extensions/attachments/overview) diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 1e63b66fc5..33f36503d8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -112,7 +112,7 @@ Type conversions are source-database-specific. For PostgreSQL: * SQL arrays → JSON arrays * `vector` (pgvector) → `float[]` -See [PostgreSQL Type Mapping](./postgres/type-mapping.mdx) for the full reference table. +See [Patching: $row Column Types](./patching.mdx#row-column-types) for the full reference table. **`CdcColumnType.Json`** — Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or @@ -235,4 +235,4 @@ For most PostgreSQL setups using the default `public` schema, this can be omitte ### PostgreSQL -- [Type Mapping](./postgres/type-mapping.mdx) +- [Patching: $row Column Types](./patching.mdx#row-column-types) diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index ef8c24ba26..94c3047800 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -29,6 +29,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * [Change Streaming](#change-streaming) * [Transaction Ordering](#transaction-ordering) * [State Persistence and Failover](#state-persistence-and-failover) + * [Updating the Task Configuration](#updating-the-task-configuration) * [Child Before Parent](#child-before-parent) @@ -179,7 +180,39 @@ See [Patching](./patching.mdx) for guidance. --- -## Child Before Parent +## Updating the Task Configuration + +When you update a CDC Sink task configuration — for example, adding or removing columns +from the `Columns` list, changing a `Patch` script, or modifying embedded table +configuration — the changes take effect **only for new CDC events going forward**. + +CDC Sink does not retroactively re-process existing documents. Documents that were +already created retain their current structure. This means: + +* **Adding a new column mapping** — Existing documents will not have the new property. + Only documents created or updated by a subsequent CDC event will include it. +* **Removing a column mapping** — Existing documents retain the property. It will no + longer be updated by CDC events, but it is not removed from existing documents. +* **Changing a patch script** — The new patch runs on future events only. Existing + documents reflect the results of the previous patch. +* **Adding an embedded or linked table** — Existing parent documents will not have the + new embedded data until a CDC event for the embedded table row arrives. + + + +To apply configuration changes to **all** documents (not just new events), delete +the CDC Sink task and recreate it. The new task will perform a fresh initial load, +re-processing all rows with the updated configuration. + +If you only need to backfill a specific property on existing documents, you can also +use a RavenDB [patch by query](../../../client-api/operations/patching/set-based) +to update existing documents independently of the CDC Sink task. + + + +--- + + Tables are scanned one at a time during the initial load. This means a child table can contain rows that reference a parent row inserted *after* the parent table scan had diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx index 6c92f20c39..f0ae2aee1e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx @@ -38,7 +38,7 @@ Use a `SqlConnectionString` with `FactoryName` set to `"MySql.Data.MySqlClient"` {`store.Maintenance.Send(new PutConnectionStringOperation( new SqlConnectionString \{ - Name = "MyMySqlConnection", + Name = "MySqlConnection", FactoryName = "MySqlConnector.MySqlConnectorFactory", ConnectionString = "Server=myserver;Port=3306;Database=mydb;User=ravendb_cdc;Password=..." \})); diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 1b3579b912..2b7bf52eef 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -498,7 +498,7 @@ Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nes ### PostgreSQL -- [Type Mapping](./postgres/type-mapping.mdx) +- [Column Mapping](./column-mapping.mdx) ### Server diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx index ef07f3bd6d..f8aebd302e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx @@ -95,7 +95,7 @@ slot and publication names: -If omitted, deterministic hash-based names are generated automatically. +If omitted, GUID-based names are generated automatically on first use. See [Initial Setup](./initial-setup.mdx) for details. --- From de1391071eb66d5aa22cef7b7e4ee27ed4badf04 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 15:32:52 +0300 Subject: [PATCH 14/84] RavenDB-26056 Extract Source Schema Changes to dedicated page Move schema change documentation from troubleshooting into its own page with per-engine detail: - PostgreSQL: auto-detects via RelationMessage, most resilient - MySQL: detects via TableMapEvent column types, auto-recovers - SQL Server: requires explicit capture instance procedure (create new instance, drain old, then drop) - Quick reference table, SQL examples, recovery mechanism - Troubleshooting retains a short summary with link to the new page --- .../cdc-sink/source-schema-changes.mdx | 253 ++++++++++++++++++ .../cdc-sink/troubleshooting.mdx | 111 +------- 2 files changed, 260 insertions(+), 104 deletions(-) create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx new file mode 100644 index 0000000000..63113a7981 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -0,0 +1,253 @@ +--- +title: "CDC Sink: Source Schema Changes" +sidebar_label: Source Schema Changes +description: "How to safely modify your source database schema while a CDC Sink task is running — behavior per database engine, recovery, and the SQL Server capture instance procedure." +sidebar_position: 13 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +# CDC Sink: Source Schema Changes + + + +* This page explains how CDC Sink handles schema changes (columns added, removed, + renamed, or retyped) on the source database tables while the task is running. + +* The behavior differs by database engine. PostgreSQL is the most resilient, + MySQL detects most changes automatically, and SQL Server requires an explicit + procedure for every schema change. + +* In this page: + * [Quick Reference](#quick-reference) + * [PostgreSQL](#postgresql) + * [MySQL](#mysql) + * [SQL Server](#sql-server) + * [Recovery From Errors](#recovery-from-errors) + * [General Recommendation](#general-recommendation) + + + +--- + +## Quick Reference + +| Change | MySQL | PostgreSQL | SQL Server | +|--------|-------|------------|------------| +| Add column (unmapped) | Transparent | Transparent | Requires [procedure](#sql-server-schema-change-procedure) | +| Add column (mapped) | Update config + restart | Update config + restart | Requires [procedure](#sql-server-schema-change-procedure) + config update | +| Drop unmapped column | Transparent | Transparent | Requires [procedure](#sql-server-schema-change-procedure) | +| Drop mapped column | Enters fallback (config error) | Enters fallback (config error) | Requires [procedure](#sql-server-schema-change-procedure) | +| Change column type | Restarts, usually recovers | Transparent (auto-rebuild) | Requires [procedure](#sql-server-schema-change-procedure) | +| Rename mapped column | Enters fallback | Enters fallback | Requires [procedure](#sql-server-schema-change-procedure) | + +--- + +## PostgreSQL + +PostgreSQL logical replication sends `RelationMessage` events inline in the WAL stream +whenever the schema changes. CDC Sink detects these automatically and rebuilds its +column mapping on the fly. This makes PostgreSQL the **most resilient** to schema changes. + +* **Adding or dropping unmapped columns** — transparent. CDC Sink auto-rebuilds and + continues without interruption. + +* **Changing a column type** — usually transparent. A new `RelationMessage` triggers + an automatic rebuild of type categories. + +* **Dropping or renaming a mapped column** — CDC Sink enters fallback because the + mapped column name is no longer found in the new schema. Update the task + configuration to match the new column name, and CDC Sink recovers on the next retry. + +### PostgreSQL Examples + + + + +{`-- Transparent: adding an unmapped column +ALTER TABLE orders ADD COLUMN internal_notes TEXT; +-- CDC Sink auto-rebuilds and continues + +-- Transparent: changing a column type +ALTER TABLE orders ALTER COLUMN status TYPE VARCHAR(100); +-- CDC Sink auto-rebuilds and continues + +-- Requires config update: renaming a mapped column +ALTER TABLE orders RENAME COLUMN name TO full_name; +-- CDC Sink enters fallback. Update column mapping from 'name' to 'full_name'. +`} + + + + +--- + +## MySQL + +MySQL CDC uses binlog replication. Each row event is preceded by a `TableMapEvent` +containing column type information. CDC Sink compares the column types at mapped +positions against the expected types from `INFORMATION_SCHEMA`. If they don't match, +the process detects a schema change. + +* **Adding or dropping unmapped columns** — transparent. The unmapped column is ignored. + +* **Changing a column type** — CDC Sink detects the type change via binlog column types, + restarts, re-resolves from `INFORMATION_SCHEMA`, and continues. + +* **Dropping or renaming a mapped column** — CDC Sink enters fallback because the + mapped column is no longer found. Update the task configuration to match the new + schema. + +### MySQL Examples + + + + +{`-- Transparent: adding an unmapped column +ALTER TABLE orders ADD COLUMN internal_notes TEXT; +-- CDC Sink continues without interruption + +-- Auto-recovers: changing a column type +ALTER TABLE orders MODIFY COLUMN status VARCHAR(100); +-- CDC Sink detects change, restarts, and recovers automatically + +-- Requires config update: dropping a mapped column +ALTER TABLE orders DROP COLUMN legacy_field; +-- CDC Sink enters fallback. Update the config to remove 'legacy_field' from Columns. +`} + + + + +--- + +## SQL Server + +SQL Server CDC uses **capture instances** — immutable snapshots of the table schema +at the time `sp_cdc_enable_table` was executed. The CDC change tables reflect the +schema as it was when the capture instance was created, **not** the current table +schema. This means **any** schema change on a CDC-tracked table requires creating +a new capture instance. + +SQL Server supports at most **two** capture instances per table at a time. The CDC +Sink always reads from the oldest active instance. When the old instance is dropped, +CDC Sink detects this (via `fn_cdc_get_min_lsn` returning all zeros), restarts, and +picks up the new instance. + +### SQL Server Schema Change Procedure + +For **any** schema change on a SQL Server CDC-tracked table, follow this procedure: + + + + +{`-- Step 1: ALTER the table +ALTER TABLE dbo.orders ADD priority INT DEFAULT 0; + +-- Step 2: Create a NEW capture instance (the old one still exists) +EXEC sys.sp_cdc_enable_table + @source_schema = N'dbo', + @source_name = N'orders', + @capture_instance = N'dbo_orders_v2', + @role_name = NULL; + +-- Step 3: WAIT — let CDC Sink drain the OLD capture instance. +-- The sink reads from the oldest instance and processes all remaining changes. +-- Monitor the CDC Sink task status in Studio to confirm it has caught up. + +-- Step 4: Drop the OLD capture instance +EXEC sys.sp_cdc_disable_table + @source_schema = N'dbo', + @source_name = N'orders', + @capture_instance = N'dbo_orders'; + +-- CDC Sink detects the drop, restarts, and picks up dbo_orders_v2. +`} + + + + +**What happens at each step:** + +1. **After step 2** — Two capture instances exist. CDC Sink continues reading from the + oldest one (`dbo_orders`). New changes are captured by both instances. +2. **After step 3** — CDC Sink has processed all changes from the old instance. It's + safe to drop it. +3. **After step 4** — `fn_cdc_get_min_lsn('dbo_orders')` returns all zeros. CDC Sink + detects this on the next poll cycle, enters fallback, and restarts against the new + instance. + +If the schema change also affects column mappings, update the CDC Sink task +configuration after the new capture instance is active. + + + +Do not drop the old capture instance before CDC Sink has drained it — you may lose +changes that were captured in the old instance but not yet processed. + + + +### SQL Server Agent + +CDC requires SQL Server Agent to be running. The capture job (which populates change +tables) and cleanup job (which purges old changes) are Agent jobs. + + + + +{`-- Check Agent status +SELECT * FROM sys.dm_server_services WHERE servicename LIKE '%Agent%'; +`} + + + + +Without the Agent, changes are never captured and CDC Sink polls indefinitely without +finding data. + +--- + +## Recovery From Errors + +All three providers use the same recovery mechanism: + +1. **Error detected** — process enters fallback mode with exponential backoff (starting + at 5 seconds, up to `CdcSink.MaxFallbackTimeInSec`) +2. **On each retry** — process restarts: re-resolves schema, re-opens connections +3. **If the error persists** (e.g., mapped column still missing) — retries continue + with increasing backoff. A notification is raised for each error, visible in Studio. +4. **After fixing the configuration** — the process recovers automatically on the next + retry cycle. No manual restart is needed. + +--- + +## General Recommendation + +For schema changes that affect mapped columns on any database engine: + +1. Update the CDC Sink task configuration to match the new schema +2. Apply the schema change on the source database +3. For SQL Server: follow the [capture instance procedure](#sql-server-schema-change-procedure) above + +CDC Sink will detect the change and recover automatically. Disabling the task +beforehand is not required but can avoid a brief fallback cycle. + +--- + +## Related Articles + +### CDC Sink + +- [Configuration Reference](./configuration-reference.mdx) +- [Column Mapping](./column-mapping.mdx) +- [How It Works: Updating the Task Configuration](./how-it-works.mdx#updating-the-task-configuration) +- [Troubleshooting](./troubleshooting.mdx) + +### SQL Server + +- [SQL Server Overview](./sql-server/overview.mdx) diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 2d4daf3c14..5c8b275645 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -69,7 +69,7 @@ specific failure reason. slot will be created on next start). * **Source table schema changed** — adding or removing columns from the SQL table - may cause mapping errors. See [Source Schema Changes](#source-schema-changes) below. + may cause mapping errors. See [Source Schema Changes](./source-schema-changes.mdx). * **Replication lag too large** — if CDC Sink falls behind significantly, PostgreSQL may retain WAL segments that fill the disk. See your PostgreSQL documentation on @@ -183,110 +183,13 @@ if (related) \{ ... \} ## Source Schema Changes -CDC Sink resolves column metadata (names, types, positions) when the task starts or -restarts. **Schema changes on the source table while the task is running are not -detected mid-stream.** The behavior depends on the type of change and the database -engine. +Adding, removing, renaming, or retyping columns on the source database while a CDC +Sink task is running requires different handling depending on the database engine. +PostgreSQL and MySQL detect most changes automatically; SQL Server requires an explicit +capture instance procedure for every schema change. -### Adding a Column (Unmapped) - -If a new column is added to the source table but is not referenced in the CDC Sink -configuration, it is **silently ignored** across all database engines. No action is -needed — the new column simply does not appear in the RavenDB document. - -The new column is still available in patch scripts via `$row` after the task is -restarted. - -### Removing a Mapped Column - -If a column that is referenced in the `Columns` mapping is dropped from the source -table: - -* **On next restart:** CDC Sink validates all mapped column names against the source - table and raises an error: `"Column 'X' not found in source columns"`. The task - enters error state and retries with exponential backoff until the configuration is - updated to remove the missing column. - -* **Mid-stream (before restart):** Behavior varies by engine: - * **PostgreSQL** — the cached column list from the replication stream becomes stale. - This may cause incorrect value mapping or errors. The task will recover the correct - state on the next restart. - * **SQL Server** — the CDC change table is independent of the source table schema and - still contains the old column, so no immediate error occurs. The column continues - to appear in change rows until the capture instance is recreated. - * **MySQL** — the missing column is silently treated as null in the document. No error - is raised until the task restarts. - -**Resolution:** Update the CDC Sink task configuration to remove the column from the -`Columns` list, then re-enable the task. - -### Renaming a Column - -A column rename is effectively a remove + add. The old mapped column name will fail -validation on restart (same as removing a mapped column). Update the `Columns` mapping -to use the new column name. - -### SQL Server: Capture Instance Limitations - -SQL Server CDC uses **capture instances** — snapshots of the table schema at the time -`sp_cdc_enable_table` was executed. The CDC change tables reflect the schema as it -was when the capture instance was created, **not** the current table schema. - -This means: - -* **Adding a column** to the source table does not add it to the CDC change table. - To capture the new column, you must create a new capture instance: - - - - -{`-- Disable the old capture instance -EXEC sys.sp_cdc_disable_table - @source_schema = N'dbo', - @source_name = N'orders', - @capture_instance = N'dbo_orders'; - --- Re-enable with the updated schema -EXEC sys.sp_cdc_enable_table - @source_schema = N'dbo', - @source_name = N'orders', - @role_name = NULL; -`} - - - - - After recreating the capture instance, restart the CDC Sink task so it picks up the - new column list. - -* **Removing a column** from the source table does not remove it from the existing - capture instance — the change table still reports the old column with null values - for new rows. No immediate error occurs, but the data is stale. - - - -When planning schema migrations on a SQL Server source database, account for the -capture instance lifecycle. The recommended sequence is: - -1. Disable the CDC Sink task in RavenDB -2. Apply the schema change (`ALTER TABLE`) -3. Recreate the capture instance (`sp_cdc_disable_table` + `sp_cdc_enable_table`) -4. Update the CDC Sink task configuration if column mappings changed -5. Re-enable the CDC Sink task - - - -### General Recommendation - -For any schema change on the source database that affects mapped columns: - -1. Disable the CDC Sink task -2. Apply the schema change on the source database -3. Update the CDC Sink task configuration to match -4. Re-enable the task - -This avoids mid-stream mismatches and ensures a clean restart with validated column -metadata. +See [Source Schema Changes](./source-schema-changes.mdx) for the full guide, including +per-engine behavior, examples, and the SQL Server procedure. --- From 255254ec7750d8426ee1f74a4c9904000bb6f469 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Tue, 7 Apr 2026 15:43:22 +0300 Subject: [PATCH 15/84] RavenDB-26056 MySQL: warn to apply schema changes one at a time MySQL CDC detects changes by column position. Compound ALTER TABLE statements (add + drop, ADD COLUMN ... AFTER ...) cause positional shifts that are hard to resolve. Apply one change at a time and let CDC Sink catch up between each. --- .../cdc-sink/source-schema-changes.mdx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index 63113a7981..cfd12c7fba 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -54,11 +54,10 @@ PostgreSQL logical replication sends `RelationMessage` events inline in the WAL whenever the schema changes. CDC Sink detects these automatically and rebuilds its column mapping on the fly. This makes PostgreSQL the **most resilient** to schema changes. -* **Adding or dropping unmapped columns** — transparent. CDC Sink auto-rebuilds and - continues without interruption. +* **Adding or dropping unmapped columns** — transparent. * **Changing a column type** — usually transparent. A new `RelationMessage` triggers - an automatic rebuild of type categories. + an update to the internal columns mapping inside the sink. * **Dropping or renaming a mapped column** — CDC Sink enters fallback because the mapped column name is no longer found in the new schema. Update the task @@ -95,6 +94,8 @@ positions against the expected types from `INFORMATION_SCHEMA`. If they don't ma the process detects a schema change. * **Adding or dropping unmapped columns** — transparent. The unmapped column is ignored. + The CDC Sink may restart itself to re-resovle the current schema from `INFORMATION_SCHEMA`, + but normal operations will resume momentarily. * **Changing a column type** — CDC Sink detects the type change via binlog column types, restarts, re-resolves from `INFORMATION_SCHEMA`, and continues. @@ -103,6 +104,19 @@ the process detects a schema change. mapped column is no longer found. Update the task configuration to match the new schema. + + +**Apply schema changes one at a time.** MySQL CDC Sink detects schema changes by +comparing column types at specific positions. If multiple changes are applied in a +single `ALTER TABLE` statement (e.g., `ADD COLUMN ... AFTER ...`, or adding and +removing columns together), the positional shifts can compound and make it difficult +for CDC Sink to resolve the new schema correctly. + +Apply one schema change, let CDC Sink catch up and confirm it is processing normally, +then apply the next change. This ensures each change is simple and isolated. + + + ### MySQL Examples From cb100f5643623327930bfc3261ab1e4306a125af Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Wed, 15 Apr 2026 09:29:42 +0000 Subject: [PATCH 16/84] RavenDB-26046 Address PR #2387 review comments Fix typo, missing heading, misleading wording, and inconsistent descriptions flagged during code review. --- docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx | 7 +++++-- docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx | 2 +- docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx | 3 ++- docs/server/ongoing-tasks/cdc-sink/monitoring.mdx | 4 ++-- docs/server/ongoing-tasks/cdc-sink/schema-design.mdx | 3 ++- .../ongoing-tasks/cdc-sink/source-schema-changes.mdx | 2 +- docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx | 7 ++++--- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 33f36503d8..3d4e6fdbde 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -155,8 +155,11 @@ Property names (the `Name` values in `Columns`) become properties on the RavenDB document — accessible as `this.FinalPrice` inside a patch script. Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible -in patch scripts via `$row.base_price` (for the current row's values) and -`$old?.base_price` (for the previous row's values on UPDATE events). +in patch scripts via `$row.base_price` (for the current row's values). + +`$old` contains the previous state of the document and uses **mapped property names** +(the `Name` values), not SQL column names. Unmapped columns do not appear in `$old`. +See [Patching: $row and $old](./patching.mdx#row-and-old-names-and-types) for details. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index 94c3047800..414ef0e4d5 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -212,7 +212,7 @@ to update existing documents independently of the CDC Sink task. --- - +## Child Before Parent Tables are scanned one at a time during the initial load. This means a child table can contain rows that reference a parent row inserted *after* the parent table scan had diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index e0ecc863fa..b54a563f58 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -77,7 +77,8 @@ With `customer_id = 42`, the Orders document gets: -The `Customer` property is a RavenDB document ID. Load the referenced document using +The `Customer` property is a RavenDB document ID, built from the `LinkedCollectionName` +and the join column values. Load the referenced document using [includes](../../../client-api/session/loading-entities#load-with-includes) to avoid a second network call. diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index 010c0f4381..ad48b4ba9b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -56,8 +56,8 @@ In fallback mode: * No changes are applied while the connection is down * The task automatically resumes streaming once the source is reachable again -The maximum time the task will remain in fallback mode before reporting an error -is controlled by the `CdcSink.MaxFallbackTimeInSec` configuration key. +Retry delay doubles on each consecutive failure, up to the cap set by +`CdcSink.MaxFallbackTimeInSec` (default 15 minutes). See [Server Configuration](./server-configuration.mdx). --- diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 3958b38dca..9c9edd6568 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -62,6 +62,7 @@ becomes one document. **Document ID generation:** `\{CollectionName\}/\{pk1\}/\{pk2\}/...` A row with `id = 42` and collection `Orders` becomes document `Orders/42`. A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. +CDC Sink uses the `CollectionName` verbatim as the document ID prefix. **Column mapping:** Only columns listed in `Columns` appear in the document. Unmapped columns are still available in patch scripts via `$row` but are not stored in the document. @@ -182,7 +183,7 @@ An embedded table needs: * **PrimaryKeyColumns** — Used to match items within the parent's array for UPDATE and DELETE * **JoinColumns** — Foreign key referencing the parent's `PrimaryKeyColumns` -The `JoinColumns` must exactly match the parent's `PrimaryKeyColumns`: +The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `PrimaryKeyColumns`: | Parent PK | Required JoinColumns | Valid? | |-----------|---------------------|--------| diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index cfd12c7fba..387f1d2c4b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -94,7 +94,7 @@ positions against the expected types from `INFORMATION_SCHEMA`. If they don't ma the process detects a schema change. * **Adding or dropping unmapped columns** — transparent. The unmapped column is ignored. - The CDC Sink may restart itself to re-resovle the current schema from `INFORMATION_SCHEMA`, + The CDC Sink may restart itself to re-resolve the current schema from `INFORMATION_SCHEMA`, but normal operations will resume momentarily. * **Changing a column type** — CDC Sink detects the type change via binlog column types, diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 5c8b275645..e34d32aa55 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -75,9 +75,10 @@ specific failure reason. may retain WAL segments that fill the disk. See your PostgreSQL documentation on `wal_keep_size` and replication slot lag. -* **Exceeded fallback timeout** — the source was unreachable for longer than - `CdcSink.MaxFallbackTimeInSec`. The task moves to error state after this timeout. - Restore connectivity and re-enable the task. +* **Persistent connection failure** — the source has been unreachable through multiple + retry cycles. Retry delay doubles on each failure up to the `CdcSink.MaxFallbackTimeInSec` + cap (default 15 minutes). Restore connectivity and the task resumes automatically + on the next retry. --- From e4a1285b3231431823d191fd82ae260ee6f79b10 Mon Sep 17 00:00:00 2001 From: Ayende Rahien Date: Wed, 15 Apr 2026 09:37:20 +0000 Subject: [PATCH 17/84] RavenDB-26046 Fix config key names and add missing Postgres timeout setting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename CdcSink.PollIntervalInSec to CdcSink.SqlServer.PollIntervalInSec to match actual code (3 files) - Add missing CdcSink.Postgres.ReplicationTimeoutInSec (default 10s) - Fix type conversion: decimal→double should be numeric/decimal→decimal --- .../cdc-sink/configuration-reference.mdx | 2 +- .../ongoing-tasks/cdc-sink/mysql/overview.mdx | 2 +- .../cdc-sink/server-configuration.mdx | 14 ++++++++++++-- .../ongoing-tasks/cdc-sink/sql-server/overview.mdx | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index ac255fa74f..809ce1ddcf 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -160,7 +160,7 @@ Controls how a SQL column value is stored in RavenDB. | Value | Behavior | |-------|----------| -| `Default` | Standard type conversion: int→long, decimal→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. | +| `Default` | Standard type conversion: int→long, numeric/decimal→decimal, real→float, double precision→double, date→DateOnly, timestamp→DateTime, uuid→string, varchar/text→string. SQL arrays→JSON arrays. JSON/JSONB stored as plain string. | | `Json` | Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | | `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx index f0ae2aee1e..5a4bba128b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx @@ -88,7 +88,7 @@ GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; ## Streaming Behavior Like PostgreSQL, MySQL CDC Sink uses streaming replication (via the binlog), not -polling. The `CdcSink.PollIntervalInSec` server configuration setting does not +polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration setting does not apply to MySQL. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index fe680783b2..aa6d656ff7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -53,16 +53,26 @@ Set to `0` to disable fallback mode entirely — the task will retry immediately --- -#### `CdcSink.PollIntervalInSec` +#### `CdcSink.SqlServer.PollIntervalInSec` **Default:** `1` -How frequently (in seconds) the CDC Sink polls the source database for new change rows. This setting applies to **SQL Server** only, which uses polling-based change capture. +How frequently (in seconds) the SQL Server CDC Sink polls for new change rows. Lower values reduce latency but increase load on the source database. PostgreSQL and MySQL use streaming replication and ignore this setting. --- +#### `CdcSink.Postgres.ReplicationTimeoutInSec` + +**Default:** `10` + +Timeout (in seconds) for the PostgreSQL replication connection. Controls both the server-side `wal_sender_timeout` (keepalives arrive at roughly half this interval) and the client-side `WalReceiverTimeout`. Lower values detect dead connections faster but increase keepalive traffic. + +SQL Server and MySQL ignore this setting. + +--- + ## Related Articles ### CDC Sink diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx index 8bb1add581..9b103d38bb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx @@ -77,7 +77,7 @@ The SQL Server Agent service must be running for CDC to function. ## Polling Behavior Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. -The `CdcSink.PollIntervalInSec` server configuration key controls how frequently +The `CdcSink.SqlServer.PollIntervalInSec` server configuration key controls how frequently the task polls for new changes. See [Server Configuration](../server-configuration.mdx). --- From f1e03d6a8097bae64aee56704e61b9051f8059c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:06 +0200 Subject: [PATCH 18/84] RavenDB-26046 Fix CDC Sink API reference: replace non-existent /verify endpoint with /schema --- docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index 809ce1ddcf..bb644fe6d9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -211,7 +211,7 @@ Specifies the structure of embedded data in the document. | PUT | `/databases/{db}/admin/cdc-sink` | DatabaseAdmin | Create CDC Sink task | | PUT | `/databases/{db}/admin/cdc-sink?id={taskId}` | DatabaseAdmin | Update CDC Sink task | | POST | `/databases/{db}/admin/cdc-sink/test` | DatabaseAdmin | Test a patch script | -| POST | `/databases/{db}/admin/cdc-sink/verify` | DatabaseAdmin | Verify source database connectivity and CDC setup | +| POST | `/databases/{db}/admin/cdc-sink/schema` | DatabaseAdmin | Discover the source schema (tables, columns, primary keys, foreign keys) | | GET | `/databases/{db}/cdc-sink/performance` | ValidUser | Get performance stats | | GET | `/databases/{db}/cdc-sink/performance/live` | ValidUser | WebSocket for live performance stats | From d49441c949aff4aeeda318a1d9a2616ed9195be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:06 +0200 Subject: [PATCH 19/84] RavenDB-26046 Fix deep-nesting JoinColumns to reference direct parent PK only --- docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx | 2 +- .../cdc-sink/postgres/examples/example-complex-nesting.mdx | 5 +++-- docs/server/ongoing-tasks/cdc-sink/schema-design.mdx | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index dde63a2bef..0c44607ea7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -203,7 +203,7 @@ directly joins to `departments`: {`// Configuration for the employees embedded table: -JoinColumns = ["company_id", "dept_id"] // Root PK + parent PK +JoinColumns = ["dept_id"] // FK to the direct parent (departments) PK PrimaryKeyColumns = ["emp_id"] `} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 9520887f56..7e5cf7eb00 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -147,8 +147,9 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. SourceTableName = "variant_attributes", PropertyName = "Attributes", Type = CdcSinkRelationType.Array, - // JoinColumns must include the ROOT PK for deep nesting - JoinColumns = ["product_id", "variant_id"], + // FK to the direct parent (product_variants) PK. + // The root PK (product_id) must exist as a denormalized column but is NOT listed here. + JoinColumns = ["variant_id"], PrimaryKeyColumns = ["attr_id"], Columns = [ diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 9c9edd6568..c5219c2d99 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -245,7 +245,7 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h SourceTableName = "employees", PropertyName = "Employees", Type = CdcSinkRelationType.Array, - JoinColumns = ["company_id", "dept_id"], // Root FK + parent FK + JoinColumns = ["dept_id"], // FK to the direct parent (departments) PK PrimaryKeyColumns = ["emp_id"], Columns = [ From 9005fa9aa98dffd736eae31298865c6ed18ce481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:26 +0200 Subject: [PATCH 20/84] RavenDB-26046 Fix document ID casing in examples (CollectionName is used verbatim) --- .../cdc-sink/postgres/examples/example-complex-nesting.mdx | 4 ++-- .../cdc-sink/postgres/examples/example-denormalization.mdx | 2 +- .../cdc-sink/postgres/examples/example-simple-migration.mdx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 7e5cf7eb00..23169d1775 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -179,7 +179,7 @@ await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); {`\{ "ProductId": 42, "Name": "Hiking Boot", - "Category": "categories/3", + "Category": "Categories/3", "Variants": [ \{ "VariantId": 101, @@ -209,7 +209,7 @@ await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); The `Categories` collection is also synced by CDC Sink (it would be a separate -root table configuration). `"categories/3"` is a standard RavenDB document ID +root table configuration). `"Categories/3"` is a standard RavenDB document ID that enables the use of RavenDB includes when querying products. diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx index 73cd1c7dfb..bd29dabe31 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -136,7 +136,7 @@ order_lines: line_id=2, order_id=1, product='Widget B', qty=1, unit_price=24.99 -RavenDB document `orders/1`: +RavenDB document `Orders/1`: diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index b6634e057e..502573bfe0 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -90,7 +90,7 @@ SQL row: -RavenDB document in collection `Customers` with ID `customers/1`: +RavenDB document in collection `Customers` with ID `Customers/1`: @@ -109,7 +109,7 @@ RavenDB document in collection `Customers` with ID `customers/1`: -Document IDs are generated as `{collection}/{pk}` — for example, `customers/1` +Document IDs are generated as `{collection}/{pk}` — for example, `Customers/1` for a row with `id = 1`. --- From 24a5192c97b28571c3385d6551e303e30f8af708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:26 +0200 Subject: [PATCH 21/84] RavenDB-26046 Correct REPLICA IDENTITY permission behavior (task fails to start) --- .../cdc-sink/postgres/replica-identity-manual-setup.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx index d1172cad60..65770a69bc 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx @@ -37,9 +37,9 @@ table whose join columns are not part of the primary key. This requires: * The CDC Sink user owns the table, **or** * The CDC Sink user has `SUPERUSER` -If neither condition is met, CDC Sink will start but embedded table deletes may -not work correctly. A database administrator must configure `REPLICA IDENTITY` -manually. +If neither condition is met, the CDC Sink task fails to start and reports a +permissions error. A database administrator must configure `REPLICA IDENTITY` +manually before the task can run. --- From dd031588f45e0268057a89f4efd62374d2a10047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:26 +0200 Subject: [PATCH 22/84] RavenDB-26046 Remove unsupported 'set MaxFallbackTime to 0' claim; describe real backoff --- docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index aa6d656ff7..39ec552481 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -49,7 +49,7 @@ Larger values increase throughput but also increase memory usage per batch. Maximum number of seconds the CDC Sink process will stay in fallback mode after a failure before retrying. Fallback duration doubles on each consecutive failure, up to this cap. -Set to `0` to disable fallback mode entirely — the task will retry immediately on each failure without exponential backoff. +The first retry after a failure waits 5 seconds; subsequent retries grow toward this cap (roughly doubling based on the time since the last error), with a small random jitter added to avoid synchronized retries across multiple tasks. --- From 27cbc24ffac9a54380ddeb663151c465b42128db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:26 +0200 Subject: [PATCH 23/84] RavenDB-26046 Document OnDelete.IgnoreDeletes as REPLICA IDENTITY escape hatch --- .../ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx | 2 ++ .../server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx | 1 + 2 files changed, 3 insertions(+) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx index 04f24fc05e..5ffc39b566 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx @@ -128,6 +128,8 @@ Full details: [Permissions and Roles](./permissions-and-roles.mdx). the primary key, the table must have `REPLICA IDENTITY FULL` or a replica identity index that includes the join columns. Without this, DELETE events will not include the old row values, and CDC Sink cannot identify which embedded item to remove. + Alternatively, set `OnDelete.IgnoreDeletes = true` on the embedded table to skip + delete processing entirely — then no `REPLICA IDENTITY` change is required. See [REPLICA IDENTITY](./replica-identity.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx index 571d76a7fb..0fad6a9213 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx @@ -75,6 +75,7 @@ For CDC Sink, `FULL` is the simplest and most compatible choice. | Root table deletes | No — root documents are deleted by document ID | | Embedded table deletes where join columns ARE part of the PK | No — `DEFAULT` is sufficient | | Embedded table deletes where join columns are NOT part of the PK | **Yes** — `DEFAULT` is insufficient | +| Embedded table where `OnDelete.IgnoreDeletes = true` is set | No — deletes are skipped, so delete routing isn't needed | | Deep-nested embedded tables | Depends on the join column placement | **Example where REPLICA IDENTITY is needed:** From 72a08f4a74aff1c37f30ade0f2014736e444d69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 14:30:26 +0200 Subject: [PATCH 24/84] RavenDB-26046 Fix slot/publication naming timing (at task creation, not first use) --- docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx index f8aebd302e..99fed469e7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx @@ -95,7 +95,7 @@ slot and publication names: -If omitted, GUID-based names are generated automatically on first use. +If omitted, GUID-based names are generated automatically when the task is created. See [Initial Setup](./initial-setup.mdx) for details. --- From 48603b6264fb995ebd399986968954559cdb45e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Wed, 24 Jun 2026 15:15:36 +0200 Subject: [PATCH 25/84] RavenDB-26046 Normalize em dashes to spaced hyphens (match docs house style) --- .../ongoing-tasks/cdc-sink/api-reference.mdx | 8 +-- .../cdc-sink/attachment-handling.mdx | 12 ++-- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 14 ++--- .../cdc-sink/configuration-reference.mdx | 18 +++--- .../cdc-sink/delete-strategies.mdx | 18 +++--- .../cdc-sink/embedded-tables.mdx | 8 +-- .../cdc-sink/failover-and-consistency.mdx | 28 ++++----- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 32 +++++----- .../ongoing-tasks/cdc-sink/monitoring.mdx | 12 ++-- .../ongoing-tasks/cdc-sink/mysql/overview.mdx | 8 +-- .../ongoing-tasks/cdc-sink/overview.mdx | 26 ++++----- .../ongoing-tasks/cdc-sink/patching.mdx | 30 +++++----- .../postgres/cleanup-and-maintenance.mdx | 10 ++-- .../examples/example-simple-migration.mdx | 2 +- .../cdc-sink/postgres/initial-setup.mdx | 2 +- .../cdc-sink/postgres/monitoring-postgres.mdx | 4 +- .../cdc-sink/postgres/overview.mdx | 24 ++++---- .../postgres/permissions-and-roles.mdx | 4 +- .../postgres/prerequisites-checklist.mdx | 2 +- .../cdc-sink/postgres/replica-identity.mdx | 10 ++-- .../cdc-sink/postgres/studio-ui.mdx | 10 ++-- .../cdc-sink/property-retention.mdx | 2 +- .../ongoing-tasks/cdc-sink/schema-design.mdx | 16 ++--- .../cdc-sink/source-schema-changes.mdx | 34 +++++------ .../cdc-sink/sql-server/overview.mdx | 2 +- .../cdc-sink/troubleshooting.mdx | 58 +++++++++---------- 26 files changed, 197 insertions(+), 197 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index c5074617f6..da354bf7ed 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -106,16 +106,16 @@ await store.Maintenance.SendAsync( -**PostgreSQL — table changes affect the publication:** +**PostgreSQL - table changes affect the publication:** The replication slot and publication names are fixed at task creation and do not change when you update the task. However, the **publication** controls which tables CDC Sink receives changes for, so table changes require database-level updates: -* **Adding tables** — If CDC Sink has the necessary permissions, it will automatically +* **Adding tables** - If CDC Sink has the necessary permissions, it will automatically run `ALTER PUBLICATION ADD TABLE ;` when the task is updated. If it does not have permissions, a database administrator must run this manually. -* **Removing tables** — `ALTER PUBLICATION DROP TABLE ;` must be +* **Removing tables** - `ALTER PUBLICATION DROP TABLE ;` must be run manually by a database administrator. CDC Sink does not remove tables from the publication automatically. @@ -182,7 +182,7 @@ See [Monitoring PostgreSQL](./postgres/monitoring-postgres.mdx). **SQL Server:** Pausing a CDC Sink task for an extended period (days) may cause SQL Server to trim the CDC change tables, removing rows that have not yet been consumed. A short pause is safe. If the task is paused long enough that trimming occurs, CDC Sink will -report an error on resume — the task may need to be recreated rather than simply resumed. +report an error on resume - the task may need to be recreated rather than simply resumed. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 208e03d497..32b999ba34 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -16,8 +16,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* SQL columns — binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) - — can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` +* SQL columns - binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) + - can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` on the column mapping entry. * This applies to both root tables and embedded tables. @@ -178,11 +178,11 @@ PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 ## Attachment Lifecycle -* **INSERT** — Attachment is created on the document -* **UPDATE** — Attachment is replaced with the new binary data -* **DELETE (embedded item)** — All attachments for that item are automatically removed +* **INSERT** - Attachment is created on the document +* **UPDATE** - Attachment is replaced with the new binary data +* **DELETE (embedded item)** - All attachments for that item are automatically removed from the parent document -* **DELETE (root document)** — Document and all its attachments are deleted +* **DELETE (root document)** - Document and all its attachments are deleted --- diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 3d4e6fdbde..3df2e82d80 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -58,7 +58,7 @@ to a RavenDB document property: The primary key column(s) do not need to be mapped. When included in `Columns`, they become a regular document property. When omitted, the PK values are still used -to build the document ID — they just won't appear as a named property. +to build the document ID - they just won't appear as a named property. Including the PK in the mapping is generally useful so the document carries its own identifier, but it is not required. @@ -95,7 +95,7 @@ that controls how the SQL value is stored in RavenDB: -**`CdcColumnType.Default`** — Standard SQL-to-JSON type conversion. This is the default when `Type` is omitted. +**`CdcColumnType.Default`** - Standard SQL-to-JSON type conversion. This is the default when `Type` is omitted. Type conversions are source-database-specific. For PostgreSQL: * `smallint` / `integer` / `oid` → `long` @@ -114,11 +114,11 @@ Type conversions are source-database-specific. For PostgreSQL: See [Patching: $row Column Types](./patching.mdx#row-column-types) for the full reference table. -**`CdcColumnType.Json`** — Parses the string value as a native JSON value (object, array, +**`CdcColumnType.Json`** - Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. -**`CdcColumnType.Attachment`** — Stores the raw column value as a RavenDB attachment. +**`CdcColumnType.Attachment`** - Stores the raw column value as a RavenDB attachment. `byte[]` → binary (`application/octet-stream`), `string` → UTF-8 text (`text/plain`), `float[]`/`double[]` → raw vector data. The `Name` field becomes the attachment name. @@ -138,7 +138,7 @@ This allows you to use data for computations without permanently storing raw SQL [ new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, - // base_price and tax_rate are NOT mapped — won't appear in document + // base_price and tax_rate are NOT mapped - won't appear in document ], Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" `} @@ -152,7 +152,7 @@ not stored as document properties. Only the computed `FinalPrice` is stored. **Naming context:** Property names (the `Name` values in `Columns`) become properties on the RavenDB -document — accessible as `this.FinalPrice` inside a patch script. +document - accessible as `this.FinalPrice` inside a patch script. Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible in patch scripts via `$row.base_price` (for the current row's values). @@ -200,7 +200,7 @@ The following rules apply to both root table and embedded table column mappings: - Each `Column` name must be unique within a table (no duplicate SQL column entries). - Each `Name` must be unique within a table (no duplicate property or attachment names). - Both `Column` and `Name` are required and must be non-empty strings. -- At least one entry is required — an empty `Columns` list is a validation error. +- At least one entry is required - an empty `Columns` list is a validation error. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index bb644fe6d9..33e58e4efe 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -41,10 +41,10 @@ The top-level configuration object for a CDC Sink task. | Property | Type | Required | Description | |----------|------|----------|-------------| | `Name` | `string` | ✓ | Unique task name | -| `ConnectionStringName` | `string` | ✓ | Name of the SQL connection string (uses the existing `SqlConnectionString` type — the same as SQL ETL). The connection string's `FactoryName` determines the source database engine. | +| `ConnectionStringName` | `string` | ✓ | Name of the SQL connection string (uses the existing `SqlConnectionString` type - the same as SQL ETL). The connection string's `FactoryName` determines the source database engine. | | `Tables` | `List` | ✓ | Root table configurations (at least one required) | | `Postgres` | `CdcSinkPostgresSettings` | | PostgreSQL-specific settings (slot and publication names) | -| `SkipInitialLoad` | `bool` | | When `true`, skip the initial full-table scan and start streaming CDC changes immediately. Only applies on first startup — has no effect once the initial load has completed. Default: `false` | +| `SkipInitialLoad` | `bool` | | When `true`, skip the initial full-table scan and start streaming CDC changes immediately. Only applies on first startup - has no effect once the initial load has completed. Default: `false` | | `Disabled` | `bool` | | Pause the task without deleting it. Default: `false` | | `MentorNode` | `string` | | Preferred cluster node for execution | | `PinToMentorNode` | `bool` | | Pin the task to the mentor node. Default: `false` | @@ -90,7 +90,7 @@ the join column values. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). ## CdcSinkTableConfig -Configures a root table — one SQL table mapped to one RavenDB collection. +Configures a root table - one SQL table mapped to one RavenDB collection. | Property | Type | Required | Description | |----------|------|----------|-------------| @@ -98,7 +98,7 @@ Configures a root table — one SQL table mapped to one RavenDB collection. | `SourceTableName` | `string` | ✓ | SQL table name (e.g., `"orders"`) | | `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | | `PrimaryKeyColumns` | `List` | ✓ | SQL columns used for document ID generation | -| `Columns` | `List` | ✓ | Column mappings — each entry defines a SQL column, its document property name, and how to store it | +| `Columns` | `List` | ✓ | Column mappings - each entry defines a SQL column, its document property name, and how to store it | | `Patch` | `string` | | JavaScript patch for INSERT and UPDATE | | `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior. Default: delete document | | `EmbeddedTables` | `List` | | Nested table configurations | @@ -119,7 +119,7 @@ Configures a table whose rows are embedded as nested objects within a parent doc | `Type` | `CdcSinkRelationType` | ✓ | `Array`, `Map`, or `Value` | | `JoinColumns` | `List` | ✓ | FK columns referencing parent's `PrimaryKeyColumns` | | `PrimaryKeyColumns` | `List` | ✓ | PK columns for matching items on UPDATE/DELETE | -| `Columns` | `List` | ✓ | Column mappings — each entry defines a SQL column, its document property name, and how to store it | +| `Columns` | `List` | ✓ | Column mappings - each entry defines a SQL column, its document property name, and how to store it | | `Patch` | `string` | | JavaScript patch on **parent** document for INSERT/UPDATE | | `OnDelete` | `CdcSinkOnDeleteConfig` | | Delete behavior for embedded items | | `CaseSensitiveKeys` | `bool` | | Case-sensitive PK matching. Default: `false` | @@ -173,13 +173,13 @@ Controls how DELETE events are handled for a table or embedded table. | Property | Type | Default | Description | |----------|------|---------|-------------| | `Patch` | `string` | null | JavaScript patch that runs when a DELETE event arrives | -| `IgnoreDeletes` | `bool` | `false` | When `true`, skip the delete — document/item is kept | +| `IgnoreDeletes` | `bool` | `false` | When `true`, skip the delete - document/item is kept | **Available patch variables for OnDelete:** -* `this` — the document (root or parent for embedded) -* `$row` — all SQL columns from the DELETE event -* `$old` — the embedded item's last known state (for embedded tables) +* `this` - the document (root or parent for embedded) +* `$row` - all SQL columns from the DELETE event +* `$old` - the embedded item's last known state (for embedded tables) **Behavior matrix:** diff --git a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx index c8beb3d9a2..dbc8211d7f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx @@ -40,9 +40,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; When `OnDelete` is `null` (or not set): -* **Root table DELETE** — The corresponding RavenDB document is deleted -* **Embedded table DELETE (Array/Map)** — The item is removed from the parent document's array or map -* **Embedded table DELETE (Value)** — The `Value`-type property on the parent document is set to `null` +* **Root table DELETE** - The corresponding RavenDB document is deleted +* **Embedded table DELETE (Array/Map)** - The item is removed from the parent document's array or map +* **Embedded table DELETE (Value)** - The `Value`-type property on the parent document is set to `null` --- @@ -59,7 +59,7 @@ When `OnDelete` is `null` (or not set): // Available variables: this, $row, $old public string Patch \{ get; set; \} - // When true, the delete is not applied — document/item is kept + // When true, the delete is not applied - document/item is kept public bool IgnoreDeletes \{ get; set; \} \} `} @@ -119,7 +119,7 @@ Use `put()` to create a document that survives the deletion: {`OnDelete = new CdcSinkOnDeleteConfig \{ - // IgnoreDeletes defaults to false — delete proceeds after patch + // IgnoreDeletes defaults to false - delete proceeds after patch Patch = @" // Create a permanent audit record in a separate collection put('DeletedOrders/' + this.Id, \{ @@ -151,7 +151,7 @@ where deletes should never result in document removal: {`OnDelete = new CdcSinkOnDeleteConfig \{ IgnoreDeletes = true - // No patch — DELETE events are silently discarded + // No patch - DELETE events are silently discarded \} `} @@ -205,13 +205,13 @@ Rather than removing a deleted line item from the array, move it to a separate -With `IgnoreDeletes = true`, CDC Sink does not automatically remove the item — +With `IgnoreDeletes = true`, CDC Sink does not automatically remove the item - the patch takes full control of both the `Lines` array and the `DeletedLines` audit trail. **Example: Run a patch but still remove the item** To run some logic on DELETE while still removing the item from the array, -use `IgnoreDeletes = false` (default) — CDC Sink handles the removal, and the patch +use `IgnoreDeletes = false` (default) - CDC Sink handles the removal, and the patch runs before it: @@ -224,7 +224,7 @@ runs before it: // ... OnDelete = new CdcSinkOnDeleteConfig \{ - // IgnoreDeletes = false (default) — CDC Sink removes the item after patch + // IgnoreDeletes = false (default) - CDC Sink removes the item after patch Patch = @" // Log total for the line being removed this.RemovedTotal = (this.RemovedTotal || 0) diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index 0c44607ea7..78b94abcb3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -147,11 +147,11 @@ item within the parent document's array or map. Items are matched by their full `PrimaryKeyColumns` composite key: -* **INSERT** — New item appended to array / added to map -* **UPDATE** — Item found by PK match; mapped columns overwritten -* **DELETE** — Item found by PK match; removed from array/map (or OnDelete behavior applied) +* **INSERT** - New item appended to array / added to map +* **UPDATE** - Item found by PK match; mapped columns overwritten +* **DELETE** - Item found by PK match; removed from array/map (or OnDelete behavior applied) -**Composite PKs** work the same way — all PK columns must match: +**Composite PKs** work the same way - all PK columns must match: diff --git a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx index 5298f4d3a4..e6f0f9cc37 100644 --- a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx @@ -47,7 +47,7 @@ Different nodes in a cluster may have different versions of this document at any ## Failover Behavior When the cluster elects a new mentor node for a CDC Sink task, the new node reads -the **replicated state** — which may be older than the work the previous mentor +the **replicated state** - which may be older than the work the previous mentor completed but had not yet replicated. **Example:** @@ -56,9 +56,9 @@ completed but had not yet replicated. {`Before failure: -├─ Node A (Mentor) — Processed up to position X, state document not yet replicated -├─ Node B (Replica) — State document shows position X-100 (older, replicated state) -└─ Node C (Replica) — State document shows position X-100 +├─ Node A (Mentor) - Processed up to position X, state document not yet replicated +├─ Node B (Replica) - State document shows position X-100 (older, replicated state) +└─ Node C (Replica) - State document shows position X-100 Node A crashes. Node B is elected new mentor. @@ -81,12 +81,12 @@ them either way. When the new mentor resumes from an older position: -* Changes that were already processed and fully replicated — re-applied (idempotent merge) -* Changes that were processed but not yet replicated — applied for the "first time" on new node -* New changes not yet seen — applied normally +* Changes that were already processed and fully replicated - re-applied (idempotent merge) +* Changes that were processed but not yet replicated - applied for the "first time" on new node +* New changes not yet seen - applied normally Re-reading is normal and expected. The document merge strategy ensures that re-applying -an INSERT or UPDATE with the same values is safe — properties are simply overwritten +an INSERT or UPDATE with the same values is safe - properties are simply overwritten with the same values they already have. @@ -104,7 +104,7 @@ CDC Sink provides **at-least-once delivery** with **eventual consistency**: * ✓ Changes are applied in source transaction order * ✓ After failover, progress resumes from the last replicated state * ✓ Idempotent patches ensure re-reads are safe -* ✗ No "exactly once" guarantee — the same change may be applied more than once +* ✗ No "exactly once" guarantee - the same change may be applied more than once This is the same model used by other ongoing tasks in RavenDB. @@ -115,7 +115,7 @@ This is the same model used by other ongoing tasks in RavenDB. A patch is **idempotent** if applying it multiple times produces the same result as applying it once. -**Column mapping is always idempotent** — overwriting a property with the same value +**Column mapping is always idempotent** - overwriting a property with the same value is a no-op. **Patches that use absolute values are idempotent:** @@ -123,7 +123,7 @@ is a no-op. -{`// Idempotent — always sets to the current SQL value +{`// Idempotent - always sets to the current SQL value this.Status = $row.is_active ? 'Active' : 'Inactive'; this.ViewCount = $row.view_count; `} @@ -136,7 +136,7 @@ this.ViewCount = $row.view_count; -{`// NOT idempotent — increments again on re-read +{`// NOT idempotent - increments again on re-read this.ViewCount = (this.ViewCount || 0) + 1; `} @@ -149,7 +149,7 @@ embedded item state, not the document's accumulated value: -{`// Idempotent — delta is recomputed correctly on re-read +{`// Idempotent - delta is recomputed correctly on re-read const oldAmount = $old?.Amount || 0; const newAmount = $row.amount || 0; this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); @@ -159,7 +159,7 @@ this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); On re-read, `$old` still reflects the state before the update, and `$row` still -reflects the new state — so the delta is the same as on the first read. +reflects the new state - so the delta is the same as on the first read. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index 414ef0e4d5..c7764b2f96 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: How It Works" sidebar_label: How It Works -description: "Describes the internal operation of CDC Sink — how it connects to the source database, loads initial data, streams changes, and handles failover." +description: "Describes the internal operation of CDC Sink - how it connects to the source database, loads initial data, streams changes, and handles failover." sidebar_position: 1 --- @@ -16,7 +16,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* This page describes the internal operation of CDC Sink — how it connects to the +* This page describes the internal operation of CDC Sink - how it connects to the source database, loads initial data, streams changes, and handles failover. * Understanding these mechanics is important when designing patches, planning for @@ -75,12 +75,12 @@ then embedded tables. This minimises the number of stub documents created (see [Child Before Parent](#child-before-parent) below). -**Change tracking is set up before the initial load begins — but CDC streaming does +**Change tracking is set up before the initial load begins - but CDC streaming does not start until after the initial load completes.** The sequence is: 1. Change-tracking infrastructure is created in the source database (e.g., a replication slot and publication for PostgreSQL, or CDC capture for SQL Server) -2. The full initial table scan runs — changes made during this time are captured by the +2. The full initial table scan runs - changes made during this time are captured by the source database but not yet consumed 3. Once the initial load is complete, CDC streaming starts from the position captured in step 1 @@ -102,7 +102,7 @@ database's change log, starting from the position captured **before** the initia Changes arrive grouped by source database transaction, preserving the exact order of operations. A transaction is only applied to RavenDB after it is fully committed -in the source database — partial transactions are never written. +in the source database - partial transactions are never written. **Document merging:** When an UPDATE arrives, CDC Sink merges the new column values onto the existing RavenDB document. Properties that are not part of the column mapping @@ -159,18 +159,18 @@ Different nodes in a cluster may have different versions of this document at any ### Failover Behavior When the cluster elects a new mentor node for the CDC Sink task, the new node reads -the **replicated** state document — which may be older than the work the previous +the **replicated** state document - which may be older than the work the previous mentor had completed but not yet replicated. The new mentor resumes from that replicated state. This means: -* **No data is lost** — CDC Sink resumes from a known position and the source database +* **No data is lost** - CDC Sink resumes from a known position and the source database retains all changes from that position onward -* **Some changes may be re-read** — Changes between the replicated state and the +* **Some changes may be re-read** - Changes between the replicated state and the previous mentor's actual progress will be processed again Re-reading is normal and expected. The document merge strategy means that re-applying -the same INSERT or UPDATE is safe — column values are simply overwritten with the same values. +the same INSERT or UPDATE is safe - column values are simply overwritten with the same values. Patches that are not idempotent can produce incorrect results if the same change is @@ -182,20 +182,20 @@ See [Patching](./patching.mdx) for guidance. ## Updating the Task Configuration -When you update a CDC Sink task configuration — for example, adding or removing columns +When you update a CDC Sink task configuration - for example, adding or removing columns from the `Columns` list, changing a `Patch` script, or modifying embedded table -configuration — the changes take effect **only for new CDC events going forward**. +configuration - the changes take effect **only for new CDC events going forward**. CDC Sink does not retroactively re-process existing documents. Documents that were already created retain their current structure. This means: -* **Adding a new column mapping** — Existing documents will not have the new property. +* **Adding a new column mapping** - Existing documents will not have the new property. Only documents created or updated by a subsequent CDC event will include it. -* **Removing a column mapping** — Existing documents retain the property. It will no +* **Removing a column mapping** - Existing documents retain the property. It will no longer be updated by CDC events, but it is not removed from existing documents. -* **Changing a patch script** — The new patch runs on future events only. Existing +* **Changing a patch script** - The new patch runs on future events only. Existing documents reflect the results of the previous patch. -* **Adding an embedded or linked table** — Existing parent documents will not have the +* **Adding an embedded or linked table** - Existing parent documents will not have the new embedded data until a CDC event for the embedded table row arrives. @@ -225,7 +225,7 @@ embedded child data. When CDC streaming begins after the initial load, it picks missing parent row and merges its columns onto the stub document. The final document will contain both the parent fields and all embedded items. No data -is lost — the brief intermediate state is resolved automatically once streaming starts. +is lost - the brief intermediate state is resolved automatically once streaming starts. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index ad48b4ba9b..4c51e5ebbc 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Monitoring" sidebar_label: Monitoring -description: "Explains how to monitor a CDC Sink task — its running state, progress, fallback behavior, and statistics available through Management Studio and the API." +description: "Explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through Management Studio and the API." sidebar_position: 12 --- @@ -16,7 +16,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* This page explains how to monitor a CDC Sink task — its running state, progress, +* This page explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through the Management Studio and API. * In this page: @@ -35,7 +35,7 @@ A CDC Sink task can be in one of the following states: | State | Description | |-------|-------------| -| `Active` | Running normally — streaming changes or waiting for new changes | +| `Active` | Running normally - streaming changes or waiting for new changes | | `ActiveByAnotherNode` | Another cluster node is the mentor; this node is a replica | | `Disabled` | Manually disabled via Studio or API | | `Error` | The task encountered an error and stopped | @@ -85,7 +85,7 @@ The returned object includes: | `ResponsibleNode` | Node currently running the task | | `Error` | Error message if the task is in error state | -Detailed per-table statistics — including row counts and last processed position — +Detailed per-table statistics - including row counts and last processed position - are available through the Management Studio's ongoing tasks detail view. --- @@ -105,7 +105,7 @@ making it straightforward to diagnose the root cause. ## Error Handling -CDC Sink tolerates individual document processing errors — each failure is logged +CDC Sink tolerates individual document processing errors - each failure is logged and recorded, but processing continues for the remaining documents in the batch. The CDC position advances as long as the error ratio stays within acceptable bounds. @@ -119,7 +119,7 @@ retry, up to the limit set by `CdcSink.MaxFallbackTimeInSec` (default 15 minutes See [Server Configuration](./server-configuration.mdx) and [Fallback Mode](#fallback-mode). **Patch errors:** -Patch errors — including `MaxSteps exceeded` — fail only the affected document. +Patch errors - including `MaxSteps exceeded` - fail only the affected document. The rest of the batch continues normally. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx index 5a4bba128b..7dc4d13245 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink for MySQL: Overview" sidebar_label: Overview -description: "CDC Sink support for MySQL and MariaDB — using binlog replication to stream changes into RavenDB in real time." +description: "CDC Sink support for MySQL and MariaDB - using binlog replication to stream changes into RavenDB in real time." sidebar_position: 0 --- @@ -79,9 +79,9 @@ GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; -* `REPLICATION SLAVE` — required to read the binlog stream -* `REPLICATION CLIENT` — required to query binlog status -* `SELECT` — required for the initial full-table load +* `REPLICATION SLAVE` - required to read the binlog stream +* `REPLICATION CLIENT` - required to query binlog status +* `SELECT` - required for the initial full-table load --- diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index 7a2adb1909..28343b119b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -24,13 +24,13 @@ import LanguageContent from "@site/src/components/LanguageContent"; The relational database is the source of truth; RavenDB receives a continuously-updated document model derived from it. -* CDC Sink maps normalized relational tables into rich, nested RavenDB documents — +* CDC Sink maps normalized relational tables into rich, nested RavenDB documents - automatically and in real time. * Supported source databases: - * **PostgreSQL** — via logical replication - * **SQL Server** — via native CDC (polling change tables) - * **MySQL / MariaDB** — via binlog replication + * **PostgreSQL** - via logical replication + * **SQL Server** - via native CDC (polling change tables) + * **MySQL / MariaDB** - via binlog replication * In this page: * [Why Use CDC Sink](#why-use-cdc-sink) @@ -49,7 +49,7 @@ without requiring changes to the source system. * **Migrate from SQL to RavenDB** Transform normalized SQL tables (orders, order_lines, customers) into rich RavenDB - documents where an Order contains embedded LineItems and a reference to the Customer — + documents where an Order contains embedded LineItems and a reference to the Customer - automatically and continuously, without changing your SQL application. * **Build a read-optimized view** @@ -63,7 +63,7 @@ without requiring changes to the source system. * **Event-driven side effects** Using JavaScript patches, every INSERT, UPDATE, or DELETE in the source database can - trigger custom logic in RavenDB — computing derived fields, maintaining running totals, + trigger custom logic in RavenDB - computing derived fields, maintaining running totals, or writing custom transformations. --- @@ -86,7 +86,7 @@ from where it left off rather than re-scanning. After the initial load, CDC Sink switches to streaming changes in real time. Changes are grouped into transactions, preserving the exact order of operations -from the source database. Partial transactions are never written to RavenDB — +from the source database. Partial transactions are never written to RavenDB - all changes within a source database transaction are applied together. ### Document Model @@ -103,21 +103,21 @@ See [Schema Design](./schema-design.mdx) for details. ## Task Lifecycle -1. **Create** — Define the task in Studio or via the Client API +1. **Create** - Define the task in Studio or via the Client API Specify the connection string, table mappings, and transformation options -2. **Verify** — CDC Sink verifies the source database is properly configured +2. **Verify** - CDC Sink verifies the source database is properly configured Checks permissions, replication prerequisites, and table configuration -3. **Initial Load** — Full table scan populates RavenDB with current data +3. **Initial Load** - Full table scan populates RavenDB with current data Progress is tracked per-table and persists across restarts -4. **Stream** — Real-time change streaming begins +4. **Stream** - Real-time change streaming begins All INSERTs, UPDATEs, and DELETEs are applied to RavenDB documents as they occur -5. **Monitor** — View statistics, errors, and progress in Studio +5. **Monitor** - View statistics, errors, and progress in Studio -6. **Retire** — Delete the task in RavenDB when no longer needed +6. **Retire** - Delete the task in RavenDB when no longer needed PostgreSQL artifacts (replication slot, publication) must be cleaned up by the database administrator separately diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 2b7bf52eef..136222bbf3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -101,15 +101,15 @@ In the patch script: -{`// $row — SQL column names, raw SQL types +{`// $row - SQL column names, raw SQL types $row.customer_name // string $row.amount // number (from numeric/decimal column) -// $old — mapped property names, stored JSON types +// $old - mapped property names, stored JSON types $old.CustomerName // string (as stored in RavenDB) $old.Amount // number (as stored in RavenDB) -// this — the document after column mapping has been applied for this event +// this - the document after column mapping has been applied for this event this.CustomerName // string (just set from $row.customer_name) this.Amount // number (just set from $row.amount) `} @@ -118,7 +118,7 @@ this.Amount // number (just set from $row.amount) -Unmapped columns — those not listed in `Columns` — appear in `$row` but are never +Unmapped columns - those not listed in `Columns` - appear in `$row` but are never written to the document and therefore never appear in `$old`. @@ -142,7 +142,7 @@ database type. | `uuid` | `string` | | | `varchar` / `text` / `char` | `string` | | | `bytea` | `string` | Base64-encoded | -| `json` / `jsonb` | `string` | Raw JSON text — call `JSON.parse()` to access as an object / array | +| `json` / `jsonb` | `string` | Raw JSON text - call `JSON.parse()` to access as an object / array | | `text[]` / `varchar[]` / `int[]` / etc. | `Array` | Elements are always strings, even for numeric array types | | `vector` (pgvector) | `Array` | Elements are JavaScript numbers (floats) | @@ -168,7 +168,7 @@ this.Label = meta.label; this.FirstTag = $row.tags[0]; this.Tags = $row.tags; -// INT[] elements are strings — parse explicitly if numeric arithmetic is needed +// INT[] elements are strings - parse explicitly if numeric arithmetic is needed var first = parseInt($row.scores[0], 10); `} @@ -263,13 +263,13 @@ Without it, deletes will leave the aggregate in an incorrect state. new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, ], - // Runs on INSERT and UPDATE — recomputes total from current Lines array + // Runs on INSERT and UPDATE - recomputes total from current Lines array Patch = @" this.TotalQuantity = (this.Lines || []) .reduce((sum, line) => sum + (line.Quantity || 0), 0); ", - // REQUIRED: Runs on DELETE — recomputes after item is removed from array + // REQUIRED: Runs on DELETE - recomputes after item is removed from array OnDelete = new CdcSinkOnDeleteConfig \{ Patch = @" @@ -398,7 +398,7 @@ if (customer) \{ this.CustomerEmail = customer.Email; this.CustomerTier = customer.Tier; \} else \{ - // Document doesn't exist yet — race condition or not yet synced + // Document doesn't exist yet - race condition or not yet synced this.CustomerName = null; this.CustomerEmail = null; \} @@ -416,7 +416,7 @@ Always check for null before accessing properties. * Denormalizing slowly-changing reference data (customer name, category, region) * Capturing a snapshot of related data at insert time -**Prefer linked tables** for simple foreign key references — they are cleaner and +**Prefer linked tables** for simple foreign key references - they are cleaner and do not have the null-handling complexity of `load()`. --- @@ -432,13 +432,13 @@ and re-applied. -{`// NOT idempotent — increments again on re-read +{`// NOT idempotent - increments again on re-read this.ViewCount = (this.ViewCount || 0) + 1; -// Idempotent — absolute value from SQL source +// Idempotent - absolute value from SQL source this.ViewCount = $row.view_count; -// Idempotent — delta via $old (both first-read and re-read produce same result) +// Idempotent - delta via $old (both first-read and re-read produce same result) const oldVal = $old?.Amount || 0; const newVal = $row.amount || 0; this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); @@ -447,7 +447,7 @@ this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); -Column mapping itself is idempotent — overwriting a property with the same value +Column mapping itself is idempotent - overwriting a property with the same value is always safe. --- @@ -462,7 +462,7 @@ See [Patching Configuration](../../../server/configuration/patching-configuratio If a patch exceeds the limit, the CDC operation fails and is retried. -Keep patches focused and efficient — prefer `.filter()` + `.reduce()` over nested loops. +Keep patches focused and efficient - prefer `.filter()` + `.reduce()` over nested loops. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx index 538fb59942..145e356008 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx @@ -17,7 +17,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * When a CDC Sink task is deleted from RavenDB, the associated PostgreSQL objects - — the replication slot and publication — are **not** automatically removed. + - the replication slot and publication - are **not** automatically removed. * These must be cleaned up manually by a database administrator. @@ -77,7 +77,7 @@ WHERE slot_name LIKE 'rvn_cdc_s_%'; An `active = false` slot is not being consumed. Compare the list to your active CDC -Sink tasks in RavenDB — any slot whose corresponding task no longer exists is orphaned. +Sink tasks in RavenDB - any slot whose corresponding task no longer exists is orphaned. List all CDC Sink publications: @@ -126,7 +126,7 @@ task must be stopped or deleted in RavenDB before the slot can be dropped. -Publications are not consumed like slots — they do not accumulate data or hold WAL +Publications are not consumed like slots - they do not accumulate data or hold WAL segments. However, they should still be dropped to keep the database clean. --- @@ -183,7 +183,7 @@ WHERE active = false; ## Slot and Publication Names Are Immutable The replication slot name and publication name are generated **once at task creation** -using a GUID and stored with the task. They do not change when you modify the task — +using a GUID and stored with the task. They do not change when you modify the task - adding or removing tables, renaming the task, or changing any other configuration always reuses the same slot and publication. @@ -191,7 +191,7 @@ Attempting to specify a different `SlotName` or `PublicationName` when updating task results in an error. If you need to use a different slot or publication, delete the task and create a new one. -The old slot and publication from the deleted task must then be cleaned up manually — +The old slot and publication from the deleted task must then be cleaned up manually - see [Dropping a Replication Slot](#dropping-a-replication-slot) and [Dropping a Publication](#dropping-a-publication) below. diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index 502573bfe0..7315fb07d2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -109,7 +109,7 @@ RavenDB document in collection `Customers` with ID `Customers/1`: -Document IDs are generated as `{collection}/{pk}` — for example, `Customers/1` +Document IDs are generated as `{collection}/{pk}` - for example, `Customers/1` for a row with `id = 1`. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx index d491506ee1..144f485d49 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx @@ -177,7 +177,7 @@ a specific task. The slot and publication names are generated **once at task creation** and then stored with the task. Subsequent modifications to the task (adding tables, changing mappings, -etc.) do not change the slot or publication names — the original names are always used. +etc.) do not change the slot or publication names - the original names are always used. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx index 78390309b6..3f94307c88 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx @@ -16,7 +16,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; -* This page covers PostgreSQL-side monitoring for CDC Sink — replication slot health, +* This page covers PostgreSQL-side monitoring for CDC Sink - replication slot health, lag, and WAL usage. * For RavenDB-side monitoring, see [Monitoring](../monitoring.mdx). @@ -77,7 +77,7 @@ of changes in the source database. Consider: * Increasing `CdcSink.MaxBatchSize` to process more changes per batch * Reducing load on the source database -* Checking the per-table processing statistics in the Management Studio for slow scripts — +* Checking the per-table processing statistics in the Management Studio for slow scripts - complex patch scripts are a common cause of processing slowdowns --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx index 99fed469e7..ce80b03e87 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink for PostgreSQL: Overview" sidebar_label: Overview -description: "CDC Sink support for PostgreSQL — using logical replication to stream changes into RavenDB in real time." +description: "CDC Sink support for PostgreSQL - using logical replication to stream changes into RavenDB in real time." sidebar_position: -1 --- @@ -55,11 +55,11 @@ changes without polling. This gives low-latency, near-real-time replication. Key PostgreSQL concepts: -* **Replication slot** — a server-side cursor that tracks how far a consumer has read. +* **Replication slot** - a server-side cursor that tracks how far a consumer has read. CDC Sink creates and manages one automatically. -* **Publication** — defines which tables are included in the replication stream. +* **Publication** - defines which tables are included in the replication stream. CDC Sink creates one automatically for the configured tables. -* **WAL (Write-Ahead Log)** — PostgreSQL retains WAL segments as long as a replication +* **WAL (Write-Ahead Log)** - PostgreSQL retains WAL segments as long as a replication slot has not consumed them. An inactive or paused task causes WAL to accumulate. --- @@ -111,13 +111,13 @@ The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. ## In This Section -* [Prerequisites Checklist](./prerequisites-checklist.mdx) — what to verify before creating a task -* [Initial Setup](./initial-setup.mdx) — creating the replication slot and publication -* [WAL Configuration](./wal-configuration.mdx) — PostgreSQL WAL settings -* [Permissions and Roles](./permissions-and-roles.mdx) — required database permissions -* [REPLICA IDENTITY](./replica-identity.mdx) — configuring DELETE event content -* [Monitoring PostgreSQL](./monitoring-postgres.mdx) — replication lag and WAL monitoring -* [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) — dropping orphaned slots -* [Studio UI](./studio-ui.mdx) — creating tasks through the Studio interface +* [Prerequisites Checklist](./prerequisites-checklist.mdx) - what to verify before creating a task +* [Initial Setup](./initial-setup.mdx) - creating the replication slot and publication +* [WAL Configuration](./wal-configuration.mdx) - PostgreSQL WAL settings +* [Permissions and Roles](./permissions-and-roles.mdx) - required database permissions +* [REPLICA IDENTITY](./replica-identity.mdx) - configuring DELETE event content +* [Monitoring PostgreSQL](./monitoring-postgres.mdx) - replication lag and WAL monitoring +* [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) - dropping orphaned slots +* [Studio UI](./studio-ui.mdx) - creating tasks through the Studio interface --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx index beb6b070d4..6db5ecb0c3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx @@ -32,8 +32,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; At a minimum, the CDC Sink user needs: -* **`REPLICATION`** attribute — allows the user to initiate logical replication -* **`SELECT`** on each table being replicated — required for the initial load phase +* **`REPLICATION`** attribute - allows the user to initiate logical replication +* **`SELECT`** on each table being replicated - required for the initial load phase Example: diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx index 5ffc39b566..d9987a96df 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx @@ -129,7 +129,7 @@ Full details: [Permissions and Roles](./permissions-and-roles.mdx). index that includes the join columns. Without this, DELETE events will not include the old row values, and CDC Sink cannot identify which embedded item to remove. Alternatively, set `OnDelete.IgnoreDeletes = true` on the embedded table to skip - delete processing entirely — then no `REPLICA IDENTITY` change is required. + delete processing entirely - then no `REPLICA IDENTITY` change is required. See [REPLICA IDENTITY](./replica-identity.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx index 0fad6a9213..762a9c4fe4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx @@ -47,7 +47,7 @@ columns, CDC Sink cannot perform steps 1 or 2. By default, PostgreSQL only includes the primary key columns in DELETE events. If the embedded table's join columns are part of the primary key, this is sufficient. -If they are not — which is the common case when a table has a surrogate PK — the +If they are not - which is the common case when a table has a surrogate PK - the DELETE event will be missing the columns needed to route it. --- @@ -72,10 +72,10 @@ For CDC Sink, `FULL` is the simplest and most compatible choice. | Scenario | REPLICA IDENTITY needed? | |----------|------------------------| -| Root table deletes | No — root documents are deleted by document ID | -| Embedded table deletes where join columns ARE part of the PK | No — `DEFAULT` is sufficient | -| Embedded table deletes where join columns are NOT part of the PK | **Yes** — `DEFAULT` is insufficient | -| Embedded table where `OnDelete.IgnoreDeletes = true` is set | No — deletes are skipped, so delete routing isn't needed | +| Root table deletes | No - root documents are deleted by document ID | +| Embedded table deletes where join columns ARE part of the PK | No - `DEFAULT` is sufficient | +| Embedded table deletes where join columns are NOT part of the PK | **Yes** - `DEFAULT` is insufficient | +| Embedded table where `OnDelete.IgnoreDeletes = true` is set | No - deletes are skipped, so delete routing isn't needed | | Deep-nested embedded tables | Depends on the join column placement | **Example where REPLICA IDENTITY is needed:** diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx index 0cedc92e5f..e2d75a0c9a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx @@ -47,9 +47,9 @@ To create a CDC Sink task in the Studio: The task list shows: * **Task name** and **connection string name** -* **State** — Active, Disabled, Error, or FallbackMode -* **Responsible node** — the cluster node currently running the task -* **Progress** — during initial load, shows which tables have been scanned +* **State** - Active, Disabled, Error, or FallbackMode +* **Responsible node** - the cluster node currently running the task +* **Progress** - during initial load, shows which tables have been scanned Clicking on a task opens the detail view with per-table statistics. @@ -62,7 +62,7 @@ form used for creation opens in edit mode. The replication slot and publication names are **fixed at task creation** and do not -change when you edit the task — regardless of whether names were auto-generated or +change when you edit the task - regardless of whether names were auto-generated or specified explicitly. When you add or remove tables, CDC Sink continues using the same slot and publication @@ -73,7 +73,7 @@ be kept in sync with the task configuration: run `ALTER PUBLICATION ADD TABLE
;` when the task is saved. If it does not have permissions, a database administrator must run this manually. * **Removing a table:** `ALTER PUBLICATION DROP TABLE
;` must be run - manually by a database administrator — CDC Sink does not remove tables from the + manually by a database administrator - CDC Sink does not remove tables from the publication automatically. Orphaned slots and publications must be dropped manually by the database administrator. diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 8f64d7c68e..03f0064b32 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -93,7 +93,7 @@ Document after CDC UPDATE: **Overwritten on CDC update:** -* Any property mapped via the `Columns` list — always updated to match the current SQL value +* Any property mapped via the `Columns` list - always updated to match the current SQL value If you manually edit a property that is part of the `Columns` list, the next CDC UPDATE for that row will overwrite your edit with the SQL value. diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index c5219c2d99..22555f48b9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -17,8 +17,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; * CDC Sink maps a relational schema to a RavenDB document model through configuration. - This page explains the three building blocks — root tables, embedded tables, and - linked tables — and how to combine them. + This page explains the three building blocks - root tables, embedded tables, and + linked tables - and how to combine them. * In this page: * [Root Tables](#root-tables) @@ -180,8 +180,8 @@ All PK columns must be present in every INSERT, UPDATE, and DELETE event. An embedded table needs: -* **PrimaryKeyColumns** — Used to match items within the parent's array for UPDATE and DELETE -* **JoinColumns** — Foreign key referencing the parent's `PrimaryKeyColumns` +* **PrimaryKeyColumns** - Used to match items within the parent's array for UPDATE and DELETE +* **JoinColumns** - Foreign key referencing the parent's `PrimaryKeyColumns` The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `PrimaryKeyColumns`: @@ -287,7 +287,7 @@ in a single pass, without additional lookups. Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY -configuration — the default DELETE events include all PK columns. +configuration - the default DELETE events include all PK columns. --- @@ -301,13 +301,13 @@ The `Type` property on embedded tables controls the document structure: | `Map` | One-to-many with direct key lookup | `"Lines": \{ "1": \{ ... \}, "2": \{ ... \} \}` | | `Value` | Many-to-one: parent has one child | `"Customer": \{ ... \}` | -**Array** — Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. +**Array** - Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. Use when you need to iterate over all items. -**Map** — Items are stored as a JSON object keyed by the primary key value(s). +**Map** - Items are stored as a JSON object keyed by the primary key value(s). Use when you need fast direct-key access within the document. -**Value** — Stores a single embedded object. +**Value** - Stores a single embedded object. Use for many-to-one relationships (many orders share one customer). --- diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index 387f1d2c4b..248d0d1ddd 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink: Source Schema Changes" sidebar_label: Source Schema Changes -description: "How to safely modify your source database schema while a CDC Sink task is running — behavior per database engine, recovery, and the SQL Server capture instance procedure." +description: "How to safely modify your source database schema while a CDC Sink task is running - behavior per database engine, recovery, and the SQL Server capture instance procedure." sidebar_position: 13 --- @@ -54,12 +54,12 @@ PostgreSQL logical replication sends `RelationMessage` events inline in the WAL whenever the schema changes. CDC Sink detects these automatically and rebuilds its column mapping on the fly. This makes PostgreSQL the **most resilient** to schema changes. -* **Adding or dropping unmapped columns** — transparent. +* **Adding or dropping unmapped columns** - transparent. -* **Changing a column type** — usually transparent. A new `RelationMessage` triggers +* **Changing a column type** - usually transparent. A new `RelationMessage` triggers an update to the internal columns mapping inside the sink. -* **Dropping or renaming a mapped column** — CDC Sink enters fallback because the +* **Dropping or renaming a mapped column** - CDC Sink enters fallback because the mapped column name is no longer found in the new schema. Update the task configuration to match the new column name, and CDC Sink recovers on the next retry. @@ -93,14 +93,14 @@ containing column type information. CDC Sink compares the column types at mapped positions against the expected types from `INFORMATION_SCHEMA`. If they don't match, the process detects a schema change. -* **Adding or dropping unmapped columns** — transparent. The unmapped column is ignored. +* **Adding or dropping unmapped columns** - transparent. The unmapped column is ignored. The CDC Sink may restart itself to re-resolve the current schema from `INFORMATION_SCHEMA`, but normal operations will resume momentarily. -* **Changing a column type** — CDC Sink detects the type change via binlog column types, +* **Changing a column type** - CDC Sink detects the type change via binlog column types, restarts, re-resolves from `INFORMATION_SCHEMA`, and continues. -* **Dropping or renaming a mapped column** — CDC Sink enters fallback because the +* **Dropping or renaming a mapped column** - CDC Sink enters fallback because the mapped column is no longer found. Update the task configuration to match the new schema. @@ -142,7 +142,7 @@ ALTER TABLE orders DROP COLUMN legacy_field; ## SQL Server -SQL Server CDC uses **capture instances** — immutable snapshots of the table schema +SQL Server CDC uses **capture instances** - immutable snapshots of the table schema at the time `sp_cdc_enable_table` was executed. The CDC change tables reflect the schema as it was when the capture instance was created, **not** the current table schema. This means **any** schema change on a CDC-tracked table requires creating @@ -170,7 +170,7 @@ EXEC sys.sp_cdc_enable_table @capture_instance = N'dbo_orders_v2', @role_name = NULL; --- Step 3: WAIT — let CDC Sink drain the OLD capture instance. +-- Step 3: WAIT - let CDC Sink drain the OLD capture instance. -- The sink reads from the oldest instance and processes all remaining changes. -- Monitor the CDC Sink task status in Studio to confirm it has caught up. @@ -188,11 +188,11 @@ EXEC sys.sp_cdc_disable_table **What happens at each step:** -1. **After step 2** — Two capture instances exist. CDC Sink continues reading from the +1. **After step 2** - Two capture instances exist. CDC Sink continues reading from the oldest one (`dbo_orders`). New changes are captured by both instances. -2. **After step 3** — CDC Sink has processed all changes from the old instance. It's +2. **After step 3** - CDC Sink has processed all changes from the old instance. It's safe to drop it. -3. **After step 4** — `fn_cdc_get_min_lsn('dbo_orders')` returns all zeros. CDC Sink +3. **After step 4** - `fn_cdc_get_min_lsn('dbo_orders')` returns all zeros. CDC Sink detects this on the next poll cycle, enters fallback, and restarts against the new instance. @@ -201,7 +201,7 @@ configuration after the new capture instance is active. -Do not drop the old capture instance before CDC Sink has drained it — you may lose +Do not drop the old capture instance before CDC Sink has drained it - you may lose changes that were captured in the old instance but not yet processed. @@ -230,12 +230,12 @@ finding data. All three providers use the same recovery mechanism: -1. **Error detected** — process enters fallback mode with exponential backoff (starting +1. **Error detected** - process enters fallback mode with exponential backoff (starting at 5 seconds, up to `CdcSink.MaxFallbackTimeInSec`) -2. **On each retry** — process restarts: re-resolves schema, re-opens connections -3. **If the error persists** (e.g., mapped column still missing) — retries continue +2. **On each retry** - process restarts: re-resolves schema, re-opens connections +3. **If the error persists** (e.g., mapped column still missing) - retries continue with increasing backoff. A notification is raised for each error, visible in Studio. -4. **After fixing the configuration** — the process recovers automatically on the next +4. **After fixing the configuration** - the process recovers automatically on the next retry cycle. No manual restart is needed. --- diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx index 9b103d38bb..810c3f2743 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx @@ -1,7 +1,7 @@ --- title: "CDC Sink for SQL Server: Overview" sidebar_label: Overview -description: "CDC Sink support for SQL Server — using native SQL Server Change Data Capture to stream changes into RavenDB." +description: "CDC Sink support for SQL Server - using native SQL Server Change Data Capture to stream changes into RavenDB." sidebar_position: 0 --- diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index e34d32aa55..ce2c9d924f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -39,17 +39,17 @@ import LanguageContent from "@site/src/components/LanguageContent"; **Common causes:** -* **Invalid connection string** — verify the connection string name matches one defined +* **Invalid connection string** - verify the connection string name matches one defined in the SQL connection strings section of the Management Studio. -* **Connection refused** — the source database is unreachable from the RavenDB server. +* **Connection refused** - the source database is unreachable from the RavenDB server. Verify host, port, and firewall rules. -* **Authentication failure** — the credentials in the connection string are incorrect +* **Authentication failure** - the credentials in the connection string are incorrect or the user does not have the required permissions. See the PostgreSQL [Permissions and Roles](./postgres/permissions-and-roles.mdx) page. -* **WAL level not set to `logical`** — CDC Sink requires logical replication enabled +* **WAL level not set to `logical`** - CDC Sink requires logical replication enabled on the source. See [WAL Configuration](./postgres/wal-configuration.mdx). @@ -64,18 +64,18 @@ specific failure reason. **Common causes:** -* **Replication slot dropped** — if the PostgreSQL replication slot was dropped +* **Replication slot dropped** - if the PostgreSQL replication slot was dropped externally, CDC Sink cannot resume. The task must be deleted and recreated (a new slot will be created on next start). -* **Source table schema changed** — adding or removing columns from the SQL table +* **Source table schema changed** - adding or removing columns from the SQL table may cause mapping errors. See [Source Schema Changes](./source-schema-changes.mdx). -* **Replication lag too large** — if CDC Sink falls behind significantly, PostgreSQL +* **Replication lag too large** - if CDC Sink falls behind significantly, PostgreSQL may retain WAL segments that fill the disk. See your PostgreSQL documentation on `wal_keep_size` and replication slot lag. -* **Persistent connection failure** — the source has been unreachable through multiple +* **Persistent connection failure** - the source has been unreachable through multiple retry cycles. Retry delay doubles on each failure up to the `CdcSink.MaxFallbackTimeInSec` cap (default 15 minutes). Restore connectivity and the task resumes automatically on the next retry. @@ -88,18 +88,18 @@ specific failure reason. **Check:** -1. **Initial load in progress** — CDC Sink performs a full table scan before streaming. +1. **Initial load in progress** - CDC Sink performs a full table scan before streaming. For large tables this can take time. Check the task progress in Studio. -2. **Table is disabled** — verify `Disabled` is not set to `true` on the `CdcSinkTableConfig`. +2. **Table is disabled** - verify `Disabled` is not set to `true` on the `CdcSinkTableConfig`. -3. **Primary key mismatch** — the columns listed in `PrimaryKeyColumns` must match the +3. **Primary key mismatch** - the columns listed in `PrimaryKeyColumns` must match the actual SQL primary key. If they don't match, CDC Sink cannot generate a document ID. -4. **Columns list is empty** — at least one column must be mapped. A table with no +4. **Columns list is empty** - at least one column must be mapped. A table with no column mappings will produce empty documents. -5. **Task is paused** — check that the task state is `Active`, not `Disabled`. +5. **Task is paused** - check that the task state is `Active`, not `Disabled`. --- @@ -109,21 +109,21 @@ specific failure reason. **Check:** -1. **JoinColumns mismatch** — the `JoinColumns` in `CdcSinkEmbeddedTableConfig` must +1. **JoinColumns mismatch** - the `JoinColumns` in `CdcSinkEmbeddedTableConfig` must reference the same columns (by name) that the SQL foreign key uses. Verify these match the parent table's `PrimaryKeyColumns`. -2. **PrimaryKeyColumns wrong** — the embedded table's `PrimaryKeyColumns` are used to +2. **PrimaryKeyColumns wrong** - the embedded table's `PrimaryKeyColumns` are used to match items on UPDATE and DELETE. If they're wrong, new items may be created as duplicates or existing items may not be found. -3. **DELETE not reflected** — if embedded item rows are being deleted in SQL but the +3. **DELETE not reflected** - if embedded item rows are being deleted in SQL but the items remain in RavenDB, check whether `REPLICA IDENTITY` is configured for the embedded table. Without it, PostgreSQL does not include the old row values in the DELETE event, and CDC Sink cannot identify which item to remove. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). -4. **Type mismatch (Array vs Map)** — if the `Type` was changed from `Array` to `Map` +4. **Type mismatch (Array vs Map)** - if the `Type` was changed from `Array` to `Map` or vice versa after documents were already created, existing documents retain the old structure. Re-process from scratch or migrate existing documents. @@ -135,17 +135,17 @@ specific failure reason. **Check:** -1. **`IgnoreDeletes = true`** — if `OnDelete.IgnoreDeletes` is set to `true`, the +1. **`IgnoreDeletes = true`** - if `OnDelete.IgnoreDeletes` is set to `true`, the delete is intentionally discarded. Verify this is the intended behavior. -2. **Missing REPLICA IDENTITY (embedded tables)** — for embedded table items, +2. **Missing REPLICA IDENTITY (embedded tables)** - for embedded table items, PostgreSQL must include old row values in DELETE events so CDC Sink knows which parent document to update. If `REPLICA IDENTITY` is not set to `FULL` (or to an index that includes join columns), the DELETE event may be missing the columns needed to route it. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). -3. **Custom patch returns without deleting** — if an `OnDelete.Patch` is configured +3. **Custom patch returns without deleting** - if an `OnDelete.Patch` is configured that does not allow the delete to proceed (combined with `IgnoreDeletes = true`), the document is kept. Review the patch logic. @@ -157,13 +157,13 @@ specific failure reason. **Check:** -1. **Script syntax error** — test the patch script in the Management Studio's patch +1. **Script syntax error** - test the patch script in the Management Studio's patch editor before using it in CDC Sink. -2. **Null reference** — `$row` properties and `$old` may be `null` for certain event +2. **Null reference** - `$row` properties and `$old` may be `null` for certain event types. Use optional chaining: `$old?.Amount || 0`. -3. **`load()` returns null** — a document loaded with `load()` may not exist yet if CDC +3. **`load()` returns null** - a document loaded with `load()` may not exist yet if CDC Sink processes tables out of dependency order. Guard with a null check: @@ -176,7 +176,7 @@ if (related) \{ ... \} -4. **Step limit exceeded** — patch scripts have a step quota. If the script is very +4. **Step limit exceeded** - patch scripts have a step quota. If the script is very long-running or loops over large arrays, it may hit `Patching.MaxStepsForScript`. See the [configuration reference](../../../server/configuration/patching-configuration) for this setting. @@ -204,15 +204,15 @@ task configuration is present and the data already exists in RavenDB. CDC Sink stores two separate pieces of information: -* **Task configuration** — stored in the cluster-wide **database record**. This is +* **Task configuration** - stored in the cluster-wide **database record**. This is always included in any export/import because it is part of the database definition. -* **Processing state (last LSN)** — stored as a **document** in the `@cdc-states` +* **Processing state (last LSN)** - stored as a **document** in the `@cdc-states` system collection. This tracks the last position read from the source database (e.g., the PostgreSQL LSN or SQL Server change tracking version). It also tracks per-table initial load progress. If you export and import the database but **skip importing documents** (or skip system -documents), the task configuration is restored from the database record — but the +documents), the task configuration is restored from the database record - but the processing state document is missing. CDC Sink sees a valid configuration with no recorded position and starts from the beginning: performing a full initial load of every configured table, then streaming all changes from the start. @@ -223,13 +223,13 @@ heavy load on both the source database and RavenDB. **How to avoid this:** * When exporting a database that has CDC Sink tasks, always include documents in the - export — specifically the `@cdc-states` collection. + export - specifically the `@cdc-states` collection. * If using Smuggler or the REST API for selective export/import, ensure system documents are included. * If state loss has already occurred and the data in RavenDB is already up to date, you can delete and recreate the task with `SkipInitialLoad = true` to skip the full table scan and begin streaming from the current position. Note that imported tasks - are restored in a **disabled** state by default — you must explicitly enable the task + are restored in a **disabled** state by default - you must explicitly enable the task after import. This gives you the opportunity to inspect and correct the configuration before the task starts processing. From c254a25968b5ca0dfc4ff2c2fd4d55219f43853e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Mon, 6 Jul 2026 12:26:58 +0200 Subject: [PATCH 26/84] RDoc-3836 Apply PR review comments and doc-wide style pass to CDC Sink docs --- .../ongoing-tasks/cdc-sink/_category_.json | 5 +- .../ongoing-tasks/cdc-sink/api-reference.mdx | 132 +++++---- .../cdc-sink/attachment-handling.mdx | 117 ++++---- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 143 +++++----- .../cdc-sink/configuration-reference.mdx | 82 +++--- .../cdc-sink/delete-strategies.mdx | 167 +++++------ .../cdc-sink/embedded-tables.mdx | 170 ++++++----- .../cdc-sink/failover-and-consistency.mdx | 83 +++--- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 137 ++++++--- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 92 +++--- .../ongoing-tasks/cdc-sink/monitoring.mdx | 61 ++-- .../ongoing-tasks/cdc-sink/mysql/overview.mdx | 67 ++--- .../ongoing-tasks/cdc-sink/overview.mdx | 118 ++++---- .../ongoing-tasks/cdc-sink/patching.mdx | 268 ++++++++++-------- .../cdc-sink/postgres/_category_.json | 5 +- .../postgres/cleanup-and-maintenance.mdx | 138 ++++----- .../postgres/examples/_category_.json | 5 +- .../examples/example-complex-nesting.mdx | 160 ++++++----- .../examples/example-denormalization.mdx | 161 ++++++----- .../examples/example-event-sourcing.mdx | 132 +++++---- .../examples/example-simple-migration.mdx | 116 ++++---- .../cdc-sink/postgres/initial-setup.mdx | 111 ++++---- .../cdc-sink/postgres/monitoring-postgres.mdx | 75 ++--- .../cdc-sink/postgres/overview.mdx | 54 ++-- .../postgres/permissions-and-roles.mdx | 83 +++--- .../postgres/prerequisites-checklist.mdx | 103 ++++--- .../replica-identity-manual-setup.mdx | 82 +++--- .../cdc-sink/postgres/replica-identity.mdx | 75 ++--- .../cdc-sink/postgres/studio-ui.mdx | 52 ++-- .../cdc-sink/postgres/wal-configuration.mdx | 90 +++--- .../cdc-sink/property-retention.mdx | 82 +++--- .../ongoing-tasks/cdc-sink/schema-design.mdx | 233 ++++++++------- .../cdc-sink/server-configuration.mdx | 39 +-- .../cdc-sink/source-schema-changes.mdx | 100 ++++--- .../cdc-sink/sql-server/_category_.json | 5 +- .../cdc-sink/sql-server/overview.mdx | 66 +++-- .../cdc-sink/troubleshooting.mdx | 97 ++++--- 37 files changed, 2045 insertions(+), 1661 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/_category_.json b/docs/server/ongoing-tasks/cdc-sink/_category_.json index 9edf48317b..fece99c61d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/_category_.json @@ -1 +1,4 @@ -{"position": 2, "label": "CDC Sink"} +{ + "position": 2, + "label": "CDC Sink" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx index da354bf7ed..16a9f9acce 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: API Reference" sidebar_label: API Reference description: "Documents the Client API operations for creating, updating, querying, toggling, and deleting CDC Sink tasks programmatically." sidebar_position: 11 +see_also: + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Overview" + link: "server/ongoing-tasks/cdc-sink/overview" + source: "docs" + path: "Server > CDC Sink" + - title: "What are Operations" + link: "client-api/operations/what-are-operations" + source: "docs" + path: "Client API > Operations" + - title: "Ongoing Task Operations" + link: "client-api/operations/maintenance/ongoing-tasks/ongoing-task-operations" + source: "docs" + path: "Client API > Operations" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +36,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * CDC Sink tasks can be created, updated, and managed programmatically using the RavenDB Client API. -* In this page: +* In this article: * [Add a CDC Sink Task](#add-a-cdc-sink-task) * [Update a CDC Sink Task](#update-a-cdc-sink-task) * [Get Task Info](#get-task-info) @@ -28,42 +45,41 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Add a CDC Sink Task + Use `AddCdcSinkOperation` to create a new CDC Sink task: - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "OrdersSync", ConnectionStringName = "MyPostgresConnection", Tables = new List - \{ + { new CdcSinkTableConfig - \{ + { CollectionName = "Orders", SourceTableName = "orders", - PrimaryKeyColumns = new List \{ "id" \}, + PrimaryKeyColumns = new List { "id" }, Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, - new CdcColumnMapping() \{ Column = "total", Name = "Total" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "total", Name = "Total" }, ] - \} - \} -\}; + } + } +}; var result = await store.Maintenance.SendAsync( new AddCdcSinkOperation(config)); long taskId = result.TaskId; -`} - +``` + @@ -74,34 +90,35 @@ long taskId = result.TaskId; | `TaskId` | `long` | Assigned task ID | | `RaftCommandIndex` | `long` | Raft index of the command | ---- + -## Update a CDC Sink Task + Use `UpdateCdcSinkOperation` to modify an existing task. Pass the full updated configuration including the `TaskId`: - -{`config.TaskId = taskId; // Must be set + +```csharp +config.TaskId = taskId; // Must be set config.Tables.Add(new CdcSinkTableConfig -\{ +{ CollectionName = "Customers", SourceTableName = "customers", - PrimaryKeyColumns = new List \{ "id" \}, + PrimaryKeyColumns = new List { "id" }, Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, - new CdcColumnMapping() \{ Column = "email", Name = "Email" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() { Column = "email", Name = "Email" }, ] -\}); +}); await store.Maintenance.SendAsync( new UpdateCdcSinkOperation(taskId, config)); -`} - +``` + @@ -135,40 +152,42 @@ database administrator. See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). ---- + -## Get Task Info + Use `GetOngoingTaskInfoOperation` to retrieve the current state of a CDC Sink task: - -{`var taskInfo = await store.Maintenance.SendAsync( + +```csharp +var taskInfo = await store.Maintenance.SendAsync( new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); -`} - +``` + ---- + -## Toggle Task State + Pause or resume a CDC Sink task using `ToggleOngoingTaskStateOperation`: - -{`// Pause the task + +```csharp +// Pause the task await store.Maintenance.SendAsync( new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: true)); // Resume the task await store.Maintenance.SendAsync( new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: false)); -`} - +``` + @@ -185,19 +204,20 @@ pause is safe. If the task is paused long enough that trimming occurs, CDC Sink report an error on resume - the task may need to be recreated rather than simply resumed. ---- + -## Delete a Task + Use `DeleteOngoingTaskOperation` to delete a CDC Sink task: - -{`await store.Maintenance.SendAsync( + +```csharp +await store.Maintenance.SendAsync( new DeleteOngoingTaskOperation(taskId, OngoingTaskType.CdcSink)); -`} - +``` + @@ -207,16 +227,4 @@ in the source database. These must be cleaned up manually by the database admini See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). ---- - -## Related Articles - -### CDC Sink - -- [Configuration Reference](./configuration-reference.mdx) -- [Overview](./overview.mdx) - -### Client API - -- [What are Operations](../../../client-api/operations/what-are-operations) -- [Ongoing Task Operations](../../../client-api/operations/maintenance/ongoing-tasks/ongoing-task-operations) + diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 32b999ba34..68535ba677 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: Attachment Handling" sidebar_label: Attachment Handling description: "Explains how to store binary or text SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." sidebar_position: 9 +see_also: + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Attachments Overview" + link: "document-extensions/attachments/overview" + source: "docs" + path: "Document Extensions > Attachments" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,7 +39,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This applies to both root tables and embedded tables. -* In this page: +* In this article: * [Root Table Attachments](#root-table-attachments) * [Embedded Table Attachments](#embedded-table-attachments) * [Attachment Naming](#attachment-naming) @@ -30,23 +47,22 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Root Table Attachments + Given a SQL table with a binary column: - - -{`CREATE TABLE files ( + + +```sql +CREATE TABLE files ( id SERIAL PRIMARY KEY, filename TEXT NOT NULL, mime_type TEXT NOT NULL, content BYTEA NOT NULL -- binary attachment ); -`} - +``` + @@ -54,26 +70,27 @@ Set `Type = CdcColumnType.Attachment` on the `content` column entry: - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ CollectionName = "Files", SourceTableName = "files", PrimaryKeyColumns = ["id"], Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "filename", Name = "Filename" \}, - new CdcColumnMapping() \{ Column = "mime_type", Name = "MimeType" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "filename", Name = "Filename" }, + new CdcColumnMapping() { Column = "mime_type", Name = "MimeType" }, new CdcColumnMapping() - \{ + { Column = "content", Name = "file", Type = CdcColumnType.Attachment - \}, + }, ] -\} -`} - +} +``` + @@ -82,9 +99,9 @@ The `Name` value becomes the attachment name. The content type is determined by SQL column type: `application/octet-stream` for binary columns, `text/plain` for text columns. ---- + -## Embedded Table Attachments + Binary columns on embedded tables are stored as attachments on the **parent** document. The attachment name is automatically prefixed to ensure uniqueness. @@ -92,9 +109,10 @@ The attachment name is automatically prefixed to ensure uniqueness. Given a parent `products` table and a child `photos` table: - - -{`CREATE TABLE products ( + + +```sql +CREATE TABLE products ( product_id SERIAL PRIMARY KEY, name TEXT NOT NULL ); @@ -106,8 +124,8 @@ CREATE TABLE photos ( thumbnail BYTEA, -- binary attachment PRIMARY KEY (product_id, photo_num) ); -`} - +``` + @@ -115,26 +133,27 @@ Configure the embedded table with `Type = CdcColumnType.Attachment` on the binar - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "photos", PropertyName = "Photos", PrimaryKeyColumns = ["photo_num"], JoinColumns = ["product_id"], Columns = [ - new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, - new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, + new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, + new CdcColumnMapping() { Column = "caption", Name = "Caption" }, new CdcColumnMapping() - \{ + { Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment - \}, + }, ] -\} -`} - +} +``` + @@ -142,9 +161,9 @@ A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on t parent document. The prefix `"Photos/1/"` is generated from the `PropertyName` and the primary key value. ---- + -## Attachment Naming + **Root table attachments:** @@ -174,9 +193,9 @@ PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 → Attachment name: "Photos/2024-01/3/thumb" ``` ---- + -## Attachment Lifecycle + * **INSERT** - Attachment is created on the document * **UPDATE** - Attachment is replaced with the new binary data @@ -184,16 +203,4 @@ PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 from the parent document * **DELETE (root document)** - Document and all its attachments are deleted ---- - -## Related Articles - -### CDC Sink - -- [Column Mapping](./column-mapping.mdx) -- [Embedded Tables](./embedded-tables.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### Document Extensions - -- [Attachments Overview](../../../document-extensions/attachments/overview) + diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 3df2e82d80..0b2597029b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -3,12 +3,33 @@ title: "CDC Sink: Column Mapping" sidebar_label: Column Mapping description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using the Columns list of CdcColumnMapping entries." sidebar_position: 5 +see_also: + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Attachment Handling" + link: "server/ongoing-tasks/cdc-sink/attachment-handling" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching: $row Column Types" + link: "server/ongoing-tasks/cdc-sink/patching#row-column-types" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -20,7 +41,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; under what property names, and how they are stored. It uses a `Columns` list of `CdcColumnMapping` objects (not a dictionary). -* In this page: +* In this article: * [Mapping Columns to Properties](#mapping-columns-to-properties) * [Column Types](#column-types) * [Unmapped Columns](#unmapped-columns) @@ -30,25 +51,24 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Mapping Columns to Properties + `Columns` is a `List` where each entry maps a SQL column to a RavenDB document property: - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, - new CdcColumnMapping() \{ Column = "order_date", Name = "OrderDate" \}, - new CdcColumnMapping() \{ Column = "total_amount", Name = "TotalAmount" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "order_date", Name = "OrderDate" }, + new CdcColumnMapping() { Column = "total_amount", Name = "TotalAmount" }, ] -`} - +``` + @@ -64,34 +84,35 @@ Including the PK in the mapping is generally useful so the document carries its identifier, but it is not required. ---- + -## Column Types + Each `CdcColumnMapping` entry has an optional `Type` property of type `CdcColumnType` that controls how the SQL value is stored in RavenDB: - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "order_id", Name = "OrderId" \}, + new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, // Parsed as a native JSON value new CdcColumnMapping() - \{ + { Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json - \}, + }, // Stored as an attachment new CdcColumnMapping() - \{ + { Column = "receipt", Name = "receipt.pdf", Type = CdcColumnType.Attachment - \}, + }, ] -`} - +``` + @@ -122,9 +143,9 @@ SQL Server `nvarchar(max)` with JSON content. `byte[]` → binary (`application/octet-stream`), `string` → UTF-8 text (`text/plain`), `float[]`/`double[]` → raw vector data. The `Name` field becomes the attachment name. ---- + -## Unmapped Columns + Columns not listed in `Columns` are **not stored** in the document, but they are available in patch scripts via `$row`. @@ -133,16 +154,17 @@ This allows you to use data for computations without permanently storing raw SQL - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, // base_price and tax_rate are NOT mapped - won't appear in document ], Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" -`} - +``` + @@ -162,9 +184,9 @@ in patch scripts via `$row.base_price` (for the current row's values). See [Patching: $row and $old](./patching.mdx#row-and-old-names-and-types) for details. ---- + -## JSON Columns + SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, SQL Server `nvarchar` with JSON content) can be parsed into native JSON objects or arrays using @@ -172,28 +194,29 @@ with JSON content) can be parsed into native JSON objects or arrays using - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, new CdcColumnMapping() - \{ + { Column = "metadata", Name = "Metadata", Type = CdcColumnType.Json - \}, + }, ] -`} - +``` + Without `CdcColumnType.Json`, the JSON column value would be stored as a raw string. With it, the value is parsed and stored as a nested object or array in the document. ---- + -## Validation Rules + The following rules apply to both root table and embedded table column mappings: @@ -202,40 +225,28 @@ The following rules apply to both root table and embedded table column mappings: - Both `Column` and `Name` are required and must be non-empty strings. - At least one entry is required - an empty `Columns` list is a validation error. ---- + -## Schema (Source Table Schema) + `SourceTableSchema` specifies the SQL schema containing the table. It defaults to `"public"` for PostgreSQL if omitted. - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ SourceTableSchema = "sales", // Table is in the "sales" schema SourceTableName = "orders", // ... -\} -`} - +} +``` + For most PostgreSQL setups using the default `public` schema, this can be omitted. ---- - -## Related Articles - -### CDC Sink - -- [Schema Design](./schema-design.mdx) -- [Patching](./patching.mdx) -- [Attachment Handling](./attachment-handling.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### PostgreSQL - -- [Patching: $row Column Types](./patching.mdx#row-column-types) + diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx index 33e58e4efe..96a1a051e9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx @@ -3,12 +3,37 @@ title: "CDC Sink: Configuration Reference" sidebar_label: Configuration Reference description: "Documents all configuration classes used to define a CDC Sink task, including CdcSinkConfiguration, table configs, CdcColumnMapping, and related types." sidebar_position: 10 +see_also: + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Linked Tables" + link: "server/ongoing-tasks/cdc-sink/linked-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Delete Strategies" + link: "server/ongoing-tasks/cdc-sink/delete-strategies" + source: "docs" + path: "Server > CDC Sink" + - title: "API Reference" + link: "server/ongoing-tasks/cdc-sink/api-reference" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -18,7 +43,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page documents all configuration classes used to define a CDC Sink task. -* In this page: +* In this article: * [CdcSinkConfiguration](#cdcsinkconfiguration) * [CdcSinkPostgresSettings](#cdcsinkpostgressettings) * [CdcSinkTableConfig](#cdcsinktableconfig) @@ -32,9 +57,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## CdcSinkConfiguration + The top-level configuration object for a CDC Sink task. @@ -58,9 +81,9 @@ The top-level configuration object for a CDC Sink task. | `System.Data.SqlClient` or `Microsoft.Data.SqlClient` | SQL Server | | `MySql.Data.MySqlClient` or `MySqlConnector.MySqlConnectorFactory` | MySQL / MariaDB | ---- + -## CdcSinkPostgresSettings + PostgreSQL-specific settings. Assigned to `CdcSinkConfiguration.Postgres`. Leave `null` for non-PostgreSQL connections. @@ -86,9 +109,9 @@ PostgreSQL table must have `REPLICA IDENTITY` configured so that DELETE events i the join column values. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). ---- + -## CdcSinkTableConfig + Configures a root table - one SQL table mapped to one RavenDB collection. @@ -105,9 +128,9 @@ Configures a root table - one SQL table mapped to one RavenDB collection. | `LinkedTables` | `List` | | Foreign key reference configurations | | `Disabled` | `bool` | | Skip this table. Default: `false` | ---- + -## CdcSinkEmbeddedTableConfig + Configures a table whose rows are embedded as nested objects within a parent document. @@ -126,9 +149,9 @@ Configures a table whose rows are embedded as nested objects within a parent doc | `EmbeddedTables` | `List` | | Nested embedded tables | | `LinkedTables` | `List` | | Linked tables within embedded items | ---- + -## CdcSinkLinkedTableConfig + Configures a foreign key reference that becomes a document ID in the parent document. @@ -140,9 +163,9 @@ Configures a foreign key reference that becomes a document ID in the parent docu | `LinkedCollectionName` | `string` | ✓ | Target RavenDB collection for ID generation (e.g., `"Customers"`) | | `JoinColumns` | `List` | ✓ | FK columns used to build the referenced document ID | ---- + -## CdcColumnMapping + A single column mapping entry within a `Columns` list. @@ -152,9 +175,9 @@ A single column mapping entry within a `Columns` list. | `Name` | `string` | ✓ | Document property name (or attachment name when `Type = Attachment`) | | `Type` | `CdcColumnType` | | How to store the value. Default: `Default` | ---- + -## CdcColumnType + Controls how a SQL column value is stored in RavenDB. @@ -164,9 +187,9 @@ Controls how a SQL column value is stored in RavenDB. | `Json` | Parses the string value as a native JSON value (object, array, string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or SQL Server `nvarchar(max)` with JSON content. | | `Attachment` | Stores the raw column value as a RavenDB attachment. `byte[]`→binary (`application/octet-stream`), `string`→UTF-8 text (`text/plain`), `float[]`/`double[]`→raw vector data. The `Name` field becomes the attachment name. | ---- + -## CdcSinkOnDeleteConfig + Controls how DELETE events are handled for a table or embedded table. @@ -190,9 +213,9 @@ Controls how DELETE events are handled for a table or embedded table. | `true` | null | DELETE discarded silently | | `true` | set | Patch runs, delete skipped | ---- + -## CdcSinkRelationType + Specifies the structure of embedded data in the document. @@ -202,9 +225,9 @@ Specifies the structure of embedded data in the document. | `Map` | One-to-many: stored as a JSON object keyed by PK value(s) | | `Value` | Many-to-one: stored as a single embedded object | ---- + -## REST API Endpoints + | Method | Path | Auth | Description | |--------|------|------|-------------| @@ -215,15 +238,4 @@ Specifies the structure of embedded data in the document. | GET | `/databases/{db}/cdc-sink/performance` | ValidUser | Get performance stats | | GET | `/databases/{db}/cdc-sink/performance/live` | ValidUser | WebSocket for live performance stats | ---- - -## Related Articles - -### CDC Sink - -- [Schema Design](./schema-design.mdx) -- [Embedded Tables](./embedded-tables.mdx) -- [Linked Tables](./linked-tables.mdx) -- [Patching](./patching.mdx) -- [Delete Strategies](./delete-strategies.mdx) -- [API Reference](./api-reference.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx index dbc8211d7f..43bb5d2326 100644 --- a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: Delete Strategies" sidebar_label: Delete Strategies description: "Documents configurable behavior for DELETE events in CDC Sink, including archive, audit trail, and silent ignore patterns." sidebar_position: 7 +see_also: + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,11 +39,11 @@ import LanguageContent from "@site/src/components/LanguageContent"; * By default, a DELETE event deletes the corresponding RavenDB document or removes the embedded item. The `OnDelete` configuration changes this. -* In this page: +* In this article: * [Default Behavior](#default-behavior) * [OnDelete Configuration](#ondelete-configuration) * [Pattern: Archive](#pattern-archive) - * [Pattern: Audit Trail](#pattern-audit-trail) + * [Pattern: Audit Trail](#pattern-audit-trail-root-document) * [Pattern: Silent Ignore](#pattern-silent-ignore) * [OnDelete for Embedded Tables](#ondelete-for-embedded-tables) * [Behavior Summary](#behavior-summary) @@ -34,9 +51,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Default Behavior + When `OnDelete` is `null` (or not set): @@ -44,26 +59,27 @@ When `OnDelete` is `null` (or not set): * **Embedded table DELETE (Array/Map)** - The item is removed from the parent document's array or map * **Embedded table DELETE (Value)** - The `Value`-type property on the parent document is set to `null` ---- + -## OnDelete Configuration + `CdcSinkOnDeleteConfig` has two properties: - -{`public class CdcSinkOnDeleteConfig -\{ + +```csharp +public class CdcSinkOnDeleteConfig +{ // JavaScript patch that runs when a DELETE event arrives // Available variables: this, $row, $old - public string Patch \{ get; set; \} + public string Patch { get; set; } // When true, the delete is not applied - document/item is kept - public bool IgnoreDeletes \{ get; set; \} -\} -`} - + public bool IgnoreDeletes { get; set; } +} +``` + @@ -78,35 +94,36 @@ set an `Archived` flag) and those changes are written to RavenDB even though the document is not deleted. ---- + -## Pattern: Archive + Keep the document in RavenDB but mark it as deleted. The patch runs to mark it, and `IgnoreDeletes = true` prevents the actual deletion: - -{`OnDelete = new CdcSinkOnDeleteConfig -\{ + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ IgnoreDeletes = true, Patch = @" this.Archived = true; this.ArchivedAt = new Date().toISOString(); " -\} -`} - +} +``` + The document remains in RavenDB with `Archived = true`. Queries can filter on this field to exclude archived records. ---- + -## Pattern: Audit Trail (Root Document) + When a root document is deleted, write an audit record to a separate RavenDB collection using `put()` before the deletion proceeds. @@ -116,51 +133,53 @@ Use `put()` to create a document that survives the deletion: - -{`OnDelete = new CdcSinkOnDeleteConfig -\{ + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ // IgnoreDeletes defaults to false - delete proceeds after patch Patch = @" // Create a permanent audit record in a separate collection - put('DeletedOrders/' + this.Id, \{ + put('DeletedOrders/' + this.Id, { OriginalId: this.Id, Customer: this.Customer, Total: this.Total, DeletedAt: new Date().toISOString() - \}); + }); " -\} -`} - +} +``` + The patch creates a document in `DeletedOrders/` before `this` is deleted. The audit record persists permanently. ---- + -## Pattern: Silent Ignore + Discard DELETE events without running any patch. Use this for append-only data where deletes should never result in document removal: - -{`OnDelete = new CdcSinkOnDeleteConfig -\{ + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ IgnoreDeletes = true // No patch - DELETE events are silently discarded -\} -`} - +} +``` + ---- + -## OnDelete for Embedded Tables + The same `OnDelete` configuration works on embedded tables. For embedded tables: @@ -175,14 +194,15 @@ Rather than removing a deleted line item from the array, move it to a separate - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "order_lines", PropertyName = "Lines", // ... OnDelete = new CdcSinkOnDeleteConfig - \{ + { IgnoreDeletes = true, Patch = @" // Remove from active Lines @@ -191,17 +211,17 @@ Rather than removing a deleted line item from the array, move it to a separate // Add to DeletedLines audit array this.DeletedLines = this.DeletedLines || []; - this.DeletedLines.push(\{ + this.DeletedLines.push({ LineId: $old?.LineId, Product: $old?.Product, Quantity: $old?.Quantity, DeletedAt: new Date().toISOString() - \}); + }); " - \} -\} -`} - + } +} +``` + @@ -216,33 +236,34 @@ runs before it: - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "order_lines", PropertyName = "Lines", // ... OnDelete = new CdcSinkOnDeleteConfig - \{ + { // IgnoreDeletes = false (default) - CDC Sink removes the item after patch Patch = @" // Log total for the line being removed this.RemovedTotal = (this.RemovedTotal || 0) + ($old?.UnitPrice || 0) * ($old?.Qty || 0); " - \} -\} -`} - + } +} +``` + The `Lines` item is removed by CDC Sink. The patch only needs to handle the side-effect logic. ---- + -## Behavior Summary + | IgnoreDeletes | Patch | Behavior | |---------------|-------|----------| @@ -251,9 +272,9 @@ side-effect logic. | `true` | null | DELETE event discarded silently | | `true` | set | Patch runs, then delete is skipped | ---- + -## DELETE Routing and REPLICA IDENTITY + For CDC Sink to route a DELETE event to the correct document or embedded item, the source database must include the necessary column values in the DELETE event. @@ -275,16 +296,4 @@ See: to discard DELETE events for an embedded table entirely. This skips the REPLICA IDENTITY check, since delete routing is no longer needed. ---- - -## Related Articles - -### CDC Sink - -- [Patching](./patching.mdx) -- [Embedded Tables](./embedded-tables.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### PostgreSQL - -- [REPLICA IDENTITY](./postgres/replica-identity.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index 78b94abcb3..e2095d6f53 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -3,12 +3,41 @@ title: "CDC Sink: Embedded Tables" sidebar_label: Embedded Tables description: "Covers configuration options, nesting constraints, and how embedded items are updated and deleted in CDC Sink." sidebar_position: 3 +see_also: + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Linked Tables" + link: "server/ongoing-tasks/cdc-sink/linked-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Delete Strategies" + link: "server/ongoing-tasks/cdc-sink/delete-strategies" + source: "docs" + path: "Server > CDC Sink" + - title: "Attachment Handling" + link: "server/ongoing-tasks/cdc-sink/attachment-handling" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "REPLICA IDENTITY Manual Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,7 +51,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page covers configuration options, nesting constraints, and how embedded items are updated and deleted. -* In this page: +* In this article: * [Basic Configuration](#basic-configuration) * [Join Columns and Primary Key Interaction](#join-columns-and-primary-key-interaction) * [Matching Items on Update and Delete](#matching-items-on-update-and-delete) @@ -31,17 +60,16 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Basic Configuration + `CdcSinkEmbeddedTableConfig` is placed inside a root table's `EmbeddedTables` list: - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableSchema = "public", // SQL schema (optional) SourceTableName = "order_lines", // SQL table name PropertyName = "Lines", // Property name in parent document @@ -50,19 +78,19 @@ import LanguageContent from "@site/src/components/LanguageContent"; PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE Columns = [ - new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, - new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, - new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, ] -\} -`} - +} +``` + ---- + -## Join Columns and Primary Key Interaction + ### Purpose of JoinColumns @@ -74,8 +102,9 @@ The `JoinColumns` values must exactly match the parent's `PrimaryKeyColumns`: - -{`// Parent root table: + +```csharp +// Parent root table: PrimaryKeyColumns = ["order_id"] // Embedded table - correct: @@ -83,8 +112,8 @@ JoinColumns = ["order_id"] // References parent's PK column // Embedded table - INCORRECT: JoinColumns = ["customer_id"] // Does not reference the parent's PK -`} - +``` + @@ -106,28 +135,30 @@ a DBA can configure it manually. The cleanest solution is to include the join column in the embedded table's primary key: - - -{`-- SQL schema: + + +```sql +-- SQL schema: CREATE TABLE order_lines ( order_id INT NOT NULL REFERENCES orders(id), line_id INT NOT NULL, product VARCHAR(200), PRIMARY KEY (order_id, line_id) -- order_id in PK means DELETE events include it ); -`} - +``` + - -{`// Configuration: + +```csharp +// Configuration: PrimaryKeyColumns = ["order_id", "line_id"] JoinColumns = ["order_id"] -`} - +``` + @@ -138,9 +169,9 @@ Alternatively, set `OnDelete.IgnoreDeletes = true` to skip delete routing entire if deletes on that embedded table don't need to be processed. See [Delete Strategies](./delete-strategies.mdx). ---- + -## Matching Items on Update and Delete + When an UPDATE or DELETE arrives for an embedded row, CDC Sink must find the correct item within the parent document's array or map. @@ -155,13 +186,14 @@ Items are matched by their full `PrimaryKeyColumns` composite key: - -{`PrimaryKeyColumns = ["invoice_date", "invoice_seq"] + +```csharp +PrimaryKeyColumns = ["invoice_date", "invoice_seq"] // UPDATE event for (invoice_date='2024-01-15', invoice_seq=3) // → Finds and updates the item where both columns match -`} - +``` + @@ -169,9 +201,9 @@ Items are matched by their full `PrimaryKeyColumns` composite key: `CaseSensitiveKeys = true` on `CdcSinkEmbeddedTableConfig` if your keys are case-sensitive. ---- + -## Deep Nesting + Embedded tables can contain their own `EmbeddedTables`, creating hierarchies with multiple levels. @@ -186,27 +218,29 @@ The `employees` table must have `company_id` (the root PK) even though it only directly joins to `departments`: - - -{`CREATE TABLE employees ( + + +```sql +CREATE TABLE employees ( company_id INT NOT NULL, -- Denormalized root PK dept_id INT NOT NULL, emp_id INT NOT NULL, PRIMARY KEY (company_id, dept_id, emp_id) ); -`} - +``` + - -{`// Configuration for the employees embedded table: + +```csharp +// Configuration for the employees embedded table: JoinColumns = ["dept_id"] // FK to the direct parent (departments) PK PrimaryKeyColumns = ["emp_id"] -`} - +``` + @@ -214,42 +248,43 @@ PrimaryKeyColumns = ["emp_id"] When a CDC Sink event arrives for an `employees` row, CDC Sink needs to: -1. Find the root document: `Companies/\{company_id\}` +1. Find the root document: `Companies/{company_id}` 2. Navigate to the correct `Departments` array item: `Departments.find(d => d.dept_id == dept_id)` 3. Add or update the `Employees` array item: `Employees.find(e => e.emp_id == emp_id)` Without `company_id` in the event, CDC Sink cannot identify the root document without an additional lookup, which is not supported. ---- + -## Attachments on Embedded Items + Binary columns from embedded tables can be stored as RavenDB attachments by adding them to `Columns` with `Type = CdcColumnType.Attachment`. - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "photos", PropertyName = "Photos", PrimaryKeyColumns = ["photo_num"], JoinColumns = ["product_id"], Columns = [ - new CdcColumnMapping() \{ Column = "photo_num", Name = "PhotoNum" \}, - new CdcColumnMapping() \{ Column = "caption", Name = "Caption" \}, + new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, + new CdcColumnMapping() { Column = "caption", Name = "Caption" }, new CdcColumnMapping() - \{ + { Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment - \}, + }, ] -\} -`} - +} +``` + @@ -259,19 +294,4 @@ ensure uniqueness within the document. When the embedded item is deleted, its attachments are automatically removed. ---- - -## Related Articles - -### CDC Sink - -- [Schema Design](./schema-design.mdx) -- [Linked Tables](./linked-tables.mdx) -- [Delete Strategies](./delete-strategies.mdx) -- [Attachment Handling](./attachment-handling.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### PostgreSQL - -- [REPLICA IDENTITY](./postgres/replica-identity.mdx) -- [REPLICA IDENTITY Manual Setup](./postgres/replica-identity-manual-setup.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx index e6f0f9cc37..34b9847acb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx @@ -3,12 +3,25 @@ title: "CDC Sink: Failover and Consistency" sidebar_label: Failover and Consistency description: "Explains how CDC Sink handles node failover, what consistency guarantees it provides, and why patches must be designed to be idempotent." sidebar_position: 13 +see_also: + - title: "How It Works" + link: "server/ongoing-tasks/cdc-sink/how-it-works" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Monitoring" + link: "server/ongoing-tasks/cdc-sink/monitoring" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +32,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page explains how CDC Sink handles node failover, what consistency guarantees it provides, and why patches must be designed to be idempotent. -* In this page: +* In this article: * [State Storage](#state-storage) * [Failover Behavior](#failover-behavior) * [Re-Reading Changes](#re-reading-changes) @@ -28,9 +41,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## State Storage + CDC Sink persists its progress as a **document in RavenDB** alongside your data. @@ -42,9 +53,9 @@ This state document records: Like any RavenDB document, this state document is subject to **normal replication behavior**. Different nodes in a cluster may have different versions of this document at any given moment. ---- + -## Failover Behavior + When the cluster elects a new mentor node for a CDC Sink task, the new node reads the **replicated state** - which may be older than the work the previous mentor @@ -54,8 +65,9 @@ completed but had not yet replicated. - -{`Before failure: + +```plain +Before failure: ├─ Node A (Mentor) - Processed up to position X, state document not yet replicated ├─ Node B (Replica) - State document shows position X-100 (older, replicated state) └─ Node C (Replica) - State document shows position X-100 @@ -64,8 +76,8 @@ Node A crashes. Node B is elected new mentor. Node B reads its state document: position X-100. Node B resumes CDC Sink from position X-100. -`} - +``` + @@ -73,9 +85,9 @@ Changes between positions X-100 and X may already be in RavenDB (written by Node or they may not be (if Node A crashed before writing). Node B will re-read and re-apply them either way. ---- + -## Re-Reading Changes + **CDC Sink guarantees that no changes are lost, but some changes may be re-read.** @@ -94,9 +106,9 @@ Patches that are not idempotent can produce incorrect results when a change is re-read after a failover. See [Idempotency Requirements](#idempotency-requirements) below. ---- + -## Consistency Guarantee + CDC Sink provides **at-least-once delivery** with **eventual consistency**: @@ -108,9 +120,9 @@ CDC Sink provides **at-least-once delivery** with **eventual consistency**: This is the same model used by other ongoing tasks in RavenDB. ---- + -## Idempotency Requirements + A patch is **idempotent** if applying it multiple times produces the same result as applying it once. @@ -122,12 +134,13 @@ is a no-op. - -{`// Idempotent - always sets to the current SQL value + +```javascript +// Idempotent - always sets to the current SQL value this.Status = $row.is_active ? 'Active' : 'Inactive'; this.ViewCount = $row.view_count; -`} - +``` + @@ -135,11 +148,12 @@ this.ViewCount = $row.view_count; - -{`// NOT idempotent - increments again on re-read + +```javascript +// NOT idempotent - increments again on re-read this.ViewCount = (this.ViewCount || 0) + 1; -`} - +``` + @@ -148,25 +162,18 @@ embedded item state, not the document's accumulated value: - -{`// Idempotent - delta is recomputed correctly on re-read + +```javascript +// Idempotent - delta is recomputed correctly on re-read const oldAmount = $old?.Amount || 0; const newAmount = $row.amount || 0; this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); -`} - +``` + On re-read, `$old` still reflects the state before the update, and `$row` still reflects the new state - so the delta is the same as on the first read. ---- - -## Related Articles - -### CDC Sink - -- [How It Works](./how-it-works.mdx) -- [Patching](./patching.mdx) -- [Monitoring](./monitoring.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index c7764b2f96..63c500359a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -3,12 +3,41 @@ title: "CDC Sink: How It Works" sidebar_label: How It Works description: "Describes the internal operation of CDC Sink - how it connects to the source database, loads initial data, streams changes, and handles failover." sidebar_position: 1 +see_also: + - title: "Overview" + link: "server/ongoing-tasks/cdc-sink/overview" + source: "docs" + path: "Server > CDC Sink" + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Property Retention" + link: "server/ongoing-tasks/cdc-sink/property-retention" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" + - title: "PostgreSQL Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "PostgreSQL Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,9 +51,8 @@ import LanguageContent from "@site/src/components/LanguageContent"; * Understanding these mechanics is important when designing patches, planning for failover, and setting up monitoring. -* In this page: +* In this article: * [Startup and Verification](#startup-and-verification) - * [PostgreSQL](#postgresql) * [Initial Load](#initial-load) * [Change Streaming](#change-streaming) * [Transaction Ordering](#transaction-ordering) @@ -34,16 +62,14 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Startup and Verification + When a CDC Sink task starts, it verifies that the source database is properly configured before doing anything else. If any check fails, CDC Sink reports the exact issue and the -SQL an administrator needs to run to fix it. The task does not start until all checks pass. +command an administrator needs to run to fix it. The task does not start until all checks pass. -After verification, CDC Sink creates the necessary change-tracking infrastructure -in the source database, then begins the initial load. +The specific checks are provider-specific. After verification, CDC Sink creates the +necessary change-tracking infrastructure in the source database, then begins the initial load. ### PostgreSQL @@ -56,19 +82,35 @@ CDC Sink checks: See the [PostgreSQL Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) for the full list of requirements. ---- +### SQL Server + +CDC Sink checks that Change Data Capture is enabled on the database and on each captured +table, and that the SQL Server Agent service is running (it drives the CDC capture jobs). +See [CDC Sink for SQL Server](./sql-server/overview.mdx). + +### MySQL / MariaDB + +CDC Sink checks that binary logging is enabled with `binlog_format = ROW`, and that the +connecting user has the `REPLICATION SLAVE` and `REPLICATION CLIENT` privileges required +to read the binlog. See [CDC Sink for MySQL](./mysql/overview.mdx). + + -## Initial Load + -Before streaming live changes, CDC Sink performs a full scan of every configured table -(root, embedded, and linked) using keyset pagination ordered by primary key. +Before streaming live changes, CDC Sink performs a full scan of every configured root +and embedded table using keyset pagination ordered by primary key. **Linked tables** are +neither scanned during the initial load nor registered for change capture - a linked +table's foreign-key columns (present on the owning root or embedded row) are resolved into +a document-ID reference in the target collection. **Progress tracking:** Initial load progress is persisted per-table as a document in RavenDB. If the task is restarted, it resumes from the last processed key rather than re-scanning the entire table. -**Batch pipelining:** While one batch is being written to RavenDB, the next batch is -being read from the source database, keeping both systems busy. +**Batch pipelining:** While one batch is being written to RavenDB, the next batch is read +from the source database in parallel, so reads and writes overlap instead of running one +after another. **Ordering:** Tables are scanned in dependency order. Root tables are loaded first, then embedded tables. This minimises the number of stub documents created (see @@ -93,9 +135,9 @@ or a long enough retention window on SQL Server CDC tables). Plan accordingly be starting the initial load on large tables. ---- + -## Change Streaming + After the initial load completes, CDC Sink begins consuming changes from the source database's change log, starting from the position captured **before** the initial load began. @@ -111,9 +153,9 @@ CDC-managed properties. See [Property Retention](./property-retention.mdx) for details. ---- + -## Transaction Ordering + CDC Sink preserves the full order of operations within a source database transaction. If a single transaction performs multiple operations on the same row, all operations @@ -122,17 +164,18 @@ are applied in order. **Example:** A source transaction that does: - - -{`BEGIN; + + +```sql +BEGIN; INSERT INTO items (id, name) VALUES (1, 'Alpha'); UPDATE items SET name = 'Beta' WHERE id = 1; DELETE FROM items WHERE id = 1; INSERT INTO items (id, name) VALUES (1, 'Gamma'); UPDATE items SET name = 'Delta' WHERE id = 1; COMMIT; -`} - +``` + @@ -141,16 +184,17 @@ CDC Sink applies all five operations in order. The final document state is `name Multiple documents modified in the same transaction are also applied atomically within a single RavenDB batch. ---- + -## State Persistence and Failover + ### State Storage CDC Sink persists its progress as a **document in RavenDB**, alongside your data. This document records: -* The last acknowledged position in the source database's change log (LSN for PostgreSQL) +* The last acknowledged position in the source database's change log + (LSN for PostgreSQL and SQL Server, GTID for MySQL/MariaDB) * Per-table initial load progress (which tables completed, and the last key scanned) Like any RavenDB document, this state document is subject to normal replication behavior. @@ -178,9 +222,9 @@ re-read after a failover. Design patches to handle re-processing safely. See [Patching](./patching.mdx) for guidance. ---- + -## Updating the Task Configuration + When you update a CDC Sink task configuration - for example, adding or removing columns from the `Columns` list, changing a `Patch` script, or modifying embedded table @@ -198,6 +242,12 @@ already created retain their current structure. This means: * **Adding an embedded or linked table** - Existing parent documents will not have the new embedded data until a CDC event for the embedded table row arrives. + +Simply restarting the task does not reprocess existing documents. A restart resumes from +the task's saved position (see [State Persistence and Failover](#state-persistence-and-failover)), +so it only continues streaming new changes. + + To apply configuration changes to **all** documents (not just new events), delete @@ -210,9 +260,17 @@ to update existing documents independently of the CDC Sink task. ---- + +The task's processing state is stored separately from the task definition, in the +`@cdc-states` system collection. A newly created task - even one created with the same +name as a deleted task - starts with no recorded position and performs a fresh full +initial load, unless it is configured with `SkipInitialLoad = true`. See +[Troubleshooting](./troubleshooting.mdx) for details on preserving or resetting this state. + + + -## Child Before Parent + Tables are scanned one at a time during the initial load. This means a child table can contain rows that reference a parent row inserted *after* the parent table scan had @@ -227,19 +285,4 @@ missing parent row and merges its columns onto the stub document. The final document will contain both the parent fields and all embedded items. No data is lost - the brief intermediate state is resolved automatically once streaming starts. ---- - -## Related Articles - -### CDC Sink - -- [Overview](./overview.mdx) -- [Schema Design](./schema-design.mdx) -- [Patching](./patching.mdx) -- [Property Retention](./property-retention.mdx) -- [Failover and Consistency](./failover-and-consistency.mdx) - -### PostgreSQL - -- [Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) -- [Initial Setup](./postgres/initial-setup.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index b54a563f58..1f3d23c355 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: Linked Tables" sidebar_label: Linked Tables description: "Explains how linked tables create document ID references in parent documents by converting foreign key values into RavenDB document IDs." sidebar_position: 4 +see_also: + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Load with Includes" + link: "client-api/session/loading-entities#load-with-includes" + source: "docs" + path: "Client API > Session" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -20,45 +37,44 @@ import LanguageContent from "@site/src/components/LanguageContent"; than embedding data. A foreign key value becomes a RavenDB document ID pointing to a related collection. -* In this page: +* In this article: * [Basic Configuration](#basic-configuration) * [Composite Foreign Keys](#composite-foreign-keys) * [Linked vs Embedded](#linked-vs-embedded) ---- - -## Basic Configuration + `CdcSinkLinkedTableConfig` is placed inside a root table's (or embedded table's) `LinkedTables` list: - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, ], LinkedTables = [ new CdcSinkLinkedTableConfig - \{ + { SourceTableName = "customers", PropertyName = "Customer", // Property name in document LinkedCollectionName = "Customers", // Target collection for ID JoinColumns = ["customer_id"] // FK used to build the document ID - \} + } ] -\} -`} - +} +``` + @@ -66,14 +82,15 @@ With `customer_id = 42`, the Orders document gets: - -{`\{ + +```json +{ "Id": 1, "CustomerId": 42, "Customer": "Customers/42" -\} -`} - +} +``` + @@ -82,25 +99,26 @@ and the join column values. Load the referenced document using [includes](../../../client-api/session/loading-entities#load-with-includes) to avoid a second network call. ---- + -## Composite Foreign Keys + When the target table has a composite primary key, the linked reference includes all parts of that key: - -{`new CdcSinkLinkedTableConfig -\{ + +```csharp +new CdcSinkLinkedTableConfig +{ SourceTableName = "customers", PropertyName = "Customer", LinkedCollectionName = "Customers", JoinColumns = ["customer_region", "customer_id"] // Must match Customers PK order -\} -`} - +} +``` + @@ -110,9 +128,9 @@ With `customer_region = 'US'` and `customer_id = 42`, the document gets: "Customer": "Customers/US/42" ``` ---- + -## Linked vs Embedded + | Consideration | Embedded | Linked | |--------------|----------|--------| @@ -129,16 +147,4 @@ together with it. **Choose linked** when the referenced entity is independently meaningful and shared across many parents, and you want to avoid duplicating data. ---- - -## Related Articles - -### CDC Sink - -- [Schema Design](./schema-design.mdx) -- [Embedded Tables](./embedded-tables.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### Client API - -- [Load with Includes](../../../client-api/session/loading-entities#load-with-includes) + diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index 4c51e5ebbc..581a16310a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: Monitoring" sidebar_label: Monitoring description: "Explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through Management Studio and the API." sidebar_position: 12 +see_also: + - title: "How It Works" + link: "server/ongoing-tasks/cdc-sink/how-it-works" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" + - title: "Server Configuration" + link: "server/ongoing-tasks/cdc-sink/server-configuration" + source: "docs" + path: "Server > CDC Sink" + - title: "Troubleshooting" + link: "server/ongoing-tasks/cdc-sink/troubleshooting" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +36,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through the Management Studio and API. -* In this page: +* In this article: * [Task State](#task-state) * [Fallback Mode](#fallback-mode) * [Statistics](#statistics) @@ -27,9 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Task State + A CDC Sink task can be in one of the following states: @@ -44,9 +59,9 @@ A CDC Sink task can be in one of the following states: The current state is visible in the **Ongoing Tasks** view in the Management Studio. ---- + -## Fallback Mode + When CDC Sink cannot reach the source database, it enters **fallback mode** rather than failing immediately. @@ -60,19 +75,20 @@ Retry delay doubles on each consecutive failure, up to the cap set by `CdcSink.MaxFallbackTimeInSec` (default 15 minutes). See [Server Configuration](./server-configuration.mdx). ---- + -## Statistics + CDC Sink exposes runtime statistics through the `GetOngoingTaskInfoOperation`: - -{`var taskInfo = await store.Maintenance.SendAsync( + +```csharp +var taskInfo = await store.Maintenance.SendAsync( new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); -`} - +``` + @@ -88,9 +104,9 @@ The returned object includes: Detailed per-table statistics - including row counts and last processed position - are available through the Management Studio's ongoing tasks detail view. ---- + -## Notifications + CDC Sink participates in RavenDB's standard alert system. If the task enters an error state or fallback mode, an alert is raised and visible in: @@ -101,9 +117,9 @@ error state or fallback mode, an alert is raised and visible in: Alerts include the error message and which table or operation triggered the failure, making it straightforward to diagnose the root cause. ---- + -## Error Handling + CDC Sink tolerates individual document processing errors - each failure is logged and recorded, but processing continues for the remaining documents in the batch. @@ -122,13 +138,4 @@ See [Server Configuration](./server-configuration.mdx) and [Fallback Mode](#fall Patch errors - including `MaxSteps exceeded` - fail only the affected document. The rest of the batch continues normally. ---- - -## Related Articles - -### CDC Sink - -- [How It Works](./how-it-works.mdx) -- [Failover and Consistency](./failover-and-consistency.mdx) -- [Server Configuration](./server-configuration.mdx) -- [Troubleshooting](./troubleshooting.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx index 7dc4d13245..bef87dc259 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx @@ -3,12 +3,21 @@ title: "CDC Sink for MySQL: Overview" sidebar_label: Overview description: "CDC Sink support for MySQL and MariaDB - using binlog replication to stream changes into RavenDB in real time." sidebar_position: 0 +see_also: + - title: "CDC Sink Overview" + link: "server/ongoing-tasks/cdc-sink/overview" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -25,45 +34,45 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Connection String + Use a `SqlConnectionString` with `FactoryName` set to `"MySql.Data.MySqlClient"` or `"MySqlConnector.MySqlConnectorFactory"`: - -{`store.Maintenance.Send(new PutConnectionStringOperation( + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( new SqlConnectionString - \{ + { Name = "MySqlConnection", FactoryName = "MySqlConnector.MySqlConnectorFactory", ConnectionString = "Server=myserver;Port=3306;Database=mydb;User=ravendb_cdc;Password=..." - \})); -`} - + })); +``` + ---- + -## Prerequisites + MySQL must have binary logging enabled with row-based format: - -{`# my.cnf / my.ini + +```ini +# my.cnf / my.ini [mysqld] log-bin = mysql-bin binlog_format = ROW binlog_row_image = FULL server-id = 1 -`} - +``` + @@ -71,11 +80,12 @@ The CDC Sink user needs the following privileges: - -{`GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'ravendb_cdc'@'%'; + +```sql +GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'ravendb_cdc'@'%'; GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; -`} - +``` + @@ -83,28 +93,21 @@ GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; * `REPLICATION CLIENT` - required to query binlog status * `SELECT` - required for the initial full-table load ---- + -## Streaming Behavior + Like PostgreSQL, MySQL CDC Sink uses streaming replication (via the binlog), not polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration setting does not apply to MySQL. ---- + -## Configuration + The CDC Sink task configuration is the same across all database engines. See [Configuration Reference](../configuration-reference.mdx) for full details. The `SourceTableSchema` corresponds to the MySQL database name. ---- - -## Related Articles - -### CDC Sink - -- [Overview](../overview.mdx) -- [Configuration Reference](../configuration-reference.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index 28343b119b..3c191c96fe 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -3,12 +3,41 @@ title: "CDC Sink: Overview" sidebar_label: Overview description: "An introduction to CDC Sink, the RavenDB ongoing task that reads Change Data Capture streams from a relational database and writes documents into RavenDB." sidebar_position: 0 +see_also: + - title: "How It Works" + link: "server/ongoing-tasks/cdc-sink/how-it-works" + source: "docs" + path: "Server > CDC Sink" + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "PostgreSQL Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "PostgreSQL Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "ETL Basics" + link: "server/ongoing-tasks/etl/basics" + source: "docs" + path: "Server > Ongoing Tasks" + - title: "Queue Sink Overview" + link: "server/ongoing-tasks/queue-sink/overview" + source: "docs" + path: "Server > Ongoing Tasks" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,12 +48,12 @@ import LanguageContent from "@site/src/components/LanguageContent"; * **CDC Sink** is a RavenDB ongoing task that reads **Change Data Capture (CDC)** streams from a relational database and writes the resulting documents into RavenDB. -* CDC Sink is the reverse of ETL: instead of pushing data _from_ RavenDB _to_ SQL, - CDC Sink _pulls_ data _from_ SQL _into_ RavenDB. +* CDC Sink is the reverse of SQL ETL: instead of pushing data _from_ RavenDB _to_ a + relational database, CDC Sink _pulls_ data _from_ the relational database _into_ RavenDB. The relational database is the source of truth; RavenDB receives a continuously-updated document model derived from it. -* CDC Sink maps normalized relational tables into rich, nested RavenDB documents - +* CDC Sink maps normalized relational tables into RavenDB documents - automatically and in real time. * Supported source databases: @@ -32,7 +61,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * **SQL Server** - via native CDC (polling change tables) * **MySQL / MariaDB** - via binlog replication -* In this page: +* In this article: * [Why Use CDC Sink](#why-use-cdc-sink) * [How It Works](#how-it-works) * [Task Lifecycle](#task-lifecycle) @@ -40,45 +69,46 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Why Use CDC Sink + CDC Sink solves the problem of moving data from a relational database into RavenDB -without requiring changes to the source system. +without changing the source application. -* **Migrate from SQL to RavenDB** - Transform normalized SQL tables (orders, order_lines, customers) into rich RavenDB - documents where an Order contains embedded LineItems and a reference to the Customer - - automatically and continuously, without changing your SQL application. +* **Migrate from SQL to RavenDB** + Transform normalized relational tables into RavenDB documents where an Order contains + embedded LineItems and a reference to the Customer - automatically and continuously, + without changing your application. -* **Build a read-optimized view** +* **Build a read-optimized view** Your transactional system uses a relational database, but your API layer needs denormalized documents. CDC Sink creates and maintains those documents without touching your existing application. -* **Gradual migration** - Keep your SQL application running while RavenDB documents are built in the background. +* **Gradual migration** + Keep your existing application running while RavenDB documents are built in the background. Applications can start reading from RavenDB while writes still go to the relational database. -* **Event-driven side effects** +* **Event-driven side effects** Using JavaScript patches, every INSERT, UPDATE, or DELETE in the source database can trigger custom logic in RavenDB - computing derived fields, maintaining running totals, or writing custom transformations. ---- + -## How It Works + A CDC Sink task continuously reads changes from the source relational database and applies them to RavenDB documents. ### Initial Load -When a CDC Sink task starts for the first time, it performs a full scan of every -configured table using keyset pagination. This populates RavenDB with the current +By default, when a CDC Sink task starts for the first time, it performs a full scan of +every configured table using keyset pagination. This populates RavenDB with the current state of the data before streaming begins. +The task can also be configured to skip the full scan and start from new CDC changes only, +without scanning existing rows - useful when you only need to capture changes going forward. + Initial load progress is persisted per-table. If the task is restarted, it resumes from where it left off rather than re-scanning. @@ -95,35 +125,39 @@ The relational model is mapped to RavenDB documents through configuration: * **Root tables** map to RavenDB collections (one document per row) * **Embedded tables** become nested arrays or objects within parent documents -* **Linked tables** become document ID references +* **Linked tables** become document ID references to _related documents_ See [Schema Design](./schema-design.mdx) for details. ---- + -## Task Lifecycle + -1. **Create** - Define the task in Studio or via the Client API +1. **Create** - Define the task in Studio or via the Client API Specify the connection string, table mappings, and transformation options -2. **Verify** - CDC Sink verifies the source database is properly configured +2. **Verify** - CDC Sink verifies the source database is properly configured Checks permissions, replication prerequisites, and table configuration -3. **Initial Load** - Full table scan populates RavenDB with current data +3. **Initial Load** - Full table scan populates RavenDB with current data Progress is tracked per-table and persists across restarts -4. **Stream** - Real-time change streaming begins +4. **Stream** - Real-time change streaming begins All INSERTs, UPDATEs, and DELETEs are applied to RavenDB documents as they occur 5. **Monitor** - View statistics, errors, and progress in Studio 6. **Retire** - Delete the task in RavenDB when no longer needed - PostgreSQL artifacts (replication slot, publication) must be cleaned up by - the database administrator separately ---- + +When you retire a task, the change-tracking artifacts left in the source database +(for example, the PostgreSQL replication slot and publication) must be cleaned up by +the database administrator separately. + + + -## Licensing + CDC Sink is available on an **Enterprise** license. @@ -131,22 +165,4 @@ CDC Sink is available on an **Enterprise** license. Learn more about licensing [here](../../../licensing/overview). ---- - -## Related Articles - -### CDC Sink - -- [How It Works](./how-it-works.mdx) -- [Schema Design](./schema-design.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### PostgreSQL - -- [Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) -- [Initial Setup](./postgres/initial-setup.mdx) - -### Server - -- [ETL Basics](../etl/basics) -- [Queue Sink Overview](../queue-sink/overview) + diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 136222bbf3..ad0ddecc69 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -3,12 +3,33 @@ title: "CDC Sink: Patching" sidebar_label: Patching description: "Explains how JavaScript patch scripts work in CDC Sink, covering available variables, patch scope, common scenarios, idempotency, and limitations." sidebar_position: 6 +see_also: + - title: "Delete Strategies" + link: "server/ongoing-tasks/cdc-sink/delete-strategies" + source: "docs" + path: "Server > CDC Sink" + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" + - title: "Property Retention" + link: "server/ongoing-tasks/cdc-sink/property-retention" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching Configuration" + link: "server/configuration/patching-configuration" + source: "docs" + path: "Server > Configuration" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -23,7 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * Patches are defined per-table (root or embedded) and per-operation (INSERT/UPDATE or DELETE via `OnDelete.Patch`). -* In this page: +* In this article: * [When Patches Run](#when-patches-run) * [Available Variables](#available-variables) * [$row and $old: Names and Types](#row-and-old-names-and-types) @@ -41,9 +62,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## When Patches Run + | Event | Patch property | Runs? | |-------|---------------|-------| @@ -55,9 +74,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; The `Patch` property on a table handles INSERT and UPDATE. The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. ---- + -## Available Variables + | Variable | Available | Type | Description | |----------|-----------|------|-------------| @@ -66,9 +85,9 @@ The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. | `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | | `load(id)` | Always | function | Load a RavenDB document by ID | ---- + -## $row and $old: Names and Types + `$row` and `$old` look similar but represent fundamentally different things: @@ -85,14 +104,15 @@ Given this column mapping: - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, - new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, ] -`} - +``` + @@ -100,8 +120,9 @@ In the patch script: - -{`// $row - SQL column names, raw SQL types + +```javascript +// $row - SQL column names, raw SQL types $row.customer_name // string $row.amount // number (from numeric/decimal column) @@ -112,8 +133,8 @@ $old.Amount // number (as stored in RavenDB) // this - the document after column mapping has been applied for this event this.CustomerName // string (just set from $row.customer_name) this.Amount // number (just set from $row.amount) -`} - +``` + @@ -122,9 +143,9 @@ Unmapped columns - those not listed in `Columns` - appear in `$row` but are neve written to the document and therefore never appear in `$old`. ---- + -## $row Column Types + `$row` exposes all SQL columns using their **original column names** (not the mapped RavenDB property names). The JavaScript type of each value depends on the source @@ -150,12 +171,13 @@ database type. - -{`var meta = JSON.parse($row.metadata); + +```javascript +var meta = JSON.parse($row.metadata); this.Priority = meta.priority; this.Label = meta.label; -`} - +``` + @@ -163,15 +185,16 @@ this.Label = meta.label; - -{`this.TagCount = $row.tags.length; + +```javascript +this.TagCount = $row.tags.length; this.FirstTag = $row.tags[0]; this.Tags = $row.tags; // INT[] elements are strings - parse explicitly if numeric arithmetic is needed var first = parseInt($row.scores[0], 10); -`} - +``` + @@ -179,26 +202,28 @@ var first = parseInt($row.scores[0], 10); - -{`this.EmbeddingSum = $row.embedding.reduce(function(a, b) \{ return a + b; \}, 0); + +```javascript +this.EmbeddingSum = $row.embedding.reduce(function(a, b) { return a + b; }, 0); this.Embedding = $row.embedding; -`} - +``` + ---- + -## Patch Scope: Root vs Embedded + **Root table patches** operate on the root document: - -{`Patch = "this.Status = $row.is_active ? 'Active' : 'Inactive';" -`} - + +```javascript +Patch = "this.Status = $row.is_active ? 'Active' : 'Inactive';" +``` + @@ -208,37 +233,39 @@ this.Embedding = $row.embedding; - -{`// Patch on order_lines embedded table + +```javascript +// Patch on order_lines embedded table Patch = "this.TotalQuantity = (this.Lines || []).reduce((s, l) => s + l.Quantity, 0);" -`} - +``` + `this` is the parent Orders document. This lets you recompute parent-level aggregates whenever an embedded item changes. ---- + -## Scenario: Column Transformation + Transform or combine SQL columns into RavenDB properties: - -{`this.FullName = ($row.first_name + ' ' + $row.last_name).trim(); + +```javascript +this.FullName = ($row.first_name + ' ' + $row.last_name).trim(); this.Status = $row.is_active ? 'Active' : 'Inactive'; this.CreatedAt = new Date($row.created_unix * 1000).toISOString(); -`} - +``` + ---- + -## Scenario: Aggregation with Embedded Tables + Recompute parent-level totals whenever an embedded item is added or updated. @@ -250,17 +277,18 @@ Without it, deletes will leave the aggregate in an incorrect state. - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "order_lines", PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["order_id"], Columns = [ - new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, - new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, ], // Runs on INSERT and UPDATE - recomputes total from current Lines array @@ -271,24 +299,24 @@ Without it, deletes will leave the aggregate in an incorrect state. // REQUIRED: Runs on DELETE - recomputes after item is removed from array OnDelete = new CdcSinkOnDeleteConfig - \{ + { Patch = @" this.TotalQuantity = (this.Lines || []) .reduce((sum, line) => sum + (line.Quantity || 0), 0); " - \} -\} -`} - + } +} +``` + The OnDelete patch runs after the item has already been removed from the array, so re-summing `this.Lines` gives the correct post-deletion total. ---- + -## Scenario: Delta Computations + Use `$old` to compute a delta when an embedded item changes, keeping a running total without recomputing from scratch. @@ -300,17 +328,18 @@ the deleted item's value. Without it, deletes leave the running total incorrect. - -{`new CdcSinkEmbeddedTableConfig -\{ + +```csharp +new CdcSinkEmbeddedTableConfig +{ SourceTableName = "invoice_lines", PropertyName = "Lines", PrimaryKeyColumns = ["line_id"], JoinColumns = ["invoice_id"], Columns = [ - new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, - new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, ], // INSERT: $old is null, so delta = new amount (0 → new) @@ -323,87 +352,90 @@ the deleted item's value. Without it, deletes leave the running total incorrect. // REQUIRED: Subtract the deleted item's amount using $old OnDelete = new CdcSinkOnDeleteConfig - \{ + { Patch = @" const deletedAmount = $old?.Amount || 0; this.RunningTotal = (this.RunningTotal || 0) - deletedAmount; " - \} -\} -`} - + } +} +``` + The `$old` variable in the OnDelete patch contains the item's last known state before deletion. ---- + -## Scenario: Computed Derived Fields + Compute fields from unmapped columns that you don't want to store directly: - -{`Columns = + +```csharp +Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, ], // base_price and tax_rate are NOT in Columns Patch = @" this.FinalPrice = $row.base_price * (1 + $row.tax_rate); this.Discount = $row.is_vip ? $row.base_price * 0.1 : 0; " -`} - +``` + ---- + -## Scenario: Document Metadata + Patches can set RavenDB document metadata, including expiration: - -{`this['@metadata'] = this['@metadata'] || \{\}; -if ($row.expires_at) \{ +```javascript +this['@metadata'] = this['@metadata'] || {}; + +if ($row.expires_at) { this['@metadata']['@expires'] = new Date($row.expires_at).toISOString(); -\} +} this['@metadata']['SourceTable'] = 'orders'; -`} - +``` + ---- + -## Scenario: Loading Related Documents + Use `load()` to load a related RavenDB document and denormalize its data: - -{`const customer = load('Customers/' + $row.customer_id); -if (customer) \{ +```javascript +const customer = load('Customers/' + $row.customer_id); + +if (customer) { this.CustomerName = customer.Name; this.CustomerEmail = customer.Email; this.CustomerTier = customer.Tier; -\} else \{ +} else { // Document doesn't exist yet - race condition or not yet synced this.CustomerName = null; this.CustomerEmail = null; -\} -`} - +} +``` + @@ -419,9 +451,9 @@ Always check for null before accessing properties. **Prefer linked tables** for simple foreign key references - they are cleaner and do not have the null-handling complexity of `load()`. ---- + -## Idempotency and Failover + After a failover, CDC Sink resumes from the replicated state, which may be older than the last work the previous mentor node completed. Some changes may be re-read @@ -431,8 +463,9 @@ and re-applied. - -{`// NOT idempotent - increments again on re-read + +```javascript +// NOT idempotent - increments again on re-read this.ViewCount = (this.ViewCount || 0) + 1; // Idempotent - absolute value from SQL source @@ -442,17 +475,17 @@ this.ViewCount = $row.view_count; const oldVal = $old?.Amount || 0; const newVal = $row.amount || 0; this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); -`} - +``` + Column mapping itself is idempotent - overwriting a property with the same value is always safe. ---- + -## Step Limit + Patch scripts are bounded by a **step quota** rather than a time limit. Each operation in the script (assignment, loop iteration, function call) consumes steps. @@ -464,9 +497,9 @@ If a patch exceeds the limit, the CDC operation fails and is retried. Keep patches focused and efficient - prefer `.filter()` + `.reduce()` over nested loops. ---- + -## Capabilities and Limitations + **What patches can do:** @@ -485,21 +518,4 @@ Keep patches focused and efficient - prefer `.filter()` + `.reduce()` over neste * Access the file system * Load documents from other RavenDB databases ---- - -## Related Articles - -### CDC Sink - -- [Delete Strategies](./delete-strategies.mdx) -- [Column Mapping](./column-mapping.mdx) -- [Property Retention](./property-retention.mdx) -- [Failover and Consistency](./failover-and-consistency.mdx) - -### PostgreSQL - -- [Column Mapping](./column-mapping.mdx) - -### Server - -- [Patching Configuration](../../../server/configuration/patching-configuration) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json b/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json index 697a3e48e5..eb53b0ec2d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json @@ -1 +1,4 @@ -{"position": 16, "label": "PostgreSQL"} \ No newline at end of file +{ + "position": 16, + "label": "PostgreSQL" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx index 145e356008..a8e6b1f475 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx @@ -3,12 +3,29 @@ title: "CDC Sink for PostgreSQL: Cleanup and Maintenance" sidebar_label: Cleanup and Maintenance description: "How to identify and remove orphaned PostgreSQL replication slots and publications after a CDC Sink task is deleted, and how to avoid slot accumulation." sidebar_position: 6 +see_also: + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Monitoring PostgreSQL" + link: "server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "WAL Configuration" + link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "API Reference" + link: "server/ongoing-tasks/cdc-sink/api-reference" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -21,19 +38,17 @@ import LanguageContent from "@site/src/components/LanguageContent"; * These must be cleaned up manually by a database administrator. -* In this page: +* In this article: * [Why Manual Cleanup Is Required](#why-manual-cleanup-is-required) * [Finding Orphaned Slots and Publications](#finding-orphaned-slots-and-publications) * [Dropping a Replication Slot](#dropping-a-replication-slot) * [Dropping a Publication](#dropping-a-publication) * [Too Many Replication Slots](#too-many-replication-slots) - * [Configuration Changes That Rename Slots](#configuration-changes-that-rename-slots) + * [Slot and Publication Names Are Immutable](#slot-and-publication-names-are-immutable) ---- - -## Why Manual Cleanup Is Required + An active replication slot prevents PostgreSQL from discarding WAL segments that have not yet been consumed. If a slot is not being consumed (because the CDC Sink @@ -59,20 +74,21 @@ For these reasons, slot and publication lifecycle management is the responsibili of the database administrator. ---- + -## Finding Orphaned Slots and Publications + List all CDC Sink replication slots: - - -{`SELECT slot_name, active, confirmed_flush_lsn + + +```sql +SELECT slot_name, active, confirmed_flush_lsn FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; -`} - +``` + @@ -82,29 +98,31 @@ Sink tasks in RavenDB - any slot whose corresponding task no longer exists is or List all CDC Sink publications: - - -{`SELECT p.pubname, c.relname AS table_name + + +```sql +SELECT p.pubname, c.relname AS table_name FROM pg_publication p JOIN pg_publication_rel pr ON pr.prpubid = p.oid JOIN pg_class c ON c.oid = pr.prrelid WHERE p.pubname LIKE 'rvn_cdc_p_%' ORDER BY p.pubname, c.relname; -`} - +``` + ---- + -## Dropping a Replication Slot + - - -{`SELECT pg_drop_replication_slot('rvn_cdc_s_'); -`} - + + +```sql +SELECT pg_drop_replication_slot('rvn_cdc_s_'); +``` + @@ -113,25 +131,26 @@ You cannot drop an active replication slot (one with `active = true`). The CDC S task must be stopped or deleted in RavenDB before the slot can be dropped. ---- + -## Dropping a Publication + - - -{`DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; -`} - + + +```sql +DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; +``` + Publications are not consumed like slots - they do not accumulate data or hold WAL segments. However, they should still be dropped to keep the database clean. ---- + -## Too Many Replication Slots + PostgreSQL limits the total number of replication slots to `max_replication_slots`. If you exceed this limit, no new CDC Sink tasks can start (they will fail with a @@ -140,12 +159,13 @@ connection error). Check how many slots are in use: - - -{`SELECT count(*) FROM pg_replication_slots; + + +```sql +SELECT count(*) FROM pg_replication_slots; SHOW max_replication_slots; -`} - +``` + @@ -154,33 +174,35 @@ To resolve this: 1. Identify inactive slots: - - -{`SELECT slot_name, active + + +```sql +SELECT slot_name, active FROM pg_replication_slots WHERE active = false; -`} - +``` + 2. Drop slots for tasks that no longer exist: - - -{`SELECT pg_drop_replication_slot('rvn_cdc_s_'); -`} - + + +```sql +SELECT pg_drop_replication_slot('rvn_cdc_s_'); +``` + 3. If needed, increase `max_replication_slots` in `postgresql.conf` and restart PostgreSQL. ---- + -## Slot and Publication Names Are Immutable + The replication slot name and publication name are generated **once at task creation** using a GUID and stored with the task. They do not change when you modify the task - @@ -195,16 +217,4 @@ The old slot and publication from the deleted task must then be cleaned up manua see [Dropping a Replication Slot](#dropping-a-replication-slot) and [Dropping a Publication](#dropping-a-publication) below. ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Initial Setup](./initial-setup.mdx) -- [Monitoring PostgreSQL](./monitoring-postgres.mdx) -- [WAL Configuration](./wal-configuration.mdx) - -### CDC Sink - -- [API Reference](../api-reference.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json index 10c3f5c05e..28a3d47b6d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json @@ -1 +1,4 @@ -{"position": 10, "label": "Examples"} +{ + "position": 10, + "label": "Examples" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx index 23169d1775..7c24376af9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx @@ -3,12 +3,41 @@ title: "CDC Sink Example: Complex Nesting with Linked Tables" sidebar_label: Complex Nesting with Linked Tables description: "Multi-level embedded table structure combined with linked table references, representing a product catalog with variants, attributes, and a category reference." sidebar_position: 3 +see_also: + - title: "Simple Migration" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Denormalization" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Event Sourcing" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Linked Tables" + link: "server/ongoing-tasks/cdc-sink/linked-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -20,7 +49,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; table references, representing a product catalog with variants, attributes, and a category reference. -* In this page: +* In this article: * [Source Schema](#source-schema) * [REPLICA IDENTITY Setup](#replica-identity-setup) * [Task Configuration](#task-configuration) @@ -28,12 +57,13 @@ import LanguageContent from "@site/src/components/LanguageContent"; -## Source Schema + - - -{`CREATE TABLE categories ( + + +```sql +CREATE TABLE categories ( category_id SERIAL PRIMARY KEY, name TEXT NOT NULL ); @@ -59,12 +89,14 @@ CREATE TABLE variant_attributes ( attr_name TEXT NOT NULL, attr_value TEXT NOT NULL ); -`} - +``` + -## REPLICA IDENTITY Setup + + + Both `product_variants` and `variant_attributes` have surrogate PKs with join columns that are not part of their primary keys. Rather than `REPLICA IDENTITY FULL` @@ -72,9 +104,10 @@ columns that are not part of their primary keys. Rather than `REPLICA IDENTITY F and PK columns: - - -{`-- product_variants: join column is product_id, PK is variant_id + + +```sql +-- product_variants: join column is product_id, PK is variant_id CREATE UNIQUE INDEX product_variants_replica_idx ON product_variants (product_id, variant_id); ALTER TABLE product_variants @@ -85,49 +118,52 @@ CREATE UNIQUE INDEX variant_attributes_replica_idx ON variant_attributes (product_id, variant_id, attr_id); ALTER TABLE variant_attributes REPLICA IDENTITY USING INDEX variant_attributes_replica_idx; -`} - +``` + See [REPLICA IDENTITY](../replica-identity.mdx) for more details. -## Task Configuration + + + - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "ProductCatalogSync", ConnectionStringName = "MyPostgresConnection", Tables = [ new CdcSinkTableConfig - \{ + { CollectionName = "Products", SourceTableName = "products", PrimaryKeyColumns = ["product_id"], Columns = [ - new CdcColumnMapping() \{ Column = "product_id", Name = "ProductId" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() { Column = "product_id", Name = "ProductId" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, ], // Linked table: category_id FK → document ID in Categories collection LinkedTables = [ new CdcSinkLinkedTableConfig - \{ + { SourceTableName = "categories", PropertyName = "Category", LinkedCollectionName = "Categories", JoinColumns = ["category_id"] - \} + } ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "product_variants", PropertyName = "Variants", Type = CdcSinkRelationType.Array, @@ -135,15 +171,15 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. PrimaryKeyColumns = ["variant_id"], Columns = [ - new CdcColumnMapping() \{ Column = "variant_id", Name = "VariantId" \}, - new CdcColumnMapping() \{ Column = "sku", Name = "Sku" \}, - new CdcColumnMapping() \{ Column = "price", Name = "Price" \}, + new CdcColumnMapping() { Column = "variant_id", Name = "VariantId" }, + new CdcColumnMapping() { Column = "sku", Name = "Sku" }, + new CdcColumnMapping() { Column = "price", Name = "Price" }, ], // Deep-nested: attributes within each variant EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "variant_attributes", PropertyName = "Attributes", Type = CdcSinkRelationType.Array, @@ -153,57 +189,60 @@ See [REPLICA IDENTITY](../replica-identity.mdx) for more details. PrimaryKeyColumns = ["attr_id"], Columns = [ - new CdcColumnMapping() \{ Column = "attr_id", Name = "AttrId" \}, - new CdcColumnMapping() \{ Column = "attr_name", Name = "Name" \}, - new CdcColumnMapping() \{ Column = "attr_value", Name = "Value" \}, + new CdcColumnMapping() { Column = "attr_id", Name = "AttrId" }, + new CdcColumnMapping() { Column = "attr_name", Name = "Name" }, + new CdcColumnMapping() { Column = "attr_value", Name = "Value" }, ] - \} + } ] - \} + } ] - \} + } ] -\}; +}; await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -`} - +``` + -## Resulting Documents + + + - -{`\{ + +```json +{ "ProductId": 42, "Name": "Hiking Boot", "Category": "Categories/3", "Variants": [ - \{ + { "VariantId": 101, "Sku": "HB-BLK-10", "Price": 89.99, "Attributes": [ - \{ "AttrId": 1, "Name": "Color", "Value": "Black" \}, - \{ "AttrId": 2, "Name": "Size", "Value": "10" \} + { "AttrId": 1, "Name": "Color", "Value": "Black" }, + { "AttrId": 2, "Name": "Size", "Value": "10" } ] - \}, - \{ + }, + { "VariantId": 102, "Sku": "HB-BRN-11", "Price": 89.99, "Attributes": [ - \{ "AttrId": 3, "Name": "Color", "Value": "Brown" \}, - \{ "AttrId": 4, "Name": "Size", "Value": "11" \} + { "AttrId": 3, "Name": "Color", "Value": "Brown" }, + { "AttrId": 4, "Name": "Size", "Value": "11" } ] - \} + } ], - "@metadata": \{ "@collection": "Products" \} -\} -`} - + "@metadata": { "@collection": "Products" } +} +``` + @@ -213,19 +252,4 @@ root table configuration). `"Categories/3"` is a standard RavenDB document ID that enables the use of RavenDB includes when querying products. ---- - -## Related Articles - -### CDC Sink Examples - -- [Simple Migration](./example-simple-migration.mdx) -- [Denormalization](./example-denormalization.mdx) -- [Event Sourcing](./example-event-sourcing.mdx) - -### CDC Sink - -- [Schema Design](../../schema-design.mdx) -- [Embedded Tables](../../embedded-tables.mdx) -- [Linked Tables](../../linked-tables.mdx) -- [REPLICA IDENTITY](../replica-identity.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx index bd29dabe31..f7c783d5d9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx @@ -3,12 +3,33 @@ title: "CDC Sink Example: Denormalization with Embedded Tables" sidebar_label: Denormalization with Embedded Tables description: "How to merge a normalized SQL schema (orders + order_lines) into denormalized RavenDB documents with embedded arrays using CDC Sink." sidebar_position: 1 +see_also: + - title: "Simple Migration" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Complex Nesting" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Delete Strategies" + link: "server/ongoing-tasks/cdc-sink/delete-strategies" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +40,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This example shows how to merge a normalized SQL schema (orders + order_lines) into denormalized RavenDB documents with embedded arrays. -* In this page: +* In this article: * [Source Schema](#source-schema) * [REPLICA IDENTITY Setup](#replica-identity-setup) * [Task Configuration](#task-configuration) @@ -28,12 +49,13 @@ import LanguageContent from "@site/src/components/LanguageContent"; -## Source Schema + - - -{`CREATE TABLE orders ( + + +```sql +CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending', @@ -47,12 +69,14 @@ CREATE TABLE order_lines ( qty INT NOT NULL, unit_price NUMERIC(10,2) NOT NULL ); -`} - +``` + -## REPLICA IDENTITY Setup + + + `order_lines` has a surrogate PK (`line_id`). The join column `order_id` is not part of the primary key. Without `REPLICA IDENTITY FULL`, DELETE events for @@ -60,79 +84,86 @@ part of the primary key. Without `REPLICA IDENTITY FULL`, DELETE events for the parent document. - - -{`ALTER TABLE order_lines REPLICA IDENTITY FULL; -`} - + + +```sql +ALTER TABLE order_lines REPLICA IDENTITY FULL; +``` + See [REPLICA IDENTITY](../replica-identity.mdx). -## Task Configuration + + + - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "OrdersSync", ConnectionStringName = "MyPostgresConnection", Tables = new List - \{ + { new CdcSinkTableConfig - \{ + { CollectionName = "Orders", SourceTableName = "orders", - PrimaryKeyColumns = new List \{ "order_id" \}, + PrimaryKeyColumns = new List { "order_id" }, Columns = [ - new CdcColumnMapping() \{ Column = "order_id", Name = "OrderId" \}, - new CdcColumnMapping() \{ Column = "customer", Name = "Customer" \}, - new CdcColumnMapping() \{ Column = "status", Name = "Status" \}, - new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, + new CdcColumnMapping() { Column = "customer", Name = "Customer" }, + new CdcColumnMapping() { Column = "status", Name = "Status" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, ], EmbeddedTables = new List - \{ + { new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "order_lines", PropertyName = "Lines", Type = CdcSinkRelationType.Array, - JoinColumns = new List \{ "order_id" \}, - PrimaryKeyColumns = new List \{ "line_id" \}, + JoinColumns = new List { "order_id" }, + PrimaryKeyColumns = new List { "line_id" }, Columns = [ - new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, - new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, - new CdcColumnMapping() \{ Column = "qty", Name = "Qty" \}, - new CdcColumnMapping() \{ Column = "unit_price", Name = "UnitPrice" \}, + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "qty", Name = "Qty" }, + new CdcColumnMapping() { Column = "unit_price", Name = "UnitPrice" }, ] - \} - \} - \} - \} -\}; + } + } + } + } +}; await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -`} - +``` + -## Resulting Documents + + + SQL rows: - -{`orders: order_id=1, customer='Acme Corp', status='pending' + +```plain +orders: order_id=1, customer='Acme Corp', status='pending' order_lines: line_id=1, order_id=1, product='Widget A', qty=3, unit_price=9.99 order_lines: line_id=2, order_id=1, product='Widget B', qty=1, unit_price=24.99 -`} - +``` + @@ -140,34 +171,37 @@ RavenDB document `Orders/1`: - -{`\{ + +```json +{ "OrderId": 1, "Customer": "Acme Corp", "Status": "pending", "CreatedAt": "2024-06-01T09:00:00+00:00", "Lines": [ - \{ + { "LineId": 1, "Product": "Widget A", "Qty": 3, "UnitPrice": 9.99 - \}, - \{ + }, + { "LineId": 2, "Product": "Widget B", "Qty": 1, "UnitPrice": 24.99 - \} + } ], - "@metadata": \{ "@collection": "Orders" \} -\} -`} - + "@metadata": { "@collection": "Orders" } +} +``` + -## What Happens on Change Events + + + **INSERT into `order_lines`:** A new item is appended to the `Lines` array. @@ -186,17 +220,4 @@ is not affected. **DELETE from `orders`:** The entire `orders/1` document is deleted, including all embedded lines. ---- - -## Related Articles - -### CDC Sink Examples - -- [Simple Migration](./example-simple-migration.mdx) -- [Complex Nesting](./example-complex-nesting.mdx) - -### CDC Sink - -- [Embedded Tables](../../embedded-tables.mdx) -- [REPLICA IDENTITY](../replica-identity.mdx) -- [Delete Strategies](../../delete-strategies.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx index a5c8304f71..6b30be34ad 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx @@ -3,12 +3,37 @@ title: "CDC Sink Example: Event Sourcing with Aggregation" sidebar_label: Event Sourcing with Aggregation description: "How to use CDC Sink patches to maintain a computed aggregate on a RavenDB document as individual event rows arrive from PostgreSQL." sidebar_position: 2 +see_also: + - title: "Simple Migration" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Denormalization" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Complex Nesting" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Delete Strategies" + link: "server/ongoing-tasks/cdc-sink/delete-strategies" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This example shows how to use CDC Sink patches to maintain a computed aggregate on a RavenDB document as individual event rows arrive from PostgreSQL. -* In this page: +* In this article: * [Source Schema](#source-schema) * [Goal](#goal) * [Task Configuration](#task-configuration) @@ -28,14 +53,15 @@ import LanguageContent from "@site/src/components/LanguageContent"; -## Source Schema + An accounts table and a transactions table: - - -{`CREATE TABLE accounts ( + + +```sql +CREATE TABLE accounts ( account_id SERIAL PRIMARY KEY, owner TEXT NOT NULL, currency TEXT NOT NULL DEFAULT 'USD' @@ -48,43 +74,48 @@ CREATE TABLE transactions ( type TEXT NOT NULL, -- 'credit' or 'debit' created_at TIMESTAMPTZ DEFAULT now() ); -`} - +``` + -## Goal + + + Store each account as a RavenDB document with a `Balance` field that reflects the running total of all transactions. Transaction rows are embedded as an array for history, and `Balance` is maintained using patch logic. -## Task Configuration + + + - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "AccountsSync", ConnectionStringName = "MyPostgresConnection", Tables = [ new CdcSinkTableConfig - \{ + { CollectionName = "Accounts", SourceTableName = "accounts", PrimaryKeyColumns = ["account_id"], Columns = [ - new CdcColumnMapping() \{ Column = "account_id", Name = "AccountId" \}, - new CdcColumnMapping() \{ Column = "owner", Name = "Owner" \}, - new CdcColumnMapping() \{ Column = "currency", Name = "Currency" \}, + new CdcColumnMapping() { Column = "account_id", Name = "AccountId" }, + new CdcColumnMapping() { Column = "owner", Name = "Owner" }, + new CdcColumnMapping() { Column = "currency", Name = "Currency" }, ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "transactions", PropertyName = "Transactions", Type = CdcSinkRelationType.Array, @@ -92,10 +123,10 @@ history, and `Balance` is maintained using patch logic. PrimaryKeyColumns = ["txn_id"], Columns = [ - new CdcColumnMapping() \{ Column = "txn_id", Name = "TxnId" \}, - new CdcColumnMapping() \{ Column = "amount", Name = "Amount" \}, - new CdcColumnMapping() \{ Column = "type", Name = "Type" \}, - new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() { Column = "txn_id", Name = "TxnId" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, + new CdcColumnMapping() { Column = "type", Name = "Type" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, ], // Patch runs on the parent document for INSERT/UPDATE Patch = """ @@ -108,50 +139,55 @@ history, and `Balance` is maintained using patch logic. + (sign * newAmount); """, OnDelete = new CdcSinkOnDeleteConfig - \{ + { Patch = """ const deletedAmount = $old?.Amount || 0; const sign = $old?.Type === 'credit' ? 1 : -1; this.Balance = (this.Balance || 0) - (sign * deletedAmount); """ - \} - \} + } + } ] - \} + } ] -\}; +}; await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -`} - +``` + -## Resulting Documents + + + After three transactions (credit 100, debit 30, credit 50): - -{`\{ + +```json +{ "AccountId": 1, "Owner": "Alice", "Currency": "USD", "Balance": 120.00, "Transactions": [ - \{ "TxnId": 1, "Amount": 100.00, "Type": "credit", "CreatedAt": "..." \}, - \{ "TxnId": 2, "Amount": 30.00, "Type": "debit", "CreatedAt": "..." \}, - \{ "TxnId": 3, "Amount": 50.00, "Type": "credit", "CreatedAt": "..." \} + { "TxnId": 1, "Amount": 100.00, "Type": "credit", "CreatedAt": "..." }, + { "TxnId": 2, "Amount": 30.00, "Type": "debit", "CreatedAt": "..." }, + { "TxnId": 3, "Amount": 50.00, "Type": "credit", "CreatedAt": "..." } ], - "@metadata": \{ "@collection": "Accounts" \} -\} -`} - + "@metadata": { "@collection": "Accounts" } +} +``` + -## Handling Deletes + + + The `OnDelete.Patch` reverses the contribution of the deleted transaction to `Balance`. This uses `$old` (the embedded item's last known state) rather than @@ -168,18 +204,4 @@ update, so the delta produces the same result. See [Failover and Consistency](../../failover-and-consistency.mdx). ---- - -## Related Articles - -### CDC Sink Examples - -- [Simple Migration](./example-simple-migration.mdx) -- [Denormalization](./example-denormalization.mdx) -- [Complex Nesting](./example-complex-nesting.mdx) - -### CDC Sink - -- [Patching](../../patching.mdx) -- [Delete Strategies](../../delete-strategies.mdx) -- [Failover and Consistency](../../failover-and-consistency.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx index 7315fb07d2..3b168820e3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx @@ -3,12 +3,33 @@ title: "CDC Sink Example: Simple Table Migration" sidebar_label: Simple Table Migration description: "Minimal setup to replicate a single SQL table into a RavenDB collection using CDC Sink." sidebar_position: 0 +see_also: + - title: "Denormalization" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Event Sourcing" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Complex Nesting" + link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + source: "docs" + path: "Server > CDC Sink > PostgreSQL > Examples" + - title: "Schema Design" + link: "server/ongoing-tasks/cdc-sink/schema-design" + source: "docs" + path: "Server > CDC Sink" + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,74 +40,81 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This example shows the minimal setup to replicate a single SQL table into a RavenDB collection. -* In this page: +* In this article: * [Source Schema](#source-schema) * [Task Configuration](#task-configuration) * [Resulting Documents](#resulting-documents) -## Source Schema + A simple customers table: - - -{`CREATE TABLE customers ( + + +```sql +CREATE TABLE customers ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT now() ); -`} - +``` + -## Task Configuration + + + - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "CustomersSync", ConnectionStringName = "MyPostgresConnection", Tables = new List - \{ + { new CdcSinkTableConfig - \{ + { CollectionName = "Customers", SourceTableName = "customers", - PrimaryKeyColumns = new List \{ "id" \}, + PrimaryKeyColumns = new List { "id" }, Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, - new CdcColumnMapping() \{ Column = "email", Name = "Email" \}, - new CdcColumnMapping() \{ Column = "created_at", Name = "CreatedAt" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() { Column = "email", Name = "Email" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, ] - \} - \} -\}; + } + } +}; await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -`} - +``` + -## Resulting Documents + + + SQL row: - -{`id=1, name='Alice', email='alice@example.com', created_at='2024-01-15 10:30:00+00' -`} - + +```plain +id=1, name='Alice', email='alice@example.com', created_at='2024-01-15 10:30:00+00' +``` + @@ -94,35 +122,23 @@ RavenDB document in collection `Customers` with ID `Customers/1`: - -{`\{ + +```json +{ "Id": 1, "Name": "Alice", "Email": "alice@example.com", "CreatedAt": "2024-01-15T10:30:00+00:00", - "@metadata": \{ + "@metadata": { "@collection": "Customers" - \} -\} -`} - + } +} +``` + Document IDs are generated as `{collection}/{pk}` - for example, `Customers/1` for a row with `id = 1`. ---- - -## Related Articles - -### CDC Sink Examples - -- [Denormalization](./example-denormalization.mdx) -- [Event Sourcing](./example-event-sourcing.mdx) -- [Complex Nesting](./example-complex-nesting.mdx) - -### CDC Sink - -- [Schema Design](../../schema-design.mdx) -- [Column Mapping](../../column-mapping.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx index 144f485d49..c302012027 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx @@ -3,12 +3,29 @@ title: "CDC Sink for PostgreSQL: Initial Setup" sidebar_label: Initial Setup description: "How CDC Sink creates and verifies the replication slot and publication on startup, with options for automatic or manual setup and custom naming." sidebar_position: 3 +see_also: + - title: "Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Permissions and Roles" + link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Cleanup and Maintenance" + link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,7 +39,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * If the CDC Sink user does not have permission to create these objects, a database administrator must create them manually before the task can start. -* In this page: +* In this article: * [Automatic Setup](#automatic-setup) * [Manual Setup](#manual-setup) * [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names) @@ -31,9 +48,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Automatic Setup + If the CDC Sink user has the required permissions (see [Permissions and Roles](./permissions-and-roles.mdx)), @@ -47,9 +62,9 @@ CDC Sink will: No manual database administration is needed in this case. ---- + -## Manual Setup + If the CDC Sink user does not have permission to create replication slots or publications, a database administrator must create them before the task is started. @@ -73,12 +88,13 @@ and reading the error message, which includes the expected names. Create a publication that includes all the tables CDC Sink will replicate: - - -{`CREATE PUBLICATION rvn_cdc_p_ + + +```sql +CREATE PUBLICATION rvn_cdc_p_ FOR TABLE orders, order_lines, customers; -`} - +``` + @@ -88,14 +104,15 @@ configurations. **Step 3: Create the replication slot** - - -{`SELECT pg_create_logical_replication_slot( + + +```sql +SELECT pg_create_logical_replication_slot( 'rvn_cdc_s_', 'pgoutput' ); -`} - +``` + @@ -110,29 +127,30 @@ when you later modify the task. If you created these objects manually, the same will continue to be used regardless of subsequent configuration changes. ---- + -## Specifying Custom Slot and Publication Names + You can explicitly specify the replication slot and publication names by setting `CdcSinkPostgresSettings` on the task configuration: - -{`var config = new CdcSinkConfiguration -\{ + +```csharp +var config = new CdcSinkConfiguration +{ Name = "OrdersSync", ConnectionStringName = "MyPostgresConnection", Postgres = new CdcSinkPostgresSettings - \{ + { SlotName = "orders_sync_slot", PublicationName = "orders_sync_pub" - \}, + }, Tables = [ ... ] -\}; -`} - +}; +``` + @@ -147,9 +165,9 @@ Custom names are useful when: **Immutability:** Once set, `SlotName` and `PublicationName` are fixed for the lifetime of the task. If you need different names, delete the task and create a new one. ---- + -## Slot and Publication Naming (Auto-generated) + When `CdcSinkPostgresSettings` is not set (or `SlotName`/`PublicationName` are null), CDC Sink generates unique names at task creation time using a GUID: @@ -163,11 +181,12 @@ The GUID is generated once when the task is first created and stored with the ta - -{`rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 + +```plain +rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 rvn_cdc_p_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 -`} - +``` + @@ -180,16 +199,17 @@ with the task. Subsequent modifications to the task (adding tables, changing map etc.) do not change the slot or publication names - the original names are always used. ---- + -## Verifying Setup + To verify the slot and publication were created: - - -{`-- View CDC Sink replication slots + + +```sql +-- View CDC Sink replication slots SELECT slot_name, plugin, slot_type, active FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; @@ -201,18 +221,9 @@ JOIN pg_publication_rel pr ON pr.prpubid = p.oid JOIN pg_class c ON c.oid = pr.prrelid WHERE p.pubname LIKE 'rvn_cdc_p_%' ORDER BY p.pubname, c.relname; -`} - +``` + ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Prerequisites Checklist](./prerequisites-checklist.mdx) -- [Permissions and Roles](./permissions-and-roles.mdx) -- [REPLICA IDENTITY](./replica-identity.mdx) -- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx index 3f94307c88..e587c2feac 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx @@ -3,12 +3,25 @@ title: "CDC Sink for PostgreSQL: Monitoring PostgreSQL" sidebar_label: Monitoring PostgreSQL description: "PostgreSQL-side monitoring for CDC Sink, including replication slot health, replication lag, and WAL disk usage queries." sidebar_position: 7 +see_also: + - title: "Cleanup and Maintenance" + link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Monitoring" + link: "server/ongoing-tasks/cdc-sink/monitoring" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -21,27 +34,26 @@ import LanguageContent from "@site/src/components/LanguageContent"; * For RavenDB-side monitoring, see [Monitoring](../monitoring.mdx). -* In this page: +* In this article: * [Replication Slot Health](#replication-slot-health) * [Replication Lag](#replication-lag) * [WAL Disk Usage](#wal-disk-usage) ---- - -## Replication Slot Health + Check that CDC Sink replication slots are active and being consumed: - - -{`SELECT slot_name, active, confirmed_flush_lsn + + +```sql +SELECT slot_name, active, confirmed_flush_lsn FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; -`} - +``` + @@ -54,21 +66,22 @@ A slot with `active = false` means CDC Sink is not currently connected. This is expected during failover or when the task is paused. If the slot remains inactive for an extended period, investigate the task state in RavenDB Studio. ---- + -## Replication Lag + Replication lag measures how far behind the slot is relative to the current WAL position: - - -{`SELECT slot_name, + + +```sql +SELECT slot_name, pg_current_wal_lsn() - confirmed_flush_lsn AS lag_bytes FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; -`} - +``` + @@ -80,9 +93,9 @@ of changes in the source database. Consider: * Checking the per-table processing statistics in the Management Studio for slow scripts - complex patch scripts are a common cause of processing slowdowns ---- + -## WAL Disk Usage + PostgreSQL retains WAL segments until all replication slots have consumed them. An inactive or slow slot can cause WAL to accumulate on disk. @@ -90,14 +103,15 @@ An inactive or slow slot can cause WAL to accumulate on disk. Check approximate WAL retained per slot: - - -{`SELECT slot_name, active, + + +```sql +SELECT slot_name, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS retained_wal_bytes FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; -`} - +``` + @@ -106,15 +120,4 @@ consumed and is holding WAL. If the slot corresponds to a deleted or abandoned CDC Sink task, drop it. See [Cleanup and Maintenance](./cleanup-and-maintenance.mdx). ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) - -### CDC Sink - -- [Monitoring](../monitoring.mdx) -- [Failover and Consistency](../failover-and-consistency.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx index ce80b03e87..ee14de06d5 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx @@ -8,7 +8,7 @@ sidebar_position: -1 import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -25,30 +25,29 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Connection String + Use a `SqlConnectionString` with `FactoryName` set to `"Npgsql"`: - -{`store.Maintenance.Send(new PutConnectionStringOperation( + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( new SqlConnectionString - \{ + { Name = "MyPostgresConnection", FactoryName = "Npgsql", ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=ravendb_cdc;Password=..." - \})); -`} - + })); +``` + ---- + -## How It Works + PostgreSQL CDC Sink uses logical replication, which provides a continuous stream of changes without polling. This gives low-latency, near-real-time replication. @@ -62,9 +61,9 @@ Key PostgreSQL concepts: * **WAL (Write-Ahead Log)** - PostgreSQL retains WAL segments as long as a replication slot has not consumed them. An inactive or paused task causes WAL to accumulate. ---- + -## Prerequisites + PostgreSQL requires several configuration settings and permissions before CDC Sink can connect. See [Prerequisites Checklist](./prerequisites-checklist.mdx) for the @@ -75,41 +74,42 @@ full list, including: * A database user with `REPLICATION` privilege * `REPLICA IDENTITY` configuration for embedded tables with surrogate keys ---- + -## PostgreSQL-Specific Settings + The `CdcSinkPostgresSettings` object on `CdcSinkConfiguration` controls the replication slot and publication names: - -{`Postgres = new CdcSinkPostgresSettings -\{ + +```csharp +Postgres = new CdcSinkPostgresSettings +{ SlotName = "my_slot", PublicationName = "my_publication" -\} -`} - +} +``` + If omitted, GUID-based names are generated automatically when the task is created. See [Initial Setup](./initial-setup.mdx) for details. ---- + -## Configuration + The CDC Sink task configuration is the same across all database engines. See [Configuration Reference](../configuration-reference.mdx) for full details. The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. ---- + -## In This Section + * [Prerequisites Checklist](./prerequisites-checklist.mdx) - what to verify before creating a task * [Initial Setup](./initial-setup.mdx) - creating the replication slot and publication @@ -120,4 +120,4 @@ The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. * [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) - dropping orphaned slots * [Studio UI](./studio-ui.mdx) - creating tasks through the Studio interface ---- + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx index 6db5ecb0c3..81f3b48090 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx @@ -3,12 +3,25 @@ title: "CDC Sink for PostgreSQL: Permissions and Roles" sidebar_label: Permissions and Roles description: "PostgreSQL permissions required by the CDC Sink user, including minimum privileges, automatic setup permissions, and dedicated user creation examples." sidebar_position: 2 +see_also: + - title: "Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Cleanup and Maintenance" + link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,16 +32,14 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page documents the PostgreSQL permissions required by the CDC Sink user, and how to grant them. -* In this page: +* In this article: * [Minimum Permissions](#minimum-permissions) * [Permissions for Automatic Setup](#permissions-for-automatic-setup) * [Creating a Dedicated CDC User](#creating-a-dedicated-cdc-user) ---- - -## Minimum Permissions + At a minimum, the CDC Sink user needs: @@ -38,17 +49,18 @@ At a minimum, the CDC Sink user needs: Example: - - -{`-- Grant replication privilege + + +```sql +-- Grant replication privilege ALTER USER cdc_user REPLICATION; -- Grant SELECT on each table GRANT SELECT ON TABLE orders TO cdc_user; GRANT SELECT ON TABLE order_lines TO cdc_user; GRANT SELECT ON TABLE customers TO cdc_user; -`} - +``` + @@ -56,9 +68,9 @@ With only these permissions, a database administrator must manually create the replication slot and publication before starting the CDC Sink task. See [Initial Setup](./initial-setup.mdx). ---- + -## Permissions for Automatic Setup + If you want CDC Sink to create and manage the replication slot and publication automatically, the user needs additional permissions: @@ -68,11 +80,12 @@ automatically, the user needs additional permissions: PostgreSQL 14+: - - -{`GRANT pg_replication_slot_admin TO cdc_user; -`} - + + +```sql +GRANT pg_replication_slot_admin TO cdc_user; +``` + @@ -85,11 +98,12 @@ The user must either own the tables being published, or have `SUPERUSER`. Alternatively, you can grant `CREATE` on the database: - - -{`GRANT CREATE ON DATABASE mydb TO cdc_user; -`} - + + +```sql +GRANT CREATE ON DATABASE mydb TO cdc_user; +``` + @@ -107,9 +121,9 @@ user then only needs `REPLICATION` privilege and `SELECT` on the relevant tables See [Initial Setup](./initial-setup.mdx). ---- + -## Creating a Dedicated CDC User + It is recommended to use a dedicated database user for CDC Sink rather than an application or admin user. @@ -117,9 +131,10 @@ application or admin user. Example setup: - - -{`-- Create the user + + +```sql +-- Create the user CREATE USER cdc_user WITH PASSWORD 'secure_password' REPLICATION; -- Grant SELECT on tables to replicate @@ -133,17 +148,9 @@ GRANT pg_replication_slot_admin TO cdc_user; -- Option A: Grant ownership of tables ALTER TABLE orders OWNER TO cdc_user; -- Option B: Create publications as a superuser before starting the task -`} - +``` + ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Prerequisites Checklist](./prerequisites-checklist.mdx) -- [Initial Setup](./initial-setup.mdx) -- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx index d9987a96df..46dec057bb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx @@ -3,12 +3,29 @@ title: "CDC Sink for PostgreSQL: Prerequisites Checklist" sidebar_label: Prerequisites Checklist description: "Verify all requirements before creating a CDC Sink task for PostgreSQL, including WAL configuration, user permissions, table requirements, and network access." sidebar_position: 0 +see_also: + - title: "WAL Configuration" + link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Permissions and Roles" + link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +36,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * Before creating a CDC Sink task for PostgreSQL, verify that each of these requirements is in place. -* In this page: +* In this article: * [Source Database Requirements](#source-database-requirements) * [User Permissions](#user-permissions) * [Table Requirements](#table-requirements) @@ -27,9 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Source Database Requirements + * **PostgreSQL version**: 10 or later (logical replication introduced in version 10) @@ -38,11 +53,12 @@ import LanguageContent from "@site/src/components/LanguageContent"; Verify with: - - -{`SHOW wal_level; -`} - + + +```sql +SHOW wal_level; +``` + @@ -53,11 +69,12 @@ import LanguageContent from "@site/src/components/LanguageContent"; Verify with: - - -{`SHOW max_replication_slots; -`} - + + +```sql +SHOW max_replication_slots; +``` + @@ -66,48 +83,51 @@ import LanguageContent from "@site/src/components/LanguageContent"; Verify with: - - -{`SHOW max_wal_senders; -`} - + + +```sql +SHOW max_wal_senders; +``` + ---- + -## User Permissions + The database user in the connection string must have sufficient permissions. **Minimum required permissions:** - - -{`-- Replication privilege (required for logical replication) + + +```sql +-- Replication privilege (required for logical replication) ALTER USER cdc_user REPLICATION; -- SELECT on each table CDC Sink will read GRANT SELECT ON TABLE orders TO cdc_user; GRANT SELECT ON TABLE order_lines TO cdc_user; -`} - +``` + **Optional (allows CDC Sink to configure replication automatically):** - - -{`-- Create/drop replication slots + + +```sql +-- Create/drop replication slots -- This requires SUPERUSER or membership in pg_replication_slot_admin (PG 14+) -- Create/drop publications -- This requires ownership of the tables being published, or SUPERUSER -`} - +``` + @@ -117,9 +137,9 @@ See [Initial Setup](./initial-setup.mdx). Full details: [Permissions and Roles](./permissions-and-roles.mdx). ---- + -## Table Requirements + * **Primary key**: Each root table and each embedded table must have a primary key (or a unique index used as a replica identity). @@ -136,9 +156,9 @@ Full details: [Permissions and Roles](./permissions-and-roles.mdx). * **Published columns**: All columns referenced in `PrimaryKeyColumns`, `JoinColumns`, and `Columns` entries must exist in the SQL table. ---- + -## Network Access + * The RavenDB server must be able to open a TCP connection to the PostgreSQL host on the configured port (default: 5432). @@ -147,13 +167,4 @@ Full details: [Permissions and Roles](./permissions-and-roles.mdx). Ensure that firewalls, proxies, and load balancers do not terminate idle or long-lived connections. ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [WAL Configuration](./wal-configuration.mdx) -- [Permissions and Roles](./permissions-and-roles.mdx) -- [Initial Setup](./initial-setup.mdx) -- [REPLICA IDENTITY](./replica-identity.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx index 65770a69bc..5ac6eb238b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx @@ -3,12 +3,21 @@ title: "CDC Sink for PostgreSQL: Manual REPLICA IDENTITY Setup" sidebar_label: Manual REPLICA IDENTITY Setup description: "Step-by-step instructions for a database administrator to configure REPLICA IDENTITY manually when CDC Sink lacks permission to alter tables." sidebar_position: 5 +see_also: + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,7 +28,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * When CDC Sink does not have permission to alter tables, a database administrator must configure `REPLICA IDENTITY` manually before the task starts. -* In this page: +* In this article: * [When Manual Setup Is Required](#when-manual-setup-is-required) * [Setting REPLICA IDENTITY FULL](#setting-replica-identity-full) * [Using an Index Instead of FULL](#using-an-index-instead-of-full) @@ -27,9 +36,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## When Manual Setup Is Required + CDC Sink attempts to set `REPLICA IDENTITY FULL` automatically on any embedded table whose join columns are not part of the primary key. This requires: @@ -41,20 +48,21 @@ If neither condition is met, the CDC Sink task fails to start and reports a permissions error. A database administrator must configure `REPLICA IDENTITY` manually before the task can run. ---- + -## Setting REPLICA IDENTITY FULL + The simplest approach is to set `REPLICA IDENTITY FULL` on all embedded tables that CDC Sink will replicate: - - -{`ALTER TABLE order_lines REPLICA IDENTITY FULL; + + +```sql +ALTER TABLE order_lines REPLICA IDENTITY FULL; ALTER TABLE line_attributes REPLICA IDENTITY FULL; -`} - +``` + @@ -62,9 +70,9 @@ ALTER TABLE line_attributes REPLICA IDENTITY FULL; This is the most compatible option but increases WAL volume for tables with many or large columns. ---- + -## Using an Index Instead of FULL + If WAL size is a concern, you can use a specific unique index that covers both the join columns and PK columns of the embedded table. @@ -72,25 +80,27 @@ the join columns and PK columns of the embedded table. **Step 1: Create a unique index covering the required columns** - - -{`-- For order_lines: join column is order_id, PK is line_id + + +```sql +-- For order_lines: join column is order_id, PK is line_id CREATE UNIQUE INDEX order_lines_replica_idx ON order_lines (order_id, line_id); -`} - +``` + **Step 2: Set REPLICA IDENTITY to use this index** - - -{`ALTER TABLE order_lines + + +```sql +ALTER TABLE order_lines REPLICA IDENTITY USING INDEX order_lines_replica_idx; -`} - +``` + @@ -102,16 +112,17 @@ The index must be `UNIQUE` and `NOT DEFERRABLE`. It cannot include expressions or partial predicates. All columns in the index must be `NOT NULL`. ---- + -## Verifying the Configuration + Confirm that the desired `REPLICA IDENTITY` mode is set: - - -{`SELECT c.relname, c.relreplident, + + +```sql +SELECT c.relname, c.relreplident, CASE c.relreplident WHEN 'd' THEN 'DEFAULT' WHEN 'f' THEN 'FULL' @@ -123,19 +134,12 @@ JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND n.nspname = 'public' ORDER BY c.relname; -`} - +``` + Tables configured with `FULL` or `INDEX` are ready for CDC Sink embedded table delete processing. ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [REPLICA IDENTITY](./replica-identity.mdx) -- [Initial Setup](./initial-setup.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx index 762a9c4fe4..48d76e15f2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx @@ -3,12 +3,21 @@ title: "CDC Sink for PostgreSQL: REPLICA IDENTITY" sidebar_label: REPLICA IDENTITY description: "How PostgreSQL REPLICA IDENTITY affects CDC Sink's ability to process DELETE events for embedded tables, and when it must be configured." sidebar_position: 4 +see_also: + - title: "Manual REPLICA IDENTITY Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -23,7 +32,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; item to remove from a parent document. Without them, embedded table deletes cannot be routed correctly. -* In this page: +* In this article: * [Why REPLICA IDENTITY Matters](#why-replica-identity-matters) * [REPLICA IDENTITY Options](#replica-identity-options) * [When Is REPLICA IDENTITY Required?](#when-is-replica-identity-required) @@ -32,9 +41,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Why REPLICA IDENTITY Matters + When CDC Sink receives a DELETE event for an embedded table, it needs to: @@ -50,9 +57,9 @@ If the embedded table's join columns are part of the primary key, this is suffic If they are not - which is the common case when a table has a surrogate PK - the DELETE event will be missing the columns needed to route it. ---- + -## REPLICA IDENTITY Options + PostgreSQL supports four REPLICA IDENTITY modes: @@ -66,9 +73,9 @@ PostgreSQL supports four REPLICA IDENTITY modes: For CDC Sink, `FULL` is the simplest and most compatible choice. `INDEX` works if the index covers both the join columns and PK columns. ---- + -## When Is REPLICA IDENTITY Required? + | Scenario | REPLICA IDENTITY needed? | |----------|------------------------| @@ -81,9 +88,10 @@ For CDC Sink, `FULL` is the simplest and most compatible choice. **Example where REPLICA IDENTITY is needed:** - - -{`-- order_lines has a surrogate PK (line_id), with order_id as foreign key + + +```sql +-- order_lines has a surrogate PK (line_id), with order_id as foreign key -- order_id is NOT part of the primary key CREATE TABLE order_lines ( line_id SERIAL PRIMARY KEY, -- PK @@ -95,17 +103,18 @@ CREATE TABLE order_lines ( -- Without REPLICA IDENTITY FULL, a DELETE event only contains line_id. -- CDC Sink cannot determine which parent document (order_id) to update. ALTER TABLE order_lines REPLICA IDENTITY FULL; -`} - +``` + **Example where REPLICA IDENTITY is NOT needed:** - - -{`-- If order_id is part of a composite PK, DEFAULT is sufficient + + +```sql +-- If order_id is part of a composite PK, DEFAULT is sufficient CREATE TABLE order_lines ( order_id INT NOT NULL, line_num INT NOT NULL, @@ -113,26 +122,27 @@ CREATE TABLE order_lines ( qty INT, PRIMARY KEY (order_id, line_num) ); -`} - +``` + ---- + -## Checking Current Setting + - - -{`SELECT c.relname, c.relreplident + + +```sql +SELECT c.relname, c.relreplident FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND n.nspname = 'public' ORDER BY c.relname; -`} - +``` + @@ -145,9 +155,9 @@ The `relreplident` column: | `i` | INDEX (specific unique index) | | `n` | NOTHING | ---- + -## Automatic vs Manual Configuration + If the CDC Sink user has sufficient permissions (table ownership or `SUPERUSER`), CDC Sink will automatically set `REPLICA IDENTITY FULL` on embedded tables that @@ -157,11 +167,4 @@ If the CDC Sink user does not have permission to alter tables, a database administrator must configure `REPLICA IDENTITY` before starting the task. See [Manual Setup](./replica-identity-manual-setup.mdx). ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Manual REPLICA IDENTITY Setup](./replica-identity-manual-setup.mdx) -- [Initial Setup](./initial-setup.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx index e2d75a0c9a..6902694417 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx @@ -3,12 +3,33 @@ title: "CDC Sink for PostgreSQL: Studio UI" sidebar_label: Studio UI description: "How to create, monitor, and edit CDC Sink tasks for PostgreSQL through the RavenDB Management Studio Ongoing Tasks interface." sidebar_position: 8 +see_also: + - title: "Initial Setup" + link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Cleanup and Maintenance" + link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Monitoring" + link: "server/ongoing-tasks/cdc-sink/monitoring" + source: "docs" + path: "Server > CDC Sink" + - title: "API Reference" + link: "server/ongoing-tasks/cdc-sink/api-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,16 +40,14 @@ import LanguageContent from "@site/src/components/LanguageContent"; * CDC Sink tasks are created and managed through the **Ongoing Tasks** section of the Management Studio. -* In this page: +* In this article: * [Creating a CDC Sink Task](#creating-a-cdc-sink-task) * [Monitoring Task State](#monitoring-task-state) * [Editing a Task](#editing-a-task) ---- - -## Creating a CDC Sink Task + To create a CDC Sink task in the Studio: @@ -40,9 +59,9 @@ To create a CDC Sink task in the Studio: 6. (Optional) Configure patches for INSERT/UPDATE/DELETE events 7. Click **Save** ---- + -## Monitoring Task State + The task list shows: @@ -53,9 +72,9 @@ The task list shows: Clicking on a task opens the detail view with per-table statistics. ---- + -## Editing a Task + To edit a task, click its name in the Ongoing Tasks list. The same configuration form used for creation opens in edit mode. @@ -80,17 +99,4 @@ Orphaned slots and publications must be dropped manually by the database adminis See [Cleanup and Maintenance](./cleanup-and-maintenance.mdx). ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Initial Setup](./initial-setup.mdx) -- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) - -### CDC Sink - -- [Monitoring](../monitoring.mdx) -- [API Reference](../api-reference.mdx) -- [Configuration Reference](../configuration-reference.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx index e4263bfdf8..0b1dc5b5e8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx @@ -3,12 +3,25 @@ title: "CDC Sink for PostgreSQL: WAL Configuration" sidebar_label: WAL Configuration description: "How to verify and configure the PostgreSQL Write-Ahead Log level to enable logical replication required by CDC Sink." sidebar_position: 1 +see_also: + - title: "Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Permissions and Roles" + link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "Cleanup and Maintenance" + link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -21,25 +34,24 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page explains how to verify the current setting and change it if needed. -* In this page: +* In this article: * [Check Current WAL Level](#check-current-wal-level) * [Enable Logical Replication](#enable-logical-replication) * [Other Required Settings](#other-required-settings) ---- - -## Check Current WAL Level + Connect to your PostgreSQL instance and run: - - -{`SHOW wal_level; -`} - + + +```sql +SHOW wal_level; +``` + @@ -48,18 +60,19 @@ If the result is `logical`, no changes are needed. If the result is `replica` or `minimal`, logical replication is not enabled and must be configured before CDC Sink can run. ---- + -## Enable Logical Replication + Edit `postgresql.conf` and set the following: - -{`wal_level = logical -`} - + +```plain +wal_level = logical +``` + @@ -68,12 +81,13 @@ This change requires a **PostgreSQL restart**. After restarting, verify the change took effect: - - -{`SHOW wal_level; + + +```sql +SHOW wal_level; -- Should return: logical -`} - +``` + @@ -82,20 +96,21 @@ Changing `wal_level` requires a full server restart, not just a configuration re Plan for a brief maintenance window. ---- + -## Other Required Settings + CDC Sink uses one replication slot per task. Ensure the following settings are sufficient for the number of CDC Sink tasks you plan to run: - -{`max_replication_slots = 10 -- at least 1 per CDC Sink task + +```plain +max_replication_slots = 10 -- at least 1 per CDC Sink task max_wal_senders = 10 -- at least 1 per active replication connection -`} - +``` + @@ -106,23 +121,16 @@ concurrent CDC Sink tasks or other replication consumers. Check current values: - - -{`SHOW max_replication_slots; + + +```sql +SHOW max_replication_slots; SHOW max_wal_senders; -`} - +``` + These settings also require a **server restart** if changed. ---- - -## Related Articles - -### CDC Sink for PostgreSQL - -- [Prerequisites Checklist](./prerequisites-checklist.mdx) -- [Permissions and Roles](./permissions-and-roles.mdx) -- [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 03f0064b32..35abdf7e6b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -3,12 +3,25 @@ title: "CDC Sink: Property Retention" sidebar_label: Property Retention description: "Explains how CDC Sink merges UPDATE events onto existing RavenDB documents, preserving properties that are not part of the column mapping." sidebar_position: 8 +see_also: + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "How It Works" + link: "server/ongoing-tasks/cdc-sink/how-it-works" + source: "docs" + path: "Server > CDC Sink" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -22,17 +35,15 @@ import LanguageContent from "@site/src/components/LanguageContent"; * Properties that are not part of the column mapping are preserved across updates. This allows RavenDB-side data to coexist safely with CDC-managed properties. -* In this page: +* In this article: * [How Merging Works](#how-merging-works) - * [What Is and Isn't Preserved](#what-is-and-isnt-preserved) + * [What Is and Is Not Preserved](#what-is-and-is-not-preserved) * [Editing Documents Directly in RavenDB](#editing-documents-directly-in-ravendb) * [Implications for Patches](#implications-for-patches) ---- - -## How Merging Works + When a CDC UPDATE arrives for a document that already exists: @@ -47,16 +58,17 @@ Initial SQL row → initial document: - -{`\{ + +```json +{ "Id": 1, "Name": "Alice", "Email": "alice@example.com", "InternalNotes": "VIP customer", - "@metadata": \{ "@collection": "Customers" \} -\} -`} - + "@metadata": { "@collection": "Customers" } +} +``` + @@ -66,24 +78,25 @@ Document after CDC UPDATE: - -{`\{ + +```json +{ "Id": 1, "Name": "Alice", "Email": "alice.new@example.com", "InternalNotes": "VIP customer", - "@metadata": \{ "@collection": "Customers" \} -\} -`} - + "@metadata": { "@collection": "Customers" } +} +``` + `Email` is updated from SQL, while `InternalNotes` (not in the `Columns` list) is preserved. ---- + -## What Is and Isn't Preserved + **Preserved across CDC updates:** @@ -98,25 +111,26 @@ Document after CDC UPDATE: If you manually edit a property that is part of the `Columns` list, the next CDC UPDATE for that row will overwrite your edit with the SQL value. ---- + -## Editing Documents Directly in RavenDB + You can safely add properties to CDC-managed documents: - -{`\{ + +```json +{ "Id": 1, "Name": "Alice", "Email": "alice@ex.com", "InternalNotes": "...", "ReviewedAt": "...", "Tags": ["vip"] -\} -`} - +} +``` + @@ -128,9 +142,9 @@ properties surviving future CDC updates. If you need to preserve a value that comes from SQL, consider adding a separate RavenDB-only property for your annotation and leaving the SQL-mapped property as-is. ---- + -## Implications for Patches + Patches run after column mapping and can set additional properties that are not from the `Columns` list. These patch-computed properties follow the same merge rules: @@ -144,12 +158,4 @@ For aggregates maintained via patches (e.g., `RunningTotal`), the patch itself is responsible for keeping the value correct across INSERT, UPDATE, and DELETE events. See [Patching](./patching.mdx). ---- - -## Related Articles - -### CDC Sink - -- [Column Mapping](./column-mapping.mdx) -- [Patching](./patching.mdx) -- [How It Works](./how-it-works.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 22555f48b9..0ac4d3290c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -3,12 +3,33 @@ title: "CDC Sink: Schema Design" sidebar_label: Schema Design description: "Explains how CDC Sink maps a relational schema to a RavenDB document model using root tables, embedded tables, and linked tables." sidebar_position: 2 +see_also: + - title: "Embedded Tables" + link: "server/ongoing-tasks/cdc-sink/embedded-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Linked Tables" + link: "server/ongoing-tasks/cdc-sink/linked-tables" + source: "docs" + path: "Server > CDC Sink" + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -20,7 +41,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; This page explains the three building blocks - root tables, embedded tables, and linked tables - and how to combine them. -* In this page: +* In this article: * [Root Tables](#root-tables) * [Embedded Tables](#embedded-tables) * [Linked Tables](#linked-tables) @@ -31,35 +52,43 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Root Tables + -A **root table** maps a SQL table to a RavenDB collection. Each row in the SQL table +A **root table** maps a source table to a RavenDB collection. Each row in the source table becomes one document. +Each root table is configured with a `CdcSinkTableConfig` object. This configuration +defines the source table to read from, the target RavenDB collection to write to, the +primary key columns used to build document IDs, and the columns to map into each document. + - -{`new CdcSinkTableConfig -\{ - CollectionName = "Orders", // RavenDB collection name - SourceTableSchema = "public", // SQL schema (optional, default: "public") - SourceTableName = "orders", // SQL table name + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Orders", // RavenDB collection name + SourceTableSchema = "public", // Source schema (optional; default is provider-specific) + SourceTableName = "orders", // Source table name PrimaryKeyColumns = ["id"], // Used for document ID generation Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, - new CdcColumnMapping() \{ Column = "total", Name = "Total" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "total", Name = "Total" }, ] -\} -`} - +} +``` + -**Document ID generation:** `\{CollectionName\}/\{pk1\}/\{pk2\}/...` + +The default `SourceTableSchema` is provider-specific: PostgreSQL uses `public`, +SQL Server uses `dbo`, and MySQL/MariaDB use the database name from the connection string. + + +**Document ID generation:** `{CollectionName}/{pk1}/{pk2}/...` A row with `id = 42` and collection `Orders` becomes document `Orders/42`. A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. CDC Sink uses the `CollectionName` verbatim as the document ID prefix. @@ -67,30 +96,35 @@ CDC Sink uses the `CollectionName` verbatim as the document ID prefix. **Column mapping:** Only columns listed in `Columns` appear in the document. Unmapped columns are still available in patch scripts via `$row` but are not stored in the document. ---- + -## Embedded Tables + An **embedded table** creates nested data within a parent document. For example, a -SQL `order_lines` table becomes an array inside each `Orders` document. +`order_lines` table becomes an array inside each `Orders` document. + +Embedded tables are configured inside the root table's `CdcSinkTableConfig`. In the +example below, the `orders` root table configuration contains an `EmbeddedTables` entry +that maps `order_lines` into the `Lines` array. - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_name", Name = "CustomerName" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "order_lines", PropertyName = "Lines", // Property in parent document Type = CdcSinkRelationType.Array, // Array of items @@ -98,15 +132,15 @@ SQL `order_lines` table becomes an array inside each `Orders` document. PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete Columns = [ - new CdcColumnMapping() \{ Column = "line_id", Name = "LineId" \}, - new CdcColumnMapping() \{ Column = "product", Name = "Product" \}, - new CdcColumnMapping() \{ Column = "quantity", Name = "Quantity" \}, + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, ] - \} + } ] -\} -`} - +} +``` + @@ -114,66 +148,68 @@ This produces documents like: - -{`\{ + +```json +{ "Id": 1, "CustomerName": "Alice", "Lines": [ - \{ "LineId": 1, "Product": "Apples", "Quantity": 5 \}, - \{ "LineId": 2, "Product": "Bananas", "Quantity": 3 \} + { "LineId": 1, "Product": "Apples", "Quantity": 5 }, + { "LineId": 2, "Product": "Bananas", "Quantity": 3 } ], - "@metadata": \{ "@collection": "Orders" \} -\} -`} - + "@metadata": { "@collection": "Orders" } +} +``` + ---- + -## Linked Tables + A **linked table** creates a document ID reference rather than embedding data. A foreign key in the source row becomes a RavenDB document ID. - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ CollectionName = "Orders", SourceTableName = "orders", PrimaryKeyColumns = ["id"], Columns = [ - new CdcColumnMapping() \{ Column = "id", Name = "Id" \}, - new CdcColumnMapping() \{ Column = "customer_id", Name = "CustomerId" \}, + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, ], LinkedTables = [ new CdcSinkLinkedTableConfig - \{ + { SourceTableName = "customers", PropertyName = "Customer", // Property in parent document LinkedCollectionName = "Customers", // Target collection for ID JoinColumns = ["customer_id"] // FK used to build the ID - \} + } ] -\} -`} - +} +``` + With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. ---- + -## Primary Key and Join Column Requirements + ### Root Tables -The `PrimaryKeyColumns` list defines which SQL columns are used to generate the document ID. +The `PrimaryKeyColumns` list defines which source columns are used to generate the document ID. All PK columns must be present in every INSERT, UPDATE, and DELETE event. ### Embedded Tables (One Level) @@ -197,15 +233,15 @@ The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `Pr For DELETE events, the source database must include the join column values so CDC Sink can route the delete to the correct parent document. -If the join column is not part of the SQL table's primary key, the source database may +If the join column is not part of the source table's primary key, the source database may need additional configuration to include it in DELETE events. See [REPLICA IDENTITY](./postgres/replica-identity.mdx) for the PostgreSQL-specific requirement and how CDC Sink handles it automatically. ---- + -## Multi-Level Nesting + Embedded tables can themselves have embedded tables, creating arbitrarily deep hierarchies. @@ -213,21 +249,22 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h - -{`new CdcSinkTableConfig -\{ + +```csharp +new CdcSinkTableConfig +{ CollectionName = "Companies", SourceTableName = "companies", PrimaryKeyColumns = ["company_id"], Columns = [ - new CdcColumnMapping() \{ Column = "company_id", Name = "CompanyId" \}, - new CdcColumnMapping() \{ Column = "name", Name = "Name" \}, + new CdcColumnMapping() { Column = "company_id", Name = "CompanyId" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "departments", PropertyName = "Departments", Type = CdcSinkRelationType.Array, @@ -235,13 +272,13 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h PrimaryKeyColumns = ["dept_id"], Columns = [ - new CdcColumnMapping() \{ Column = "dept_id", Name = "DeptId" \}, - new CdcColumnMapping() \{ Column = "dept_name", Name = "DeptName" \}, + new CdcColumnMapping() { Column = "dept_id", Name = "DeptId" }, + new CdcColumnMapping() { Column = "dept_name", Name = "DeptName" }, ], EmbeddedTables = [ new CdcSinkEmbeddedTableConfig - \{ + { SourceTableName = "employees", PropertyName = "Employees", Type = CdcSinkRelationType.Array, @@ -249,16 +286,16 @@ Embedded tables can themselves have embedded tables, creating arbitrarily deep h PrimaryKeyColumns = ["emp_id"], Columns = [ - new CdcColumnMapping() \{ Column = "emp_id", Name = "EmpId" \}, - new CdcColumnMapping() \{ Column = "emp_name", Name = "EmpName" \}, + new CdcColumnMapping() { Column = "emp_id", Name = "EmpId" }, + new CdcColumnMapping() { Column = "emp_name", Name = "EmpName" }, ] - \} + } ] - \} + } ] -\} -`} - +} +``` + @@ -269,37 +306,38 @@ table's primary key as a denormalized column. The `employees` table must have This is required because CDC Sink needs to route every row to the correct root document in a single pass, without additional lookups. -**SQL schema to support this:** +**Source schema to support this:** - - -{`CREATE TABLE employees ( + + +```sql +CREATE TABLE employees ( company_id INT NOT NULL, -- Denormalized root FK dept_id INT NOT NULL, -- Parent FK emp_id INT NOT NULL, -- Local PK emp_name VARCHAR(200), PRIMARY KEY (company_id, dept_id, emp_id) ); -`} - +``` + Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY configuration - the default DELETE events include all PK columns. ---- + -## Relation Types + The `Type` property on embedded tables controls the document structure: | Type | Use Case | Document Structure | |------|----------|--------------------| -| `Array` | One-to-many: parent has many children | `"Lines": [\{ ... \}, \{ ... \}]` | -| `Map` | One-to-many with direct key lookup | `"Lines": \{ "1": \{ ... \}, "2": \{ ... \} \}` | -| `Value` | Many-to-one: parent has one child | `"Customer": \{ ... \}` | +| `Array` | One-to-many: parent has many children | `"Lines": [{ ... }, { ... }]` | +| `Map` | One-to-many with direct key lookup | `"Lines": { "1": { ... }, "2": { ... } }` | +| `Value` | Many-to-one: parent has one child | `"Customer": { ... }` | **Array** - Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. Use when you need to iterate over all items. @@ -310,9 +348,9 @@ Use when you need fast direct-key access within the document. **Value** - Stores a single embedded object. Use for many-to-one relationships (many orders share one customer). ---- + -## Choosing Between Embedded and Linked + | Consideration | Embedded | Linked | |--------------|----------|--------| @@ -332,17 +370,4 @@ Use for many-to-one relationships (many orders share one customer). * The referenced entity is shared by many parents * You want RavenDB's include loading to handle the join ---- - -## Related Articles - -### CDC Sink - -- [Embedded Tables](./embedded-tables.mdx) -- [Linked Tables](./linked-tables.mdx) -- [Column Mapping](./column-mapping.mdx) -- [Configuration Reference](./configuration-reference.mdx) - -### PostgreSQL - -- [REPLICA IDENTITY](./postgres/replica-identity.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index 39ec552481..4836222f26 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -3,12 +3,29 @@ title: "CDC Sink: Server Configuration" sidebar_label: Server Configuration description: "Documents the RavenDB server configuration keys that control CDC Sink task behavior, including batch size, fallback timeout, and poll interval." sidebar_position: 15 +see_also: + - title: "Overview" + link: "server/ongoing-tasks/cdc-sink/overview" + source: "docs" + path: "Server > CDC Sink" + - title: "Monitoring" + link: "server/ongoing-tasks/cdc-sink/monitoring" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Overview" + link: "server/configuration/configuration-options" + source: "docs" + path: "Server > Configuration" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,14 +36,12 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page documents the RavenDB server configuration keys that control CDC Sink task behavior. -* In this page: +* In this article: * [Configuration Keys](#configuration-keys) ---- - -## Configuration Keys + These keys can be set in `settings.json` or passed as environment variables. See [Configuration Overview](../../../server/configuration/configuration-options). @@ -71,16 +86,4 @@ Timeout (in seconds) for the PostgreSQL replication connection. Controls both th SQL Server and MySQL ignore this setting. ---- - -## Related Articles - -### CDC Sink - -- [Overview](./overview.mdx) -- [Monitoring](./monitoring.mdx) -- [Failover and Consistency](./failover-and-consistency.mdx) - -### Server Configuration - -- [Configuration Overview](../../../server/configuration/configuration-options) + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index 248d0d1ddd..d1a716ab45 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -3,12 +3,33 @@ title: "CDC Sink: Source Schema Changes" sidebar_label: Source Schema Changes description: "How to safely modify your source database schema while a CDC Sink task is running - behavior per database engine, recovery, and the SQL Server capture instance procedure." sidebar_position: 13 +see_also: + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "Column Mapping" + link: "server/ongoing-tasks/cdc-sink/column-mapping" + source: "docs" + path: "Server > CDC Sink" + - title: "How It Works: Updating the Task Configuration" + link: "server/ongoing-tasks/cdc-sink/how-it-works#updating-the-task-configuration" + source: "docs" + path: "Server > CDC Sink" + - title: "Troubleshooting" + link: "server/ongoing-tasks/cdc-sink/troubleshooting" + source: "docs" + path: "Server > CDC Sink" + - title: "SQL Server Overview" + link: "server/ongoing-tasks/cdc-sink/sql-server/overview" + source: "docs" + path: "Server > CDC Sink > SQL Server" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -23,7 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; MySQL detects most changes automatically, and SQL Server requires an explicit procedure for every schema change. -* In this page: +* In this article: * [Quick Reference](#quick-reference) * [PostgreSQL](#postgresql) * [MySQL](#mysql) @@ -33,9 +54,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Quick Reference + | Change | MySQL | PostgreSQL | SQL Server | |--------|-------|------------|------------| @@ -46,9 +65,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; | Change column type | Restarts, usually recovers | Transparent (auto-rebuild) | Requires [procedure](#sql-server-schema-change-procedure) | | Rename mapped column | Enters fallback | Enters fallback | Requires [procedure](#sql-server-schema-change-procedure) | ---- + -## PostgreSQL + PostgreSQL logical replication sends `RelationMessage` events inline in the WAL stream whenever the schema changes. CDC Sink detects these automatically and rebuilds its @@ -67,8 +86,9 @@ column mapping on the fly. This makes PostgreSQL the **most resilient** to schem - -{`-- Transparent: adding an unmapped column + +```sql +-- Transparent: adding an unmapped column ALTER TABLE orders ADD COLUMN internal_notes TEXT; -- CDC Sink auto-rebuilds and continues @@ -79,14 +99,14 @@ ALTER TABLE orders ALTER COLUMN status TYPE VARCHAR(100); -- Requires config update: renaming a mapped column ALTER TABLE orders RENAME COLUMN name TO full_name; -- CDC Sink enters fallback. Update column mapping from 'name' to 'full_name'. -`} - +``` + ---- + -## MySQL + MySQL CDC uses binlog replication. Each row event is preceded by a `TableMapEvent` containing column type information. CDC Sink compares the column types at mapped @@ -121,8 +141,9 @@ then apply the next change. This ensures each change is simple and isolated. - -{`-- Transparent: adding an unmapped column + +```sql +-- Transparent: adding an unmapped column ALTER TABLE orders ADD COLUMN internal_notes TEXT; -- CDC Sink continues without interruption @@ -133,14 +154,14 @@ ALTER TABLE orders MODIFY COLUMN status VARCHAR(100); -- Requires config update: dropping a mapped column ALTER TABLE orders DROP COLUMN legacy_field; -- CDC Sink enters fallback. Update the config to remove 'legacy_field' from Columns. -`} - +``` + ---- + -## SQL Server + SQL Server CDC uses **capture instances** - immutable snapshots of the table schema at the time `sp_cdc_enable_table` was executed. The CDC change tables reflect the @@ -159,8 +180,9 @@ For **any** schema change on a SQL Server CDC-tracked table, follow this procedu - -{`-- Step 1: ALTER the table + +```sql +-- Step 1: ALTER the table ALTER TABLE dbo.orders ADD priority INT DEFAULT 0; -- Step 2: Create a NEW capture instance (the old one still exists) @@ -181,8 +203,8 @@ EXEC sys.sp_cdc_disable_table @capture_instance = N'dbo_orders'; -- CDC Sink detects the drop, restarts, and picks up dbo_orders_v2. -`} - +``` + @@ -213,20 +235,21 @@ tables) and cleanup job (which purges old changes) are Agent jobs. - -{`-- Check Agent status + +```sql +-- Check Agent status SELECT * FROM sys.dm_server_services WHERE servicename LIKE '%Agent%'; -`} - +``` + Without the Agent, changes are never captured and CDC Sink polls indefinitely without finding data. ---- + -## Recovery From Errors + All three providers use the same recovery mechanism: @@ -238,9 +261,9 @@ All three providers use the same recovery mechanism: 4. **After fixing the configuration** - the process recovers automatically on the next retry cycle. No manual restart is needed. ---- + -## General Recommendation + For schema changes that affect mapped columns on any database engine: @@ -251,17 +274,4 @@ For schema changes that affect mapped columns on any database engine: CDC Sink will detect the change and recover automatically. Disabling the task beforehand is not required but can avoid a brief fallback cycle. ---- - -## Related Articles - -### CDC Sink - -- [Configuration Reference](./configuration-reference.mdx) -- [Column Mapping](./column-mapping.mdx) -- [How It Works: Updating the Task Configuration](./how-it-works.mdx#updating-the-task-configuration) -- [Troubleshooting](./troubleshooting.mdx) - -### SQL Server - -- [SQL Server Overview](./sql-server/overview.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json b/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json index 53959810fc..cf141b1eb7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json @@ -1 +1,4 @@ -{"position": 17, "label": "SQL Server"} +{ + "position": 17, + "label": "SQL Server" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx index 810c3f2743..6aa1d706fb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx @@ -3,12 +3,25 @@ title: "CDC Sink for SQL Server: Overview" sidebar_label: Overview description: "CDC Sink support for SQL Server - using native SQL Server Change Data Capture to stream changes into RavenDB." sidebar_position: 0 +see_also: + - title: "Overview" + link: "server/ongoing-tasks/cdc-sink/overview" + source: "docs" + path: "Server > CDC Sink" + - title: "Configuration Reference" + link: "server/ongoing-tasks/cdc-sink/configuration-reference" + source: "docs" + path: "Server > CDC Sink" + - title: "PostgreSQL Prerequisites Checklist" + link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -25,39 +38,38 @@ import LanguageContent from "@site/src/components/LanguageContent"; ---- - -## Connection String + -Use a `SqlConnectionString` with `FactoryName` set to `"System.Data.SqlClient"` or -`"Microsoft.Data.SqlClient"`: +Use a `SqlConnectionString` with `FactoryName` set to `"Microsoft.Data.SqlClient"`: - -{`store.Maintenance.Send(new PutConnectionStringOperation( + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( new SqlConnectionString - \{ + { Name = "MySqlServerConnection", FactoryName = "Microsoft.Data.SqlClient", ConnectionString = "Server=myserver;Database=mydb;Trusted_Connection=True;" - \})); -`} - + })); +``` + ---- + -## Prerequisites + SQL Server CDC must be enabled on the source database and on each table you want to capture: - -{`-- Enable CDC on the database + +```sql +-- Enable CDC on the database EXEC sys.sp_cdc_enable_db; -- Enable CDC on a table @@ -65,36 +77,28 @@ EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'orders', @role_name = NULL; -`} - +``` + The SQL Server Agent service must be running for CDC to function. ---- + -## Polling Behavior + Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration key controls how frequently the task polls for new changes. See [Server Configuration](../server-configuration.mdx). ---- + -## Configuration + The CDC Sink task configuration is the same across all database engines. See [Configuration Reference](../configuration-reference.mdx) for full details. The `SourceTableSchema` defaults to `"dbo"` when using SQL Server. ---- - -## Related Articles - -### CDC Sink - -- [Overview](../overview.mdx) -- [Configuration Reference](../configuration-reference.mdx) -- [PostgreSQL: Prerequisites Checklist](../postgres/prerequisites-checklist.mdx) + diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index ce2c9d924f..f46f9077c7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -3,12 +3,41 @@ title: "CDC Sink: Troubleshooting" sidebar_label: Troubleshooting description: "Covers common problems encountered when running CDC Sink tasks and how to resolve them, including startup failures, error states, and missing documents." sidebar_position: 14 +see_also: + - title: "How It Works" + link: "server/ongoing-tasks/cdc-sink/how-it-works" + source: "docs" + path: "Server > CDC Sink" + - title: "Monitoring" + link: "server/ongoing-tasks/cdc-sink/monitoring" + source: "docs" + path: "Server > CDC Sink" + - title: "Patching" + link: "server/ongoing-tasks/cdc-sink/patching" + source: "docs" + path: "Server > CDC Sink" + - title: "Failover and Consistency" + link: "server/ongoing-tasks/cdc-sink/failover-and-consistency" + source: "docs" + path: "Server > CDC Sink" + - title: "PostgreSQL WAL Configuration" + link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "PostgreSQL Permissions and Roles" + link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" + - title: "PostgreSQL REPLICA IDENTITY" + link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + source: "docs" + path: "Server > CDC Sink > PostgreSQL" --- import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; +import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; @@ -19,21 +48,19 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page covers common problems encountered when running CDC Sink tasks and how to resolve them. -* In this page: - * [Task Won't Start](#task-wont-start) +* In this article: + * [Task Fails to Start](#task-fails-to-start) * [Task Enters Error State](#task-enters-error-state) * [Documents Not Appearing](#documents-not-appearing) * [Embedded Items Missing or Incorrect](#embedded-items-missing-or-incorrect) * [DELETE Not Applied](#delete-not-applied) * [Patch Errors](#patch-errors) * [Source Schema Changes](#source-schema-changes) - * [Partial Export/Import and State Loss](#partial-exportimport-and-state-loss) + * [Partial Export/Import and State Loss](#partial-export-import-and-state-loss) ---- - -## Task Won't Start + **Symptom:** Task remains in `Error` state immediately after creation. @@ -56,9 +83,9 @@ import LanguageContent from "@site/src/components/LanguageContent"; Check the error message in the Notification Center (bell icon in Studio) for the specific failure reason. ---- + -## Task Enters Error State + **Symptom:** Task was running, then stopped with an error. @@ -80,9 +107,9 @@ specific failure reason. cap (default 15 minutes). Restore connectivity and the task resumes automatically on the next retry. ---- + -## Documents Not Appearing + **Symptom:** SQL rows exist but corresponding RavenDB documents are not created. @@ -101,9 +128,9 @@ specific failure reason. 5. **Task is paused** - check that the task state is `Active`, not `Disabled`. ---- + -## Embedded Items Missing or Incorrect + **Symptom:** Parent document exists but embedded array/map is empty or items are missing. @@ -127,9 +154,9 @@ specific failure reason. or vice versa after documents were already created, existing documents retain the old structure. Re-process from scratch or migrate existing documents. ---- + -## DELETE Not Applied + **Symptom:** A row was deleted from SQL but the RavenDB document still exists. @@ -149,9 +176,9 @@ specific failure reason. that does not allow the delete to proceed (combined with `IgnoreDeletes = true`), the document is kept. Review the patch logic. ---- + -## Patch Errors + **Symptom:** Task enters error state with a message referencing a JavaScript patch failure. @@ -168,11 +195,12 @@ specific failure reason. - -{`const related = load("Collection/123"); -if (related) \{ ... \} -`} - + +```javascript +const related = load("Collection/123"); +if (related) { ... } +``` + @@ -180,9 +208,9 @@ if (related) \{ ... \} long-running or loops over large arrays, it may hit `Patching.MaxStepsForScript`. See the [configuration reference](../../../server/configuration/patching-configuration) for this setting. ---- + -## Source Schema Changes + Adding, removing, renaming, or retyping columns on the source database while a CDC Sink task is running requires different handling depending on the database engine. @@ -192,9 +220,9 @@ capture instance procedure for every schema change. See [Source Schema Changes](./source-schema-changes.mdx) for the full guide, including per-engine behavior, examples, and the SQL Server procedure. ---- + -## Partial Export/Import and State Loss + **Symptom:** After importing a database export, CDC Sink re-reads all data from the source database from the beginning, performing a full initial load even though the @@ -245,19 +273,4 @@ changes that occurred between the export and the recreation). ---- - -## Related Articles - -### CDC Sink - -- [How It Works](./how-it-works.mdx) -- [Monitoring](./monitoring.mdx) -- [Patching](./patching.mdx) -- [Failover and Consistency](./failover-and-consistency.mdx) - -### PostgreSQL - -- [WAL Configuration](./postgres/wal-configuration.mdx) -- [Permissions and Roles](./postgres/permissions-and-roles.mdx) -- [REPLICA IDENTITY](./postgres/replica-identity.mdx) + From 08e72d613fef8a58a01ae5deb8d263837cf66951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Mon, 6 Jul 2026 12:29:33 +0200 Subject: [PATCH 27/84] RDoc-3836 Restructure CDC Sink docs into Source Database Setup and Manage Tasks categories --- .../cdc-sink/attachment-handling.mdx | 4 ++-- .../ongoing-tasks/cdc-sink/column-mapping.mdx | 4 ++-- .../ongoing-tasks/cdc-sink/delete-strategies.mdx | 8 ++++---- .../ongoing-tasks/cdc-sink/embedded-tables.mdx | 10 +++++----- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 10 +++++----- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 4 ++-- .../manage-cdc-sink-tasks/_category_.json | 4 ++++ .../api-reference.mdx | 14 +++++++------- .../configuration-reference.mdx | 10 +++++----- .../server/ongoing-tasks/cdc-sink/monitoring.mdx | 2 +- docs/server/ongoing-tasks/cdc-sink/overview.mdx | 6 +++--- docs/server/ongoing-tasks/cdc-sink/patching.mdx | 2 +- .../cdc-sink/property-retention.mdx | 2 +- .../ongoing-tasks/cdc-sink/schema-design.mdx | 8 ++++---- .../cdc-sink/server-configuration.mdx | 2 +- .../source-database-setup/_category_.json | 4 ++++ .../mysql/_category_.json | 2 +- .../mysql/overview.mdx | 4 ++-- .../postgres/_category_.json | 2 +- .../postgres/cleanup-and-maintenance.mdx | 8 ++++---- .../postgres/examples/_category_.json | 0 .../examples/example-complex-nesting.mdx | 8 ++++---- .../examples/example-denormalization.mdx | 6 +++--- .../postgres/examples/example-event-sourcing.mdx | 8 ++++---- .../examples/example-simple-migration.mdx | 6 +++--- .../postgres/initial-setup.mdx | 8 ++++---- .../postgres/monitoring-postgres.mdx | 4 ++-- .../postgres/overview.mdx | 2 +- .../postgres/permissions-and-roles.mdx | 6 +++--- .../postgres/prerequisites-checklist.mdx | 8 ++++---- .../postgres/replica-identity-manual-setup.mdx | 4 ++-- .../postgres/replica-identity.mdx | 4 ++-- .../postgres/studio-ui.mdx | 8 ++++---- .../postgres/wal-configuration.mdx | 6 +++--- .../sql-server/_category_.json | 2 +- .../sql-server/overview.mdx | 8 ++++---- .../cdc-sink/source-schema-changes.mdx | 6 +++--- .../ongoing-tasks/cdc-sink/troubleshooting.mdx | 16 ++++++++-------- 38 files changed, 114 insertions(+), 106 deletions(-) create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/_category_.json rename docs/server/ongoing-tasks/cdc-sink/{ => manage-cdc-sink-tasks}/api-reference.mdx (93%) rename docs/server/ongoing-tasks/cdc-sink/{ => manage-cdc-sink-tasks}/configuration-reference.mdx (97%) create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/_category_.json rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/mysql/_category_.json (56%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/mysql/overview.mdx (93%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/_category_.json (60%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/cleanup-and-maintenance.mdx (94%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/examples/_category_.json (100%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/examples/example-complex-nesting.mdx (95%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/examples/example-denormalization.mdx (95%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/examples/example-event-sourcing.mdx (94%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/examples/example-simple-migration.mdx (91%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/initial-setup.mdx (94%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/monitoring-postgres.mdx (95%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/overview.mdx (97%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/permissions-and-roles.mdx (93%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/prerequisites-checklist.mdx (92%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/replica-identity-manual-setup.mdx (95%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/replica-identity.mdx (96%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/studio-ui.mdx (90%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/postgres/wal-configuration.mdx (91%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/sql-server/_category_.json (60%) rename docs/server/ongoing-tasks/cdc-sink/{ => source-database-setup}/sql-server/overview.mdx (87%) diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 68535ba677..10c84cdd42 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Attachment Handling" sidebar_label: Attachment Handling description: "Explains how to store binary or text SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." -sidebar_position: 9 +sidebar_position: 8 see_also: - title: "Column Mapping" link: "server/ongoing-tasks/cdc-sink/column-mapping" @@ -13,7 +13,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "Attachments Overview" diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index 0b2597029b..f4d721f42a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Column Mapping" sidebar_label: Column Mapping description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using the Columns list of CdcColumnMapping entries." -sidebar_position: 5 +sidebar_position: 7 see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -17,7 +17,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "Patching: $row Column Types" diff --git a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx index 43bb5d2326..76d4f20210 100644 --- a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Delete Strategies" sidebar_label: Delete Strategies description: "Documents configurable behavior for DELETE events in CDC Sink, including archive, audit trail, and silent ignore patterns." -sidebar_position: 7 +sidebar_position: 11 see_also: - title: "Patching" link: "server/ongoing-tasks/cdc-sink/patching" @@ -13,11 +13,11 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -290,7 +290,7 @@ configuration for DELETE routing. See: -* [REPLICA IDENTITY](./postgres/replica-identity.mdx) (PostgreSQL) +* [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) (PostgreSQL) **Skipping REPLICA IDENTITY requirements:** Set `OnDelete.IgnoreDeletes = true` to discard DELETE events for an embedded table entirely. This skips the REPLICA diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index e2095d6f53..6f8ec20130 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Embedded Tables" sidebar_label: Embedded Tables description: "Covers configuration options, nesting constraints, and how embedded items are updated and deleted in CDC Sink." -sidebar_position: 3 +sidebar_position: 5 see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -21,15 +21,15 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "REPLICA IDENTITY Manual Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -126,7 +126,7 @@ By default, many databases only include primary key columns in DELETE events. If join column is _not_ in the embedded table's primary key, additional source database configuration is required. -**PostgreSQL:** See [REPLICA IDENTITY](./postgres/replica-identity.mdx) +**PostgreSQL:** See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) for how CDC Sink handles this automatically when it has sufficient permissions, or how a DBA can configure it manually. diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index 63c500359a..fbe1d804c4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -25,11 +25,11 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "PostgreSQL Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "PostgreSQL Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -79,20 +79,20 @@ CDC Sink checks: * The connecting user has sufficient privileges * REPLICA IDENTITY is configured correctly for embedded tables that need delete routing -See the [PostgreSQL Prerequisites Checklist](./postgres/prerequisites-checklist.mdx) +See the [PostgreSQL Prerequisites Checklist](./source-database-setup/postgres/prerequisites-checklist.mdx) for the full list of requirements. ### SQL Server CDC Sink checks that Change Data Capture is enabled on the database and on each captured table, and that the SQL Server Agent service is running (it drives the CDC capture jobs). -See [CDC Sink for SQL Server](./sql-server/overview.mdx). +See [CDC Sink for SQL Server](./source-database-setup/sql-server/overview.mdx). ### MySQL / MariaDB CDC Sink checks that binary logging is enabled with `binlog_format = ROW`, and that the connecting user has the `REPLICATION SLAVE` and `REPLICATION CLIENT` privileges required -to read the binlog. See [CDC Sink for MySQL](./mysql/overview.mdx). +to read the binlog. See [CDC Sink for MySQL](./source-database-setup/mysql/overview.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index 1f3d23c355..e622792736 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Linked Tables" sidebar_label: Linked Tables description: "Explains how linked tables create document ID references in parent documents by converting foreign key values into RavenDB document IDs." -sidebar_position: 4 +sidebar_position: 6 see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -13,7 +13,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "Load with Includes" diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/_category_.json b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/_category_.json new file mode 100644 index 0000000000..f24e44ba19 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 3, + "label": "Manage CDC Sink Tasks" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx similarity index 93% rename from docs/server/ongoing-tasks/cdc-sink/api-reference.mdx rename to docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx index 16a9f9acce..f0e37dd65a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx @@ -1,11 +1,11 @@ --- title: "CDC Sink: API Reference" -sidebar_label: API Reference +sidebar_label: Task Operations description: "Documents the Client API operations for creating, updating, querying, toggling, and deleting CDC Sink tasks programmatically." -sidebar_position: 11 +sidebar_position: 0 see_also: - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "Overview" @@ -144,12 +144,12 @@ SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; SELECT pubname FROM pg_publication WHERE pubname LIKE 'rvn_cdc_p_%'; ``` -See [Initial Setup](./postgres/initial-setup.mdx) for +See [Initial Setup](../source-database-setup/postgres/initial-setup.mdx) for guidance on slot and publication management. Dropped or orphaned slots and publications must be cleaned up manually by the database administrator. -See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). +See [Cleanup and Maintenance](../source-database-setup/postgres/cleanup-and-maintenance.mdx). @@ -196,7 +196,7 @@ await store.Maintenance.SendAsync( PostgreSQL retains WAL segments for unconsumed slots, so pausing for an extended period causes WAL to accumulate on disk. Monitor disk usage if a task is paused for more than a short time. -See [Monitoring PostgreSQL](./postgres/monitoring-postgres.mdx). +See [Monitoring PostgreSQL](../source-database-setup/postgres/monitoring-postgres.mdx). **SQL Server:** Pausing a CDC Sink task for an extended period (days) may cause SQL Server to trim the CDC change tables, removing rows that have not yet been consumed. A short @@ -224,7 +224,7 @@ await store.Maintenance.SendAsync( Deleting the task in RavenDB does **not** drop the replication slot or publication in the source database. These must be cleaned up manually by the database administrator. -See [Cleanup and Maintenance](./postgres/cleanup-and-maintenance.mdx). +See [Cleanup and Maintenance](../source-database-setup/postgres/cleanup-and-maintenance.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx similarity index 97% rename from docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx rename to docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx index 96a1a051e9..40b84736f3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx @@ -1,8 +1,8 @@ --- title: "CDC Sink: Configuration Reference" -sidebar_label: Configuration Reference +sidebar_label: Configuration Syntax description: "Documents all configuration classes used to define a CDC Sink task, including CdcSinkConfiguration, table configs, CdcColumnMapping, and related types." -sidebar_position: 10 +sidebar_position: 1 see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -25,7 +25,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "API Reference" - link: "server/ongoing-tasks/cdc-sink/api-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference" source: "docs" path: "Server > CDC Sink" --- @@ -101,12 +101,12 @@ Setting these explicitly is useful when: If tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` automatically on startup (requires sufficient permissions). -See [Initial Setup](./postgres/initial-setup.mdx) for details. +See [Initial Setup](../source-database-setup/postgres/initial-setup.mdx) for details. For embedded tables where the join columns are not part of the primary key, the PostgreSQL table must have `REPLICA IDENTITY` configured so that DELETE events include -the join column values. See [REPLICA IDENTITY](./postgres/replica-identity.mdx). +the join column values. See [REPLICA IDENTITY](../source-database-setup/postgres/replica-identity.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index 581a16310a..0edb1ff6c8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Monitoring" sidebar_label: Monitoring description: "Explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through Management Studio and the API." -sidebar_position: 12 +sidebar_position: 15 see_also: - title: "How It Works" link: "server/ongoing-tasks/cdc-sink/how-it-works" diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index 3c191c96fe..d9e5150f2e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -13,15 +13,15 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "PostgreSQL Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "PostgreSQL Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "ETL Basics" diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index ad0ddecc69..41e0a92119 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Patching" sidebar_label: Patching description: "Explains how JavaScript patch scripts work in CDC Sink, covering available variables, patch scope, common scenarios, idempotency, and limitations." -sidebar_position: 6 +sidebar_position: 10 see_also: - title: "Delete Strategies" link: "server/ongoing-tasks/cdc-sink/delete-strategies" diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 35abdf7e6b..68944a00c1 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Property Retention" sidebar_label: Property Retention description: "Explains how CDC Sink merges UPDATE events onto existing RavenDB documents, preserving properties that are not part of the column mapping." -sidebar_position: 8 +sidebar_position: 9 see_also: - title: "Column Mapping" link: "server/ongoing-tasks/cdc-sink/column-mapping" diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 0ac4d3290c..7ba7130d11 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Schema Design" sidebar_label: Schema Design description: "Explains how CDC Sink maps a relational schema to a RavenDB document model using root tables, embedded tables, and linked tables." -sidebar_position: 2 +sidebar_position: 4 see_also: - title: "Embedded Tables" link: "server/ongoing-tasks/cdc-sink/embedded-tables" @@ -17,11 +17,11 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -236,7 +236,7 @@ can route the delete to the correct parent document. If the join column is not part of the source table's primary key, the source database may need additional configuration to include it in DELETE events. -See [REPLICA IDENTITY](./postgres/replica-identity.mdx) for +See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) for the PostgreSQL-specific requirement and how CDC Sink handles it automatically. diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index 4836222f26..6b8e1e11d6 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Server Configuration" sidebar_label: Server Configuration description: "Documents the RavenDB server configuration keys that control CDC Sink task behavior, including batch size, fallback timeout, and poll interval." -sidebar_position: 15 +sidebar_position: 14 see_also: - title: "Overview" link: "server/ongoing-tasks/cdc-sink/overview" diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/_category_.json b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/_category_.json new file mode 100644 index 0000000000..542c452f50 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 2, + "label": "Source Database Setup" +} diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/_category_.json similarity index 56% rename from docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/_category_.json index 8ae06a8e97..c0d9bbe1c7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/_category_.json @@ -1,4 +1,4 @@ { - "position": 18, + "position": 2, "label": "MySQL" } diff --git a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx similarity index 93% rename from docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx index bef87dc259..9b6dd92d55 100644 --- a/docs/server/ongoing-tasks/cdc-sink/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx @@ -9,7 +9,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" --- @@ -106,7 +106,7 @@ apply to MySQL. The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../configuration-reference.mdx) for full details. +See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. The `SourceTableSchema` corresponds to the MySQL database name. diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/_category_.json similarity index 60% rename from docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/_category_.json index eb53b0ec2d..3825482859 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/_category_.json @@ -1,4 +1,4 @@ { - "position": 16, + "position": 0, "label": "PostgreSQL" } diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx similarity index 94% rename from docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx index a8e6b1f475..aca04da727 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx @@ -5,19 +5,19 @@ description: "How to identify and remove orphaned PostgreSQL replication slots a sidebar_position: 6 see_also: - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Monitoring PostgreSQL" - link: "server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "WAL Configuration" - link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "API Reference" - link: "server/ongoing-tasks/cdc-sink/api-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference" source: "docs" path: "Server > CDC Sink" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/_category_.json similarity index 100% rename from docs/server/ongoing-tasks/cdc-sink/postgres/examples/_category_.json rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/_category_.json diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx similarity index 95% rename from docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx index 7c24376af9..e84ae90e7f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx @@ -5,15 +5,15 @@ description: "Multi-level embedded table structure combined with linked table re sidebar_position: 3 see_also: - title: "Simple Migration" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Denormalization" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Event Sourcing" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Schema Design" @@ -29,7 +29,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx similarity index 95% rename from docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx index f7c783d5d9..744fd21204 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx @@ -5,11 +5,11 @@ description: "How to merge a normalized SQL schema (orders + order_lines) into d sidebar_position: 1 see_also: - title: "Simple Migration" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Complex Nesting" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Embedded Tables" @@ -17,7 +17,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Delete Strategies" diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx similarity index 94% rename from docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx index 6b30be34ad..2ffbcfed43 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx @@ -5,15 +5,15 @@ description: "How to use CDC Sink patches to maintain a computed aggregate on a sidebar_position: 2 see_also: - title: "Simple Migration" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Denormalization" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Complex Nesting" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Patching" @@ -201,7 +201,7 @@ keeps `Balance` consistent. The patch uses delta logic (`$old` → `$row`) for idempotency. If a change is re-applied after a failover, `$old` still reflects the state before the original update, so the delta produces the same result. -See [Failover and Consistency](../../failover-and-consistency.mdx). +See [Failover and Consistency](../../../failover-and-consistency.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx similarity index 91% rename from docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx index 3b168820e3..06f996aef1 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx @@ -5,15 +5,15 @@ description: "Minimal setup to replicate a single SQL table into a RavenDB colle sidebar_position: 0 see_also: - title: "Denormalization" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-denormalization" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Event Sourcing" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-event-sourcing" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Complex Nesting" - link: "server/ongoing-tasks/cdc-sink/postgres/examples/example-complex-nesting" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting" source: "docs" path: "Server > CDC Sink > PostgreSQL > Examples" - title: "Schema Design" diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx similarity index 94% rename from docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx index c302012027..41f8a366b7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/initial-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx @@ -5,19 +5,19 @@ description: "How CDC Sink creates and verifies the replication slot and publica sidebar_position: 3 see_also: - title: "Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Permissions and Roles" - link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Cleanup and Maintenance" - link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx similarity index 95% rename from docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx index e587c2feac..b02f5bb598 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/monitoring-postgres.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx @@ -5,7 +5,7 @@ description: "PostgreSQL-side monitoring for CDC Sink, including replication slo sidebar_position: 7 see_also: - title: "Cleanup and Maintenance" - link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Monitoring" @@ -32,7 +32,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; * This page covers PostgreSQL-side monitoring for CDC Sink - replication slot health, lag, and WAL usage. -* For RavenDB-side monitoring, see [Monitoring](../monitoring.mdx). +* For RavenDB-side monitoring, see [Monitoring](../../monitoring.mdx). * In this article: * [Replication Slot Health](#replication-slot-health) diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx similarity index 97% rename from docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx index ee14de06d5..c13ae9e843 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx @@ -103,7 +103,7 @@ See [Initial Setup](./initial-setup.mdx) for details. The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../configuration-reference.mdx) for full details. +See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx similarity index 93% rename from docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx index 81f3b48090..c8b0f4ac68 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx @@ -5,15 +5,15 @@ description: "PostgreSQL permissions required by the CDC Sink user, including mi sidebar_position: 2 see_also: - title: "Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Cleanup and Maintenance" - link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx similarity index 92% rename from docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx index 46dec057bb..92d34b9b22 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx @@ -5,19 +5,19 @@ description: "Verify all requirements before creating a CDC Sink task for Postgr sidebar_position: 0 see_also: - title: "WAL Configuration" - link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Permissions and Roles" - link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx similarity index 95% rename from docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx index 5ac6eb238b..9d2a0d88f9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx @@ -5,11 +5,11 @@ description: "Step-by-step instructions for a database administrator to configur sidebar_position: 5 see_also: - title: "REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx similarity index 96% rename from docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx index 48d76e15f2..54aabf93af 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx @@ -5,11 +5,11 @@ description: "How PostgreSQL REPLICA IDENTITY affects CDC Sink's ability to proc sidebar_position: 4 see_also: - title: "Manual REPLICA IDENTITY Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity-manual-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx similarity index 90% rename from docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx index 6902694417..4b0b8523df 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx @@ -5,11 +5,11 @@ description: "How to create, monitor, and edit CDC Sink tasks for PostgreSQL thr sidebar_position: 8 see_also: - title: "Initial Setup" - link: "server/ongoing-tasks/cdc-sink/postgres/initial-setup" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Cleanup and Maintenance" - link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Monitoring" @@ -17,11 +17,11 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "API Reference" - link: "server/ongoing-tasks/cdc-sink/api-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference" source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx similarity index 91% rename from docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx index 0b1dc5b5e8..18b0e9e0ab 100644 --- a/docs/server/ongoing-tasks/cdc-sink/postgres/wal-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx @@ -5,15 +5,15 @@ description: "How to verify and configure the PostgreSQL Write-Ahead Log level t sidebar_position: 1 see_also: - title: "Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Permissions and Roles" - link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "Cleanup and Maintenance" - link: "server/ongoing-tasks/cdc-sink/postgres/cleanup-and-maintenance" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/_category_.json similarity index 60% rename from docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/_category_.json index cf141b1eb7..4f139ac95c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/_category_.json +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/_category_.json @@ -1,4 +1,4 @@ { - "position": 17, + "position": 1, "label": "SQL Server" } diff --git a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx similarity index 87% rename from docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx rename to docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx index 6aa1d706fb..506bdc07f7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx @@ -9,11 +9,11 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "PostgreSQL Prerequisites Checklist" - link: "server/ongoing-tasks/cdc-sink/postgres/prerequisites-checklist" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -90,14 +90,14 @@ The SQL Server Agent service must be running for CDC to function. Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration key controls how frequently -the task polls for new changes. See [Server Configuration](../server-configuration.mdx). +the task polls for new changes. See [Server Configuration](../../server-configuration.mdx). The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../configuration-reference.mdx) for full details. +See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. The `SourceTableSchema` defaults to `"dbo"` when using SQL Server. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index d1a716ab45..ae54f3934d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -2,10 +2,10 @@ title: "CDC Sink: Source Schema Changes" sidebar_label: Source Schema Changes description: "How to safely modify your source database schema while a CDC Sink task is running - behavior per database engine, recovery, and the SQL Server capture instance procedure." -sidebar_position: 13 +sidebar_position: 12 see_also: - title: "Configuration Reference" - link: "server/ongoing-tasks/cdc-sink/configuration-reference" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" source: "docs" path: "Server > CDC Sink" - title: "Column Mapping" @@ -21,7 +21,7 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "SQL Server Overview" - link: "server/ongoing-tasks/cdc-sink/sql-server/overview" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview" source: "docs" path: "Server > CDC Sink > SQL Server" --- diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index f46f9077c7..20ba802322 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -2,7 +2,7 @@ title: "CDC Sink: Troubleshooting" sidebar_label: Troubleshooting description: "Covers common problems encountered when running CDC Sink tasks and how to resolve them, including startup failures, error states, and missing documents." -sidebar_position: 14 +sidebar_position: 16 see_also: - title: "How It Works" link: "server/ongoing-tasks/cdc-sink/how-it-works" @@ -21,15 +21,15 @@ see_also: source: "docs" path: "Server > CDC Sink" - title: "PostgreSQL WAL Configuration" - link: "server/ongoing-tasks/cdc-sink/postgres/wal-configuration" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "PostgreSQL Permissions and Roles" - link: "server/ongoing-tasks/cdc-sink/postgres/permissions-and-roles" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles" source: "docs" path: "Server > CDC Sink > PostgreSQL" - title: "PostgreSQL REPLICA IDENTITY" - link: "server/ongoing-tasks/cdc-sink/postgres/replica-identity" + link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity" source: "docs" path: "Server > CDC Sink > PostgreSQL" --- @@ -74,11 +74,11 @@ import LanguageContent from "@site/src/components/LanguageContent"; * **Authentication failure** - the credentials in the connection string are incorrect or the user does not have the required permissions. - See the PostgreSQL [Permissions and Roles](./postgres/permissions-and-roles.mdx) page. + See the PostgreSQL [Permissions and Roles](./source-database-setup/postgres/permissions-and-roles.mdx) page. * **WAL level not set to `logical`** - CDC Sink requires logical replication enabled on the source. - See [WAL Configuration](./postgres/wal-configuration.mdx). + See [WAL Configuration](./source-database-setup/postgres/wal-configuration.mdx). Check the error message in the Notification Center (bell icon in Studio) for the specific failure reason. @@ -148,7 +148,7 @@ specific failure reason. items remain in RavenDB, check whether `REPLICA IDENTITY` is configured for the embedded table. Without it, PostgreSQL does not include the old row values in the DELETE event, and CDC Sink cannot identify which item to remove. - See [REPLICA IDENTITY](./postgres/replica-identity.mdx). + See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx). 4. **Type mismatch (Array vs Map)** - if the `Type` was changed from `Array` to `Map` or vice versa after documents were already created, existing documents retain the @@ -170,7 +170,7 @@ specific failure reason. parent document to update. If `REPLICA IDENTITY` is not set to `FULL` (or to an index that includes join columns), the DELETE event may be missing the columns needed to route it. - See [REPLICA IDENTITY](./postgres/replica-identity.mdx). + See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx). 3. **Custom patch returns without deleting** - if an `OnDelete.Patch` is configured that does not allow the delete to proceed (combined with `IgnoreDeletes = true`), From c0da8809ca87370569f7553e052959c4b39d3ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Mon, 6 Jul 2026 15:16:20 +0200 Subject: [PATCH 28/84] RDoc-3836 Split C#-only CDC Sink pages into csharp language partials --- .../cdc-sink/attachment-handling.mdx | 183 +------ .../ongoing-tasks/cdc-sink/column-mapping.mdx | 225 +------- .../content/_attachment-handling-csharp.mdx | 178 +++++++ .../content/_column-mapping-csharp.mdx | 220 ++++++++ .../content/_delete-strategies-csharp.mdx | 271 ++++++++++ .../content/_embedded-tables-csharp.mdx | 257 +++++++++ .../content/_linked-tables-csharp.mdx | 122 +++++ .../cdc-sink/content/_monitoring-csharp.mdx | 113 ++++ .../cdc-sink/content/_patching-csharp.mdx | 489 +++++++++++++++++ .../content/_schema-design-csharp.mdx | 341 ++++++++++++ .../cdc-sink/delete-strategies.mdx | 276 +--------- .../cdc-sink/embedded-tables.mdx | 262 +--------- .../cdc-sink/failover-and-consistency.mdx | 2 - .../ongoing-tasks/cdc-sink/how-it-works.mdx | 6 +- .../ongoing-tasks/cdc-sink/linked-tables.mdx | 127 +---- .../manage-cdc-sink-tasks/api-reference.mdx | 207 +------- .../configuration-reference.mdx | 2 - .../content/_api-reference-csharp.mdx | 202 +++++++ .../ongoing-tasks/cdc-sink/monitoring.mdx | 118 +---- .../ongoing-tasks/cdc-sink/overview.mdx | 4 +- .../ongoing-tasks/cdc-sink/patching.mdx | 494 +----------------- .../cdc-sink/property-retention.mdx | 2 - .../ongoing-tasks/cdc-sink/schema-design.mdx | 346 +----------- .../cdc-sink/server-configuration.mdx | 4 +- .../mysql/content/_overview-csharp.mdx | 93 ++++ .../source-database-setup/mysql/overview.mdx | 98 +--- .../postgres/cleanup-and-maintenance.mdx | 16 +- .../content/_initial-setup-csharp.mdx | 201 +++++++ .../postgres/content/_overview-csharp.mdx | 112 ++++ .../_example-complex-nesting-csharp.mdx | 215 ++++++++ .../_example-denormalization-csharp.mdx | 191 +++++++ .../_example-event-sourcing-csharp.mdx | 171 ++++++ .../_example-simple-migration-csharp.mdx | 112 ++++ .../examples/example-complex-nesting.mdx | 220 +------- .../examples/example-denormalization.mdx | 196 +------ .../examples/example-event-sourcing.mdx | 176 +------ .../examples/example-simple-migration.mdx | 117 +---- .../postgres/initial-setup.mdx | 206 +------- .../postgres/monitoring-postgres.mdx | 8 +- .../postgres/overview.mdx | 117 +---- .../postgres/permissions-and-roles.mdx | 10 +- .../postgres/prerequisites-checklist.mdx | 12 +- .../replica-identity-manual-setup.mdx | 10 +- .../postgres/replica-identity.mdx | 8 +- .../postgres/studio-ui.mdx | 2 - .../postgres/wal-configuration.mdx | 8 +- .../sql-server/content/_overview-csharp.mdx | 80 +++ .../sql-server/overview.mdx | 85 +-- .../cdc-sink/source-schema-changes.mdx | 10 +- .../cdc-sink/troubleshooting.mdx | 4 +- 50 files changed, 3508 insertions(+), 3421 deletions(-) create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/content/_api-reference-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/content/_overview-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-denormalization-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-event-sourcing-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/content/_overview-csharp.mdx diff --git a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx index 10c84cdd42..6447d1adf3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/attachment-handling.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Attachment Handling" sidebar_label: Attachment Handling description: "Explains how to store binary or text SQL columns as RavenDB attachments using CdcColumnType.Attachment on root and embedded table configurations." sidebar_position: 8 +supported_languages: ["csharp"] see_also: - title: "Column Mapping" link: "server/ongoing-tasks/cdc-sink/column-mapping" @@ -22,185 +23,13 @@ see_also: path: "Document Extensions > Attachments" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Attachment Handling +import AttachmentHandlingCsharp from './content/_attachment-handling-csharp.mdx'; - + -* SQL columns - binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) - - can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` - on the column mapping entry. - -* This applies to both root tables and embedded tables. - -* In this article: - * [Root Table Attachments](#root-table-attachments) - * [Embedded Table Attachments](#embedded-table-attachments) - * [Attachment Naming](#attachment-naming) - * [Attachment Lifecycle](#attachment-lifecycle) - - - - - -Given a SQL table with a binary column: - - - - -```sql -CREATE TABLE files ( - id SERIAL PRIMARY KEY, - filename TEXT NOT NULL, - mime_type TEXT NOT NULL, - content BYTEA NOT NULL -- binary attachment -); -``` - - - - -Set `Type = CdcColumnType.Attachment` on the `content` column entry: - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Files", - SourceTableName = "files", - PrimaryKeyColumns = ["id"], - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "filename", Name = "Filename" }, - new CdcColumnMapping() { Column = "mime_type", Name = "MimeType" }, - new CdcColumnMapping() - { - Column = "content", Name = "file", - Type = CdcColumnType.Attachment - }, - ] -} -``` - - - - -The `content` column is stored as an attachment named `"file"` on the document. -The `Name` value becomes the attachment name. The content type is determined by the -SQL column type: `application/octet-stream` for binary columns, `text/plain` for -text columns. - - - - - -Binary columns on embedded tables are stored as attachments on the **parent** document. -The attachment name is automatically prefixed to ensure uniqueness. - -Given a parent `products` table and a child `photos` table: - - - - -```sql -CREATE TABLE products ( - product_id SERIAL PRIMARY KEY, - name TEXT NOT NULL -); - -CREATE TABLE photos ( - product_id INT NOT NULL REFERENCES products(product_id), - photo_num INT NOT NULL, - caption TEXT, - thumbnail BYTEA, -- binary attachment - PRIMARY KEY (product_id, photo_num) -); -``` - - - - -Configure the embedded table with `Type = CdcColumnType.Attachment` on the binary column: - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "photos", - PropertyName = "Photos", - PrimaryKeyColumns = ["photo_num"], - JoinColumns = ["product_id"], - Columns = - [ - new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, - new CdcColumnMapping() { Column = "caption", Name = "Caption" }, - new CdcColumnMapping() - { - Column = "thumbnail", Name = "thumb", - Type = CdcColumnType.Attachment - }, - ] -} -``` - - - - -A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the -parent document. The prefix `"Photos/1/"` is generated from the `PropertyName` and -the primary key value. - - - - - -**Root table attachments:** - -The attachment name is exactly the `Name` value on the mapping entry with -`Type = CdcColumnType.Attachment`. - -``` -Column = "content", Name = "file", Type = CdcColumnType.Attachment -→ Attachment name: "file" -``` - -**Embedded table attachments:** - -The attachment name is prefixed with `{PropertyName}/{pkValue}/`: - -``` -PropertyName = "Photos" -PrimaryKeyColumns = ["photo_num"] → photo_num = 1 -Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment -→ Attachment name: "Photos/1/thumb" -``` - -For composite primary keys, all key values are joined: - -``` -PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 -→ Attachment name: "Photos/2024-01/3/thumb" -``` - - - - - -* **INSERT** - Attachment is created on the document -* **UPDATE** - Attachment is replaced with the new binary data -* **DELETE (embedded item)** - All attachments for that item are automatically removed - from the parent document -* **DELETE (root document)** - Document and all its attachments are deleted - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx index f4d721f42a..94135f8e13 100644 --- a/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/column-mapping.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Column Mapping" sidebar_label: Column Mapping description: "Explains how to control which SQL columns appear in RavenDB documents and under what property names using the Columns list of CdcColumnMapping entries." sidebar_position: 7 +supported_languages: ["csharp"] see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -26,227 +27,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Column Mapping +import ColumnMappingCsharp from './content/_column-mapping-csharp.mdx'; - + -* Column mapping controls which SQL columns appear in the RavenDB document, - under what property names, and how they are stored. It uses a `Columns` list - of `CdcColumnMapping` objects (not a dictionary). - -* In this article: - * [Mapping Columns to Properties](#mapping-columns-to-properties) - * [Column Types](#column-types) - * [Unmapped Columns](#unmapped-columns) - * [JSON Columns](#json-columns) - * [Validation Rules](#validation-rules) - * [Schema (Source Table Schema)](#schema-source-table-schema) - - - - - -`Columns` is a `List` where each entry maps a SQL column -to a RavenDB document property: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, - new CdcColumnMapping() { Column = "order_date", Name = "OrderDate" }, - new CdcColumnMapping() { Column = "total_amount", Name = "TotalAmount" }, -] -``` - - - - -**`Column`:** SQL column name (case-insensitive match against the column names in CDC events) -**`Name`:** Property name in the RavenDB document - - -The primary key column(s) do not need to be mapped. When included in `Columns`, -they become a regular document property. When omitted, the PK values are still used -to build the document ID - they just won't appear as a named property. - -Including the PK in the mapping is generally useful so the document carries its own -identifier, but it is not required. - - - - - - -Each `CdcColumnMapping` entry has an optional `Type` property of type `CdcColumnType` -that controls how the SQL value is stored in RavenDB: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, - // Parsed as a native JSON value - new CdcColumnMapping() - { - Column = "metadata", Name = "Metadata", - Type = CdcColumnType.Json - }, - // Stored as an attachment - new CdcColumnMapping() - { - Column = "receipt", Name = "receipt.pdf", - Type = CdcColumnType.Attachment - }, -] -``` - - - - -**`CdcColumnType.Default`** - Standard SQL-to-JSON type conversion. This is the default when `Type` is omitted. -Type conversions are source-database-specific. For PostgreSQL: - -* `smallint` / `integer` / `oid` → `long` -* `bigint` → `long` -* `real` → `float` -* `double precision` → `double` -* `numeric` / `decimal` → `decimal` -* `boolean` → `bool` -* `date` → `DateOnly` -* `timestamp` / `timestamptz` → `DateTime` (UTC) -* `uuid` → `string` -* `varchar` / `text` / `char` → `string` -* `json` / `jsonb` → `string` (raw JSON text, not parsed) -* SQL arrays → JSON arrays -* `vector` (pgvector) → `float[]` - -See [Patching: $row Column Types](./patching.mdx#row-column-types) for the full reference table. - -**`CdcColumnType.Json`** - Parses the string value as a native JSON value (object, array, -string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or -SQL Server `nvarchar(max)` with JSON content. - -**`CdcColumnType.Attachment`** - Stores the raw column value as a RavenDB attachment. -`byte[]` → binary (`application/octet-stream`), `string` → UTF-8 text (`text/plain`), -`float[]`/`double[]` → raw vector data. The `Name` field becomes the attachment name. - - - - - -Columns not listed in `Columns` are **not stored** in the document, but they -are available in patch scripts via `$row`. - -This allows you to use data for computations without permanently storing raw SQL values: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - // base_price and tax_rate are NOT mapped - won't appear in document -], -Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" -``` - - - - -In this example, `base_price` and `tax_rate` are available during the patch but -not stored as document properties. Only the computed `FinalPrice` is stored. - - -**Naming context:** -Property names (the `Name` values in `Columns`) become properties on the RavenDB -document - accessible as `this.FinalPrice` inside a patch script. - -Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible -in patch scripts via `$row.base_price` (for the current row's values). - -`$old` contains the previous state of the document and uses **mapped property names** -(the `Name` values), not SQL column names. Unmapped columns do not appear in `$old`. -See [Patching: $row and $old](./patching.mdx#row-and-old-names-and-types) for details. - - - - - - -SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, SQL Server `nvarchar` -with JSON content) can be parsed into native JSON objects or arrays using -`CdcColumnType.Json`: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - new CdcColumnMapping() - { - Column = "metadata", Name = "Metadata", - Type = CdcColumnType.Json - }, -] -``` - - - - -Without `CdcColumnType.Json`, the JSON column value would be stored as a raw string. -With it, the value is parsed and stored as a nested object or array in the document. - - - - - -The following rules apply to both root table and embedded table column mappings: - -- Each `Column` name must be unique within a table (no duplicate SQL column entries). -- Each `Name` must be unique within a table (no duplicate property or attachment names). -- Both `Column` and `Name` are required and must be non-empty strings. -- At least one entry is required - an empty `Columns` list is a validation error. - - - - - -`SourceTableSchema` specifies the SQL schema containing the table. It defaults to -`"public"` for PostgreSQL if omitted. - - - - -```csharp -new CdcSinkTableConfig -{ - SourceTableSchema = "sales", // Table is in the "sales" schema - SourceTableName = "orders", - // ... -} -``` - - - - -For most PostgreSQL setups using the default `public` schema, this can be omitted. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx new file mode 100644 index 0000000000..83e1c65e50 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx @@ -0,0 +1,178 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* SQL columns - binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) + - can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` + on the column mapping entry. + +* This applies to both root tables and embedded tables. + +* In this article: + * [Root Table Attachments](#root-table-attachments) + * [Embedded Table Attachments](#embedded-table-attachments) + * [Attachment Naming](#attachment-naming) + * [Attachment Lifecycle](#attachment-lifecycle) + + + + + +Given a SQL table with a binary column: + + + + +```sql +CREATE TABLE files ( + id SERIAL PRIMARY KEY, + filename TEXT NOT NULL, + mime_type TEXT NOT NULL, + content BYTEA NOT NULL -- binary attachment +); +``` + + + + +Set `Type = CdcColumnType.Attachment` on the `content` column entry: + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Files", + SourceTableName = "files", + PrimaryKeyColumns = ["id"], + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "filename", Name = "Filename" }, + new CdcColumnMapping() { Column = "mime_type", Name = "MimeType" }, + new CdcColumnMapping() + { + Column = "content", Name = "file", + Type = CdcColumnType.Attachment + }, + ] +} +``` + + + + +The `content` column is stored as an attachment named `"file"` on the document. +The `Name` value becomes the attachment name. The content type is determined by the +SQL column type: `application/octet-stream` for binary columns, `text/plain` for +text columns. + + + + + +Binary columns on embedded tables are stored as attachments on the **parent** document. +The attachment name is automatically prefixed to ensure uniqueness. + +Given a parent `products` table and a child `photos` table: + + + + +```sql +CREATE TABLE products ( + product_id SERIAL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE photos ( + product_id INT NOT NULL REFERENCES products(product_id), + photo_num INT NOT NULL, + caption TEXT, + thumbnail BYTEA, -- binary attachment + PRIMARY KEY (product_id, photo_num) +); +``` + + + + +Configure the embedded table with `Type = CdcColumnType.Attachment` on the binary column: + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "photos", + PropertyName = "Photos", + PrimaryKeyColumns = ["photo_num"], + JoinColumns = ["product_id"], + Columns = + [ + new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, + new CdcColumnMapping() { Column = "caption", Name = "Caption" }, + new CdcColumnMapping() + { + Column = "thumbnail", Name = "thumb", + Type = CdcColumnType.Attachment + }, + ] +} +``` + + + + +A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the +parent document. The prefix `"Photos/1/"` is generated from the `PropertyName` and +the primary key value. + + + + + +**Root table attachments:** + +The attachment name is exactly the `Name` value on the mapping entry with +`Type = CdcColumnType.Attachment`. + +``` +Column = "content", Name = "file", Type = CdcColumnType.Attachment +→ Attachment name: "file" +``` + +**Embedded table attachments:** + +The attachment name is prefixed with `{PropertyName}/{pkValue}/`: + +``` +PropertyName = "Photos" +PrimaryKeyColumns = ["photo_num"] → photo_num = 1 +Column = "thumbnail", Name = "thumb", Type = CdcColumnType.Attachment +→ Attachment name: "Photos/1/thumb" +``` + +For composite primary keys, all key values are joined: + +``` +PrimaryKeyColumns = ["date", "seq"] → date='2024-01', seq=3 +→ Attachment name: "Photos/2024-01/3/thumb" +``` + + + + + +* **INSERT** - Attachment is created on the document +* **UPDATE** - Attachment is replaced with the new binary data +* **DELETE (embedded item)** - All attachments for that item are automatically removed + from the parent document +* **DELETE (root document)** - Document and all its attachments are deleted + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx new file mode 100644 index 0000000000..4e0a045b86 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx @@ -0,0 +1,220 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* Column mapping controls which SQL columns appear in the RavenDB document, + under what property names, and how they are stored. It uses a `Columns` list + of `CdcColumnMapping` objects (not a dictionary). + +* In this article: + * [Mapping Columns to Properties](#mapping-columns-to-properties) + * [Column Types](#column-types) + * [Unmapped Columns](#unmapped-columns) + * [JSON Columns](#json-columns) + * [Validation Rules](#validation-rules) + * [Schema (Source Table Schema)](#schema-source-table-schema) + + + + + +`Columns` is a `List` where each entry maps a SQL column +to a RavenDB document property: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "order_date", Name = "OrderDate" }, + new CdcColumnMapping() { Column = "total_amount", Name = "TotalAmount" }, +] +``` + + + + +**`Column`:** SQL column name (case-insensitive match against the column names in CDC events) +**`Name`:** Property name in the RavenDB document + + +The primary key column(s) do not need to be mapped. When included in `Columns`, +they become a regular document property. When omitted, the PK values are still used +to build the document ID - they just won't appear as a named property. + +Including the PK in the mapping is generally useful so the document carries its own +identifier, but it is not required. + + + + + + +Each `CdcColumnMapping` entry has an optional `Type` property of type `CdcColumnType` +that controls how the SQL value is stored in RavenDB: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, + // Parsed as a native JSON value + new CdcColumnMapping() + { + Column = "metadata", Name = "Metadata", + Type = CdcColumnType.Json + }, + // Stored as an attachment + new CdcColumnMapping() + { + Column = "receipt", Name = "receipt.pdf", + Type = CdcColumnType.Attachment + }, +] +``` + + + + +**`CdcColumnType.Default`** - Standard SQL-to-JSON type conversion. This is the default when `Type` is omitted. +Type conversions are source-database-specific. For PostgreSQL: + +* `smallint` / `integer` / `oid` → `long` +* `bigint` → `long` +* `real` → `float` +* `double precision` → `double` +* `numeric` / `decimal` → `decimal` +* `boolean` → `bool` +* `date` → `DateOnly` +* `timestamp` / `timestamptz` → `DateTime` (UTC) +* `uuid` → `string` +* `varchar` / `text` / `char` → `string` +* `json` / `jsonb` → `string` (raw JSON text, not parsed) +* SQL arrays → JSON arrays +* `vector` (pgvector) → `float[]` + +See [Patching: $row Column Types](../patching.mdx#row-column-types) for the full reference table. + +**`CdcColumnType.Json`** - Parses the string value as a native JSON value (object, array, +string, number, boolean, etc.) in the document. Use for PostgreSQL `json`/`jsonb` or +SQL Server `nvarchar(max)` with JSON content. + +**`CdcColumnType.Attachment`** - Stores the raw column value as a RavenDB attachment. +`byte[]` → binary (`application/octet-stream`), `string` → UTF-8 text (`text/plain`), +`float[]`/`double[]` → raw vector data. The `Name` field becomes the attachment name. + + + + + +Columns not listed in `Columns` are **not stored** in the document, but they +are available in patch scripts via `$row`. + +This allows you to use data for computations without permanently storing raw SQL values: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + // base_price and tax_rate are NOT mapped - won't appear in document +], +Patch = "this.FinalPrice = $row.base_price * (1 + $row.tax_rate);" +``` + + + + +In this example, `base_price` and `tax_rate` are available during the patch but +not stored as document properties. Only the computed `FinalPrice` is stored. + + +**Naming context:** +Property names (the `Name` values in `Columns`) become properties on the RavenDB +document - accessible as `this.FinalPrice` inside a patch script. + +Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible +in patch scripts via `$row.base_price` (for the current row's values). + +`$old` contains the previous state of the document and uses **mapped property names** +(the `Name` values), not SQL column names. Unmapped columns do not appear in `$old`. +See [Patching: $row and $old](../patching.mdx#row-and-old-names-and-types) for details. + + + + + + +SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, SQL Server `nvarchar` +with JSON content) can be parsed into native JSON objects or arrays using +`CdcColumnType.Json`: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() + { + Column = "metadata", Name = "Metadata", + Type = CdcColumnType.Json + }, +] +``` + + + + +Without `CdcColumnType.Json`, the JSON column value would be stored as a raw string. +With it, the value is parsed and stored as a nested object or array in the document. + + + + + +The following rules apply to both root table and embedded table column mappings: + +- Each `Column` name must be unique within a table (no duplicate SQL column entries). +- Each `Name` must be unique within a table (no duplicate property or attachment names). +- Both `Column` and `Name` are required and must be non-empty strings. +- At least one entry is required - an empty `Columns` list is a validation error. + + + + + +`SourceTableSchema` specifies the SQL schema containing the table. It defaults to +`"public"` for PostgreSQL if omitted. + + + + +```csharp +new CdcSinkTableConfig +{ + SourceTableSchema = "sales", // Table is in the "sales" schema + SourceTableName = "orders", + // ... +} +``` + + + + +For most PostgreSQL setups using the default `public` schema, this can be omitted. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx new file mode 100644 index 0000000000..0262cd94da --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx @@ -0,0 +1,271 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink provides configurable behavior for DELETE events through the + `CdcSinkOnDeleteConfig` object on both root and embedded table configurations. + +* By default, a DELETE event deletes the corresponding RavenDB document or removes + the embedded item. The `OnDelete` configuration changes this. + +* In this article: + * [Default Behavior](#default-behavior) + * [OnDelete Configuration](#ondelete-configuration) + * [Pattern: Archive](#pattern-archive) + * [Pattern: Audit Trail](#pattern-audit-trail-root-document) + * [Pattern: Silent Ignore](#pattern-silent-ignore) + * [OnDelete for Embedded Tables](#ondelete-for-embedded-tables) + * [Behavior Summary](#behavior-summary) + * [DELETE Routing and REPLICA IDENTITY](#delete-routing-and-replica-identity) + + + + + +When `OnDelete` is `null` (or not set): + +* **Root table DELETE** - The corresponding RavenDB document is deleted +* **Embedded table DELETE (Array/Map)** - The item is removed from the parent document's array or map +* **Embedded table DELETE (Value)** - The `Value`-type property on the parent document is set to `null` + + + + + +`CdcSinkOnDeleteConfig` has two properties: + + + + +```csharp +public class CdcSinkOnDeleteConfig +{ + // JavaScript patch that runs when a DELETE event arrives + // Available variables: this, $row, $old + public string Patch { get; set; } + + // When true, the delete is not applied - document/item is kept + public bool IgnoreDeletes { get; set; } +} +``` + + + + +* If `Patch` is set, it runs **before** the delete decision is made +* If `IgnoreDeletes = true`, the deletion is skipped after the patch runs +* If `IgnoreDeletes = false` (default), the deletion proceeds after the patch runs + + +When `IgnoreDeletes = true`, CDC Sink skips the delete but still **saves any changes +made to `this`** in the patch. This means a patch can modify the document (e.g., +set an `Archived` flag) and those changes are written to RavenDB even though the +document is not deleted. + + + + + + +Keep the document in RavenDB but mark it as deleted. The patch runs to mark it, +and `IgnoreDeletes = true` prevents the actual deletion: + + + + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ + IgnoreDeletes = true, + Patch = @" + this.Archived = true; + this.ArchivedAt = new Date().toISOString(); + " +} +``` + + + + +The document remains in RavenDB with `Archived = true`. Queries can filter on this +field to exclude archived records. + + + + + +When a root document is deleted, write an audit record to a separate RavenDB +collection using `put()` before the deletion proceeds. + +The document is deleted after the patch runs, so any writes to `this` are lost. +Use `put()` to create a document that survives the deletion: + + + + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ + // IgnoreDeletes defaults to false - delete proceeds after patch + Patch = @" + // Create a permanent audit record in a separate collection + put('DeletedOrders/' + this.Id, { + OriginalId: this.Id, + Customer: this.Customer, + Total: this.Total, + DeletedAt: new Date().toISOString() + }); + " +} +``` + + + + +The patch creates a document in `DeletedOrders/` before `this` is deleted. +The audit record persists permanently. + + + + + +Discard DELETE events without running any patch. Use this for append-only data +where deletes should never result in document removal: + + + + +```csharp +OnDelete = new CdcSinkOnDeleteConfig +{ + IgnoreDeletes = true + // No patch - DELETE events are silently discarded +} +``` + + + + + + + + +The same `OnDelete` configuration works on embedded tables. For embedded tables: + +* `Patch` runs on the **parent document** (not the embedded item) +* `$old` contains the embedded item's last known state before deletion +* `IgnoreDeletes = true` prevents the item from being removed from the array/map + +**Example: Keep deleted items in an audit array** + +Rather than removing a deleted line item from the array, move it to a separate +`DeletedLines` property: + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "order_lines", + PropertyName = "Lines", + // ... + OnDelete = new CdcSinkOnDeleteConfig + { + IgnoreDeletes = true, + Patch = @" + // Remove from active Lines + this.Lines = (this.Lines || []) + .filter(l => l.LineId !== $old?.LineId); + + // Add to DeletedLines audit array + this.DeletedLines = this.DeletedLines || []; + this.DeletedLines.push({ + LineId: $old?.LineId, + Product: $old?.Product, + Quantity: $old?.Quantity, + DeletedAt: new Date().toISOString() + }); + " + } +} +``` + + + + +With `IgnoreDeletes = true`, CDC Sink does not automatically remove the item - +the patch takes full control of both the `Lines` array and the `DeletedLines` audit trail. + +**Example: Run a patch but still remove the item** + +To run some logic on DELETE while still removing the item from the array, +use `IgnoreDeletes = false` (default) - CDC Sink handles the removal, and the patch +runs before it: + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "order_lines", + PropertyName = "Lines", + // ... + OnDelete = new CdcSinkOnDeleteConfig + { + // IgnoreDeletes = false (default) - CDC Sink removes the item after patch + Patch = @" + // Log total for the line being removed + this.RemovedTotal = (this.RemovedTotal || 0) + + ($old?.UnitPrice || 0) * ($old?.Qty || 0); + " + } +} +``` + + + + +The `Lines` item is removed by CDC Sink. The patch only needs to handle the +side-effect logic. + + + + + +| IgnoreDeletes | Patch | Behavior | +|---------------|-------|----------| +| `false` | null | Normal delete (default) | +| `false` | set | Patch runs, then delete proceeds | +| `true` | null | DELETE event discarded silently | +| `true` | set | Patch runs, then delete is skipped | + + + + + +For CDC Sink to route a DELETE event to the correct document or embedded item, +the source database must include the necessary column values in the DELETE event. + +For embedded tables where the join column is not in the primary key, the source +database may need additional configuration. + + +The REPLICA IDENTITY requirement described below is **PostgreSQL-specific**. +Other databases may have different requirements or may not need any extra +configuration for DELETE routing. + + +See: + +* [REPLICA IDENTITY](../source-database-setup/postgres/replica-identity.mdx) (PostgreSQL) + +**Skipping REPLICA IDENTITY requirements:** Set `OnDelete.IgnoreDeletes = true` +to discard DELETE events for an embedded table entirely. This skips the REPLICA +IDENTITY check, since delete routing is no longer needed. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx new file mode 100644 index 0000000000..3aafc8869f --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx @@ -0,0 +1,257 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* Embedded tables allow CDC Sink to nest SQL table data inside a parent document as + arrays, maps, or single objects. + +* This page covers configuration options, nesting constraints, and how embedded items + are updated and deleted. + +* In this article: + * [Basic Configuration](#basic-configuration) + * [Join Columns and Primary Key Interaction](#join-columns-and-primary-key-interaction) + * [Matching Items on Update and Delete](#matching-items-on-update-and-delete) + * [Deep Nesting](#deep-nesting) + * [Attachments on Embedded Items](#attachments-on-embedded-items) + + + + + +`CdcSinkEmbeddedTableConfig` is placed inside a root table's `EmbeddedTables` list: + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableSchema = "public", // SQL schema (optional) + SourceTableName = "order_lines", // SQL table name + PropertyName = "Lines", // Property name in parent document + Type = CdcSinkRelationType.Array, // Array, Map, or Value + JoinColumns = ["order_id"], // FK to parent's PrimaryKeyColumns + PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE + Columns = + [ + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, + ] +} +``` + + + + + + + + +### Purpose of JoinColumns + +`JoinColumns` specifies the foreign key columns in the embedded table that reference +the parent's primary key. CDC Sink uses these columns to route each row to the correct +parent document. + +The `JoinColumns` values must exactly match the parent's `PrimaryKeyColumns`: + + + + +```csharp +// Parent root table: +PrimaryKeyColumns = ["order_id"] + +// Embedded table - correct: +JoinColumns = ["order_id"] // References parent's PK column + +// Embedded table - INCORRECT: +JoinColumns = ["customer_id"] // Does not reference the parent's PK +``` + + + + +### DELETE Events + +For DELETE events, the source database must include the join column values so CDC Sink +can route the delete to the correct parent document. + +By default, many databases only include primary key columns in DELETE events. If the +join column is _not_ in the embedded table's primary key, additional source database +configuration is required. + +**PostgreSQL:** See [REPLICA IDENTITY](../source-database-setup/postgres/replica-identity.mdx) +for how CDC Sink handles this automatically when it has sufficient permissions, or how +a DBA can configure it manually. + +### Avoiding REPLICA IDENTITY Requirements + +The cleanest solution is to include the join column in the embedded table's primary key: + + + + +```sql +-- SQL schema: +CREATE TABLE order_lines ( + order_id INT NOT NULL REFERENCES orders(id), + line_id INT NOT NULL, + product VARCHAR(200), + PRIMARY KEY (order_id, line_id) -- order_id in PK means DELETE events include it +); +``` + + + + + + + +```csharp +// Configuration: +PrimaryKeyColumns = ["order_id", "line_id"] +JoinColumns = ["order_id"] +``` + + + + +With `order_id` in the primary key, DELETE events include it by default and no additional +source database configuration is needed. + +Alternatively, set `OnDelete.IgnoreDeletes = true` to skip delete routing entirely +if deletes on that embedded table don't need to be processed. +See [Delete Strategies](../delete-strategies.mdx). + + + + + +When an UPDATE or DELETE arrives for an embedded row, CDC Sink must find the correct +item within the parent document's array or map. + +Items are matched by their full `PrimaryKeyColumns` composite key: + +* **INSERT** - New item appended to array / added to map +* **UPDATE** - Item found by PK match; mapped columns overwritten +* **DELETE** - Item found by PK match; removed from array/map (or OnDelete behavior applied) + +**Composite PKs** work the same way - all PK columns must match: + + + + +```csharp +PrimaryKeyColumns = ["invoice_date", "invoice_seq"] + +// UPDATE event for (invoice_date='2024-01-15', invoice_seq=3) +// → Finds and updates the item where both columns match +``` + + + + +**Case sensitivity:** By default, PK matching is case-insensitive. Set +`CaseSensitiveKeys = true` on `CdcSinkEmbeddedTableConfig` if your keys are +case-sensitive. + + + + + +Embedded tables can contain their own `EmbeddedTables`, creating hierarchies +with multiple levels. + +**Key constraint:** Every descendant table must carry the **root table's primary key** +as a denormalized column. This is required because CDC Sink routes each row to its +root document in a single pass. + +**Example: Company → Departments → Employees** + +The `employees` table must have `company_id` (the root PK) even though it only +directly joins to `departments`: + + + + +```sql +CREATE TABLE employees ( + company_id INT NOT NULL, -- Denormalized root PK + dept_id INT NOT NULL, + emp_id INT NOT NULL, + PRIMARY KEY (company_id, dept_id, emp_id) +); +``` + + + + + + + +```csharp +// Configuration for the employees embedded table: +JoinColumns = ["dept_id"] // FK to the direct parent (departments) PK +PrimaryKeyColumns = ["emp_id"] +``` + + + + +**Why is the root PK required?** + +When a CDC Sink event arrives for an `employees` row, CDC Sink needs to: + +1. Find the root document: `Companies/{company_id}` +2. Navigate to the correct `Departments` array item: `Departments.find(d => d.dept_id == dept_id)` +3. Add or update the `Employees` array item: `Employees.find(e => e.emp_id == emp_id)` + +Without `company_id` in the event, CDC Sink cannot identify the root document +without an additional lookup, which is not supported. + + + + + +Binary columns from embedded tables can be stored as RavenDB attachments by adding +them to `Columns` with `Type = CdcColumnType.Attachment`. + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "photos", + PropertyName = "Photos", + PrimaryKeyColumns = ["photo_num"], + JoinColumns = ["product_id"], + Columns = + [ + new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, + new CdcColumnMapping() { Column = "caption", Name = "Caption" }, + new CdcColumnMapping() + { + Column = "thumbnail", Name = "thumb", + Type = CdcColumnType.Attachment + }, + ] +} +``` + + + + +A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the +parent document. The attachment name is prefixed with the embedded path and PK to +ensure uniqueness within the document. + +When the embedded item is deleted, its attachments are automatically removed. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx new file mode 100644 index 0000000000..ec90d3f46e --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx @@ -0,0 +1,122 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* A **linked table** creates a document ID reference in the parent document rather + than embedding data. A foreign key value becomes a RavenDB document ID pointing + to a related collection. + +* In this article: + * [Basic Configuration](#basic-configuration) + * [Composite Foreign Keys](#composite-foreign-keys) + * [Linked vs Embedded](#linked-vs-embedded) + + + + + +`CdcSinkLinkedTableConfig` is placed inside a root table's (or embedded table's) `LinkedTables` list: + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, + ], + LinkedTables = + [ + new CdcSinkLinkedTableConfig + { + SourceTableName = "customers", + PropertyName = "Customer", // Property name in document + LinkedCollectionName = "Customers", // Target collection for ID + JoinColumns = ["customer_id"] // FK used to build the document ID + } + ] +} +``` + + + + +With `customer_id = 42`, the Orders document gets: + + + + +```json +{ + "Id": 1, + "CustomerId": 42, + "Customer": "Customers/42" +} +``` + + + + +The `Customer` property is a RavenDB document ID, built from the `LinkedCollectionName` +and the join column values. Load the referenced document using +[includes](../../../../client-api/session/loading-entities.mdx#load-with-includes) to avoid +a second network call. + + + + + +When the target table has a composite primary key, the linked reference includes +all parts of that key: + + + + +```csharp +new CdcSinkLinkedTableConfig +{ + SourceTableName = "customers", + PropertyName = "Customer", + LinkedCollectionName = "Customers", + JoinColumns = ["customer_region", "customer_id"] // Must match Customers PK order +} +``` + + + + +With `customer_region = 'US'` and `customer_id = 42`, the document gets: + +``` +"Customer": "Customers/US/42" +``` + + + + + +| Consideration | Embedded | Linked | +|--------------|----------|--------| +| Data stored | Full nested object/array inside document | Document ID reference only | +| Load pattern | Single document load | Load parent + include references | +| Document size | Grows with embedded items | Parent document stays small | +| Updates to referenced data | Reflected via CDC | Reflected via CDC on the referenced collection | +| Independence | Child has no meaning without parent | Referenced entity exists independently | +| Typical use | Orders own LineItems | Orders reference Customers | + +**Choose embedded** when the child data belongs to the parent and is always read +together with it. + +**Choose linked** when the referenced entity is independently meaningful and shared +across many parents, and you want to avoid duplicating data. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx new file mode 100644 index 0000000000..6d96da3075 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx @@ -0,0 +1,113 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* This page explains how to monitor a CDC Sink task - its running state, progress, + fallback behavior, and statistics available through the Management Studio and API. + +* In this article: + * [Task State](#task-state) + * [Fallback Mode](#fallback-mode) + * [Statistics](#statistics) + * [Notifications](#notifications) + + + + + +A CDC Sink task can be in one of the following states: + +| State | Description | +|-------|-------------| +| `Active` | Running normally - streaming changes or waiting for new changes | +| `ActiveByAnotherNode` | Another cluster node is the mentor; this node is a replica | +| `Disabled` | Manually disabled via Studio or API | +| `Error` | The task encountered an error and stopped | +| `FallbackMode` | Connection to the source database was lost; retrying | +| `NotOnThisNode` | This node does not hold the task | + +The current state is visible in the **Ongoing Tasks** view in the Management Studio. + + + + + +When CDC Sink cannot reach the source database, it enters **fallback mode** rather +than failing immediately. + +In fallback mode: +* The task continues retrying the connection at regular intervals +* No changes are applied while the connection is down +* The task automatically resumes streaming once the source is reachable again + +Retry delay doubles on each consecutive failure, up to the cap set by +`CdcSink.MaxFallbackTimeInSec` (default 15 minutes). +See [Server Configuration](../server-configuration.mdx). + + + + + +CDC Sink exposes runtime statistics through the `GetOngoingTaskInfoOperation`: + + + + +```csharp +var taskInfo = await store.Maintenance.SendAsync( + new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); +``` + + + + +The returned object includes: + +| Field | Description | +|-------|-------------| +| `TaskState` | Current state of the task | +| `MentorNode` | Configured preferred node | +| `ResponsibleNode` | Node currently running the task | +| `Error` | Error message if the task is in error state | + +Detailed per-table statistics - including row counts and last processed position - +are available through the Management Studio's ongoing tasks detail view. + + + + + +CDC Sink participates in RavenDB's standard alert system. If the task enters an +error state or fallback mode, an alert is raised and visible in: + +* The **Notification Center** in the Management Studio (bell icon) +* The cluster's alert log + +Alerts include the error message and which table or operation triggered the failure, +making it straightforward to diagnose the root cause. + + + + + +CDC Sink tolerates individual document processing errors - each failure is logged +and recorded, but processing continues for the remaining documents in the batch. +The CDC position advances as long as the error ratio stays within acceptable bounds. + +**Error threshold:** +When cumulative errors reach **100** and also exceed the number of successes, +the batch throws and the task enters fallback mode. + +**Fallback mode on error:** +The task enters exponential backoff, starting at 5 seconds and doubling on each +retry, up to the limit set by `CdcSink.MaxFallbackTimeInSec` (default 15 minutes). +See [Server Configuration](../server-configuration.mdx) and [Fallback Mode](#fallback-mode). + +**Patch errors:** +Patch errors - including `MaxSteps exceeded` - fail only the affected document. +The rest of the batch continues normally. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx new file mode 100644 index 0000000000..344d1ee515 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx @@ -0,0 +1,489 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* A **patch** is a JavaScript snippet that runs on a document after column mapping is applied. + Patches let you transform data, compute derived fields, maintain aggregates, load related + documents, and control document metadata. + +* Patches are defined per-table (root or embedded) and per-operation (INSERT/UPDATE + or DELETE via `OnDelete.Patch`). + +* In this article: + * [When Patches Run](#when-patches-run) + * [Available Variables](#available-variables) + * [$row and $old: Names and Types](#row-and-old-names-and-types) + * [$row Column Types](#row-column-types) + * [Patch Scope: Root vs Embedded](#patch-scope-root-vs-embedded) + * [Scenario: Column Transformation](#scenario-column-transformation) + * [Scenario: Aggregation with Embedded Tables](#scenario-aggregation-with-embedded-tables) + * [Scenario: Delta Computations](#scenario-delta-computations) + * [Scenario: Computed Derived Fields](#scenario-computed-derived-fields) + * [Scenario: Document Metadata](#scenario-document-metadata) + * [Scenario: Loading Related Documents](#scenario-loading-related-documents) + * [Idempotency and Failover](#idempotency-and-failover) + * [Step Limit](#step-limit) + * [Capabilities and Limitations](#capabilities-and-limitations) + + + + + +| Event | Patch property | Runs? | +|-------|---------------|-------| +| INSERT | `Patch` | ✓ After column mapping | +| UPDATE | `Patch` | ✓ After column mapping, on merged document | +| DELETE (root table) | `OnDelete.Patch` | ✓ Before document is deleted | +| DELETE (embedded table) | `OnDelete.Patch` | ✓ On parent document before item is removed | + +The `Patch` property on a table handles INSERT and UPDATE. +The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. + + + + + +| Variable | Available | Type | Description | +|----------|-----------|------|-------------| +| `this` | Always | object | The document being modified (root or parent for embedded) | +| `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | +| `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | +| `load(id)` | Always | function | Load a RavenDB document by ID | + + + + + +`$row` and `$old` look similar but represent fundamentally different things: + +| | `$row` | `$old` | +|--|--------|--------| +| **Contains** | The incoming SQL row from the CDC event | The previous state of the RavenDB document (or embedded item) | +| **Property names** | Original SQL column names (`customer_name`) | Mapped RavenDB property names (`CustomerName`) | +| **Value types** | Raw SQL types (see [$row Column Types](#row-column-types)) | Stored JSON types (whatever was last written to RavenDB) | +| **Available on INSERT** | ✓ | ✗ (null) | +| **Available on UPDATE** | ✓ | ✓ | +| **Available on DELETE** | ✓ | ✓ | + +Given this column mapping: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, +] +``` + + + + +In the patch script: + + + + +```javascript +// $row - SQL column names, raw SQL types +$row.customer_name // string +$row.amount // number (from numeric/decimal column) + +// $old - mapped property names, stored JSON types +$old.CustomerName // string (as stored in RavenDB) +$old.Amount // number (as stored in RavenDB) + +// this - the document after column mapping has been applied for this event +this.CustomerName // string (just set from $row.customer_name) +this.Amount // number (just set from $row.amount) +``` + + + + + +Unmapped columns - those not listed in `Columns` - appear in `$row` but are never +written to the document and therefore never appear in `$old`. + + + + + + +`$row` exposes all SQL columns using their **original column names** (not the mapped +RavenDB property names). The JavaScript type of each value depends on the source +database type. + +### PostgreSQL + +| PostgreSQL Type | JavaScript Type in `$row` | Notes | +|----------------|--------------------------|-------| +| `integer` / `bigint` | `number` | | +| `real` / `double precision` | `number` | | +| `numeric` | `number` | | +| `boolean` | `boolean` | | +| `date` / `timestamp` / `timestamptz` | `string` | Formatted date string | +| `uuid` | `string` | | +| `varchar` / `text` / `char` | `string` | | +| `bytea` | `string` | Base64-encoded | +| `json` / `jsonb` | `string` | Raw JSON text - call `JSON.parse()` to access as an object / array | +| `text[]` / `varchar[]` / `int[]` / etc. | `Array` | Elements are always strings, even for numeric array types | +| `vector` (pgvector) | `Array` | Elements are JavaScript numbers (floats) | + +**JSON/JSONB columns require explicit parsing:** + + + + +```javascript +var meta = JSON.parse($row.metadata); +this.Priority = meta.priority; +this.Label = meta.label; +``` + + + + +**Array columns:** + + + + +```javascript +this.TagCount = $row.tags.length; +this.FirstTag = $row.tags[0]; +this.Tags = $row.tags; + +// INT[] elements are strings - parse explicitly if numeric arithmetic is needed +var first = parseInt($row.scores[0], 10); +``` + + + + +**pgvector columns (elements are numbers, not strings):** + + + + +```javascript +this.EmbeddingSum = $row.embedding.reduce(function(a, b) { return a + b; }, 0); +this.Embedding = $row.embedding; +``` + + + + + + + + +**Root table patches** operate on the root document: + + + + +```javascript +Patch = "this.Status = $row.is_active ? 'Active' : 'Inactive';" +``` + + + + +`this` is the Orders (or whatever root collection) document. + +**Embedded table patches** operate on the **parent** document, not the embedded item: + + + + +```javascript +// Patch on order_lines embedded table +Patch = "this.TotalQuantity = (this.Lines || []).reduce((s, l) => s + l.Quantity, 0);" +``` + + + + +`this` is the parent Orders document. This lets you recompute parent-level aggregates +whenever an embedded item changes. + + + + + +Transform or combine SQL columns into RavenDB properties: + + + + +```javascript +this.FullName = ($row.first_name + ' ' + $row.last_name).trim(); +this.Status = $row.is_active ? 'Active' : 'Inactive'; +this.CreatedAt = new Date($row.created_unix * 1000).toISOString(); +``` + + + + + + + + +Recompute parent-level totals whenever an embedded item is added or updated. + + +If you use a `Patch` to maintain an aggregate, you **must** also provide an +`OnDelete.Patch` that reverses the aggregate when an item is deleted. +Without it, deletes will leave the aggregate in an incorrect state. + + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "order_lines", + PropertyName = "Lines", + PrimaryKeyColumns = ["line_id"], + JoinColumns = ["order_id"], + Columns = + [ + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, + ], + + // Runs on INSERT and UPDATE - recomputes total from current Lines array + Patch = @" + this.TotalQuantity = (this.Lines || []) + .reduce((sum, line) => sum + (line.Quantity || 0), 0); + ", + + // REQUIRED: Runs on DELETE - recomputes after item is removed from array + OnDelete = new CdcSinkOnDeleteConfig + { + Patch = @" + this.TotalQuantity = (this.Lines || []) + .reduce((sum, line) => sum + (line.Quantity || 0), 0); + " + } +} +``` + + + + +The OnDelete patch runs after the item has already been removed from the array, +so re-summing `this.Lines` gives the correct post-deletion total. + + + + + +Use `$old` to compute a delta when an embedded item changes, keeping a running total +without recomputing from scratch. + + +Running total patches using `$old` must have a matching `OnDelete.Patch` that subtracts +the deleted item's value. Without it, deletes leave the running total incorrect. + + + + + +```csharp +new CdcSinkEmbeddedTableConfig +{ + SourceTableName = "invoice_lines", + PropertyName = "Lines", + PrimaryKeyColumns = ["line_id"], + JoinColumns = ["invoice_id"], + Columns = + [ + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, + ], + + // INSERT: $old is null, so delta = new amount (0 → new) + // UPDATE: $old has previous Amount, delta = new - old + Patch = @" + const oldAmount = $old?.Amount || 0; + const newAmount = $row.amount || 0; + this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); + ", + + // REQUIRED: Subtract the deleted item's amount using $old + OnDelete = new CdcSinkOnDeleteConfig + { + Patch = @" + const deletedAmount = $old?.Amount || 0; + this.RunningTotal = (this.RunningTotal || 0) - deletedAmount; + " + } +} +``` + + + + +The `$old` variable in the OnDelete patch contains the item's last known state before deletion. + + + + + +Compute fields from unmapped columns that you don't want to store directly: + + + + +```csharp +Columns = +[ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, +], +// base_price and tax_rate are NOT in Columns +Patch = @" + this.FinalPrice = $row.base_price * (1 + $row.tax_rate); + this.Discount = $row.is_vip ? $row.base_price * 0.1 : 0; +" +``` + + + + + + + + +Patches can set RavenDB document metadata, including expiration: + + + + +```javascript +this['@metadata'] = this['@metadata'] || {}; + +if ($row.expires_at) { + this['@metadata']['@expires'] = new Date($row.expires_at).toISOString(); +} + +this['@metadata']['SourceTable'] = 'orders'; +``` + + + + + + + + +Use `load()` to load a related RavenDB document and denormalize its data: + + + + +```javascript +const customer = load('Customers/' + $row.customer_id); + +if (customer) { + this.CustomerName = customer.Name; + this.CustomerEmail = customer.Email; + this.CustomerTier = customer.Tier; +} else { + // Document doesn't exist yet - race condition or not yet synced + this.CustomerName = null; + this.CustomerEmail = null; +} +``` + + + + +`load()` returns `null` if the document does not exist or has not yet been created +by CDC Sink (race condition when multiple tables are loading in parallel). +Always check for null before accessing properties. + +**When to use `load()`:** + +* Denormalizing slowly-changing reference data (customer name, category, region) +* Capturing a snapshot of related data at insert time + +**Prefer linked tables** for simple foreign key references - they are cleaner and +do not have the null-handling complexity of `load()`. + + + + + +After a failover, CDC Sink resumes from the replicated state, which may be older +than the last work the previous mentor node completed. Some changes may be re-read +and re-applied. + +**Patches that are not idempotent can produce incorrect results when re-applied.** + + + + +```javascript +// NOT idempotent - increments again on re-read +this.ViewCount = (this.ViewCount || 0) + 1; + +// Idempotent - absolute value from SQL source +this.ViewCount = $row.view_count; + +// Idempotent - delta via $old (both first-read and re-read produce same result) +const oldVal = $old?.Amount || 0; +const newVal = $row.amount || 0; +this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); +``` + + + + +Column mapping itself is idempotent - overwriting a property with the same value +is always safe. + + + + + +Patch scripts are bounded by a **step quota** rather than a time limit. Each operation +in the script (assignment, loop iteration, function call) consumes steps. + +The limit is controlled by the `Patching.MaxStepsForScript` configuration setting. +See [Patching Configuration](../../../configuration/patching-configuration.mdx). + +If a patch exceeds the limit, the CDC operation fails and is retried. + +Keep patches focused and efficient - prefer `.filter()` + `.reduce()` over nested loops. + + + + + +**What patches can do:** + +* Access `this`, `$row`, `$old` +* Load related documents with `load(id)` +* Create or replace documents with `put(id, document)` +* Delete documents with `del(id)` +* Compute and transform property values +* Set and modify document metadata +* Conditional logic, loops, array methods +* Use built-in JavaScript: `Date`, `Math`, `JSON`, `Array` + +**What patches cannot do:** + +* Make HTTP calls or API requests +* Access the file system +* Load documents from other RavenDB databases + + diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx new file mode 100644 index 0000000000..7389badcf4 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx @@ -0,0 +1,341 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink maps a relational schema to a RavenDB document model through configuration. + This page explains the three building blocks - root tables, embedded tables, and + linked tables - and how to combine them. + +* In this article: + * [Root Tables](#root-tables) + * [Embedded Tables](#embedded-tables) + * [Linked Tables](#linked-tables) + * [Primary Key and Join Column Requirements](#primary-key-and-join-column-requirements) + * [Multi-Level Nesting](#multi-level-nesting) + * [Relation Types](#relation-types) + * [Choosing Between Embedded and Linked](#choosing-between-embedded-and-linked) + + + + + +A **root table** maps a source table to a RavenDB collection. Each row in the source table +becomes one document. + +Each root table is configured with a `CdcSinkTableConfig` object. This configuration +defines the source table to read from, the target RavenDB collection to write to, the +primary key columns used to build document IDs, and the columns to map into each document. + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Orders", // RavenDB collection name + SourceTableSchema = "public", // Source schema (optional; default is provider-specific) + SourceTableName = "orders", // Source table name + PrimaryKeyColumns = ["id"], // Used for document ID generation + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "total", Name = "Total" }, + ] +} +``` + + + + + +The default `SourceTableSchema` is provider-specific: PostgreSQL uses `public`, +SQL Server uses `dbo`, and MySQL/MariaDB use the database name from the connection string. + + +**Document ID generation:** `{CollectionName}/{pk1}/{pk2}/...` +A row with `id = 42` and collection `Orders` becomes document `Orders/42`. +A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. +CDC Sink uses the `CollectionName` verbatim as the document ID prefix. + +**Column mapping:** Only columns listed in `Columns` appear in the document. Unmapped columns are +still available in patch scripts via `$row` but are not stored in the document. + + + + + +An **embedded table** creates nested data within a parent document. For example, a +`order_lines` table becomes an array inside each `Orders` document. + +Embedded tables are configured inside the root table's `CdcSinkTableConfig`. In the +example below, the `orders` root table configuration contains an `EmbeddedTables` entry +that maps `order_lines` into the `Lines` array. + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "order_lines", + PropertyName = "Lines", // Property in parent document + Type = CdcSinkRelationType.Array, // Array of items + JoinColumns = ["order_id"], // FK referencing parent's PK + PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete + Columns = + [ + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, + ] + } + ] +} +``` + + + + +This produces documents like: + + + + +```json +{ + "Id": 1, + "CustomerName": "Alice", + "Lines": [ + { "LineId": 1, "Product": "Apples", "Quantity": 5 }, + { "LineId": 2, "Product": "Bananas", "Quantity": 3 } + ], + "@metadata": { "@collection": "Orders" } +} +``` + + + + + + + + +A **linked table** creates a document ID reference rather than embedding data. +A foreign key in the source row becomes a RavenDB document ID. + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = ["id"], + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, + ], + LinkedTables = + [ + new CdcSinkLinkedTableConfig + { + SourceTableName = "customers", + PropertyName = "Customer", // Property in parent document + LinkedCollectionName = "Customers", // Target collection for ID + JoinColumns = ["customer_id"] // FK used to build the ID + } + ] +} +``` + + + + +With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. + + + + + +### Root Tables + +The `PrimaryKeyColumns` list defines which source columns are used to generate the document ID. +All PK columns must be present in every INSERT, UPDATE, and DELETE event. + +### Embedded Tables (One Level) + +An embedded table needs: + +* **PrimaryKeyColumns** - Used to match items within the parent's array for UPDATE and DELETE +* **JoinColumns** - Foreign key referencing the parent's `PrimaryKeyColumns` + +The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `PrimaryKeyColumns`: + +| Parent PK | Required JoinColumns | Valid? | +|-----------|---------------------|--------| +| `[id]` | `[order_id]` where `order_id` = parent's `id` | ✓ | +| `[id, year]` | `[order_id, order_year]` | ✓ | +| `[id]` | `[customer_id, order_id]` | ✗ Extra column not from parent PK | +| `[id, year]` | `[order_id]` | ✗ Missing `order_year` | + +### DELETE Events and REPLICA IDENTITY + +For DELETE events, the source database must include the join column values so CDC Sink +can route the delete to the correct parent document. + +If the join column is not part of the source table's primary key, the source database may +need additional configuration to include it in DELETE events. + +See [REPLICA IDENTITY](../source-database-setup/postgres/replica-identity.mdx) for +the PostgreSQL-specific requirement and how CDC Sink handles it automatically. + + + + + +Embedded tables can themselves have embedded tables, creating arbitrarily deep hierarchies. + +**Example: Company → Departments → Employees** + + + + +```csharp +new CdcSinkTableConfig +{ + CollectionName = "Companies", + SourceTableName = "companies", + PrimaryKeyColumns = ["company_id"], + Columns = + [ + new CdcColumnMapping() { Column = "company_id", Name = "CompanyId" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "departments", + PropertyName = "Departments", + Type = CdcSinkRelationType.Array, + JoinColumns = ["company_id"], // Root FK + PrimaryKeyColumns = ["dept_id"], + Columns = + [ + new CdcColumnMapping() { Column = "dept_id", Name = "DeptId" }, + new CdcColumnMapping() { Column = "dept_name", Name = "DeptName" }, + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "employees", + PropertyName = "Employees", + Type = CdcSinkRelationType.Array, + JoinColumns = ["dept_id"], // FK to the direct parent (departments) PK + PrimaryKeyColumns = ["emp_id"], + Columns = + [ + new CdcColumnMapping() { Column = "emp_id", Name = "EmpId" }, + new CdcColumnMapping() { Column = "emp_name", Name = "EmpName" }, + ] + } + ] + } + ] +} +``` + + + + +**Critical requirement for deep nesting:** All descendant tables must carry the root +table's primary key as a denormalized column. The `employees` table must have +`company_id` even though it joins directly to `departments` via `dept_id`. + +This is required because CDC Sink needs to route every row to the correct root document +in a single pass, without additional lookups. + +**Source schema to support this:** + + + + +```sql +CREATE TABLE employees ( + company_id INT NOT NULL, -- Denormalized root FK + dept_id INT NOT NULL, -- Parent FK + emp_id INT NOT NULL, -- Local PK + emp_name VARCHAR(200), + PRIMARY KEY (company_id, dept_id, emp_id) +); +``` + + + + +Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY +configuration - the default DELETE events include all PK columns. + + + + + +The `Type` property on embedded tables controls the document structure: + +| Type | Use Case | Document Structure | +|------|----------|--------------------| +| `Array` | One-to-many: parent has many children | `"Lines": [{ ... }, { ... }]` | +| `Map` | One-to-many with direct key lookup | `"Lines": { "1": { ... }, "2": { ... } }` | +| `Value` | Many-to-one: parent has one child | `"Customer": { ... }` | + +**Array** - Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. +Use when you need to iterate over all items. + +**Map** - Items are stored as a JSON object keyed by the primary key value(s). +Use when you need fast direct-key access within the document. + +**Value** - Stores a single embedded object. +Use for many-to-one relationships (many orders share one customer). + + + + + +| Consideration | Embedded | Linked | +|--------------|----------|--------| +| Data location | Stored inside parent document | Stored in a separate document | +| Access pattern | Read parent to get all data | Load parent, then load referenced doc | +| Updates | Automatic via CDC | Automatic via CDC for each table | +| Document size | Grows with embedded items | Parent stays small | +| Use case | Parent owns child (orders own lines) | Independent entities (orders reference customers) | + +**Use embedded tables** when: +* The child entity has no meaning outside the parent (order lines without an order) +* You always read the parent and child together +* You want a single-document read + +**Use linked tables** when: +* The referenced entity is independently meaningful (customers exist without orders) +* The referenced entity is shared by many parents +* You want RavenDB's include loading to handle the join + + diff --git a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx index 76d4f20210..3397b1f482 100644 --- a/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/delete-strategies.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Delete Strategies" sidebar_label: Delete Strategies description: "Documents configurable behavior for DELETE events in CDC Sink, including archive, audit trail, and silent ignore patterns." sidebar_position: 11 +supported_languages: ["csharp"] see_also: - title: "Patching" link: "server/ongoing-tasks/cdc-sink/patching" @@ -22,278 +23,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Delete Strategies +import DeleteStrategiesCsharp from './content/_delete-strategies-csharp.mdx'; - + -* CDC Sink provides configurable behavior for DELETE events through the - `CdcSinkOnDeleteConfig` object on both root and embedded table configurations. - -* By default, a DELETE event deletes the corresponding RavenDB document or removes - the embedded item. The `OnDelete` configuration changes this. - -* In this article: - * [Default Behavior](#default-behavior) - * [OnDelete Configuration](#ondelete-configuration) - * [Pattern: Archive](#pattern-archive) - * [Pattern: Audit Trail](#pattern-audit-trail-root-document) - * [Pattern: Silent Ignore](#pattern-silent-ignore) - * [OnDelete for Embedded Tables](#ondelete-for-embedded-tables) - * [Behavior Summary](#behavior-summary) - * [DELETE Routing and REPLICA IDENTITY](#delete-routing-and-replica-identity) - - - - - -When `OnDelete` is `null` (or not set): - -* **Root table DELETE** - The corresponding RavenDB document is deleted -* **Embedded table DELETE (Array/Map)** - The item is removed from the parent document's array or map -* **Embedded table DELETE (Value)** - The `Value`-type property on the parent document is set to `null` - - - - - -`CdcSinkOnDeleteConfig` has two properties: - - - - -```csharp -public class CdcSinkOnDeleteConfig -{ - // JavaScript patch that runs when a DELETE event arrives - // Available variables: this, $row, $old - public string Patch { get; set; } - - // When true, the delete is not applied - document/item is kept - public bool IgnoreDeletes { get; set; } -} -``` - - - - -* If `Patch` is set, it runs **before** the delete decision is made -* If `IgnoreDeletes = true`, the deletion is skipped after the patch runs -* If `IgnoreDeletes = false` (default), the deletion proceeds after the patch runs - - -When `IgnoreDeletes = true`, CDC Sink skips the delete but still **saves any changes -made to `this`** in the patch. This means a patch can modify the document (e.g., -set an `Archived` flag) and those changes are written to RavenDB even though the -document is not deleted. - - - - - - -Keep the document in RavenDB but mark it as deleted. The patch runs to mark it, -and `IgnoreDeletes = true` prevents the actual deletion: - - - - -```csharp -OnDelete = new CdcSinkOnDeleteConfig -{ - IgnoreDeletes = true, - Patch = @" - this.Archived = true; - this.ArchivedAt = new Date().toISOString(); - " -} -``` - - - - -The document remains in RavenDB with `Archived = true`. Queries can filter on this -field to exclude archived records. - - - - - -When a root document is deleted, write an audit record to a separate RavenDB -collection using `put()` before the deletion proceeds. - -The document is deleted after the patch runs, so any writes to `this` are lost. -Use `put()` to create a document that survives the deletion: - - - - -```csharp -OnDelete = new CdcSinkOnDeleteConfig -{ - // IgnoreDeletes defaults to false - delete proceeds after patch - Patch = @" - // Create a permanent audit record in a separate collection - put('DeletedOrders/' + this.Id, { - OriginalId: this.Id, - Customer: this.Customer, - Total: this.Total, - DeletedAt: new Date().toISOString() - }); - " -} -``` - - - - -The patch creates a document in `DeletedOrders/` before `this` is deleted. -The audit record persists permanently. - - - - - -Discard DELETE events without running any patch. Use this for append-only data -where deletes should never result in document removal: - - - - -```csharp -OnDelete = new CdcSinkOnDeleteConfig -{ - IgnoreDeletes = true - // No patch - DELETE events are silently discarded -} -``` - - - - - - - - -The same `OnDelete` configuration works on embedded tables. For embedded tables: - -* `Patch` runs on the **parent document** (not the embedded item) -* `$old` contains the embedded item's last known state before deletion -* `IgnoreDeletes = true` prevents the item from being removed from the array/map - -**Example: Keep deleted items in an audit array** - -Rather than removing a deleted line item from the array, move it to a separate -`DeletedLines` property: - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "order_lines", - PropertyName = "Lines", - // ... - OnDelete = new CdcSinkOnDeleteConfig - { - IgnoreDeletes = true, - Patch = @" - // Remove from active Lines - this.Lines = (this.Lines || []) - .filter(l => l.LineId !== $old?.LineId); - - // Add to DeletedLines audit array - this.DeletedLines = this.DeletedLines || []; - this.DeletedLines.push({ - LineId: $old?.LineId, - Product: $old?.Product, - Quantity: $old?.Quantity, - DeletedAt: new Date().toISOString() - }); - " - } -} -``` - - - - -With `IgnoreDeletes = true`, CDC Sink does not automatically remove the item - -the patch takes full control of both the `Lines` array and the `DeletedLines` audit trail. - -**Example: Run a patch but still remove the item** - -To run some logic on DELETE while still removing the item from the array, -use `IgnoreDeletes = false` (default) - CDC Sink handles the removal, and the patch -runs before it: - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "order_lines", - PropertyName = "Lines", - // ... - OnDelete = new CdcSinkOnDeleteConfig - { - // IgnoreDeletes = false (default) - CDC Sink removes the item after patch - Patch = @" - // Log total for the line being removed - this.RemovedTotal = (this.RemovedTotal || 0) - + ($old?.UnitPrice || 0) * ($old?.Qty || 0); - " - } -} -``` - - - - -The `Lines` item is removed by CDC Sink. The patch only needs to handle the -side-effect logic. - - - - - -| IgnoreDeletes | Patch | Behavior | -|---------------|-------|----------| -| `false` | null | Normal delete (default) | -| `false` | set | Patch runs, then delete proceeds | -| `true` | null | DELETE event discarded silently | -| `true` | set | Patch runs, then delete is skipped | - - - - - -For CDC Sink to route a DELETE event to the correct document or embedded item, -the source database must include the necessary column values in the DELETE event. - -For embedded tables where the join column is not in the primary key, the source -database may need additional configuration. - - -The REPLICA IDENTITY requirement described below is **PostgreSQL-specific**. -Other databases may have different requirements or may not need any extra -configuration for DELETE routing. - - -See: - -* [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) (PostgreSQL) - -**Skipping REPLICA IDENTITY requirements:** Set `OnDelete.IgnoreDeletes = true` -to discard DELETE events for an embedded table entirely. This skips the REPLICA -IDENTITY check, since delete routing is no longer needed. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx index 6f8ec20130..152913f8e2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/embedded-tables.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Embedded Tables" sidebar_label: Embedded Tables description: "Covers configuration options, nesting constraints, and how embedded items are updated and deleted in CDC Sink." sidebar_position: 5 +supported_languages: ["csharp"] see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -34,264 +35,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Embedded Tables +import EmbeddedTablesCsharp from './content/_embedded-tables-csharp.mdx'; - + -* Embedded tables allow CDC Sink to nest SQL table data inside a parent document as - arrays, maps, or single objects. - -* This page covers configuration options, nesting constraints, and how embedded items - are updated and deleted. - -* In this article: - * [Basic Configuration](#basic-configuration) - * [Join Columns and Primary Key Interaction](#join-columns-and-primary-key-interaction) - * [Matching Items on Update and Delete](#matching-items-on-update-and-delete) - * [Deep Nesting](#deep-nesting) - * [Attachments on Embedded Items](#attachments-on-embedded-items) - - - - - -`CdcSinkEmbeddedTableConfig` is placed inside a root table's `EmbeddedTables` list: - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableSchema = "public", // SQL schema (optional) - SourceTableName = "order_lines", // SQL table name - PropertyName = "Lines", // Property name in parent document - Type = CdcSinkRelationType.Array, // Array, Map, or Value - JoinColumns = ["order_id"], // FK to parent's PrimaryKeyColumns - PrimaryKeyColumns = ["line_id"], // Used to match items on UPDATE/DELETE - Columns = - [ - new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, - new CdcColumnMapping() { Column = "product", Name = "Product" }, - new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, - ] -} -``` - - - - - - - - -### Purpose of JoinColumns - -`JoinColumns` specifies the foreign key columns in the embedded table that reference -the parent's primary key. CDC Sink uses these columns to route each row to the correct -parent document. - -The `JoinColumns` values must exactly match the parent's `PrimaryKeyColumns`: - - - - -```csharp -// Parent root table: -PrimaryKeyColumns = ["order_id"] - -// Embedded table - correct: -JoinColumns = ["order_id"] // References parent's PK column - -// Embedded table - INCORRECT: -JoinColumns = ["customer_id"] // Does not reference the parent's PK -``` - - - - -### DELETE Events - -For DELETE events, the source database must include the join column values so CDC Sink -can route the delete to the correct parent document. - -By default, many databases only include primary key columns in DELETE events. If the -join column is _not_ in the embedded table's primary key, additional source database -configuration is required. - -**PostgreSQL:** See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) -for how CDC Sink handles this automatically when it has sufficient permissions, or how -a DBA can configure it manually. - -### Avoiding REPLICA IDENTITY Requirements - -The cleanest solution is to include the join column in the embedded table's primary key: - - - - -```sql --- SQL schema: -CREATE TABLE order_lines ( - order_id INT NOT NULL REFERENCES orders(id), - line_id INT NOT NULL, - product VARCHAR(200), - PRIMARY KEY (order_id, line_id) -- order_id in PK means DELETE events include it -); -``` - - - - - - - -```csharp -// Configuration: -PrimaryKeyColumns = ["order_id", "line_id"] -JoinColumns = ["order_id"] -``` - - - - -With `order_id` in the primary key, DELETE events include it by default and no additional -source database configuration is needed. - -Alternatively, set `OnDelete.IgnoreDeletes = true` to skip delete routing entirely -if deletes on that embedded table don't need to be processed. -See [Delete Strategies](./delete-strategies.mdx). - - - - - -When an UPDATE or DELETE arrives for an embedded row, CDC Sink must find the correct -item within the parent document's array or map. - -Items are matched by their full `PrimaryKeyColumns` composite key: - -* **INSERT** - New item appended to array / added to map -* **UPDATE** - Item found by PK match; mapped columns overwritten -* **DELETE** - Item found by PK match; removed from array/map (or OnDelete behavior applied) - -**Composite PKs** work the same way - all PK columns must match: - - - - -```csharp -PrimaryKeyColumns = ["invoice_date", "invoice_seq"] - -// UPDATE event for (invoice_date='2024-01-15', invoice_seq=3) -// → Finds and updates the item where both columns match -``` - - - - -**Case sensitivity:** By default, PK matching is case-insensitive. Set -`CaseSensitiveKeys = true` on `CdcSinkEmbeddedTableConfig` if your keys are -case-sensitive. - - - - - -Embedded tables can contain their own `EmbeddedTables`, creating hierarchies -with multiple levels. - -**Key constraint:** Every descendant table must carry the **root table's primary key** -as a denormalized column. This is required because CDC Sink routes each row to its -root document in a single pass. - -**Example: Company → Departments → Employees** - -The `employees` table must have `company_id` (the root PK) even though it only -directly joins to `departments`: - - - - -```sql -CREATE TABLE employees ( - company_id INT NOT NULL, -- Denormalized root PK - dept_id INT NOT NULL, - emp_id INT NOT NULL, - PRIMARY KEY (company_id, dept_id, emp_id) -); -``` - - - - - - - -```csharp -// Configuration for the employees embedded table: -JoinColumns = ["dept_id"] // FK to the direct parent (departments) PK -PrimaryKeyColumns = ["emp_id"] -``` - - - - -**Why is the root PK required?** - -When a CDC Sink event arrives for an `employees` row, CDC Sink needs to: - -1. Find the root document: `Companies/{company_id}` -2. Navigate to the correct `Departments` array item: `Departments.find(d => d.dept_id == dept_id)` -3. Add or update the `Employees` array item: `Employees.find(e => e.emp_id == emp_id)` - -Without `company_id` in the event, CDC Sink cannot identify the root document -without an additional lookup, which is not supported. - - - - - -Binary columns from embedded tables can be stored as RavenDB attachments by adding -them to `Columns` with `Type = CdcColumnType.Attachment`. - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "photos", - PropertyName = "Photos", - PrimaryKeyColumns = ["photo_num"], - JoinColumns = ["product_id"], - Columns = - [ - new CdcColumnMapping() { Column = "photo_num", Name = "PhotoNum" }, - new CdcColumnMapping() { Column = "caption", Name = "Caption" }, - new CdcColumnMapping() - { - Column = "thumbnail", Name = "thumb", - Type = CdcColumnType.Attachment - }, - ] -} -``` - - - - -A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the -parent document. The attachment name is prefixed with the embedded path and PK to -ensure uniqueness within the document. - -When the embedded item is deleted, its attachments are automatically removed. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx index 34b9847acb..6cc5756809 100644 --- a/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/failover-and-consistency.mdx @@ -22,8 +22,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Failover and Consistency diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index fbe1d804c4..c9c4dfc824 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -38,8 +38,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: How It Works @@ -164,7 +162,7 @@ are applied in order. **Example:** A source transaction that does: - + ```sql BEGIN; @@ -255,7 +253,7 @@ the CDC Sink task and recreate it. The new task will perform a fresh initial loa re-processing all rows with the updated configuration. If you only need to backfill a specific property on existing documents, you can also -use a RavenDB [patch by query](../../../client-api/operations/patching/set-based) +use a RavenDB [patch by query](../../../client-api/operations/patching/set-based.mdx) to update existing documents independently of the CDC Sink task. diff --git a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx index e622792736..e4199908ad 100644 --- a/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/linked-tables.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Linked Tables" sidebar_label: Linked Tables description: "Explains how linked tables create document ID references in parent documents by converting foreign key values into RavenDB document IDs." sidebar_position: 6 +supported_languages: ["csharp"] see_also: - title: "Schema Design" link: "server/ongoing-tasks/cdc-sink/schema-design" @@ -22,129 +23,13 @@ see_also: path: "Client API > Session" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Linked Tables +import LinkedTablesCsharp from './content/_linked-tables-csharp.mdx'; - + -* A **linked table** creates a document ID reference in the parent document rather - than embedding data. A foreign key value becomes a RavenDB document ID pointing - to a related collection. - -* In this article: - * [Basic Configuration](#basic-configuration) - * [Composite Foreign Keys](#composite-foreign-keys) - * [Linked vs Embedded](#linked-vs-embedded) - - - - - -`CdcSinkLinkedTableConfig` is placed inside a root table's (or embedded table's) `LinkedTables` list: - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Orders", - SourceTableName = "orders", - PrimaryKeyColumns = ["id"], - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, - ], - LinkedTables = - [ - new CdcSinkLinkedTableConfig - { - SourceTableName = "customers", - PropertyName = "Customer", // Property name in document - LinkedCollectionName = "Customers", // Target collection for ID - JoinColumns = ["customer_id"] // FK used to build the document ID - } - ] -} -``` - - - - -With `customer_id = 42`, the Orders document gets: - - - - -```json -{ - "Id": 1, - "CustomerId": 42, - "Customer": "Customers/42" -} -``` - - - - -The `Customer` property is a RavenDB document ID, built from the `LinkedCollectionName` -and the join column values. Load the referenced document using -[includes](../../../client-api/session/loading-entities#load-with-includes) to avoid -a second network call. - - - - - -When the target table has a composite primary key, the linked reference includes -all parts of that key: - - - - -```csharp -new CdcSinkLinkedTableConfig -{ - SourceTableName = "customers", - PropertyName = "Customer", - LinkedCollectionName = "Customers", - JoinColumns = ["customer_region", "customer_id"] // Must match Customers PK order -} -``` - - - - -With `customer_region = 'US'` and `customer_id = 42`, the document gets: - -``` -"Customer": "Customers/US/42" -``` - - - - - -| Consideration | Embedded | Linked | -|--------------|----------|--------| -| Data stored | Full nested object/array inside document | Document ID reference only | -| Load pattern | Single document load | Load parent + include references | -| Document size | Grows with embedded items | Parent document stays small | -| Updates to referenced data | Reflected via CDC | Reflected via CDC on the referenced collection | -| Independence | Child has no meaning without parent | Referenced entity exists independently | -| Typical use | Orders own LineItems | Orders reference Customers | - -**Choose embedded** when the child data belongs to the parent and is always read -together with it. - -**Choose linked** when the referenced entity is independently meaningful and shared -across many parents, and you want to avoid duplicating data. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx index f0e37dd65a..c632569f0e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/api-reference.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: API Reference" sidebar_label: Task Operations description: "Documents the Client API operations for creating, updating, querying, toggling, and deleting CDC Sink tasks programmatically." sidebar_position: 0 +supported_languages: ["csharp"] see_also: - title: "Configuration Reference" link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference" @@ -22,209 +23,13 @@ see_also: path: "Client API > Operations" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: API Reference +import ApiReferenceCsharp from './content/_api-reference-csharp.mdx'; - + -* CDC Sink tasks can be created, updated, and managed programmatically using - the RavenDB Client API. - -* In this article: - * [Add a CDC Sink Task](#add-a-cdc-sink-task) - * [Update a CDC Sink Task](#update-a-cdc-sink-task) - * [Get Task Info](#get-task-info) - * [Toggle Task State](#toggle-task-state) - * [Delete a Task](#delete-a-task) - - - - - -Use `AddCdcSinkOperation` to create a new CDC Sink task: - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "OrdersSync", - ConnectionStringName = "MyPostgresConnection", - Tables = new List - { - new CdcSinkTableConfig - { - CollectionName = "Orders", - SourceTableName = "orders", - PrimaryKeyColumns = new List { "id" }, - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, - new CdcColumnMapping() { Column = "total", Name = "Total" }, - ] - } - } -}; - -var result = await store.Maintenance.SendAsync( - new AddCdcSinkOperation(config)); - -long taskId = result.TaskId; -``` - - - - -`AddCdcSinkOperationResult`: - -| Property | Type | Description | -|----------|------|-------------| -| `TaskId` | `long` | Assigned task ID | -| `RaftCommandIndex` | `long` | Raft index of the command | - - - - - -Use `UpdateCdcSinkOperation` to modify an existing task. -Pass the full updated configuration including the `TaskId`: - - - - -```csharp -config.TaskId = taskId; // Must be set -config.Tables.Add(new CdcSinkTableConfig -{ - CollectionName = "Customers", - SourceTableName = "customers", - PrimaryKeyColumns = new List { "id" }, - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - new CdcColumnMapping() { Column = "email", Name = "Email" }, - ] -}); - -await store.Maintenance.SendAsync( - new UpdateCdcSinkOperation(taskId, config)); -``` - - - - - -**PostgreSQL - table changes affect the publication:** - -The replication slot and publication names are fixed at task creation and do not -change when you update the task. However, the **publication** controls which tables -CDC Sink receives changes for, so table changes require database-level updates: - -* **Adding tables** - If CDC Sink has the necessary permissions, it will automatically - run `ALTER PUBLICATION ADD TABLE ;` when the task is updated. If it - does not have permissions, a database administrator must run this manually. -* **Removing tables** - `ALTER PUBLICATION DROP TABLE ;` must be - run manually by a database administrator. CDC Sink does not remove tables from the - publication automatically. - -If the slot and publication were auto-named, a database administrator can look up -the current names from the task error log or from PostgreSQL: - -```sql -SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; -SELECT pubname FROM pg_publication WHERE pubname LIKE 'rvn_cdc_p_%'; -``` - -See [Initial Setup](../source-database-setup/postgres/initial-setup.mdx) for -guidance on slot and publication management. - -Dropped or orphaned slots and publications must be cleaned up manually by the -database administrator. -See [Cleanup and Maintenance](../source-database-setup/postgres/cleanup-and-maintenance.mdx). - - - - - - -Use `GetOngoingTaskInfoOperation` to retrieve the current state of a CDC Sink task: - - - - -```csharp -var taskInfo = await store.Maintenance.SendAsync( - new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); -``` - - - - - - - - -Pause or resume a CDC Sink task using `ToggleOngoingTaskStateOperation`: - - - - -```csharp -// Pause the task -await store.Maintenance.SendAsync( - new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: true)); - -// Resume the task -await store.Maintenance.SendAsync( - new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: false)); -``` - - - - - -**PostgreSQL:** Pausing a CDC Sink task stops the replication slot from being consumed. -PostgreSQL retains WAL segments for unconsumed slots, so pausing for an extended period -causes WAL to accumulate on disk. Monitor disk usage if a task is paused for more than -a short time. -See [Monitoring PostgreSQL](../source-database-setup/postgres/monitoring-postgres.mdx). - -**SQL Server:** Pausing a CDC Sink task for an extended period (days) may cause SQL Server -to trim the CDC change tables, removing rows that have not yet been consumed. A short -pause is safe. If the task is paused long enough that trimming occurs, CDC Sink will -report an error on resume - the task may need to be recreated rather than simply resumed. - - - - - - -Use `DeleteOngoingTaskOperation` to delete a CDC Sink task: - - - - -```csharp -await store.Maintenance.SendAsync( - new DeleteOngoingTaskOperation(taskId, OngoingTaskType.CdcSink)); -``` - - - - - -Deleting the task in RavenDB does **not** drop the replication slot or publication -in the source database. These must be cleaned up manually by the database administrator. -See [Cleanup and Maintenance](../source-database-setup/postgres/cleanup-and-maintenance.mdx). - - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx index 40b84736f3..659bfbe961 100644 --- a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx @@ -34,8 +34,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Configuration Reference diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/content/_api-reference-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/content/_api-reference-csharp.mdx new file mode 100644 index 0000000000..921af6f79f --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/content/_api-reference-csharp.mdx @@ -0,0 +1,202 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink tasks can be created, updated, and managed programmatically using + the RavenDB Client API. + +* In this article: + * [Add a CDC Sink Task](#add-a-cdc-sink-task) + * [Update a CDC Sink Task](#update-a-cdc-sink-task) + * [Get Task Info](#get-task-info) + * [Toggle Task State](#toggle-task-state) + * [Delete a Task](#delete-a-task) + + + + + +Use `AddCdcSinkOperation` to create a new CDC Sink task: + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + { + new CdcSinkTableConfig + { + CollectionName = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = new List { "id" }, + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, + new CdcColumnMapping() { Column = "total", Name = "Total" }, + ] + } + } +}; + +var result = await store.Maintenance.SendAsync( + new AddCdcSinkOperation(config)); + +long taskId = result.TaskId; +``` + + + + +`AddCdcSinkOperationResult`: + +| Property | Type | Description | +|----------|------|-------------| +| `TaskId` | `long` | Assigned task ID | +| `RaftCommandIndex` | `long` | Raft index of the command | + + + + + +Use `UpdateCdcSinkOperation` to modify an existing task. +Pass the full updated configuration including the `TaskId`: + + + + +```csharp +config.TaskId = taskId; // Must be set +config.Tables.Add(new CdcSinkTableConfig +{ + CollectionName = "Customers", + SourceTableName = "customers", + PrimaryKeyColumns = new List { "id" }, + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() { Column = "email", Name = "Email" }, + ] +}); + +await store.Maintenance.SendAsync( + new UpdateCdcSinkOperation(taskId, config)); +``` + + + + + +**PostgreSQL - table changes affect the publication:** + +The replication slot and publication names are fixed at task creation and do not +change when you update the task. However, the **publication** controls which tables +CDC Sink receives changes for, so table changes require database-level updates: + +* **Adding tables** - If CDC Sink has the necessary permissions, it will automatically + run `ALTER PUBLICATION ADD TABLE ;` when the task is updated. If it + does not have permissions, a database administrator must run this manually. +* **Removing tables** - `ALTER PUBLICATION DROP TABLE ;` must be + run manually by a database administrator. CDC Sink does not remove tables from the + publication automatically. + +If the slot and publication were auto-named, a database administrator can look up +the current names from the task error log or from PostgreSQL: + +```sql +SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE 'rvn_cdc_s_%'; +SELECT pubname FROM pg_publication WHERE pubname LIKE 'rvn_cdc_p_%'; +``` + +See [Initial Setup](../../source-database-setup/postgres/initial-setup.mdx) for +guidance on slot and publication management. + +Dropped or orphaned slots and publications must be cleaned up manually by the +database administrator. +See [Cleanup and Maintenance](../../source-database-setup/postgres/cleanup-and-maintenance.mdx). + + + + + + +Use `GetOngoingTaskInfoOperation` to retrieve the current state of a CDC Sink task: + + + + +```csharp +var taskInfo = await store.Maintenance.SendAsync( + new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); +``` + + + + + + + + +Pause or resume a CDC Sink task using `ToggleOngoingTaskStateOperation`: + + + + +```csharp +// Pause the task +await store.Maintenance.SendAsync( + new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: true)); + +// Resume the task +await store.Maintenance.SendAsync( + new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.CdcSink, disable: false)); +``` + + + + + +**PostgreSQL:** Pausing a CDC Sink task stops the replication slot from being consumed. +PostgreSQL retains WAL segments for unconsumed slots, so pausing for an extended period +causes WAL to accumulate on disk. Monitor disk usage if a task is paused for more than +a short time. +See [Monitoring PostgreSQL](../../source-database-setup/postgres/monitoring-postgres.mdx). + +**SQL Server:** Pausing a CDC Sink task for an extended period (days) may cause SQL Server +to trim the CDC change tables, removing rows that have not yet been consumed. A short +pause is safe. If the task is paused long enough that trimming occurs, CDC Sink will +report an error on resume - the task may need to be recreated rather than simply resumed. + + + + + + +Use `DeleteOngoingTaskOperation` to delete a CDC Sink task: + + + + +```csharp +await store.Maintenance.SendAsync( + new DeleteOngoingTaskOperation(taskId, OngoingTaskType.CdcSink)); +``` + + + + + +Deleting the task in RavenDB does **not** drop the replication slot or publication +in the source database. These must be cleaned up manually by the database administrator. +See [Cleanup and Maintenance](../../source-database-setup/postgres/cleanup-and-maintenance.mdx). + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx index 0edb1ff6c8..d1d24ca676 100644 --- a/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/monitoring.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Monitoring" sidebar_label: Monitoring description: "Explains how to monitor a CDC Sink task - its running state, progress, fallback behavior, and statistics available through Management Studio and the API." sidebar_position: 15 +supported_languages: ["csharp"] see_also: - title: "How It Works" link: "server/ongoing-tasks/cdc-sink/how-it-works" @@ -22,120 +23,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Monitoring +import MonitoringCsharp from './content/_monitoring-csharp.mdx'; - + -* This page explains how to monitor a CDC Sink task - its running state, progress, - fallback behavior, and statistics available through the Management Studio and API. - -* In this article: - * [Task State](#task-state) - * [Fallback Mode](#fallback-mode) - * [Statistics](#statistics) - * [Notifications](#notifications) - - - - - -A CDC Sink task can be in one of the following states: - -| State | Description | -|-------|-------------| -| `Active` | Running normally - streaming changes or waiting for new changes | -| `ActiveByAnotherNode` | Another cluster node is the mentor; this node is a replica | -| `Disabled` | Manually disabled via Studio or API | -| `Error` | The task encountered an error and stopped | -| `FallbackMode` | Connection to the source database was lost; retrying | -| `NotOnThisNode` | This node does not hold the task | - -The current state is visible in the **Ongoing Tasks** view in the Management Studio. - - - - - -When CDC Sink cannot reach the source database, it enters **fallback mode** rather -than failing immediately. - -In fallback mode: -* The task continues retrying the connection at regular intervals -* No changes are applied while the connection is down -* The task automatically resumes streaming once the source is reachable again - -Retry delay doubles on each consecutive failure, up to the cap set by -`CdcSink.MaxFallbackTimeInSec` (default 15 minutes). -See [Server Configuration](./server-configuration.mdx). - - - - - -CDC Sink exposes runtime statistics through the `GetOngoingTaskInfoOperation`: - - - - -```csharp -var taskInfo = await store.Maintenance.SendAsync( - new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.CdcSink)); -``` - - - - -The returned object includes: - -| Field | Description | -|-------|-------------| -| `TaskState` | Current state of the task | -| `MentorNode` | Configured preferred node | -| `ResponsibleNode` | Node currently running the task | -| `Error` | Error message if the task is in error state | - -Detailed per-table statistics - including row counts and last processed position - -are available through the Management Studio's ongoing tasks detail view. - - - - - -CDC Sink participates in RavenDB's standard alert system. If the task enters an -error state or fallback mode, an alert is raised and visible in: - -* The **Notification Center** in the Management Studio (bell icon) -* The cluster's alert log - -Alerts include the error message and which table or operation triggered the failure, -making it straightforward to diagnose the root cause. - - - - - -CDC Sink tolerates individual document processing errors - each failure is logged -and recorded, but processing continues for the remaining documents in the batch. -The CDC position advances as long as the error ratio stays within acceptable bounds. - -**Error threshold:** -When cumulative errors reach **100** and also exceed the number of successes, -the batch throws and the task enters fallback mode. - -**Fallback mode on error:** -The task enters exponential backoff, starting at 5 seconds and doubling on each -retry, up to the limit set by `CdcSink.MaxFallbackTimeInSec` (default 15 minutes). -See [Server Configuration](./server-configuration.mdx) and [Fallback Mode](#fallback-mode). - -**Patch errors:** -Patch errors - including `MaxSteps exceeded` - fail only the affected document. -The rest of the batch continues normally. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index d9e5150f2e..715f08f119 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -38,8 +38,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Overview @@ -163,6 +161,6 @@ the database administrator separately. CDC Sink is available on an **Enterprise** license. -Learn more about licensing [here](../../../licensing/overview). +Learn more about licensing [here](../../../licensing/overview.mdx). diff --git a/docs/server/ongoing-tasks/cdc-sink/patching.mdx b/docs/server/ongoing-tasks/cdc-sink/patching.mdx index 41e0a92119..060755aeaf 100644 --- a/docs/server/ongoing-tasks/cdc-sink/patching.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/patching.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Patching" sidebar_label: Patching description: "Explains how JavaScript patch scripts work in CDC Sink, covering available variables, patch scope, common scenarios, idempotency, and limitations." sidebar_position: 10 +supported_languages: ["csharp"] see_also: - title: "Delete Strategies" link: "server/ongoing-tasks/cdc-sink/delete-strategies" @@ -26,496 +27,13 @@ see_also: path: "Server > Configuration" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Patching +import PatchingCsharp from './content/_patching-csharp.mdx'; - + -* A **patch** is a JavaScript snippet that runs on a document after column mapping is applied. - Patches let you transform data, compute derived fields, maintain aggregates, load related - documents, and control document metadata. - -* Patches are defined per-table (root or embedded) and per-operation (INSERT/UPDATE - or DELETE via `OnDelete.Patch`). - -* In this article: - * [When Patches Run](#when-patches-run) - * [Available Variables](#available-variables) - * [$row and $old: Names and Types](#row-and-old-names-and-types) - * [$row Column Types](#row-column-types) - * [Patch Scope: Root vs Embedded](#patch-scope-root-vs-embedded) - * [Scenario: Column Transformation](#scenario-column-transformation) - * [Scenario: Aggregation with Embedded Tables](#scenario-aggregation-with-embedded-tables) - * [Scenario: Delta Computations](#scenario-delta-computations) - * [Scenario: Computed Derived Fields](#scenario-computed-derived-fields) - * [Scenario: Document Metadata](#scenario-document-metadata) - * [Scenario: Loading Related Documents](#scenario-loading-related-documents) - * [Idempotency and Failover](#idempotency-and-failover) - * [Step Limit](#step-limit) - * [Capabilities and Limitations](#capabilities-and-limitations) - - - - - -| Event | Patch property | Runs? | -|-------|---------------|-------| -| INSERT | `Patch` | ✓ After column mapping | -| UPDATE | `Patch` | ✓ After column mapping, on merged document | -| DELETE (root table) | `OnDelete.Patch` | ✓ Before document is deleted | -| DELETE (embedded table) | `OnDelete.Patch` | ✓ On parent document before item is removed | - -The `Patch` property on a table handles INSERT and UPDATE. -The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. - - - - - -| Variable | Available | Type | Description | -|----------|-----------|------|-------------| -| `this` | Always | object | The document being modified (root or parent for embedded) | -| `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | -| `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | -| `load(id)` | Always | function | Load a RavenDB document by ID | - - - - - -`$row` and `$old` look similar but represent fundamentally different things: - -| | `$row` | `$old` | -|--|--------|--------| -| **Contains** | The incoming SQL row from the CDC event | The previous state of the RavenDB document (or embedded item) | -| **Property names** | Original SQL column names (`customer_name`) | Mapped RavenDB property names (`CustomerName`) | -| **Value types** | Raw SQL types (see [$row Column Types](#row-column-types)) | Stored JSON types (whatever was last written to RavenDB) | -| **Available on INSERT** | ✓ | ✗ (null) | -| **Available on UPDATE** | ✓ | ✓ | -| **Available on DELETE** | ✓ | ✓ | - -Given this column mapping: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, - new CdcColumnMapping() { Column = "amount", Name = "Amount" }, -] -``` - - - - -In the patch script: - - - - -```javascript -// $row - SQL column names, raw SQL types -$row.customer_name // string -$row.amount // number (from numeric/decimal column) - -// $old - mapped property names, stored JSON types -$old.CustomerName // string (as stored in RavenDB) -$old.Amount // number (as stored in RavenDB) - -// this - the document after column mapping has been applied for this event -this.CustomerName // string (just set from $row.customer_name) -this.Amount // number (just set from $row.amount) -``` - - - - - -Unmapped columns - those not listed in `Columns` - appear in `$row` but are never -written to the document and therefore never appear in `$old`. - - - - - - -`$row` exposes all SQL columns using their **original column names** (not the mapped -RavenDB property names). The JavaScript type of each value depends on the source -database type. - -### PostgreSQL - -| PostgreSQL Type | JavaScript Type in `$row` | Notes | -|----------------|--------------------------|-------| -| `integer` / `bigint` | `number` | | -| `real` / `double precision` | `number` | | -| `numeric` | `number` | | -| `boolean` | `boolean` | | -| `date` / `timestamp` / `timestamptz` | `string` | Formatted date string | -| `uuid` | `string` | | -| `varchar` / `text` / `char` | `string` | | -| `bytea` | `string` | Base64-encoded | -| `json` / `jsonb` | `string` | Raw JSON text - call `JSON.parse()` to access as an object / array | -| `text[]` / `varchar[]` / `int[]` / etc. | `Array` | Elements are always strings, even for numeric array types | -| `vector` (pgvector) | `Array` | Elements are JavaScript numbers (floats) | - -**JSON/JSONB columns require explicit parsing:** - - - - -```javascript -var meta = JSON.parse($row.metadata); -this.Priority = meta.priority; -this.Label = meta.label; -``` - - - - -**Array columns:** - - - - -```javascript -this.TagCount = $row.tags.length; -this.FirstTag = $row.tags[0]; -this.Tags = $row.tags; - -// INT[] elements are strings - parse explicitly if numeric arithmetic is needed -var first = parseInt($row.scores[0], 10); -``` - - - - -**pgvector columns (elements are numbers, not strings):** - - - - -```javascript -this.EmbeddingSum = $row.embedding.reduce(function(a, b) { return a + b; }, 0); -this.Embedding = $row.embedding; -``` - - - - - - - - -**Root table patches** operate on the root document: - - - - -```javascript -Patch = "this.Status = $row.is_active ? 'Active' : 'Inactive';" -``` - - - - -`this` is the Orders (or whatever root collection) document. - -**Embedded table patches** operate on the **parent** document, not the embedded item: - - - - -```javascript -// Patch on order_lines embedded table -Patch = "this.TotalQuantity = (this.Lines || []).reduce((s, l) => s + l.Quantity, 0);" -``` - - - - -`this` is the parent Orders document. This lets you recompute parent-level aggregates -whenever an embedded item changes. - - - - - -Transform or combine SQL columns into RavenDB properties: - - - - -```javascript -this.FullName = ($row.first_name + ' ' + $row.last_name).trim(); -this.Status = $row.is_active ? 'Active' : 'Inactive'; -this.CreatedAt = new Date($row.created_unix * 1000).toISOString(); -``` - - - - - - - - -Recompute parent-level totals whenever an embedded item is added or updated. - - -If you use a `Patch` to maintain an aggregate, you **must** also provide an -`OnDelete.Patch` that reverses the aggregate when an item is deleted. -Without it, deletes will leave the aggregate in an incorrect state. - - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "order_lines", - PropertyName = "Lines", - PrimaryKeyColumns = ["line_id"], - JoinColumns = ["order_id"], - Columns = - [ - new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, - new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, - ], - - // Runs on INSERT and UPDATE - recomputes total from current Lines array - Patch = @" - this.TotalQuantity = (this.Lines || []) - .reduce((sum, line) => sum + (line.Quantity || 0), 0); - ", - - // REQUIRED: Runs on DELETE - recomputes after item is removed from array - OnDelete = new CdcSinkOnDeleteConfig - { - Patch = @" - this.TotalQuantity = (this.Lines || []) - .reduce((sum, line) => sum + (line.Quantity || 0), 0); - " - } -} -``` - - - - -The OnDelete patch runs after the item has already been removed from the array, -so re-summing `this.Lines` gives the correct post-deletion total. - - - - - -Use `$old` to compute a delta when an embedded item changes, keeping a running total -without recomputing from scratch. - - -Running total patches using `$old` must have a matching `OnDelete.Patch` that subtracts -the deleted item's value. Without it, deletes leave the running total incorrect. - - - - - -```csharp -new CdcSinkEmbeddedTableConfig -{ - SourceTableName = "invoice_lines", - PropertyName = "Lines", - PrimaryKeyColumns = ["line_id"], - JoinColumns = ["invoice_id"], - Columns = - [ - new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, - new CdcColumnMapping() { Column = "amount", Name = "Amount" }, - ], - - // INSERT: $old is null, so delta = new amount (0 → new) - // UPDATE: $old has previous Amount, delta = new - old - Patch = @" - const oldAmount = $old?.Amount || 0; - const newAmount = $row.amount || 0; - this.RunningTotal = (this.RunningTotal || 0) + (newAmount - oldAmount); - ", - - // REQUIRED: Subtract the deleted item's amount using $old - OnDelete = new CdcSinkOnDeleteConfig - { - Patch = @" - const deletedAmount = $old?.Amount || 0; - this.RunningTotal = (this.RunningTotal || 0) - deletedAmount; - " - } -} -``` - - - - -The `$old` variable in the OnDelete patch contains the item's last known state before deletion. - - - - - -Compute fields from unmapped columns that you don't want to store directly: - - - - -```csharp -Columns = -[ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, -], -// base_price and tax_rate are NOT in Columns -Patch = @" - this.FinalPrice = $row.base_price * (1 + $row.tax_rate); - this.Discount = $row.is_vip ? $row.base_price * 0.1 : 0; -" -``` - - - - - - - - -Patches can set RavenDB document metadata, including expiration: - - - - -```javascript -this['@metadata'] = this['@metadata'] || {}; - -if ($row.expires_at) { - this['@metadata']['@expires'] = new Date($row.expires_at).toISOString(); -} - -this['@metadata']['SourceTable'] = 'orders'; -``` - - - - - - - - -Use `load()` to load a related RavenDB document and denormalize its data: - - - - -```javascript -const customer = load('Customers/' + $row.customer_id); - -if (customer) { - this.CustomerName = customer.Name; - this.CustomerEmail = customer.Email; - this.CustomerTier = customer.Tier; -} else { - // Document doesn't exist yet - race condition or not yet synced - this.CustomerName = null; - this.CustomerEmail = null; -} -``` - - - - -`load()` returns `null` if the document does not exist or has not yet been created -by CDC Sink (race condition when multiple tables are loading in parallel). -Always check for null before accessing properties. - -**When to use `load()`:** - -* Denormalizing slowly-changing reference data (customer name, category, region) -* Capturing a snapshot of related data at insert time - -**Prefer linked tables** for simple foreign key references - they are cleaner and -do not have the null-handling complexity of `load()`. - - - - - -After a failover, CDC Sink resumes from the replicated state, which may be older -than the last work the previous mentor node completed. Some changes may be re-read -and re-applied. - -**Patches that are not idempotent can produce incorrect results when re-applied.** - - - - -```javascript -// NOT idempotent - increments again on re-read -this.ViewCount = (this.ViewCount || 0) + 1; - -// Idempotent - absolute value from SQL source -this.ViewCount = $row.view_count; - -// Idempotent - delta via $old (both first-read and re-read produce same result) -const oldVal = $old?.Amount || 0; -const newVal = $row.amount || 0; -this.RunningTotal = (this.RunningTotal || 0) + (newVal - oldVal); -``` - - - - -Column mapping itself is idempotent - overwriting a property with the same value -is always safe. - - - - - -Patch scripts are bounded by a **step quota** rather than a time limit. Each operation -in the script (assignment, loop iteration, function call) consumes steps. - -The limit is controlled by the `Patching.MaxStepsForScript` configuration setting. -See [Patching Configuration](../../../server/configuration/patching-configuration). - -If a patch exceeds the limit, the CDC operation fails and is retried. - -Keep patches focused and efficient - prefer `.filter()` + `.reduce()` over nested loops. - - - - - -**What patches can do:** - -* Access `this`, `$row`, `$old` -* Load related documents with `load(id)` -* Create or replace documents with `put(id, document)` -* Delete documents with `del(id)` -* Compute and transform property values -* Set and modify document metadata -* Conditional logic, loops, array methods -* Use built-in JavaScript: `Date`, `Math`, `JSON`, `Array` - -**What patches cannot do:** - -* Make HTTP calls or API requests -* Access the file system -* Load documents from other RavenDB databases - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 68944a00c1..9627d5531c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -22,8 +22,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Property Retention diff --git a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx index 7ba7130d11..2c93a4d87e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/schema-design.mdx @@ -3,6 +3,7 @@ title: "CDC Sink: Schema Design" sidebar_label: Schema Design description: "Explains how CDC Sink maps a relational schema to a RavenDB document model using root tables, embedded tables, and linked tables." sidebar_position: 4 +supported_languages: ["csharp"] see_also: - title: "Embedded Tables" link: "server/ongoing-tasks/cdc-sink/embedded-tables" @@ -26,348 +27,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink: Schema Design +import SchemaDesignCsharp from './content/_schema-design-csharp.mdx'; - + -* CDC Sink maps a relational schema to a RavenDB document model through configuration. - This page explains the three building blocks - root tables, embedded tables, and - linked tables - and how to combine them. - -* In this article: - * [Root Tables](#root-tables) - * [Embedded Tables](#embedded-tables) - * [Linked Tables](#linked-tables) - * [Primary Key and Join Column Requirements](#primary-key-and-join-column-requirements) - * [Multi-Level Nesting](#multi-level-nesting) - * [Relation Types](#relation-types) - * [Choosing Between Embedded and Linked](#choosing-between-embedded-and-linked) - - - - - -A **root table** maps a source table to a RavenDB collection. Each row in the source table -becomes one document. - -Each root table is configured with a `CdcSinkTableConfig` object. This configuration -defines the source table to read from, the target RavenDB collection to write to, the -primary key columns used to build document IDs, and the columns to map into each document. - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Orders", // RavenDB collection name - SourceTableSchema = "public", // Source schema (optional; default is provider-specific) - SourceTableName = "orders", // Source table name - PrimaryKeyColumns = ["id"], // Used for document ID generation - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, - new CdcColumnMapping() { Column = "total", Name = "Total" }, - ] -} -``` - - - - - -The default `SourceTableSchema` is provider-specific: PostgreSQL uses `public`, -SQL Server uses `dbo`, and MySQL/MariaDB use the database name from the connection string. - - -**Document ID generation:** `{CollectionName}/{pk1}/{pk2}/...` -A row with `id = 42` and collection `Orders` becomes document `Orders/42`. -A composite PK `(region, id)` with values `(US, 42)` becomes `Orders/US/42`. -CDC Sink uses the `CollectionName` verbatim as the document ID prefix. - -**Column mapping:** Only columns listed in `Columns` appear in the document. Unmapped columns are -still available in patch scripts via `$row` but are not stored in the document. - - - - - -An **embedded table** creates nested data within a parent document. For example, a -`order_lines` table becomes an array inside each `Orders` document. - -Embedded tables are configured inside the root table's `CdcSinkTableConfig`. In the -example below, the `orders` root table configuration contains an `EmbeddedTables` entry -that maps `order_lines` into the `Lines` array. - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Orders", - SourceTableName = "orders", - PrimaryKeyColumns = ["id"], - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_name", Name = "CustomerName" }, - ], - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "order_lines", - PropertyName = "Lines", // Property in parent document - Type = CdcSinkRelationType.Array, // Array of items - JoinColumns = ["order_id"], // FK referencing parent's PK - PrimaryKeyColumns = ["line_id"], // Used to match items on update/delete - Columns = - [ - new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, - new CdcColumnMapping() { Column = "product", Name = "Product" }, - new CdcColumnMapping() { Column = "quantity", Name = "Quantity" }, - ] - } - ] -} -``` - - - - -This produces documents like: - - - - -```json -{ - "Id": 1, - "CustomerName": "Alice", - "Lines": [ - { "LineId": 1, "Product": "Apples", "Quantity": 5 }, - { "LineId": 2, "Product": "Bananas", "Quantity": 3 } - ], - "@metadata": { "@collection": "Orders" } -} -``` - - - - - - - - -A **linked table** creates a document ID reference rather than embedding data. -A foreign key in the source row becomes a RavenDB document ID. - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Orders", - SourceTableName = "orders", - PrimaryKeyColumns = ["id"], - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, - ], - LinkedTables = - [ - new CdcSinkLinkedTableConfig - { - SourceTableName = "customers", - PropertyName = "Customer", // Property in parent document - LinkedCollectionName = "Customers", // Target collection for ID - JoinColumns = ["customer_id"] // FK used to build the ID - } - ] -} -``` - - - - -With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. - - - - - -### Root Tables - -The `PrimaryKeyColumns` list defines which source columns are used to generate the document ID. -All PK columns must be present in every INSERT, UPDATE, and DELETE event. - -### Embedded Tables (One Level) - -An embedded table needs: - -* **PrimaryKeyColumns** - Used to match items within the parent's array for UPDATE and DELETE -* **JoinColumns** - Foreign key referencing the parent's `PrimaryKeyColumns` - -The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `PrimaryKeyColumns`: - -| Parent PK | Required JoinColumns | Valid? | -|-----------|---------------------|--------| -| `[id]` | `[order_id]` where `order_id` = parent's `id` | ✓ | -| `[id, year]` | `[order_id, order_year]` | ✓ | -| `[id]` | `[customer_id, order_id]` | ✗ Extra column not from parent PK | -| `[id, year]` | `[order_id]` | ✗ Missing `order_year` | - -### DELETE Events and REPLICA IDENTITY - -For DELETE events, the source database must include the join column values so CDC Sink -can route the delete to the correct parent document. - -If the join column is not part of the source table's primary key, the source database may -need additional configuration to include it in DELETE events. - -See [REPLICA IDENTITY](./source-database-setup/postgres/replica-identity.mdx) for -the PostgreSQL-specific requirement and how CDC Sink handles it automatically. - - - - - -Embedded tables can themselves have embedded tables, creating arbitrarily deep hierarchies. - -**Example: Company → Departments → Employees** - - - - -```csharp -new CdcSinkTableConfig -{ - CollectionName = "Companies", - SourceTableName = "companies", - PrimaryKeyColumns = ["company_id"], - Columns = - [ - new CdcColumnMapping() { Column = "company_id", Name = "CompanyId" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - ], - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "departments", - PropertyName = "Departments", - Type = CdcSinkRelationType.Array, - JoinColumns = ["company_id"], // Root FK - PrimaryKeyColumns = ["dept_id"], - Columns = - [ - new CdcColumnMapping() { Column = "dept_id", Name = "DeptId" }, - new CdcColumnMapping() { Column = "dept_name", Name = "DeptName" }, - ], - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "employees", - PropertyName = "Employees", - Type = CdcSinkRelationType.Array, - JoinColumns = ["dept_id"], // FK to the direct parent (departments) PK - PrimaryKeyColumns = ["emp_id"], - Columns = - [ - new CdcColumnMapping() { Column = "emp_id", Name = "EmpId" }, - new CdcColumnMapping() { Column = "emp_name", Name = "EmpName" }, - ] - } - ] - } - ] -} -``` - - - - -**Critical requirement for deep nesting:** All descendant tables must carry the root -table's primary key as a denormalized column. The `employees` table must have -`company_id` even though it joins directly to `departments` via `dept_id`. - -This is required because CDC Sink needs to route every row to the correct root document -in a single pass, without additional lookups. - -**Source schema to support this:** - - - - -```sql -CREATE TABLE employees ( - company_id INT NOT NULL, -- Denormalized root FK - dept_id INT NOT NULL, -- Parent FK - emp_id INT NOT NULL, -- Local PK - emp_name VARCHAR(200), - PRIMARY KEY (company_id, dept_id, emp_id) -); -``` - - - - -Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY -configuration - the default DELETE events include all PK columns. - - - - - -The `Type` property on embedded tables controls the document structure: - -| Type | Use Case | Document Structure | -|------|----------|--------------------| -| `Array` | One-to-many: parent has many children | `"Lines": [{ ... }, { ... }]` | -| `Map` | One-to-many with direct key lookup | `"Lines": { "1": { ... }, "2": { ... } }` | -| `Value` | Many-to-one: parent has one child | `"Customer": { ... }` | - -**Array** - Items are matched by `PrimaryKeyColumns` for UPDATE and DELETE. -Use when you need to iterate over all items. - -**Map** - Items are stored as a JSON object keyed by the primary key value(s). -Use when you need fast direct-key access within the document. - -**Value** - Stores a single embedded object. -Use for many-to-one relationships (many orders share one customer). - - - - - -| Consideration | Embedded | Linked | -|--------------|----------|--------| -| Data location | Stored inside parent document | Stored in a separate document | -| Access pattern | Read parent to get all data | Load parent, then load referenced doc | -| Updates | Automatic via CDC | Automatic via CDC for each table | -| Document size | Grows with embedded items | Parent stays small | -| Use case | Parent owns child (orders own lines) | Independent entities (orders reference customers) | - -**Use embedded tables** when: -* The child entity has no meaning outside the parent (order lines without an order) -* You always read the parent and child together -* You want a single-document read - -**Use linked tables** when: -* The referenced entity is independently meaningful (customers exist without orders) -* The referenced entity is shared by many parents -* You want RavenDB's include loading to handle the join - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index 6b8e1e11d6..0a59fbaf8a 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -26,8 +26,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Server Configuration @@ -44,7 +42,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; These keys can be set in `settings.json` or passed as environment variables. -See [Configuration Overview](../../../server/configuration/configuration-options). +See [Configuration Overview](../../../server/configuration/configuration-options.mdx). --- diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/content/_overview-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/content/_overview-csharp.mdx new file mode 100644 index 0000000000..ba8bff80a2 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/content/_overview-csharp.mdx @@ -0,0 +1,93 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink supports MySQL and MariaDB as source databases using + [binary log (binlog) replication](https://dev.mysql.com/doc/refman/8.0/en/replication.html). + +* MySQL streams row-level changes in real time through the binlog. CDC Sink consumes + this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB documents as they + occur. + + + + + +Use a `SqlConnectionString` with `FactoryName` set to `"MySql.Data.MySqlClient"` or +`"MySqlConnector.MySqlConnectorFactory"`: + + + + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + { + Name = "MySqlConnection", + FactoryName = "MySqlConnector.MySqlConnectorFactory", + ConnectionString = "Server=myserver;Port=3306;Database=mydb;User=ravendb_cdc;Password=..." + })); +``` + + + + + + + + +MySQL must have binary logging enabled with row-based format: + + + + +```ini +# my.cnf / my.ini +[mysqld] +log-bin = mysql-bin +binlog_format = ROW +binlog_row_image = FULL +server-id = 1 +``` + + + + +The CDC Sink user needs the following privileges: + + + + +```sql +GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'ravendb_cdc'@'%'; +GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; +``` + + + + +* `REPLICATION SLAVE` - required to read the binlog stream +* `REPLICATION CLIENT` - required to query binlog status +* `SELECT` - required for the initial full-table load + + + + + +Like PostgreSQL, MySQL CDC Sink uses streaming replication (via the binlog), not +polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration setting does not +apply to MySQL. + + + + + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. + +The `SourceTableSchema` corresponds to the MySQL database name. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx index 9b6dd92d55..bcba6e5e89 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx @@ -3,6 +3,7 @@ title: "CDC Sink for MySQL: Overview" sidebar_label: Overview description: "CDC Sink support for MySQL and MariaDB - using binlog replication to stream changes into RavenDB in real time." sidebar_position: 0 +supported_languages: ["csharp"] see_also: - title: "CDC Sink Overview" link: "server/ongoing-tasks/cdc-sink/overview" @@ -14,100 +15,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink for MySQL: Overview +import OverviewCsharp from './content/_overview-csharp.mdx'; - + -* CDC Sink supports MySQL and MariaDB as source databases using - [binary log (binlog) replication](https://dev.mysql.com/doc/refman/8.0/en/replication.html). - -* MySQL streams row-level changes in real time through the binlog. CDC Sink consumes - this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB documents as they - occur. - - - - - -Use a `SqlConnectionString` with `FactoryName` set to `"MySql.Data.MySqlClient"` or -`"MySqlConnector.MySqlConnectorFactory"`: - - - - -```csharp -store.Maintenance.Send(new PutConnectionStringOperation( - new SqlConnectionString - { - Name = "MySqlConnection", - FactoryName = "MySqlConnector.MySqlConnectorFactory", - ConnectionString = "Server=myserver;Port=3306;Database=mydb;User=ravendb_cdc;Password=..." - })); -``` - - - - - - - - -MySQL must have binary logging enabled with row-based format: - - - - -```ini -# my.cnf / my.ini -[mysqld] -log-bin = mysql-bin -binlog_format = ROW -binlog_row_image = FULL -server-id = 1 -``` - - - - -The CDC Sink user needs the following privileges: - - - - -```sql -GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'ravendb_cdc'@'%'; -GRANT SELECT ON mydb.* TO 'ravendb_cdc'@'%'; -``` - - - - -* `REPLICATION SLAVE` - required to read the binlog stream -* `REPLICATION CLIENT` - required to query binlog status -* `SELECT` - required for the initial full-table load - - - - - -Like PostgreSQL, MySQL CDC Sink uses streaming replication (via the binlog), not -polling. The `CdcSink.SqlServer.PollIntervalInSec` server configuration setting does not -apply to MySQL. - - - - - -The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. - -The `SourceTableSchema` corresponds to the MySQL database name. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx index aca04da727..f4cfb6f015 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx @@ -26,8 +26,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Cleanup and Maintenance @@ -81,7 +79,7 @@ of the database administrator. List all CDC Sink replication slots: - + ```sql SELECT slot_name, active, confirmed_flush_lsn @@ -98,7 +96,7 @@ Sink tasks in RavenDB - any slot whose corresponding task no longer exists is or List all CDC Sink publications: - + ```sql SELECT p.pubname, c.relname AS table_name @@ -117,7 +115,7 @@ ORDER BY p.pubname, c.relname; - + ```sql SELECT pg_drop_replication_slot('rvn_cdc_s_'); @@ -136,7 +134,7 @@ task must be stopped or deleted in RavenDB before the slot can be dropped. - + ```sql DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; @@ -159,7 +157,7 @@ connection error). Check how many slots are in use: - + ```sql SELECT count(*) FROM pg_replication_slots; @@ -174,7 +172,7 @@ To resolve this: 1. Identify inactive slots: - + ```sql SELECT slot_name, active @@ -188,7 +186,7 @@ WHERE active = false; 2. Drop slots for tasks that no longer exist: - + ```sql SELECT pg_drop_replication_slot('rvn_cdc_s_'); diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx new file mode 100644 index 0000000000..bf88c4cdb5 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx @@ -0,0 +1,201 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* When CDC Sink starts, it verifies and (if it has the necessary permissions) creates + the **replication slot** and **publication** required for logical replication. + +* If the CDC Sink user does not have permission to create these objects, a database + administrator must create them manually before the task can start. + +* In this article: + * [Automatic Setup](#automatic-setup) + * [Manual Setup](#manual-setup) + * [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names) + * [Slot and Publication Naming (Auto-generated)](#slot-and-publication-naming-auto-generated) + * [Verifying Setup](#verifying-setup) + + + + + +If the CDC Sink user has the required permissions (see +[Permissions and Roles](../permissions-and-roles.mdx)), +CDC Sink will: + +1. Generate the replication slot and publication names (a GUID-based identifier) and store them with the task +2. Check whether they already exist +3. Create them if they do not exist +4. If configured tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` automatically (requires the user to have publication ownership or superuser access) +5. Begin the initial load + +No manual database administration is needed in this case. + + + + + +If the CDC Sink user does not have permission to create replication slots or +publications, a database administrator must create them before the task is started. + +**Step 1: Determine the slot and publication names** + +The simplest approach is to specify the names explicitly in `CdcSinkPostgresSettings` +so both you and the database administrator know what names to use. +See [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names). + +If using auto-generated names (no `Postgres` settings), CDC Sink generates names +using the `rvn_cdc_s_` and `rvn_cdc_p_` prefixes followed by a GUID. +See [Slot and Publication Naming](#slot-and-publication-naming-auto-generated) +for the naming scheme. + +You can also find the names CDC Sink expects by creating the task (it will fail to start) +and reading the error message, which includes the expected names. + +**Step 2: Create the publication** + +Create a publication that includes all the tables CDC Sink will replicate: + + + + +```sql +CREATE PUBLICATION rvn_cdc_p_ +FOR TABLE orders, order_lines, customers; +``` + + + + +The publication must include all tables from the task's root and embedded table +configurations. + +**Step 3: Create the replication slot** + + + + +```sql +SELECT pg_create_logical_replication_slot( + 'rvn_cdc_s_', + 'pgoutput' +); +``` + + + + +**Step 4: Start the CDC Sink task** + +Once the slot and publication exist, CDC Sink will detect them on startup and +proceed with the initial load. + + +The slot and publication names are determined at task creation time and do not change +when you later modify the task. If you created these objects manually, the same names +will continue to be used regardless of subsequent configuration changes. + + + + + + +You can explicitly specify the replication slot and publication names by setting +`CdcSinkPostgresSettings` on the task configuration: + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Postgres = new CdcSinkPostgresSettings + { + SlotName = "orders_sync_slot", + PublicationName = "orders_sync_pub" + }, + Tables = [ ... ] +}; +``` + + + + +Custom names are useful when: + +* A database administrator pre-creates the slot and publication with human-readable + names before starting the task +* You are migrating from a previous CDC Sink task and want to reuse an existing slot + to avoid re-reading history +* You need predictable names across environments (dev/staging/prod) + +**Immutability:** Once set, `SlotName` and `PublicationName` are fixed for the +lifetime of the task. If you need different names, delete the task and create a new one. + + + + + +When `CdcSinkPostgresSettings` is not set (or `SlotName`/`PublicationName` are null), +CDC Sink generates unique names at task creation time using a GUID: + +* **Slot name**: `rvn_cdc_s_` +* **Publication name**: `rvn_cdc_p_` + +The GUID is generated once when the task is first created and stored with the task. + +**Example:** + + + + +```plain +rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 +rvn_cdc_p_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 +``` + + + + +The slot and publication share the same identifier, making it easy to match them to +a specific task. + + +The slot and publication names are generated **once at task creation** and then stored +with the task. Subsequent modifications to the task (adding tables, changing mappings, +etc.) do not change the slot or publication names - the original names are always used. + + + + + + +To verify the slot and publication were created: + + + + +```sql +-- View CDC Sink replication slots +SELECT slot_name, plugin, slot_type, active +FROM pg_replication_slots +WHERE slot_name LIKE 'rvn_cdc_s_%'; + +-- View CDC Sink publications +SELECT p.pubname, c.relname AS table_name +FROM pg_publication p +JOIN pg_publication_rel pr ON pr.prpubid = p.oid +JOIN pg_class c ON c.oid = pr.prrelid +WHERE p.pubname LIKE 'rvn_cdc_p_%' +ORDER BY p.pubname, c.relname; +``` + + + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx new file mode 100644 index 0000000000..43e3d0dd72 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx @@ -0,0 +1,112 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink supports PostgreSQL as a source database using + [logical replication](https://www.postgresql.org/docs/current/logical-replication.html). + +* PostgreSQL streams row-level changes in real time through a logical replication slot. + CDC Sink consumes this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB + documents as they occur. + + + + + +Use a `SqlConnectionString` with `FactoryName` set to `"Npgsql"`: + + + + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + { + Name = "MyPostgresConnection", + FactoryName = "Npgsql", + ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=ravendb_cdc;Password=..." + })); +``` + + + + + + + + +PostgreSQL CDC Sink uses logical replication, which provides a continuous stream of +changes without polling. This gives low-latency, near-real-time replication. + +Key PostgreSQL concepts: + +* **Replication slot** - a server-side cursor that tracks how far a consumer has read. + CDC Sink creates and manages one automatically. +* **Publication** - defines which tables are included in the replication stream. + CDC Sink creates one automatically for the configured tables. +* **WAL (Write-Ahead Log)** - PostgreSQL retains WAL segments as long as a replication + slot has not consumed them. An inactive or paused task causes WAL to accumulate. + + + + + +PostgreSQL requires several configuration settings and permissions before CDC Sink +can connect. See [Prerequisites Checklist](../prerequisites-checklist.mdx) for the +full list, including: + +* WAL level set to `logical` +* Sufficient `max_replication_slots` and `max_wal_senders` +* A database user with `REPLICATION` privilege +* `REPLICA IDENTITY` configuration for embedded tables with surrogate keys + + + + + +The `CdcSinkPostgresSettings` object on `CdcSinkConfiguration` controls the replication +slot and publication names: + + + + +```csharp +Postgres = new CdcSinkPostgresSettings +{ + SlotName = "my_slot", + PublicationName = "my_publication" +} +``` + + + + +If omitted, GUID-based names are generated automatically when the task is created. +See [Initial Setup](../initial-setup.mdx) for details. + + + + + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. + +The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. + + + + + +* [Prerequisites Checklist](../prerequisites-checklist.mdx) - what to verify before creating a task +* [Initial Setup](../initial-setup.mdx) - creating the replication slot and publication +* [WAL Configuration](../wal-configuration.mdx) - PostgreSQL WAL settings +* [Permissions and Roles](../permissions-and-roles.mdx) - required database permissions +* [REPLICA IDENTITY](../replica-identity.mdx) - configuring DELETE event content +* [Monitoring PostgreSQL](../monitoring-postgres.mdx) - replication lag and WAL monitoring +* [Cleanup and Maintenance](../cleanup-and-maintenance.mdx) - dropping orphaned slots +* [Studio UI](../studio-ui.mdx) - creating tasks through the Studio interface + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx new file mode 100644 index 0000000000..c69cf844a8 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx @@ -0,0 +1,215 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* This example shows a multi-level embedded table structure combined with linked + table references, representing a product catalog with variants, attributes, and + a category reference. + +* In this article: + * [Source Schema](#source-schema) + * [REPLICA IDENTITY Setup](#replica-identity-setup) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + + + + + + + + +```sql +CREATE TABLE categories ( + category_id SERIAL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE products ( + product_id SERIAL PRIMARY KEY, + name TEXT NOT NULL, + category_id INT REFERENCES categories(category_id) +); + +CREATE TABLE product_variants ( + variant_id SERIAL PRIMARY KEY, + product_id INT NOT NULL REFERENCES products(product_id), + sku TEXT NOT NULL, + price NUMERIC(10,2) +); + +CREATE TABLE variant_attributes ( + attr_id SERIAL PRIMARY KEY, + -- denormalized root PK (required for deep nesting) + product_id INT NOT NULL REFERENCES products(product_id), + variant_id INT NOT NULL REFERENCES product_variants(variant_id), + attr_name TEXT NOT NULL, + attr_value TEXT NOT NULL +); +``` + + + + + + + + +Both `product_variants` and `variant_attributes` have surrogate PKs with join +columns that are not part of their primary keys. Rather than `REPLICA IDENTITY FULL` +(which includes all columns), we use targeted unique indexes covering just the join +and PK columns: + + + + +```sql +-- product_variants: join column is product_id, PK is variant_id +CREATE UNIQUE INDEX product_variants_replica_idx + ON product_variants (product_id, variant_id); +ALTER TABLE product_variants + REPLICA IDENTITY USING INDEX product_variants_replica_idx; + +-- variant_attributes: join columns are product_id + variant_id, PK is attr_id +CREATE UNIQUE INDEX variant_attributes_replica_idx + ON variant_attributes (product_id, variant_id, attr_id); +ALTER TABLE variant_attributes + REPLICA IDENTITY USING INDEX variant_attributes_replica_idx; +``` + + + + +See [REPLICA IDENTITY](../../replica-identity.mdx) for more details. + + + + + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "ProductCatalogSync", + ConnectionStringName = "MyPostgresConnection", + Tables = + [ + new CdcSinkTableConfig + { + CollectionName = "Products", + SourceTableName = "products", + PrimaryKeyColumns = ["product_id"], + Columns = + [ + new CdcColumnMapping() { Column = "product_id", Name = "ProductId" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + ], + // Linked table: category_id FK → document ID in Categories collection + LinkedTables = + [ + new CdcSinkLinkedTableConfig + { + SourceTableName = "categories", + PropertyName = "Category", + LinkedCollectionName = "Categories", + JoinColumns = ["category_id"] + } + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "product_variants", + PropertyName = "Variants", + Type = CdcSinkRelationType.Array, + JoinColumns = ["product_id"], + PrimaryKeyColumns = ["variant_id"], + Columns = + [ + new CdcColumnMapping() { Column = "variant_id", Name = "VariantId" }, + new CdcColumnMapping() { Column = "sku", Name = "Sku" }, + new CdcColumnMapping() { Column = "price", Name = "Price" }, + ], + // Deep-nested: attributes within each variant + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "variant_attributes", + PropertyName = "Attributes", + Type = CdcSinkRelationType.Array, + // FK to the direct parent (product_variants) PK. + // The root PK (product_id) must exist as a denormalized column but is NOT listed here. + JoinColumns = ["variant_id"], + PrimaryKeyColumns = ["attr_id"], + Columns = + [ + new CdcColumnMapping() { Column = "attr_id", Name = "AttrId" }, + new CdcColumnMapping() { Column = "attr_name", Name = "Name" }, + new CdcColumnMapping() { Column = "attr_value", Name = "Value" }, + ] + } + ] + } + ] + } + ] +}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +``` + + + + + + + + + + + +```json +{ + "ProductId": 42, + "Name": "Hiking Boot", + "Category": "Categories/3", + "Variants": [ + { + "VariantId": 101, + "Sku": "HB-BLK-10", + "Price": 89.99, + "Attributes": [ + { "AttrId": 1, "Name": "Color", "Value": "Black" }, + { "AttrId": 2, "Name": "Size", "Value": "10" } + ] + }, + { + "VariantId": 102, + "Sku": "HB-BRN-11", + "Price": 89.99, + "Attributes": [ + { "AttrId": 3, "Name": "Color", "Value": "Brown" }, + { "AttrId": 4, "Name": "Size", "Value": "11" } + ] + } + ], + "@metadata": { "@collection": "Products" } +} +``` + + + + + +The `Categories` collection is also synced by CDC Sink (it would be a separate +root table configuration). `"Categories/3"` is a standard RavenDB document ID +that enables the use of RavenDB includes when querying products. + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-denormalization-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-denormalization-csharp.mdx new file mode 100644 index 0000000000..05823352ad --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-denormalization-csharp.mdx @@ -0,0 +1,191 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* This example shows how to merge a normalized SQL schema (orders + order_lines) + into denormalized RavenDB documents with embedded arrays. + +* In this article: + * [Source Schema](#source-schema) + * [REPLICA IDENTITY Setup](#replica-identity-setup) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + * [What Happens on Change Events](#what-happens-on-change-events) + + + + + + + + +```sql +CREATE TABLE orders ( + order_id SERIAL PRIMARY KEY, + customer TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE order_lines ( + line_id SERIAL PRIMARY KEY, + order_id INT NOT NULL REFERENCES orders(order_id), + product TEXT NOT NULL, + qty INT NOT NULL, + unit_price NUMERIC(10,2) NOT NULL +); +``` + + + + + + + + +`order_lines` has a surrogate PK (`line_id`). The join column `order_id` is not +part of the primary key. Without `REPLICA IDENTITY FULL`, DELETE events for +`order_lines` rows would not include `order_id`, and CDC Sink could not find +the parent document. + + + + +```sql +ALTER TABLE order_lines REPLICA IDENTITY FULL; +``` + + + + +See [REPLICA IDENTITY](../../replica-identity.mdx). + + + + + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "OrdersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + { + new CdcSinkTableConfig + { + CollectionName = "Orders", + SourceTableName = "orders", + PrimaryKeyColumns = new List { "order_id" }, + Columns = + [ + new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, + new CdcColumnMapping() { Column = "customer", Name = "Customer" }, + new CdcColumnMapping() { Column = "status", Name = "Status" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, + ], + EmbeddedTables = new List + { + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "order_lines", + PropertyName = "Lines", + Type = CdcSinkRelationType.Array, + JoinColumns = new List { "order_id" }, + PrimaryKeyColumns = new List { "line_id" }, + Columns = + [ + new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, + new CdcColumnMapping() { Column = "product", Name = "Product" }, + new CdcColumnMapping() { Column = "qty", Name = "Qty" }, + new CdcColumnMapping() { Column = "unit_price", Name = "UnitPrice" }, + ] + } + } + } + } +}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +``` + + + + + + + + +SQL rows: + + + + +```plain +orders: order_id=1, customer='Acme Corp', status='pending' +order_lines: line_id=1, order_id=1, product='Widget A', qty=3, unit_price=9.99 +order_lines: line_id=2, order_id=1, product='Widget B', qty=1, unit_price=24.99 +``` + + + + +RavenDB document `Orders/1`: + + + + +```json +{ + "OrderId": 1, + "Customer": "Acme Corp", + "Status": "pending", + "CreatedAt": "2024-06-01T09:00:00+00:00", + "Lines": [ + { + "LineId": 1, + "Product": "Widget A", + "Qty": 3, + "UnitPrice": 9.99 + }, + { + "LineId": 2, + "Product": "Widget B", + "Qty": 1, + "UnitPrice": 24.99 + } + ], + "@metadata": { "@collection": "Orders" } +} +``` + + + + + + + + +**INSERT into `order_lines`:** +A new item is appended to the `Lines` array. + +**UPDATE to `order_lines`:** +CDC Sink finds the item by `line_id` within the `Lines` array and updates its properties. + +**DELETE from `order_lines`:** +CDC Sink finds the item by `line_id` and removes it from the array. +(Requires `REPLICA IDENTITY FULL` as configured above.) + +**UPDATE to `orders`:** +Only the root document properties (`Status`, etc.) are updated. The `Lines` array +is not affected. + +**DELETE from `orders`:** +The entire `orders/1` document is deleted, including all embedded lines. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-event-sourcing-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-event-sourcing-csharp.mdx new file mode 100644 index 0000000000..08317722e9 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-event-sourcing-csharp.mdx @@ -0,0 +1,171 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* This example shows how to use CDC Sink patches to maintain a computed aggregate + on a RavenDB document as individual event rows arrive from PostgreSQL. + +* In this article: + * [Source Schema](#source-schema) + * [Goal](#goal) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + * [Handling Deletes](#handling-deletes) + + + + + +An accounts table and a transactions table: + + + + +```sql +CREATE TABLE accounts ( + account_id SERIAL PRIMARY KEY, + owner TEXT NOT NULL, + currency TEXT NOT NULL DEFAULT 'USD' +); + +CREATE TABLE transactions ( + txn_id SERIAL PRIMARY KEY, + account_id INT NOT NULL REFERENCES accounts(account_id), + amount NUMERIC(12,2) NOT NULL, + type TEXT NOT NULL, -- 'credit' or 'debit' + created_at TIMESTAMPTZ DEFAULT now() +); +``` + + + + + + + + +Store each account as a RavenDB document with a `Balance` field that reflects the +running total of all transactions. Transaction rows are embedded as an array for +history, and `Balance` is maintained using patch logic. + + + + + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "AccountsSync", + ConnectionStringName = "MyPostgresConnection", + Tables = + [ + new CdcSinkTableConfig + { + CollectionName = "Accounts", + SourceTableName = "accounts", + PrimaryKeyColumns = ["account_id"], + Columns = + [ + new CdcColumnMapping() { Column = "account_id", Name = "AccountId" }, + new CdcColumnMapping() { Column = "owner", Name = "Owner" }, + new CdcColumnMapping() { Column = "currency", Name = "Currency" }, + ], + EmbeddedTables = + [ + new CdcSinkEmbeddedTableConfig + { + SourceTableName = "transactions", + PropertyName = "Transactions", + Type = CdcSinkRelationType.Array, + JoinColumns = ["account_id"], + PrimaryKeyColumns = ["txn_id"], + Columns = + [ + new CdcColumnMapping() { Column = "txn_id", Name = "TxnId" }, + new CdcColumnMapping() { Column = "amount", Name = "Amount" }, + new CdcColumnMapping() { Column = "type", Name = "Type" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, + ], + // Patch runs on the parent document for INSERT/UPDATE + Patch = """ + const oldAmount = $old?.Amount || 0; + const newAmount = $row.amount || 0; + const sign = $row.type === 'credit' ? 1 : -1; + const oldSign = $old?.Type === 'credit' ? 1 : -1; + this.Balance = (this.Balance || 0) + - (oldSign * oldAmount) + + (sign * newAmount); + """, + OnDelete = new CdcSinkOnDeleteConfig + { + Patch = """ + const deletedAmount = $old?.Amount || 0; + const sign = $old?.Type === 'credit' ? 1 : -1; + this.Balance = (this.Balance || 0) - (sign * deletedAmount); + """ + } + } + ] + } + ] +}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +``` + + + + + + + + +After three transactions (credit 100, debit 30, credit 50): + + + + +```json +{ + "AccountId": 1, + "Owner": "Alice", + "Currency": "USD", + "Balance": 120.00, + "Transactions": [ + { "TxnId": 1, "Amount": 100.00, "Type": "credit", "CreatedAt": "..." }, + { "TxnId": 2, "Amount": 30.00, "Type": "debit", "CreatedAt": "..." }, + { "TxnId": 3, "Amount": 50.00, "Type": "credit", "CreatedAt": "..." } + ], + "@metadata": { "@collection": "Accounts" } +} +``` + + + + + + + + +The `OnDelete.Patch` reverses the contribution of the deleted transaction to +`Balance`. This uses `$old` (the embedded item's last known state) rather than +`$row`, because for a DELETE event the embedded item's mapped values are in `$old`. + +Without the `OnDelete.Patch`, deleting a transaction row from SQL would remove +it from the `Transactions` array but leave `Balance` stale. The delete patch +keeps `Balance` consistent. + + +The patch uses delta logic (`$old` → `$row`) for idempotency. If a change is +re-applied after a failover, `$old` still reflects the state before the original +update, so the delta produces the same result. +See [Failover and Consistency](../../../../failover-and-consistency.mdx). + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx new file mode 100644 index 0000000000..fef149316b --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx @@ -0,0 +1,112 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* This example shows the minimal setup to replicate a single SQL table into a + RavenDB collection. + +* In this article: + * [Source Schema](#source-schema) + * [Task Configuration](#task-configuration) + * [Resulting Documents](#resulting-documents) + + + + + +A simple customers table: + + + + +```sql +CREATE TABLE customers ( + id SERIAL PRIMARY KEY, + name TEXT NOT NULL, + email TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() +); +``` + + + + + + + + + + + +```csharp +var config = new CdcSinkConfiguration +{ + Name = "CustomersSync", + ConnectionStringName = "MyPostgresConnection", + Tables = new List + { + new CdcSinkTableConfig + { + CollectionName = "Customers", + SourceTableName = "customers", + PrimaryKeyColumns = new List { "id" }, + Columns = + [ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() { Column = "email", Name = "Email" }, + new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, + ] + } + } +}; + +await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +``` + + + + + + + + +SQL row: + + + + +```plain +id=1, name='Alice', email='alice@example.com', created_at='2024-01-15 10:30:00+00' +``` + + + + +RavenDB document in collection `Customers` with ID `Customers/1`: + + + + +```json +{ + "Id": 1, + "Name": "Alice", + "Email": "alice@example.com", + "CreatedAt": "2024-01-15T10:30:00+00:00", + "@metadata": { + "@collection": "Customers" + } +} +``` + + + + +Document IDs are generated as `{collection}/{pk}` - for example, `Customers/1` +for a row with `id = 1`. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx index e84ae90e7f..688497dcda 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-complex-nesting.mdx @@ -3,6 +3,7 @@ title: "CDC Sink Example: Complex Nesting with Linked Tables" sidebar_label: Complex Nesting with Linked Tables description: "Multi-level embedded table structure combined with linked table references, representing a product catalog with variants, attributes, and a category reference." sidebar_position: 3 +supported_languages: ["csharp"] see_also: - title: "Simple Migration" link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" @@ -34,222 +35,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink Example: Complex Nesting with Linked Tables +import ExampleComplexNestingCsharp from './content/_example-complex-nesting-csharp.mdx'; - + -* This example shows a multi-level embedded table structure combined with linked - table references, representing a product catalog with variants, attributes, and - a category reference. - -* In this article: - * [Source Schema](#source-schema) - * [REPLICA IDENTITY Setup](#replica-identity-setup) - * [Task Configuration](#task-configuration) - * [Resulting Documents](#resulting-documents) - - - - - - - - -```sql -CREATE TABLE categories ( - category_id SERIAL PRIMARY KEY, - name TEXT NOT NULL -); - -CREATE TABLE products ( - product_id SERIAL PRIMARY KEY, - name TEXT NOT NULL, - category_id INT REFERENCES categories(category_id) -); - -CREATE TABLE product_variants ( - variant_id SERIAL PRIMARY KEY, - product_id INT NOT NULL REFERENCES products(product_id), - sku TEXT NOT NULL, - price NUMERIC(10,2) -); - -CREATE TABLE variant_attributes ( - attr_id SERIAL PRIMARY KEY, - -- denormalized root PK (required for deep nesting) - product_id INT NOT NULL REFERENCES products(product_id), - variant_id INT NOT NULL REFERENCES product_variants(variant_id), - attr_name TEXT NOT NULL, - attr_value TEXT NOT NULL -); -``` - - - - - - - - -Both `product_variants` and `variant_attributes` have surrogate PKs with join -columns that are not part of their primary keys. Rather than `REPLICA IDENTITY FULL` -(which includes all columns), we use targeted unique indexes covering just the join -and PK columns: - - - - -```sql --- product_variants: join column is product_id, PK is variant_id -CREATE UNIQUE INDEX product_variants_replica_idx - ON product_variants (product_id, variant_id); -ALTER TABLE product_variants - REPLICA IDENTITY USING INDEX product_variants_replica_idx; - --- variant_attributes: join columns are product_id + variant_id, PK is attr_id -CREATE UNIQUE INDEX variant_attributes_replica_idx - ON variant_attributes (product_id, variant_id, attr_id); -ALTER TABLE variant_attributes - REPLICA IDENTITY USING INDEX variant_attributes_replica_idx; -``` - - - - -See [REPLICA IDENTITY](../replica-identity.mdx) for more details. - - - - - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "ProductCatalogSync", - ConnectionStringName = "MyPostgresConnection", - Tables = - [ - new CdcSinkTableConfig - { - CollectionName = "Products", - SourceTableName = "products", - PrimaryKeyColumns = ["product_id"], - Columns = - [ - new CdcColumnMapping() { Column = "product_id", Name = "ProductId" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - ], - // Linked table: category_id FK → document ID in Categories collection - LinkedTables = - [ - new CdcSinkLinkedTableConfig - { - SourceTableName = "categories", - PropertyName = "Category", - LinkedCollectionName = "Categories", - JoinColumns = ["category_id"] - } - ], - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "product_variants", - PropertyName = "Variants", - Type = CdcSinkRelationType.Array, - JoinColumns = ["product_id"], - PrimaryKeyColumns = ["variant_id"], - Columns = - [ - new CdcColumnMapping() { Column = "variant_id", Name = "VariantId" }, - new CdcColumnMapping() { Column = "sku", Name = "Sku" }, - new CdcColumnMapping() { Column = "price", Name = "Price" }, - ], - // Deep-nested: attributes within each variant - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "variant_attributes", - PropertyName = "Attributes", - Type = CdcSinkRelationType.Array, - // FK to the direct parent (product_variants) PK. - // The root PK (product_id) must exist as a denormalized column but is NOT listed here. - JoinColumns = ["variant_id"], - PrimaryKeyColumns = ["attr_id"], - Columns = - [ - new CdcColumnMapping() { Column = "attr_id", Name = "AttrId" }, - new CdcColumnMapping() { Column = "attr_name", Name = "Name" }, - new CdcColumnMapping() { Column = "attr_value", Name = "Value" }, - ] - } - ] - } - ] - } - ] -}; - -await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -``` - - - - - - - - - - - -```json -{ - "ProductId": 42, - "Name": "Hiking Boot", - "Category": "Categories/3", - "Variants": [ - { - "VariantId": 101, - "Sku": "HB-BLK-10", - "Price": 89.99, - "Attributes": [ - { "AttrId": 1, "Name": "Color", "Value": "Black" }, - { "AttrId": 2, "Name": "Size", "Value": "10" } - ] - }, - { - "VariantId": 102, - "Sku": "HB-BRN-11", - "Price": 89.99, - "Attributes": [ - { "AttrId": 3, "Name": "Color", "Value": "Brown" }, - { "AttrId": 4, "Name": "Size", "Value": "11" } - ] - } - ], - "@metadata": { "@collection": "Products" } -} -``` - - - - - -The `Categories` collection is also synced by CDC Sink (it would be a separate -root table configuration). `"Categories/3"` is a standard RavenDB document ID -that enables the use of RavenDB includes when querying products. - - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx index 744fd21204..b766fef917 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization.mdx @@ -3,6 +3,7 @@ title: "CDC Sink Example: Denormalization with Embedded Tables" sidebar_label: Denormalization with Embedded Tables description: "How to merge a normalized SQL schema (orders + order_lines) into denormalized RavenDB documents with embedded arrays using CDC Sink." sidebar_position: 1 +supported_languages: ["csharp"] see_also: - title: "Simple Migration" link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" @@ -26,198 +27,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink Example: Denormalization with Embedded Tables +import ExampleDenormalizationCsharp from './content/_example-denormalization-csharp.mdx'; - + -* This example shows how to merge a normalized SQL schema (orders + order_lines) - into denormalized RavenDB documents with embedded arrays. - -* In this article: - * [Source Schema](#source-schema) - * [REPLICA IDENTITY Setup](#replica-identity-setup) - * [Task Configuration](#task-configuration) - * [Resulting Documents](#resulting-documents) - * [What Happens on Change Events](#what-happens-on-change-events) - - - - - - - - -```sql -CREATE TABLE orders ( - order_id SERIAL PRIMARY KEY, - customer TEXT NOT NULL, - status TEXT NOT NULL DEFAULT 'pending', - created_at TIMESTAMPTZ DEFAULT now() -); - -CREATE TABLE order_lines ( - line_id SERIAL PRIMARY KEY, - order_id INT NOT NULL REFERENCES orders(order_id), - product TEXT NOT NULL, - qty INT NOT NULL, - unit_price NUMERIC(10,2) NOT NULL -); -``` - - - - - - - - -`order_lines` has a surrogate PK (`line_id`). The join column `order_id` is not -part of the primary key. Without `REPLICA IDENTITY FULL`, DELETE events for -`order_lines` rows would not include `order_id`, and CDC Sink could not find -the parent document. - - - - -```sql -ALTER TABLE order_lines REPLICA IDENTITY FULL; -``` - - - - -See [REPLICA IDENTITY](../replica-identity.mdx). - - - - - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "OrdersSync", - ConnectionStringName = "MyPostgresConnection", - Tables = new List - { - new CdcSinkTableConfig - { - CollectionName = "Orders", - SourceTableName = "orders", - PrimaryKeyColumns = new List { "order_id" }, - Columns = - [ - new CdcColumnMapping() { Column = "order_id", Name = "OrderId" }, - new CdcColumnMapping() { Column = "customer", Name = "Customer" }, - new CdcColumnMapping() { Column = "status", Name = "Status" }, - new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, - ], - EmbeddedTables = new List - { - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "order_lines", - PropertyName = "Lines", - Type = CdcSinkRelationType.Array, - JoinColumns = new List { "order_id" }, - PrimaryKeyColumns = new List { "line_id" }, - Columns = - [ - new CdcColumnMapping() { Column = "line_id", Name = "LineId" }, - new CdcColumnMapping() { Column = "product", Name = "Product" }, - new CdcColumnMapping() { Column = "qty", Name = "Qty" }, - new CdcColumnMapping() { Column = "unit_price", Name = "UnitPrice" }, - ] - } - } - } - } -}; - -await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -``` - - - - - - - - -SQL rows: - - - - -```plain -orders: order_id=1, customer='Acme Corp', status='pending' -order_lines: line_id=1, order_id=1, product='Widget A', qty=3, unit_price=9.99 -order_lines: line_id=2, order_id=1, product='Widget B', qty=1, unit_price=24.99 -``` - - - - -RavenDB document `Orders/1`: - - - - -```json -{ - "OrderId": 1, - "Customer": "Acme Corp", - "Status": "pending", - "CreatedAt": "2024-06-01T09:00:00+00:00", - "Lines": [ - { - "LineId": 1, - "Product": "Widget A", - "Qty": 3, - "UnitPrice": 9.99 - }, - { - "LineId": 2, - "Product": "Widget B", - "Qty": 1, - "UnitPrice": 24.99 - } - ], - "@metadata": { "@collection": "Orders" } -} -``` - - - - - - - - -**INSERT into `order_lines`:** -A new item is appended to the `Lines` array. - -**UPDATE to `order_lines`:** -CDC Sink finds the item by `line_id` within the `Lines` array and updates its properties. - -**DELETE from `order_lines`:** -CDC Sink finds the item by `line_id` and removes it from the array. -(Requires `REPLICA IDENTITY FULL` as configured above.) - -**UPDATE to `orders`:** -Only the root document properties (`Status`, etc.) are updated. The `Lines` array -is not affected. - -**DELETE from `orders`:** -The entire `orders/1` document is deleted, including all embedded lines. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx index 2ffbcfed43..f22a8f0b8d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-event-sourcing.mdx @@ -3,6 +3,7 @@ title: "CDC Sink Example: Event Sourcing with Aggregation" sidebar_label: Event Sourcing with Aggregation description: "How to use CDC Sink patches to maintain a computed aggregate on a RavenDB document as individual event rows arrive from PostgreSQL." sidebar_position: 2 +supported_languages: ["csharp"] see_also: - title: "Simple Migration" link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration" @@ -30,178 +31,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink Example: Event Sourcing with Aggregation +import ExampleEventSourcingCsharp from './content/_example-event-sourcing-csharp.mdx'; - + -* This example shows how to use CDC Sink patches to maintain a computed aggregate - on a RavenDB document as individual event rows arrive from PostgreSQL. - -* In this article: - * [Source Schema](#source-schema) - * [Goal](#goal) - * [Task Configuration](#task-configuration) - * [Resulting Documents](#resulting-documents) - * [Handling Deletes](#handling-deletes) - - - - - -An accounts table and a transactions table: - - - - -```sql -CREATE TABLE accounts ( - account_id SERIAL PRIMARY KEY, - owner TEXT NOT NULL, - currency TEXT NOT NULL DEFAULT 'USD' -); - -CREATE TABLE transactions ( - txn_id SERIAL PRIMARY KEY, - account_id INT NOT NULL REFERENCES accounts(account_id), - amount NUMERIC(12,2) NOT NULL, - type TEXT NOT NULL, -- 'credit' or 'debit' - created_at TIMESTAMPTZ DEFAULT now() -); -``` - - - - - - - - -Store each account as a RavenDB document with a `Balance` field that reflects the -running total of all transactions. Transaction rows are embedded as an array for -history, and `Balance` is maintained using patch logic. - - - - - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "AccountsSync", - ConnectionStringName = "MyPostgresConnection", - Tables = - [ - new CdcSinkTableConfig - { - CollectionName = "Accounts", - SourceTableName = "accounts", - PrimaryKeyColumns = ["account_id"], - Columns = - [ - new CdcColumnMapping() { Column = "account_id", Name = "AccountId" }, - new CdcColumnMapping() { Column = "owner", Name = "Owner" }, - new CdcColumnMapping() { Column = "currency", Name = "Currency" }, - ], - EmbeddedTables = - [ - new CdcSinkEmbeddedTableConfig - { - SourceTableName = "transactions", - PropertyName = "Transactions", - Type = CdcSinkRelationType.Array, - JoinColumns = ["account_id"], - PrimaryKeyColumns = ["txn_id"], - Columns = - [ - new CdcColumnMapping() { Column = "txn_id", Name = "TxnId" }, - new CdcColumnMapping() { Column = "amount", Name = "Amount" }, - new CdcColumnMapping() { Column = "type", Name = "Type" }, - new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, - ], - // Patch runs on the parent document for INSERT/UPDATE - Patch = """ - const oldAmount = $old?.Amount || 0; - const newAmount = $row.amount || 0; - const sign = $row.type === 'credit' ? 1 : -1; - const oldSign = $old?.Type === 'credit' ? 1 : -1; - this.Balance = (this.Balance || 0) - - (oldSign * oldAmount) - + (sign * newAmount); - """, - OnDelete = new CdcSinkOnDeleteConfig - { - Patch = """ - const deletedAmount = $old?.Amount || 0; - const sign = $old?.Type === 'credit' ? 1 : -1; - this.Balance = (this.Balance || 0) - (sign * deletedAmount); - """ - } - } - ] - } - ] -}; - -await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -``` - - - - - - - - -After three transactions (credit 100, debit 30, credit 50): - - - - -```json -{ - "AccountId": 1, - "Owner": "Alice", - "Currency": "USD", - "Balance": 120.00, - "Transactions": [ - { "TxnId": 1, "Amount": 100.00, "Type": "credit", "CreatedAt": "..." }, - { "TxnId": 2, "Amount": 30.00, "Type": "debit", "CreatedAt": "..." }, - { "TxnId": 3, "Amount": 50.00, "Type": "credit", "CreatedAt": "..." } - ], - "@metadata": { "@collection": "Accounts" } -} -``` - - - - - - - - -The `OnDelete.Patch` reverses the contribution of the deleted transaction to -`Balance`. This uses `$old` (the embedded item's last known state) rather than -`$row`, because for a DELETE event the embedded item's mapped values are in `$old`. - -Without the `OnDelete.Patch`, deleting a transaction row from SQL would remove -it from the `Transactions` array but leave `Balance` stale. The delete patch -keeps `Balance` consistent. - - -The patch uses delta logic (`$old` → `$row`) for idempotency. If a change is -re-applied after a failover, `$old` still reflects the state before the original -update, so the delta produces the same result. -See [Failover and Consistency](../../../failover-and-consistency.mdx). - - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx index 06f996aef1..e4f3ceed47 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-simple-migration.mdx @@ -3,6 +3,7 @@ title: "CDC Sink Example: Simple Table Migration" sidebar_label: Simple Table Migration description: "Minimal setup to replicate a single SQL table into a RavenDB collection using CDC Sink." sidebar_position: 0 +supported_languages: ["csharp"] see_also: - title: "Denormalization" link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/example-denormalization" @@ -26,119 +27,13 @@ see_also: path: "Server > CDC Sink" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink Example: Simple Table Migration +import ExampleSimpleMigrationCsharp from './content/_example-simple-migration-csharp.mdx'; - + -* This example shows the minimal setup to replicate a single SQL table into a - RavenDB collection. - -* In this article: - * [Source Schema](#source-schema) - * [Task Configuration](#task-configuration) - * [Resulting Documents](#resulting-documents) - - - - - -A simple customers table: - - - - -```sql -CREATE TABLE customers ( - id SERIAL PRIMARY KEY, - name TEXT NOT NULL, - email TEXT NOT NULL, - created_at TIMESTAMPTZ DEFAULT now() -); -``` - - - - - - - - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "CustomersSync", - ConnectionStringName = "MyPostgresConnection", - Tables = new List - { - new CdcSinkTableConfig - { - CollectionName = "Customers", - SourceTableName = "customers", - PrimaryKeyColumns = new List { "id" }, - Columns = - [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "name", Name = "Name" }, - new CdcColumnMapping() { Column = "email", Name = "Email" }, - new CdcColumnMapping() { Column = "created_at", Name = "CreatedAt" }, - ] - } - } -}; - -await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); -``` - - - - - - - - -SQL row: - - - - -```plain -id=1, name='Alice', email='alice@example.com', created_at='2024-01-15 10:30:00+00' -``` - - - - -RavenDB document in collection `Customers` with ID `Customers/1`: - - - - -```json -{ - "Id": 1, - "Name": "Alice", - "Email": "alice@example.com", - "CreatedAt": "2024-01-15T10:30:00+00:00", - "@metadata": { - "@collection": "Customers" - } -} -``` - - - - -Document IDs are generated as `{collection}/{pk}` - for example, `Customers/1` -for a row with `id = 1`. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx index 41f8a366b7..59f32acaf2 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/initial-setup.mdx @@ -3,6 +3,7 @@ title: "CDC Sink for PostgreSQL: Initial Setup" sidebar_label: Initial Setup description: "How CDC Sink creates and verifies the replication slot and publication on startup, with options for automatic or manual setup and custom naming." sidebar_position: 3 +supported_languages: ["csharp"] see_also: - title: "Prerequisites Checklist" link: "server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist" @@ -22,208 +23,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink for PostgreSQL: Initial Setup +import InitialSetupCsharp from './content/_initial-setup-csharp.mdx'; - + -* When CDC Sink starts, it verifies and (if it has the necessary permissions) creates - the **replication slot** and **publication** required for logical replication. - -* If the CDC Sink user does not have permission to create these objects, a database - administrator must create them manually before the task can start. - -* In this article: - * [Automatic Setup](#automatic-setup) - * [Manual Setup](#manual-setup) - * [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names) - * [Slot and Publication Naming (Auto-generated)](#slot-and-publication-naming-auto-generated) - * [Verifying Setup](#verifying-setup) - - - - - -If the CDC Sink user has the required permissions (see -[Permissions and Roles](./permissions-and-roles.mdx)), -CDC Sink will: - -1. Generate the replication slot and publication names (a GUID-based identifier) and store them with the task -2. Check whether they already exist -3. Create them if they do not exist -4. If configured tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` automatically (requires the user to have publication ownership or superuser access) -5. Begin the initial load - -No manual database administration is needed in this case. - - - - - -If the CDC Sink user does not have permission to create replication slots or -publications, a database administrator must create them before the task is started. - -**Step 1: Determine the slot and publication names** - -The simplest approach is to specify the names explicitly in `CdcSinkPostgresSettings` -so both you and the database administrator know what names to use. -See [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names). - -If using auto-generated names (no `Postgres` settings), CDC Sink generates names -using the `rvn_cdc_s_` and `rvn_cdc_p_` prefixes followed by a GUID. -See [Slot and Publication Naming](#slot-and-publication-naming-auto-generated) -for the naming scheme. - -You can also find the names CDC Sink expects by creating the task (it will fail to start) -and reading the error message, which includes the expected names. - -**Step 2: Create the publication** - -Create a publication that includes all the tables CDC Sink will replicate: - - - - -```sql -CREATE PUBLICATION rvn_cdc_p_ -FOR TABLE orders, order_lines, customers; -``` - - - - -The publication must include all tables from the task's root and embedded table -configurations. - -**Step 3: Create the replication slot** - - - - -```sql -SELECT pg_create_logical_replication_slot( - 'rvn_cdc_s_', - 'pgoutput' -); -``` - - - - -**Step 4: Start the CDC Sink task** - -Once the slot and publication exist, CDC Sink will detect them on startup and -proceed with the initial load. - - -The slot and publication names are determined at task creation time and do not change -when you later modify the task. If you created these objects manually, the same names -will continue to be used regardless of subsequent configuration changes. - - - - - - -You can explicitly specify the replication slot and publication names by setting -`CdcSinkPostgresSettings` on the task configuration: - - - - -```csharp -var config = new CdcSinkConfiguration -{ - Name = "OrdersSync", - ConnectionStringName = "MyPostgresConnection", - Postgres = new CdcSinkPostgresSettings - { - SlotName = "orders_sync_slot", - PublicationName = "orders_sync_pub" - }, - Tables = [ ... ] -}; -``` - - - - -Custom names are useful when: - -* A database administrator pre-creates the slot and publication with human-readable - names before starting the task -* You are migrating from a previous CDC Sink task and want to reuse an existing slot - to avoid re-reading history -* You need predictable names across environments (dev/staging/prod) - -**Immutability:** Once set, `SlotName` and `PublicationName` are fixed for the -lifetime of the task. If you need different names, delete the task and create a new one. - - - - - -When `CdcSinkPostgresSettings` is not set (or `SlotName`/`PublicationName` are null), -CDC Sink generates unique names at task creation time using a GUID: - -* **Slot name**: `rvn_cdc_s_` -* **Publication name**: `rvn_cdc_p_` - -The GUID is generated once when the task is first created and stored with the task. - -**Example:** - - - - -```plain -rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 -rvn_cdc_p_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 -``` - - - - -The slot and publication share the same identifier, making it easy to match them to -a specific task. - - -The slot and publication names are generated **once at task creation** and then stored -with the task. Subsequent modifications to the task (adding tables, changing mappings, -etc.) do not change the slot or publication names - the original names are always used. - - - - - - -To verify the slot and publication were created: - - - - -```sql --- View CDC Sink replication slots -SELECT slot_name, plugin, slot_type, active -FROM pg_replication_slots -WHERE slot_name LIKE 'rvn_cdc_s_%'; - --- View CDC Sink publications -SELECT p.pubname, c.relname AS table_name -FROM pg_publication p -JOIN pg_publication_rel pr ON pr.prpubid = p.oid -JOIN pg_class c ON c.oid = pr.prrelid -WHERE p.pubname LIKE 'rvn_cdc_p_%' -ORDER BY p.pubname, c.relname; -``` - - - - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx index b02f5bb598..0012360d4d 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/monitoring-postgres.mdx @@ -22,8 +22,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Monitoring PostgreSQL @@ -46,7 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; Check that CDC Sink replication slots are active and being consumed: - + ```sql SELECT slot_name, active, confirmed_flush_lsn @@ -73,7 +71,7 @@ for an extended period, investigate the task state in RavenDB Studio. Replication lag measures how far behind the slot is relative to the current WAL position: - + ```sql SELECT slot_name, @@ -103,7 +101,7 @@ An inactive or slow slot can cause WAL to accumulate on disk. Check approximate WAL retained per slot: - + ```sql SELECT slot_name, active, diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx index c13ae9e843..28c31b19eb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/overview.mdx @@ -3,121 +3,16 @@ title: "CDC Sink for PostgreSQL: Overview" sidebar_label: Overview description: "CDC Sink support for PostgreSQL - using logical replication to stream changes into RavenDB in real time." sidebar_position: -1 +supported_languages: ["csharp"] --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink for PostgreSQL: Overview +import OverviewCsharp from './content/_overview-csharp.mdx'; - + -* CDC Sink supports PostgreSQL as a source database using - [logical replication](https://www.postgresql.org/docs/current/logical-replication.html). - -* PostgreSQL streams row-level changes in real time through a logical replication slot. - CDC Sink consumes this stream and applies INSERTs, UPDATEs, and DELETEs to RavenDB - documents as they occur. - - - - - -Use a `SqlConnectionString` with `FactoryName` set to `"Npgsql"`: - - - - -```csharp -store.Maintenance.Send(new PutConnectionStringOperation( - new SqlConnectionString - { - Name = "MyPostgresConnection", - FactoryName = "Npgsql", - ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=ravendb_cdc;Password=..." - })); -``` - - - - - - - - -PostgreSQL CDC Sink uses logical replication, which provides a continuous stream of -changes without polling. This gives low-latency, near-real-time replication. - -Key PostgreSQL concepts: - -* **Replication slot** - a server-side cursor that tracks how far a consumer has read. - CDC Sink creates and manages one automatically. -* **Publication** - defines which tables are included in the replication stream. - CDC Sink creates one automatically for the configured tables. -* **WAL (Write-Ahead Log)** - PostgreSQL retains WAL segments as long as a replication - slot has not consumed them. An inactive or paused task causes WAL to accumulate. - - - - - -PostgreSQL requires several configuration settings and permissions before CDC Sink -can connect. See [Prerequisites Checklist](./prerequisites-checklist.mdx) for the -full list, including: - -* WAL level set to `logical` -* Sufficient `max_replication_slots` and `max_wal_senders` -* A database user with `REPLICATION` privilege -* `REPLICA IDENTITY` configuration for embedded tables with surrogate keys - - - - - -The `CdcSinkPostgresSettings` object on `CdcSinkConfiguration` controls the replication -slot and publication names: - - - - -```csharp -Postgres = new CdcSinkPostgresSettings -{ - SlotName = "my_slot", - PublicationName = "my_publication" -} -``` - - - - -If omitted, GUID-based names are generated automatically when the task is created. -See [Initial Setup](./initial-setup.mdx) for details. - - - - - -The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. - -The `SourceTableSchema` defaults to `"public"` when using PostgreSQL. - - - - - -* [Prerequisites Checklist](./prerequisites-checklist.mdx) - what to verify before creating a task -* [Initial Setup](./initial-setup.mdx) - creating the replication slot and publication -* [WAL Configuration](./wal-configuration.mdx) - PostgreSQL WAL settings -* [Permissions and Roles](./permissions-and-roles.mdx) - required database permissions -* [REPLICA IDENTITY](./replica-identity.mdx) - configuring DELETE event content -* [Monitoring PostgreSQL](./monitoring-postgres.mdx) - replication lag and WAL monitoring -* [Cleanup and Maintenance](./cleanup-and-maintenance.mdx) - dropping orphaned slots -* [Studio UI](./studio-ui.mdx) - creating tasks through the Studio interface - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx index c8b0f4ac68..eb6e36014c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx @@ -22,8 +22,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Permissions and Roles @@ -49,7 +47,7 @@ At a minimum, the CDC Sink user needs: Example: - + ```sql -- Grant replication privilege @@ -80,7 +78,7 @@ automatically, the user needs additional permissions: PostgreSQL 14+: - + ```sql GRANT pg_replication_slot_admin TO cdc_user; @@ -98,7 +96,7 @@ The user must either own the tables being published, or have `SUPERUSER`. Alternatively, you can grant `CREATE` on the database: - + ```sql GRANT CREATE ON DATABASE mydb TO cdc_user; @@ -131,7 +129,7 @@ application or admin user. Example setup: - + ```sql -- Create the user diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx index 92d34b9b22..4a8cb0b0d1 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx @@ -26,8 +26,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Prerequisites Checklist @@ -53,7 +51,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; Verify with: - + ```sql SHOW wal_level; @@ -69,7 +67,7 @@ SHOW wal_level; Verify with: - + ```sql SHOW max_replication_slots; @@ -83,7 +81,7 @@ SHOW max_replication_slots; Verify with: - + ```sql SHOW max_wal_senders; @@ -101,7 +99,7 @@ The database user in the connection string must have sufficient permissions. **Minimum required permissions:** - + ```sql -- Replication privilege (required for logical replication) @@ -118,7 +116,7 @@ GRANT SELECT ON TABLE order_lines TO cdc_user; **Optional (allows CDC Sink to configure replication automatically):** - + ```sql -- Create/drop replication slots diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx index 9d2a0d88f9..6390df72f3 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx @@ -18,8 +18,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Manual REPLICA IDENTITY Setup @@ -56,7 +54,7 @@ The simplest approach is to set `REPLICA IDENTITY FULL` on all embedded tables that CDC Sink will replicate: - + ```sql ALTER TABLE order_lines REPLICA IDENTITY FULL; @@ -80,7 +78,7 @@ the join columns and PK columns of the embedded table. **Step 1: Create a unique index covering the required columns** - + ```sql -- For order_lines: join column is order_id, PK is line_id @@ -94,7 +92,7 @@ CREATE UNIQUE INDEX order_lines_replica_idx **Step 2: Set REPLICA IDENTITY to use this index** - + ```sql ALTER TABLE order_lines @@ -119,7 +117,7 @@ or partial predicates. All columns in the index must be `NOT NULL`. Confirm that the desired `REPLICA IDENTITY` mode is set: - + ```sql SELECT c.relname, c.relreplident, diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx index 54aabf93af..6d98c3bba7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx @@ -18,8 +18,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: REPLICA IDENTITY @@ -88,7 +86,7 @@ For CDC Sink, `FULL` is the simplest and most compatible choice. **Example where REPLICA IDENTITY is needed:** - + ```sql -- order_lines has a surrogate PK (line_id), with order_id as foreign key @@ -111,7 +109,7 @@ ALTER TABLE order_lines REPLICA IDENTITY FULL; **Example where REPLICA IDENTITY is NOT needed:** - + ```sql -- If order_id is part of a composite PK, DEFAULT is sufficient @@ -132,7 +130,7 @@ CREATE TABLE order_lines ( - + ```sql SELECT c.relname, c.relreplident diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx index 4b0b8523df..59f0c535b7 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx @@ -30,8 +30,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: Studio UI diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx index 18b0e9e0ab..8b27ecf2ac 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/wal-configuration.mdx @@ -22,8 +22,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink for PostgreSQL: WAL Configuration @@ -46,7 +44,7 @@ import LanguageContent from "@site/src/components/LanguageContent"; Connect to your PostgreSQL instance and run: - + ```sql SHOW wal_level; @@ -81,7 +79,7 @@ This change requires a **PostgreSQL restart**. After restarting, verify the change took effect: - + ```sql SHOW wal_level; @@ -121,7 +119,7 @@ concurrent CDC Sink tasks or other replication consumers. Check current values: - + ```sql SHOW max_replication_slots; diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/content/_overview-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/content/_overview-csharp.mdx new file mode 100644 index 0000000000..975d397f15 --- /dev/null +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/content/_overview-csharp.mdx @@ -0,0 +1,80 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Panel from '@site/src/components/Panel'; + + + +* CDC Sink supports SQL Server as a source database using native + [SQL Server Change Data Capture](https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server). + +* SQL Server CDC captures row-level changes from the transaction log and stores them + in change tables. CDC Sink polls these change tables to stream INSERTs, UPDATEs, + and DELETEs into RavenDB documents. + + + + + +Use a `SqlConnectionString` with `FactoryName` set to `"Microsoft.Data.SqlClient"`: + + + + +```csharp +store.Maintenance.Send(new PutConnectionStringOperation( + new SqlConnectionString + { + Name = "MySqlServerConnection", + FactoryName = "Microsoft.Data.SqlClient", + ConnectionString = "Server=myserver;Database=mydb;Trusted_Connection=True;" + })); +``` + + + + + + + + +SQL Server CDC must be enabled on the source database and on each table you want +to capture: + + + + +```sql +-- Enable CDC on the database +EXEC sys.sp_cdc_enable_db; + +-- Enable CDC on a table +EXEC sys.sp_cdc_enable_table + @source_schema = N'dbo', + @source_name = N'orders', + @role_name = NULL; +``` + + + + +The SQL Server Agent service must be running for CDC to function. + + + + + +Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. +The `CdcSink.SqlServer.PollIntervalInSec` server configuration key controls how frequently +the task polls for new changes. See [Server Configuration](../../../server-configuration.mdx). + + + + + +The CDC Sink task configuration is the same across all database engines. +See [Configuration Reference](../../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. + +The `SourceTableSchema` defaults to `"dbo"` when using SQL Server. + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx index 506bdc07f7..3edc42fec9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx @@ -3,6 +3,7 @@ title: "CDC Sink for SQL Server: Overview" sidebar_label: Overview description: "CDC Sink support for SQL Server - using native SQL Server Change Data Capture to stream changes into RavenDB." sidebar_position: 0 +supported_languages: ["csharp"] see_also: - title: "Overview" link: "server/ongoing-tasks/cdc-sink/overview" @@ -18,87 +19,13 @@ see_also: path: "Server > CDC Sink > PostgreSQL" --- -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; -# CDC Sink for SQL Server: Overview +import OverviewCsharp from './content/_overview-csharp.mdx'; - + -* CDC Sink supports SQL Server as a source database using native - [SQL Server Change Data Capture](https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server). - -* SQL Server CDC captures row-level changes from the transaction log and stores them - in change tables. CDC Sink polls these change tables to stream INSERTs, UPDATEs, - and DELETEs into RavenDB documents. - - - - - -Use a `SqlConnectionString` with `FactoryName` set to `"Microsoft.Data.SqlClient"`: - - - - -```csharp -store.Maintenance.Send(new PutConnectionStringOperation( - new SqlConnectionString - { - Name = "MySqlServerConnection", - FactoryName = "Microsoft.Data.SqlClient", - ConnectionString = "Server=myserver;Database=mydb;Trusted_Connection=True;" - })); -``` - - - - - - - - -SQL Server CDC must be enabled on the source database and on each table you want -to capture: - - - - -```sql --- Enable CDC on the database -EXEC sys.sp_cdc_enable_db; - --- Enable CDC on a table -EXEC sys.sp_cdc_enable_table - @source_schema = N'dbo', - @source_name = N'orders', - @role_name = NULL; -``` - - - - -The SQL Server Agent service must be running for CDC to function. - - - - - -Unlike PostgreSQL (which uses streaming replication), SQL Server CDC Sink uses polling. -The `CdcSink.SqlServer.PollIntervalInSec` server configuration key controls how frequently -the task polls for new changes. See [Server Configuration](../../server-configuration.mdx). - - - - - -The CDC Sink task configuration is the same across all database engines. -See [Configuration Reference](../../manage-cdc-sink-tasks/configuration-reference.mdx) for full details. - -The `SourceTableSchema` defaults to `"dbo"` when using SQL Server. - - + + + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx index ae54f3934d..000f9c1c22 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-schema-changes.mdx @@ -30,8 +30,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Source Schema Changes @@ -85,7 +83,7 @@ column mapping on the fly. This makes PostgreSQL the **most resilient** to schem ### PostgreSQL Examples - + ```sql -- Transparent: adding an unmapped column @@ -140,7 +138,7 @@ then apply the next change. This ensures each change is simple and isolated. ### MySQL Examples - + ```sql -- Transparent: adding an unmapped column @@ -179,7 +177,7 @@ picks up the new instance. For **any** schema change on a SQL Server CDC-tracked table, follow this procedure: - + ```sql -- Step 1: ALTER the table @@ -234,7 +232,7 @@ CDC requires SQL Server Agent to be running. The capture job (which populates ch tables) and cleanup job (which purges old changes) are Agent jobs. - + ```sql -- Check Agent status diff --git a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx index 20ba802322..cfbb2bbab8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/troubleshooting.mdx @@ -38,8 +38,6 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; # CDC Sink: Troubleshooting @@ -206,7 +204,7 @@ if (related) { ... } 4. **Step limit exceeded** - patch scripts have a step quota. If the script is very long-running or loops over large arrays, it may hit `Patching.MaxStepsForScript`. - See the [configuration reference](../../../server/configuration/patching-configuration) for this setting. + See the [configuration reference](../../../server/configuration/patching-configuration.mdx) for this setting. From 68acefffdd66bd0f3446e2075aa2783b80ad2b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Mon, 6 Jul 2026 15:29:12 +0200 Subject: [PATCH 29/84] RDoc-3836 Apply second round of CDC Sink PR review comments --- .../content/_attachment-handling-csharp.mdx | 4 +- .../content/_column-mapping-csharp.mdx | 63 ++++++++++++++----- .../content/_delete-strategies-csharp.mdx | 6 +- .../content/_embedded-tables-csharp.mdx | 49 ++++++++++++--- .../content/_linked-tables-csharp.mdx | 19 ++++-- .../cdc-sink/content/_monitoring-csharp.mdx | 39 +++++++++--- .../cdc-sink/content/_patching-csharp.mdx | 29 +++++++-- .../content/_schema-design-csharp.mdx | 28 ++++++--- .../configuration-reference.mdx | 8 +-- .../cdc-sink/property-retention.mdx | 11 ++-- .../cdc-sink/server-configuration.mdx | 44 ++++++------- .../postgres/cleanup-and-maintenance.mdx | 10 +-- .../content/_initial-setup-csharp.mdx | 36 ++++++----- .../postgres/content/_overview-csharp.mdx | 17 +++-- .../_example-complex-nesting-csharp.mdx | 33 ++++++++++ .../_example-simple-migration-csharp.mdx | 5 +- .../postgres/permissions-and-roles.mdx | 14 +++-- .../postgres/prerequisites-checklist.mdx | 17 ++--- .../replica-identity-manual-setup.mdx | 4 +- .../postgres/replica-identity.mdx | 5 ++ .../postgres/studio-ui.mdx | 4 +- 21 files changed, 316 insertions(+), 129 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx index 83e1c65e50..7254d2d6d4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx @@ -68,8 +68,8 @@ new CdcSinkTableConfig The `content` column is stored as an attachment named `"file"` on the document. The `Name` value becomes the attachment name. The content type is determined by the -SQL column type: `application/octet-stream` for binary columns, `text/plain` for -text columns. +runtime value type (not the SQL column type): `application/octet-stream` for binary +values, `text/plain` for text values. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx index 4e0a045b86..95c42edbaa 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_column-mapping-csharp.mdx @@ -44,12 +44,10 @@ Columns = **`Name`:** Property name in the RavenDB document -The primary key column(s) do not need to be mapped. When included in `Columns`, -they become a regular document property. When omitted, the PK values are still used -to build the document ID - they just won't appear as a named property. - -Including the PK in the mapping is generally useful so the document carries its own -identifier, but it is not required. +Every column in `PrimaryKeyColumns` must also appear in `Columns`. It is then stored +as a regular document property, which CDC Sink reads back to match the correct embedded +array/map item on subsequent UPDATE/DELETE events. The document ID itself is built from +the PK's raw source-row value. @@ -147,8 +145,10 @@ document - accessible as `this.FinalPrice` inside a patch script. Column names (the `Column` values in `Columns`, plus any unmapped columns) are accessible in patch scripts via `$row.base_price` (for the current row's values). -`$old` contains the previous state of the document and uses **mapped property names** -(the `Name` values), not SQL column names. Unmapped columns do not appear in `$old`. +`$old` contains the previous stored value before the current change: for root-table +patches, the previous document; for embedded-table patches, the previous embedded item. +It uses mapped property names (`Name` values), not SQL column names. Unmapped columns +do not appear in `$old`. See [Patching: $row and $old](../patching.mdx#row-and-old-names-and-types) for details. @@ -156,9 +156,10 @@ See [Patching: $row and $old](../patching.mdx#row-and-old-names-and-types) for d -SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, SQL Server `nvarchar` -with JSON content) can be parsed into native JSON objects or arrays using -`CdcColumnType.Json`: +SQL columns that contain JSON data (e.g., PostgreSQL `jsonb`, MySQL `json`, SQL Server +`nvarchar` with JSON content) can be parsed into native JSON values using +`CdcColumnType.Json`. This handles both JSON objects/arrays and scalar JSON values +(strings, numbers, booleans, and `null`): @@ -180,7 +181,31 @@ Columns = Without `CdcColumnType.Json`, the JSON column value would be stored as a raw string. -With it, the value is parsed and stored as a nested object or array in the document. +With it, the value is parsed and stored as a nested object, array, or scalar value in +the document. + +The same mapping applies to a MySQL `json` column - the `Type = CdcColumnType.Json` +entry is identical regardless of the source provider: + + + + +```csharp +// MySQL `json` column +Columns = +[ + new CdcColumnMapping() { Column = "id", Name = "Id" }, + new CdcColumnMapping() { Column = "name", Name = "Name" }, + new CdcColumnMapping() + { + Column = "attributes", Name = "Attributes", + Type = CdcColumnType.Json + }, +] +``` + + + @@ -189,16 +214,22 @@ With it, the value is parsed and stored as a nested object or array in the docum The following rules apply to both root table and embedded table column mappings: - Each `Column` name must be unique within a table (no duplicate SQL column entries). -- Each `Name` must be unique within a table (no duplicate property or attachment names). +- Each `Name` must be unique within the table and must not duplicate any embedded or + linked table `PropertyName` on the same parent. - Both `Column` and `Name` are required and must be non-empty strings. - At least one entry is required - an empty `Columns` list is a validation error. +- Every column in `PrimaryKeyColumns` must also appear in `Columns`. It is then stored + as a regular document property, which CDC Sink reads back to match the correct embedded + array/map item on subsequent UPDATE/DELETE events. The document ID itself is built from + the PK's raw source-row value. -`SourceTableSchema` specifies the SQL schema containing the table. It defaults to -`"public"` for PostgreSQL if omitted. +`SourceTableSchema` specifies the SQL schema containing the table. If omitted, CDC Sink +uses the provider default: `public` for PostgreSQL, `dbo` for SQL Server, and the database +name from the connection string for MySQL/MariaDB. @@ -215,6 +246,6 @@ new CdcSinkTableConfig -For most PostgreSQL setups using the default `public` schema, this can be omitted. +When the table is in the provider's default schema, this can be omitted. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx index 0262cd94da..c2c5718ccd 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_delete-strategies-csharp.mdx @@ -59,6 +59,10 @@ public class CdcSinkOnDeleteConfig * If `IgnoreDeletes = true`, the deletion is skipped after the patch runs * If `IgnoreDeletes = false` (default), the deletion proceeds after the patch runs +A DELETE event is discarded outright only when `IgnoreDeletes == true` **and** `Patch == null` +(that is, `OnDelete.IgnoreDeletes = true` with no `OnDelete.Patch`). If a delete patch is +configured, the event is still routed so the patch can run - even when `IgnoreDeletes = true`. + When `IgnoreDeletes = true`, CDC Sink skips the delete but still **saves any changes made to `this`** in the patch. This means a patch can modify the document (e.g., @@ -157,7 +161,7 @@ The same `OnDelete` configuration works on embedded tables. For embedded tables: * `Patch` runs on the **parent document** (not the embedded item) * `$old` contains the embedded item's last known state before deletion -* `IgnoreDeletes = true` prevents the item from being removed from the array/map +* `IgnoreDeletes = true` prevents the item from being removed from the array/map/value **Example: Keep deleted items in an audit array** diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx index 3aafc8869f..660b3d6a5e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx @@ -22,6 +22,12 @@ import Panel from '@site/src/components/Panel'; +Each embedded table is configured with a `CdcSinkEmbeddedTableConfig` object inside the +root table's `EmbeddedTables` list. This configuration defines the related SQL table, the +parent document property that will hold the embedded data, the join columns used to find +the parent document, the embedded table's primary key columns, and the columns to store in +each embedded item. + `CdcSinkEmbeddedTableConfig` is placed inside a root table's `EmbeddedTables` list: @@ -30,7 +36,7 @@ import Panel from '@site/src/components/Panel'; ```csharp new CdcSinkEmbeddedTableConfig { - SourceTableSchema = "public", // SQL schema (optional) + SourceTableSchema = "public", // SQL schema (provider-specific; "public" for PostgreSQL) SourceTableName = "order_lines", // SQL table name PropertyName = "Lines", // Property name in parent document Type = CdcSinkRelationType.Array, // Array, Map, or Value @@ -58,20 +64,24 @@ new CdcSinkEmbeddedTableConfig the parent's primary key. CDC Sink uses these columns to route each row to the correct parent document. -The `JoinColumns` values must exactly match the parent's `PrimaryKeyColumns`: +`JoinColumns` are the embedded table's foreign key columns. They must correspond to the +parent's `PrimaryKeyColumns` in the same order and count, but the column names can differ: ```csharp // Parent root table: -PrimaryKeyColumns = ["order_id"] +PrimaryKeyColumns = ["id"] // Embedded table - correct: -JoinColumns = ["order_id"] // References parent's PK column +JoinColumns = ["order_id"] // FK that references the parent's PK ("id"); + // the name can differ, but it must correspond + // to the parent's PK in the same order/count // Embedded table - INCORRECT: -JoinColumns = ["customer_id"] // Does not reference the parent's PK +JoinColumns = ["order_id", "line_no"] // Column count does not match the parent's + // single-column PrimaryKeyColumns ``` @@ -122,11 +132,13 @@ JoinColumns = ["order_id"] -With `order_id` in the primary key, DELETE events include it by default and no additional -source database configuration is needed. +With `order_id` in the primary key, PostgreSQL DELETE events include it by default and no +additional REPLICA IDENTITY configuration is needed. Alternatively, set `OnDelete.IgnoreDeletes = true` to skip delete routing entirely -if deletes on that embedded table don't need to be processed. +if deletes on that embedded table don't need to be processed. This only skips delete +routing when no `OnDelete.Patch` is configured. If a delete patch is configured, CDC Sink +still routes the delete to the parent document so the patch can run. See [Delete Strategies](../delete-strategies.mdx). @@ -161,6 +173,11 @@ PrimaryKeyColumns = ["invoice_date", "invoice_seq"] `CaseSensitiveKeys = true` on `CdcSinkEmbeddedTableConfig` if your keys are case-sensitive. +**Value embedded tables:** The matching behavior above applies to `Array` and `Map` +embedded tables. For `Value` embedded tables, there is only one embedded object at the +configured property. Updates merge into that object, and deletes set the property to +`null` unless `OnDelete` changes the behavior. + @@ -198,12 +215,19 @@ CREATE TABLE employees ( ```csharp // Configuration for the employees embedded table: JoinColumns = ["dept_id"] // FK to the direct parent (departments) PK -PrimaryKeyColumns = ["emp_id"] +PrimaryKeyColumns = ["emp_id"] // Local item key within each department ``` +Note that `PrimaryKeyColumns` here lists only `emp_id`, not the full physical +`PRIMARY KEY (company_id, dept_id, emp_id)` from the SQL schema. At each nesting level, +`PrimaryKeyColumns` identifies the item **within its direct parent's** array or map, so +only the local key column (`emp_id`) is needed. The root PK (`company_id`) still has to +be present as a denormalized column on the row (see the key constraint above) so CDC Sink +can locate the root document, but it is not part of the embedded table's `PrimaryKeyColumns`. + **Why is the root PK required?** When a CDC Sink event arrives for an `employees` row, CDC Sink needs to: @@ -248,10 +272,15 @@ new CdcSinkEmbeddedTableConfig +When `Type = CdcColumnType.Attachment`, the `Name` value is the attachment name, not a +property on the embedded item. In the example above, `Column = "thumbnail", Name = "thumb", +Type = CdcColumnType.Attachment` stores the `thumbnail` column as an attachment named +`thumb`; it does not add a `thumb` field to the embedded item. + A photo with `photo_num = 1` creates an attachment named `"Photos/1/thumb"` on the parent document. The attachment name is prefixed with the embedded path and PK to ensure uniqueness within the document. -When the embedded item is deleted, its attachments are automatically removed. +When the embedded item is removed, its attachments are automatically removed. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx index ec90d3f46e..ad8adf8bf4 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_linked-tables-csharp.mdx @@ -9,6 +9,11 @@ import Panel from '@site/src/components/Panel'; than embedding data. A foreign key value becomes a RavenDB document ID pointing to a related collection. +* `CdcSinkLinkedTableConfig` only creates the document ID reference in the current + document. It does **not** create or maintain the referenced document itself. + The referenced document exists only if the referenced table is also configured + as a root table. + * In this article: * [Basic Configuration](#basic-configuration) * [Composite Foreign Keys](#composite-foreign-keys) @@ -31,8 +36,7 @@ new CdcSinkTableConfig PrimaryKeyColumns = ["id"], Columns = [ - new CdcColumnMapping() { Column = "id", Name = "Id" }, - new CdcColumnMapping() { Column = "customer_id", Name = "CustomerId" }, + new CdcColumnMapping() { Column = "id", Name = "Id" }, ], LinkedTables = [ @@ -58,7 +62,6 @@ With `customer_id = 42`, the Orders document gets: ```json { "Id": 1, - "CustomerId": 42, "Customer": "Customers/42" } ``` @@ -67,7 +70,13 @@ With `customer_id = 42`, the Orders document gets: The `Customer` property is a RavenDB document ID, built from the `LinkedCollectionName` -and the join column values. Load the referenced document using +and the join column values. The `JoinColumns` values are appended to +`LinkedCollectionName` in the order listed. Use the same order as the referenced +table's `PrimaryKeyColumns`, so the generated ID matches the referenced document ID. + +This configuration only writes the `"Customers/42"` reference into the Orders document. +The `Customers/42` document itself exists only if the `customers` table is also +configured as a root table. Load the referenced document using [includes](../../../../client-api/session/loading-entities.mdx#load-with-includes) to avoid a second network call. @@ -109,7 +118,7 @@ With `customer_region = 'US'` and `customer_id = 42`, the document gets: | Data stored | Full nested object/array inside document | Document ID reference only | | Load pattern | Single document load | Load parent + include references | | Document size | Grows with embedded items | Parent document stays small | -| Updates to referenced data | Reflected via CDC | Reflected via CDC on the referenced collection | +| Updates to referenced data | Reflected via CDC | Reflected via CDC only when the referenced table is also configured as a root table | | Independence | Child has no meaning without parent | Referenced entity exists independently | | Typical use | Orders own LineItems | Orders reference Customers | diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx index 6d96da3075..8cc8db4ee8 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx @@ -18,16 +18,26 @@ import Panel from '@site/src/components/Panel'; -A CDC Sink task can be in one of the following states: +A CDC Sink task's status is reported through two separate fields: `TaskState` +describes whether the task is enabled, and `TaskConnectionStatus` describes the +task's live connection to the source database. -| State | Description | +**`TaskState`** - whether the task is enabled: + +| Value | Description | +|-------|-------------| +| `Enabled` | The task is enabled | +| `Disabled` | The task is disabled | +| `PartiallyEnabled` | The task is enabled but not fully active (for example, enabled at the task level while an individual component is disabled) | + +**`TaskConnectionStatus`** - the task's live connection state: + +| Value | Description | |-------|-------------| -| `Active` | Running normally - streaming changes or waiting for new changes | -| `ActiveByAnotherNode` | Another cluster node is the mentor; this node is a replica | -| `Disabled` | Manually disabled via Studio or API | -| `Error` | The task encountered an error and stopped | -| `FallbackMode` | Connection to the source database was lost; retrying | -| `NotOnThisNode` | This node does not hold the task | +| `Active` | The task is running on this node and connected | +| `NotActive` | The task is not currently running | +| `Reconnect` | The task is attempting to reconnect to the source database | +| `NotOnThisNode` | The task is not assigned to this node | The current state is visible in the **Ongoing Tasks** view in the Management Studio. @@ -68,11 +78,22 @@ The returned object includes: | Field | Description | |-------|-------------| -| `TaskState` | Current state of the task | +| `TaskState` | Whether the task is enabled (`Enabled` / `Disabled` / `PartiallyEnabled`) | +| `TaskConnectionStatus` | Live connection state (`Active` / `NotActive` / `Reconnect` / `NotOnThisNode`) | | `MentorNode` | Configured preferred node | | `ResponsibleNode` | Node currently running the task | | `Error` | Error message if the task is in error state | +The following CDC-specific fields report the task's recent processing activity: + +| Field | Description | +|-------|-------------| +| `LastBatchTime` | Timestamp of the last batch of changes that was processed | +| `LastCheckpoint` | Timestamp of the last CDC checkpoint (last processed position) that was persisted | +| `SecondsSinceLastBatch` | Number of seconds elapsed since the last batch was processed | +| `LastActivityTime` | Timestamp of the last task activity | +| `SecondsSinceLastActivity` | Number of seconds elapsed since the last task activity | + Detailed per-table statistics - including row counts and last processed position - are available through the Management Studio's ongoing tasks detail view. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx index 344d1ee515..8954ffe222 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx @@ -37,7 +37,7 @@ import Panel from '@site/src/components/Panel'; | INSERT | `Patch` | ✓ After column mapping | | UPDATE | `Patch` | ✓ After column mapping, on merged document | | DELETE (root table) | `OnDelete.Patch` | ✓ Before document is deleted | -| DELETE (embedded table) | `OnDelete.Patch` | ✓ On parent document before item is removed | +| DELETE (embedded table) | `OnDelete.Patch` | ✓ On parent document after item is removed | The `Patch` property on a table handles INSERT and UPDATE. The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. @@ -50,7 +50,7 @@ The `OnDelete.Patch` on `CdcSinkOnDeleteConfig` handles DELETE separately. |----------|-----------|------|-------------| | `this` | Always | object | The document being modified (root or parent for embedded) | | `$row` | Always | object | All SQL columns from the CDC event (mapped and unmapped) | -| `$old` | Always | object \| null | Previous state of the document (root patches) or embedded item (embedded patches). Null on INSERT. | +| `$old` | Always | object \| null | Contains the previous stored document or embedded item before the current change. It is `null` when there is no previous value, such as a new document or embedded item. | | `load(id)` | Always | function | Load a RavenDB document by ID | @@ -95,8 +95,8 @@ $row.customer_name // string $row.amount // number (from numeric/decimal column) // $old - mapped property names, stored JSON types -$old.CustomerName // string (as stored in RavenDB) -$old.Amount // number (as stored in RavenDB) +$old?.CustomerName // string, or undefined/null when there is no previous value +$old?.Amount // number, or undefined/null when there is no previous value // this - the document after column mapping has been applied for this event this.CustomerName // string (just set from $row.customer_name) @@ -111,6 +111,14 @@ Unmapped columns - those not listed in `Columns` - appear in `$row` but are neve written to the document and therefore never appear in `$old`. +The pair most likely to confuse a first-time reader is `$row` vs `this`: + +| | `$row` | `this` | +|--|--------|--------| +| **Contains** | The incoming SQL row from the CDC event | The RavenDB document after column mapping was applied | +| **Property names** | Original SQL column names (`customer_name`) | Mapped RavenDB property names (`CustomerName`) | +| **Value types** | Raw SQL types (see [$row Column Types](#row-column-types)) | Mapped JSON types written to the document | + @@ -119,6 +127,9 @@ written to the document and therefore never appear in `$old`. RavenDB property names). The JavaScript type of each value depends on the source database type. +The table below covers the **PostgreSQL** source provider. Other providers +(SQL Server, MySQL) map their column types to JavaScript values analogously. + ### PostgreSQL | PostgreSQL Type | JavaScript Type in `$row` | Notes | @@ -213,6 +224,12 @@ Patch = "this.TotalQuantity = (this.Lines || []).reduce((s, l) => s + l.Quantity `this` is the parent Orders document. This lets you recompute parent-level aggregates whenever an embedded item changes. + +Embedded table patches run with `this` set to the owning RavenDB document that contains +the embedded item, not to the embedded item itself. `$row` is the incoming +embedded-table row, and `$old` is the previous embedded item. + + @@ -407,6 +424,10 @@ if (customer) { +Use `load()` when you want to copy related document values into the current document +at patch time. The copied values are denormalized; later changes to the loaded document +do not automatically update this document. + `load()` returns `null` if the document does not exist or has not yet been created by CDC Sink (race condition when multiple tables are loading in parallel). Always check for null before accessing properties. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx index 7389badcf4..b841a54e2b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_schema-design-csharp.mdx @@ -171,6 +171,10 @@ new CdcSinkTableConfig With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. +A linked table does NOT load or maintain the linked document by itself. It only writes a +document ID reference such as `Customers/42` into the current document. The referenced +`Customers/42` document is maintained only if `customers` is also configured as a root table. + @@ -180,6 +184,10 @@ With `customer_id = 42`, the document gets `"Customer": "Customers/42"`. The `PrimaryKeyColumns` list defines which source columns are used to generate the document ID. All PK columns must be present in every INSERT, UPDATE, and DELETE event. +Every column listed in `PrimaryKeyColumns` must also appear in the `Columns` list. In the +samples, `Columns` is the list of `CdcColumnMapping` entries, where `Column` is the source +SQL column name and `Name` is the RavenDB document field name. + ### Embedded Tables (One Level) An embedded table needs: @@ -196,13 +204,14 @@ The `JoinColumns` must correspond 1:1 (same count and order) to the parent's `Pr | `[id]` | `[customer_id, order_id]` | ✗ Extra column not from parent PK | | `[id, year]` | `[order_id]` | ✗ Missing `order_year` | -### DELETE Events and REPLICA IDENTITY +### DELETE Events and REPLICA IDENTITY (PostgreSQL) For DELETE events, the source database must include the join column values so CDC Sink can route the delete to the correct parent document. If the join column is not part of the source table's primary key, the source database may -need additional configuration to include it in DELETE events. +need additional configuration to include it in DELETE events. For PostgreSQL, this is +controlled by REPLICA IDENTITY. See [REPLICA IDENTITY](../source-database-setup/postgres/replica-identity.mdx) for the PostgreSQL-specific requirement and how CDC Sink handles it automatically. @@ -292,13 +301,16 @@ CREATE TABLE employees ( -Including all routing columns in the primary key also avoids the need for REPLICA IDENTITY -configuration - the default DELETE events include all PK columns. +For PostgreSQL, including all routing columns in the primary key also avoids the need for +REPLICA IDENTITY configuration - the default DELETE events include all PK columns. +When defining a CDC Sink task, you choose how related SQL tables are represented in RavenDB: +embedded inside the parent document, or linked as references to separate documents. + The `Type` property on embedded tables controls the document structure: | Type | Use Case | Document Structure | @@ -316,9 +328,7 @@ Use when you need fast direct-key access within the document. **Value** - Stores a single embedded object. Use for many-to-one relationships (many orders share one customer). - - - +The following table summarizes how embedded and linked tables compare: | Consideration | Embedded | Linked | |--------------|----------|--------| @@ -328,6 +338,10 @@ Use for many-to-one relationships (many orders share one customer). | Document size | Grows with embedded items | Parent stays small | | Use case | Parent owns child (orders own lines) | Independent entities (orders reference customers) | + + + + **Use embedded tables** when: * The child entity has no meaning outside the parent (order lines without an order) * You always read the parent and child together diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx index 659bfbe961..428f04bdce 100644 --- a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/configuration-reference.mdx @@ -76,7 +76,7 @@ The top-level configuration object for a CDC Sink task. | FactoryName | Database Engine | |-------------|-----------------| | `Npgsql` | PostgreSQL | -| `System.Data.SqlClient` or `Microsoft.Data.SqlClient` | SQL Server | +| `Microsoft.Data.SqlClient` | SQL Server | | `MySql.Data.MySqlClient` or `MySqlConnector.MySqlConnectorFactory` | MySQL / MariaDB | @@ -117,7 +117,7 @@ Configures a root table - one SQL table mapped to one RavenDB collection. |----------|------|----------|-------------| | `CollectionName` | `string` | ✓ | RavenDB collection name (e.g., `"Orders"`) | | `SourceTableName` | `string` | ✓ | SQL table name (e.g., `"orders"`) | -| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `SourceTableSchema` | `string` | | SQL schema name. Default is provider-specific: PostgreSQL `"public"`, SQL Server `"dbo"`, MySQL/MariaDB the database name from the connection string. | | `PrimaryKeyColumns` | `List` | ✓ | SQL columns used for document ID generation | | `Columns` | `List` | ✓ | Column mappings - each entry defines a SQL column, its document property name, and how to store it | | `Patch` | `string` | | JavaScript patch for INSERT and UPDATE | @@ -135,7 +135,7 @@ Configures a table whose rows are embedded as nested objects within a parent doc | Property | Type | Required | Description | |----------|------|----------|-------------| | `SourceTableName` | `string` | ✓ | SQL table name | -| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `SourceTableSchema` | `string` | | SQL schema name. Default is provider-specific: PostgreSQL `"public"`, SQL Server `"dbo"`, MySQL/MariaDB the database name from the connection string. | | `PropertyName` | `string` | ✓ | Property name in the parent document (e.g., `"Lines"`) | | `Type` | `CdcSinkRelationType` | ✓ | `Array`, `Map`, or `Value` | | `JoinColumns` | `List` | ✓ | FK columns referencing parent's `PrimaryKeyColumns` | @@ -156,7 +156,7 @@ Configures a foreign key reference that becomes a document ID in the parent docu | Property | Type | Required | Description | |----------|------|----------|-------------| | `SourceTableName` | `string` | ✓ | SQL table name of the referenced table | -| `SourceTableSchema` | `string` | | SQL schema name. Default: `"public"` | +| `SourceTableSchema` | `string` | | SQL schema name. Default is provider-specific: PostgreSQL `"public"`, SQL Server `"dbo"`, MySQL/MariaDB the database name from the connection string. | | `PropertyName` | `string` | ✓ | Property name in the parent document (e.g., `"Customer"`) | | `LinkedCollectionName` | `string` | ✓ | Target RavenDB collection for ID generation (e.g., `"Customers"`) | | `JoinColumns` | `List` | ✓ | FK columns used to build the referenced document ID | diff --git a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx index 9627d5531c..440ec986bf 100644 --- a/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/property-retention.mdx @@ -52,7 +52,7 @@ When a CDC UPDATE arrives for a document that already exists: **Example:** -Initial SQL row → initial document: +Existing RavenDB document before the CDC UPDATE: @@ -100,11 +100,14 @@ Document after CDC UPDATE: * Properties not listed in the `Columns` list * Properties set in RavenDB directly (annotations, computed values, flags) -* Document metadata (unless the patch explicitly modifies it) **Overwritten on CDC update:** * Any property mapped via the `Columns` list - always updated to match the current SQL value +* Document metadata - a root CDC upsert builds a fresh `@metadata` object containing only + `@collection`, then the merge overwrites each mapped property (including `@metadata`) onto + the existing document while leaving unmapped properties untouched. As a result, custom + metadata set directly in RavenDB is replaced on every upsert unless a patch re-applies it. If you manually edit a property that is part of the `Columns` list, the next CDC UPDATE for that row will overwrite your edit with the SQL value. @@ -149,8 +152,8 @@ from the `Columns` list. These patch-computed properties follow the same merge r * If a patch sets `this.ComputedField = ...`, that value persists across future events where the patch doesn't explicitly change it -* If a patch sets a property that is also in the `Columns` list, the column mapping - value takes precedence (mapping is applied before patching) +* If a patch sets a property that is also in the `Columns` list, the patch value + takes precedence (mapping is applied first, then the patch runs and can override it) For aggregates maintained via patches (e.g., `RunningTotal`), the patch itself is responsible for keeping the value correct across INSERT, UPDATE, and DELETE events. diff --git a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx index 0a59fbaf8a..0850d04906 100644 --- a/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/server-configuration.mdx @@ -25,7 +25,6 @@ see_also: import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import Panel from '@site/src/components/Panel'; # CDC Sink: Server Configuration @@ -35,53 +34,54 @@ import Panel from '@site/src/components/Panel'; task behavior. * In this article: - * [Configuration Keys](#configuration-keys) + * [CdcSink.MaxBatchSize](#cdcsinkmaxbatchsize) + * [CdcSink.MaxFallbackTimeInSec](#cdcsinkmaxfallbacktimeinsec) + * [CdcSink.SqlServer.PollIntervalInSec](#cdcsinksqlserverpollintervalinsec) + * [CdcSink.Postgres.ReplicationTimeoutInSec](#cdcsinkpostgresreplicationtimeoutinsec) - - These keys can be set in `settings.json` or passed as environment variables. +All CDC Sink keys have a `Server-wide or per database` scope, so they can be set +per database as well as server-wide. See [Configuration Overview](../../../server/configuration/configuration-options.mdx). ---- - -#### `CdcSink.MaxBatchSize` - -**Default:** `1024` +## CdcSink.MaxBatchSize Target number of change rows processed in a single batch before writing to RavenDB. A batch may exceed this size when a source database transaction contains more rows, since transactions are never split across batches. Larger values increase throughput but also increase memory usage per batch. ---- - -#### `CdcSink.MaxFallbackTimeInSec` +- **Type**: `int` +- **Default**: `1024` +- **Scope**: Server-wide or per database -**Default:** `900` (15 minutes) +## CdcSink.MaxFallbackTimeInSec Maximum number of seconds the CDC Sink process will stay in fallback mode after a failure before retrying. Fallback duration doubles on each consecutive failure, up to this cap. The first retry after a failure waits 5 seconds; subsequent retries grow toward this cap (roughly doubling based on the time since the last error), with a small random jitter added to avoid synchronized retries across multiple tasks. ---- - -#### `CdcSink.SqlServer.PollIntervalInSec` +- **Type**: `int` +- **Default**: `900` (15 minutes) +- **Scope**: Server-wide or per database -**Default:** `1` +## CdcSink.SqlServer.PollIntervalInSec How frequently (in seconds) the SQL Server CDC Sink polls for new change rows. Lower values reduce latency but increase load on the source database. PostgreSQL and MySQL use streaming replication and ignore this setting. ---- - -#### `CdcSink.Postgres.ReplicationTimeoutInSec` +- **Type**: `int` +- **Default**: `1` +- **Scope**: Server-wide or per database -**Default:** `10` +## CdcSink.Postgres.ReplicationTimeoutInSec Timeout (in seconds) for the PostgreSQL replication connection. Controls both the server-side `wal_sender_timeout` (keepalives arrive at roughly half this interval) and the client-side `WalReceiverTimeout`. Lower values detect dead connections faster but increase keepalive traffic. SQL Server and MySQL ignore this setting. - +- **Type**: `int` +- **Default**: `10` +- **Scope**: Server-wide or per database diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx index f4cfb6f015..8f19761eeb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/cleanup-and-maintenance.mdx @@ -118,7 +118,7 @@ ORDER BY p.pubname, c.relname; ```sql -SELECT pg_drop_replication_slot('rvn_cdc_s_'); +SELECT pg_drop_replication_slot('rvn_cdc_s_'); ``` @@ -137,7 +137,7 @@ task must be stopped or deleted in RavenDB before the slot can be dropped. ```sql -DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; +DROP PUBLICATION IF EXISTS "rvn_cdc_p_"; ``` @@ -177,7 +177,7 @@ To resolve this: ```sql SELECT slot_name, active FROM pg_replication_slots -WHERE active = false; +WHERE active = false AND slot_name LIKE 'rvn_cdc_s_%'; ``` @@ -189,7 +189,7 @@ WHERE active = false; ```sql -SELECT pg_drop_replication_slot('rvn_cdc_s_'); +SELECT pg_drop_replication_slot('rvn_cdc_s_'); ``` @@ -203,7 +203,7 @@ SELECT pg_drop_replication_slot('rvn_cdc_s_'); The replication slot name and publication name are generated **once at task creation** -using a GUID and stored with the task. They do not change when you modify the task - +using the task id and stored with the task. They do not change when you modify the task - adding or removing tables, renaming the task, or changing any other configuration always reuses the same slot and publication. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx index bf88c4cdb5..03d7120603 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_initial-setup-csharp.mdx @@ -8,8 +8,9 @@ import Panel from '@site/src/components/Panel'; * When CDC Sink starts, it verifies and (if it has the necessary permissions) creates the **replication slot** and **publication** required for logical replication. -* If the CDC Sink user does not have permission to create these objects, a database - administrator must create them manually before the task can start. +* If the PostgreSQL user configured in the CDC Sink connection string does not have + permission to create these objects, a database administrator must create them + manually before the task can start. * In this article: * [Automatic Setup](#automatic-setup) @@ -22,11 +23,12 @@ import Panel from '@site/src/components/Panel'; -If the CDC Sink user has the required permissions (see +If the PostgreSQL user configured in the CDC Sink connection string has the required +PostgreSQL permissions (see [Permissions and Roles](../permissions-and-roles.mdx)), CDC Sink will: -1. Generate the replication slot and publication names (a GUID-based identifier) and store them with the task +1. Generate the replication slot and publication names (derived from the task id) and store them with the task 2. Check whether they already exist 3. Create them if they do not exist 4. If configured tables are missing from the publication, CDC Sink attempts `ALTER PUBLICATION ... ADD TABLE` automatically (requires the user to have publication ownership or superuser access) @@ -38,8 +40,9 @@ No manual database administration is needed in this case. -If the CDC Sink user does not have permission to create replication slots or -publications, a database administrator must create them before the task is started. +If the PostgreSQL user configured in the CDC Sink connection string does not have +permission to create replication slots or publications, a database administrator must +create them before the task is started. **Step 1: Determine the slot and publication names** @@ -48,7 +51,7 @@ so both you and the database administrator know what names to use. See [Specifying Custom Slot and Publication Names](#specifying-custom-slot-and-publication-names). If using auto-generated names (no `Postgres` settings), CDC Sink generates names -using the `rvn_cdc_s_` and `rvn_cdc_p_` prefixes followed by a GUID. +using the `rvn_cdc_s_` and `rvn_cdc_p_` prefixes followed by the task id. See [Slot and Publication Naming](#slot-and-publication-naming-auto-generated) for the naming scheme. @@ -63,7 +66,7 @@ Create a publication that includes all the tables CDC Sink will replicate: ```sql -CREATE PUBLICATION rvn_cdc_p_ +CREATE PUBLICATION rvn_cdc_p_ FOR TABLE orders, order_lines, customers; ``` @@ -80,7 +83,7 @@ configurations. ```sql SELECT pg_create_logical_replication_slot( - 'rvn_cdc_s_', + 'rvn_cdc_s_', 'pgoutput' ); ``` @@ -142,12 +145,13 @@ lifetime of the task. If you need different names, delete the task and create a When `CdcSinkPostgresSettings` is not set (or `SlotName`/`PublicationName` are null), -CDC Sink generates unique names at task creation time using a GUID: +CDC Sink generates unique names at task creation time using the task id: -* **Slot name**: `rvn_cdc_s_` -* **Publication name**: `rvn_cdc_p_` +* **Slot name**: `rvn_cdc_s_{taskId}` +* **Publication name**: `rvn_cdc_p_{taskId}` -The GUID is generated once when the task is first created and stored with the task. +Here `{taskId}` is the task's Raft etag, assigned once when the task is first created +and stored with the task. **Example:** @@ -155,14 +159,14 @@ The GUID is generated once when the task is first created and stored with the ta ```plain -rvn_cdc_s_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 -rvn_cdc_p_a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6 +rvn_cdc_s_9481 +rvn_cdc_p_9481 ``` -The slot and publication share the same identifier, making it easy to match them to +The slot and publication share the same task id, making it easy to match them to a specific task. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx index 43e3d0dd72..f7e5e16b4e 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/content/_overview-csharp.mdx @@ -27,7 +27,7 @@ store.Maintenance.Send(new PutConnectionStringOperation( { Name = "MyPostgresConnection", FactoryName = "Npgsql", - ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=ravendb_cdc;Password=..." + ConnectionString = "Host=myserver;Port=5432;Database=mydb;Username=cdc_user;Password=..." })); ``` @@ -44,9 +44,11 @@ changes without polling. This gives low-latency, near-real-time replication. Key PostgreSQL concepts: * **Replication slot** - a server-side cursor that tracks how far a consumer has read. - CDC Sink creates and manages one automatically. + CDC Sink creates and manages one automatically when the PostgreSQL user has + sufficient permissions. * **Publication** - defines which tables are included in the replication stream. - CDC Sink creates one automatically for the configured tables. + CDC Sink creates one automatically for the configured tables when the PostgreSQL + user has sufficient permissions. * **WAL (Write-Ahead Log)** - PostgreSQL retains WAL segments as long as a replication slot has not consumed them. An inactive or paused task causes WAL to accumulate. @@ -61,7 +63,9 @@ full list, including: * WAL level set to `logical` * Sufficient `max_replication_slots` and `max_wal_senders` * A database user with `REPLICATION` privilege -* `REPLICA IDENTITY` configuration for embedded tables with surrogate keys +* `REPLICA IDENTITY` configuration for embedded tables whose primary key is an + auto-generated column (for example a serial/identity ID rather than a natural + business key) @@ -84,7 +88,10 @@ Postgres = new CdcSinkPostgresSettings -If omitted, GUID-based names are generated automatically when the task is created. +If these names are omitted, they are generated automatically at task creation as +`rvn_cdc_s_{taskId}` (slot) and `rvn_cdc_p_{taskId}` (publication), where `{taskId}` +is the task's Raft etag. Automatic creation of the slot and publication requires the +PostgreSQL user to have sufficient permissions. See [Initial Setup](../initial-setup.mdx) for details. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx index c69cf844a8..a8c4b24bbb 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx @@ -89,6 +89,15 @@ See [REPLICA IDENTITY](../../replica-identity.mdx) for more details. +Multi-level nesting follows three rules: + +* Every descendant table must carry the root's primary key (here `product_id`) as + a denormalized column so CDC Sink can locate the root document. +* Each embedded level's `JoinColumns` points to its direct parent's primary key, + used to navigate the nested arrays. +* The root primary key is read from the row automatically - it does not need to be + listed in `JoinColumns` or in the `Columns` mapping. + @@ -171,6 +180,30 @@ await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); +SQL rows: + + + + +```sql +categories: category_id=3, name='Footwear' + +products: product_id=42, name='Hiking Boot', category_id=3 + +product_variants: variant_id=101, product_id=42, sku='HB-BLK-10', price=89.99 +product_variants: variant_id=102, product_id=42, sku='HB-BRN-11', price=89.99 + +variant_attributes: attr_id=1, product_id=42, variant_id=101, attr_name='Color', attr_value='Black' +variant_attributes: attr_id=2, product_id=42, variant_id=101, attr_name='Size', attr_value='10' +variant_attributes: attr_id=3, product_id=42, variant_id=102, attr_name='Color', attr_value='Brown' +variant_attributes: attr_id=4, product_id=42, variant_id=102, attr_name='Size', attr_value='11' +``` + + + + +RavenDB document `Products/42`: + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx index fef149316b..5909d767fc 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-simple-migration-csharp.mdx @@ -53,6 +53,7 @@ var config = new CdcSinkConfiguration CollectionName = "Customers", SourceTableName = "customers", PrimaryKeyColumns = new List { "id" }, + // Column = source SQL column, Name = RavenDB document property Columns = [ new CdcColumnMapping() { Column = "id", Name = "Id" }, @@ -107,6 +108,8 @@ RavenDB document in collection `Customers` with ID `Customers/1`: Document IDs are generated as `{collection}/{pk}` - for example, `Customers/1` -for a row with `id = 1`. +for a row with `id = 1`. The `id` column is the primary key: it must be included +in `Columns` (the task is rejected otherwise), and its value is used both to build +the document ID and to store the `Id` property. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx index eb6e36014c..2b36314e50 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/permissions-and-roles.mdx @@ -39,6 +39,10 @@ import Panel from '@site/src/components/Panel'; +The **CDC Sink user** is the PostgreSQL role in the connection string that the CDC Sink +task uses to connect to the source database. Throughout this page, `cdc_user` is used as +the example username for this role. + At a minimum, the CDC Sink user needs: * **`REPLICATION`** attribute - allows the user to initiate logical replication @@ -75,19 +79,19 @@ automatically, the user needs additional permissions: **Create/drop replication slots:** -PostgreSQL 14+: +Creating and dropping logical replication slots requires the `REPLICATION` role attribute: ```sql -GRANT pg_replication_slot_admin TO cdc_user; +ALTER USER cdc_user REPLICATION; ``` -PostgreSQL 10–13: Replication slot management requires `SUPERUSER`. +On PostgreSQL 10 - 13, replication slot management effectively requires `SUPERUSER`. **Create/drop publications:** @@ -139,8 +143,8 @@ CREATE USER cdc_user WITH PASSWORD 'secure_password' REPLICATION; GRANT SELECT ON TABLE orders TO cdc_user; GRANT SELECT ON TABLE order_lines TO cdc_user; --- If using PostgreSQL 14+ and want automatic slot management: -GRANT pg_replication_slot_admin TO cdc_user; +-- If you want CDC Sink to manage replication slots automatically: +-- (the REPLICATION attribute is already granted above) -- If user needs to create publications (requires table ownership or superuser): -- Option A: Grant ownership of tables diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx index 4a8cb0b0d1..2dfb7f13a9 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx @@ -115,19 +115,14 @@ GRANT SELECT ON TABLE order_lines TO cdc_user; **Optional (allows CDC Sink to configure replication automatically):** - - +To let CDC Sink create and drop its own replication slot and publication, the user needs: -```sql --- Create/drop replication slots --- This requires SUPERUSER or membership in pg_replication_slot_admin (PG 14+) +* **Create/drop replication slots:** the `REPLICATION` role attribute (granted with + `ALTER USER cdc_user REPLICATION;`). On PostgreSQL 10 - 13 this requires `SUPERUSER`. +* **Create/drop publications:** ownership of the tables being published, or `SUPERUSER`. + Alternatively, `CREATE` on the database. --- Create/drop publications --- This requires ownership of the tables being published, or SUPERUSER -``` - - - +See [Permissions and Roles](./permissions-and-roles.mdx) for the exact grants. If the CDC Sink user does not have permission to create publications and replication slots, a database administrator must set them up manually. diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx index 6390df72f3..75ed791632 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity-manual-setup.mdx @@ -73,7 +73,9 @@ or large columns. If WAL size is a concern, you can use a specific unique index that covers both -the join columns and PK columns of the embedded table. +the join columns and PK columns of the embedded table, because those become the +values PostgreSQL sends on DELETE, and CDC Sink needs both the join columns (to +find the parent document) and the PK columns (to find the matching embedded item). **Step 1: Create a unique index covering the required columns** diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx index 6d98c3bba7..0d7cc4c789 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx @@ -55,6 +55,11 @@ If the embedded table's join columns are part of the primary key, this is suffic If they are not - which is the common case when a table has a surrogate PK - the DELETE event will be missing the columns needed to route it. +UPDATE events always carry the new row, so routing an UPDATE normally works even +under `DEFAULT`. REPLICA IDENTITY chiefly matters for DELETE events, and for UPDATEs +that change the key or join columns (where the old key values are needed to locate +the existing embedded item). + diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx index 59f0c535b7..432b267954 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx @@ -64,7 +64,9 @@ To create a CDC Sink task in the Studio: The task list shows: * **Task name** and **connection string name** -* **State** - Active, Disabled, Error, or FallbackMode +* **Task state** (`TaskState`) - `Enabled`, `Disabled`, or `PartiallyEnabled` +* **Connection status** (`TaskConnectionStatus`) - `Active`, `NotActive`, `Reconnect`, + or `NotOnThisNode` * **Responsible node** - the cluster node currently running the task * **Progress** - during initial load, shows which tables have been scanned From f089ad0a286e81c1fa978910b8174041bb893304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Tue, 7 Jul 2026 15:56:30 +0200 Subject: [PATCH 30/84] RDoc-3836 Flatten nested clause in CDC Sink attachment-handling intro --- .../cdc-sink/content/_attachment-handling-csharp.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx index 7254d2d6d4..edfa3a4385 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_attachment-handling-csharp.mdx @@ -5,8 +5,8 @@ import Panel from '@site/src/components/Panel'; -* SQL columns - binary (`bytea`, `varbinary`, etc.) or text (`text`, `nvarchar`, etc.) - - can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` +* Binary columns (`bytea`, `varbinary`, etc.) and text columns (`text`, `nvarchar`, etc.) + can be stored as RavenDB **attachments** by setting `Type = CdcColumnType.Attachment` on the column mapping entry. * This applies to both root tables and embedded tables. From 66c141d08dcb3caf5b03582cfecf11eb58b1dcbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Le=C5=9Bniak?= Date: Tue, 7 Jul 2026 16:05:53 +0200 Subject: [PATCH 31/84] RDoc-3836 Apply further review comments --- .../content/_embedded-tables-csharp.mdx | 2 +- .../cdc-sink/content/_monitoring-csharp.mdx | 25 +++---------- .../cdc-sink/content/_patching-csharp.mdx | 6 ++-- .../_example-complex-nesting-csharp.mdx | 36 +++++++++++-------- .../postgres/replica-identity.mdx | 2 +- .../postgres/studio-ui.mdx | 6 ++-- 6 files changed, 35 insertions(+), 42 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx index 660b3d6a5e..d99ba2f57f 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_embedded-tables-csharp.mdx @@ -36,7 +36,7 @@ each embedded item. ```csharp new CdcSinkEmbeddedTableConfig { - SourceTableSchema = "public", // SQL schema (provider-specific; "public" for PostgreSQL) + SourceTableSchema = "public", // Source schema (default: "public" PostgreSQL, "dbo" SQL Server, db name for MySQL) SourceTableName = "order_lines", // SQL table name PropertyName = "Lines", // Property name in parent document Type = CdcSinkRelationType.Array, // Array, Map, or Value diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx index 8cc8db4ee8..b7bfcf3d7c 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_monitoring-csharp.mdx @@ -18,26 +18,11 @@ import Panel from '@site/src/components/Panel'; -A CDC Sink task's status is reported through two separate fields: `TaskState` -describes whether the task is enabled, and `TaskConnectionStatus` describes the -task's live connection to the source database. - -**`TaskState`** - whether the task is enabled: - -| Value | Description | -|-------|-------------| -| `Enabled` | The task is enabled | -| `Disabled` | The task is disabled | -| `PartiallyEnabled` | The task is enabled but not fully active (for example, enabled at the task level while an individual component is disabled) | - -**`TaskConnectionStatus`** - the task's live connection state: - -| Value | Description | -|-------|-------------| -| `Active` | The task is running on this node and connected | -| `NotActive` | The task is not currently running | -| `Reconnect` | The task is attempting to reconnect to the source database | -| `NotOnThisNode` | The task is not assigned to this node | +A CDC Sink task's status is reported through two standard ongoing-task fields: +`TaskState` (whether the task is enabled) and `TaskConnectionStatus` (the task's +live connection to the source database). For the full set of values and their +meanings, see +[Ongoing Task Operations](../../../../client-api/operations/maintenance/ongoing-tasks/ongoing-task-operations.mdx). The current state is visible in the **Ongoing Tasks** view in the Management Studio. diff --git a/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx index 8954ffe222..77e6405b10 100644 --- a/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/content/_patching-csharp.mdx @@ -95,8 +95,8 @@ $row.customer_name // string $row.amount // number (from numeric/decimal column) // $old - mapped property names, stored JSON types -$old?.CustomerName // string, or undefined/null when there is no previous value -$old?.Amount // number, or undefined/null when there is no previous value +$old?.CustomerName // string, or undefined when there is no previous value +$old?.Amount // number, or undefined when there is no previous value // this - the document after column mapping has been applied for this event this.CustomerName // string (just set from $row.customer_name) @@ -111,7 +111,7 @@ Unmapped columns - those not listed in `Columns` - appear in `$row` but are neve written to the document and therefore never appear in `$old`. -The pair most likely to confuse a first-time reader is `$row` vs `this`: +**`$row` vs `this` comparison** | | `$row` | `this` | |--|--------|--------| diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx index a8c4b24bbb..ad41d3633b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/examples/content/_example-complex-nesting-csharp.mdx @@ -182,25 +182,33 @@ await store.Maintenance.SendAsync(new AddCdcSinkOperation(config)); SQL rows: - - +**`categories`** -```sql -categories: category_id=3, name='Footwear' +| category_id | name | +|---|---| +| 3 | Footwear | -products: product_id=42, name='Hiking Boot', category_id=3 +**`products`** -product_variants: variant_id=101, product_id=42, sku='HB-BLK-10', price=89.99 -product_variants: variant_id=102, product_id=42, sku='HB-BRN-11', price=89.99 +| product_id | name | category_id | +|---|---|---| +| 42 | Hiking Boot | 3 | -variant_attributes: attr_id=1, product_id=42, variant_id=101, attr_name='Color', attr_value='Black' -variant_attributes: attr_id=2, product_id=42, variant_id=101, attr_name='Size', attr_value='10' -variant_attributes: attr_id=3, product_id=42, variant_id=102, attr_name='Color', attr_value='Brown' -variant_attributes: attr_id=4, product_id=42, variant_id=102, attr_name='Size', attr_value='11' -``` +**`product_variants`** - - +| variant_id | product_id | sku | price | +|---|---|---|---| +| 101 | 42 | HB-BLK-10 | 89.99 | +| 102 | 42 | HB-BRN-11 | 89.99 | + +**`variant_attributes`** + +| attr_id | product_id | variant_id | attr_name | attr_value | +|---|---|---|---|---| +| 1 | 42 | 101 | Color | Black | +| 2 | 42 | 101 | Size | 10 | +| 3 | 42 | 102 | Color | Brown | +| 4 | 42 | 102 | Size | 11 | RavenDB document `Products/42`: diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx index 0d7cc4c789..d6ba0e1bcd 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/replica-identity.mdx @@ -56,7 +56,7 @@ If they are not - which is the common case when a table has a surrogate PK - the DELETE event will be missing the columns needed to route it. UPDATE events always carry the new row, so routing an UPDATE normally works even -under `DEFAULT`. REPLICA IDENTITY chiefly matters for DELETE events, and for UPDATEs +under `DEFAULT`. REPLICA IDENTITY mostly matters for DELETE events, and for UPDATEs that change the key or join columns (where the old key values are needed to locate the existing embedded item). diff --git a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx index 432b267954..5ecad7a264 100644 --- a/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/source-database-setup/postgres/studio-ui.mdx @@ -64,9 +64,9 @@ To create a CDC Sink task in the Studio: The task list shows: * **Task name** and **connection string name** -* **Task state** (`TaskState`) - `Enabled`, `Disabled`, or `PartiallyEnabled` -* **Connection status** (`TaskConnectionStatus`) - `Active`, `NotActive`, `Reconnect`, - or `NotOnThisNode` +* **Task state** and **connection status** - see + [Ongoing Tasks - General Info](../../../../../studio/database/tasks/ongoing-tasks/general-info.mdx) + for the full set of state and connection-status values * **Responsible node** - the cluster node currently running the task * **Progress** - during initial load, shows which tables have been scanned From 3a844607a382ba6dca9d47a1f51275677dc513d9 Mon Sep 17 00:00:00 2001 From: Danielle9897 Date: Tue, 7 Jul 2026 17:40:10 +0300 Subject: [PATCH 32/84] RDoc-3836 Apply editorial updates to: overview & how-it-works --- .../ongoing-tasks/cdc-sink/how-it-works.mdx | 329 ++++++++++-------- .../ongoing-tasks/cdc-sink/overview.mdx | 130 +++---- 2 files changed, 245 insertions(+), 214 deletions(-) diff --git a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx index c9c4dfc824..0271ea0883 100644 --- a/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/how-it-works.mdx @@ -38,37 +38,41 @@ import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; - -# CDC Sink: How It Works +import ContentFrame from '@site/src/components/ContentFrame'; -* This page describes the internal operation of CDC Sink - how it connects to the - source database, loads initial data, streams changes, and handles failover. +* This article describes the internal operation of CDC Sink - how it verifies the source + database, loads initial data, streams changes, preserves transaction order, and handles failover. -* Understanding these mechanics is important when designing patches, planning for - failover, and setting up monitoring. +* Understanding these mechanics is important when designing patches, planning for failover, + and updating task configuration. * In this article: - * [Startup and Verification](#startup-and-verification) - * [Initial Load](#initial-load) - * [Change Streaming](#change-streaming) - * [Transaction Ordering](#transaction-ordering) - * [State Persistence and Failover](#state-persistence-and-failover) - * [Updating the Task Configuration](#updating-the-task-configuration) - * [Child Before Parent](#child-before-parent) + * [Startup and verification](#startup-and-verification) + * [Initial load](#initial-load) + * [Streaming changes](#streaming-changes) + * [Transaction ordering](#transaction-ordering) + * [State persistence](#state-persistence) + * [Failover behavior](#failover-behavior) + * [Updating the task configuration](#updating-the-task-configuration) + * [Embedded row before root row](#embedded-row-before-root-row) - + -When a CDC Sink task starts, it verifies that the source database is properly configured -before doing anything else. If any check fails, CDC Sink reports the exact issue and the -command an administrator needs to run to fix it. The task does not start until all checks pass. +When a CDC Sink task starts, it first verifies that the source database is ready for change capture. +The specific checks depend on the source database provider. + +If a check fails, CDC Sink reports the problem and the command an administrator can run to fix it. +The task does not continue until all checks pass. -The specific checks are provider-specific. After verification, CDC Sink creates the -necessary change-tracking infrastructure in the source database, then begins the initial load. +After verification, CDC Sink creates the required change-tracking infrastructure in the source database, +then begins the initial load. + + ### PostgreSQL CDC Sink checks: @@ -77,93 +81,106 @@ CDC Sink checks: * The connecting user has sufficient privileges * REPLICA IDENTITY is configured correctly for embedded tables that need delete routing -See the [PostgreSQL Prerequisites Checklist](./source-database-setup/postgres/prerequisites-checklist.mdx) +See the [PostgreSQL prerequisites checklist](../../../server/ongoing-tasks/cdc-sink/source-database-setup/postgres/prerequisites-checklist.mdx) for the full list of requirements. - + + + + ### SQL Server -CDC Sink checks that Change Data Capture is enabled on the database and on each captured -table, and that the SQL Server Agent service is running (it drives the CDC capture jobs). -See [CDC Sink for SQL Server](./source-database-setup/sql-server/overview.mdx). +CDC Sink checks that Change Data Capture is enabled on the database and on each captured table, +and that the SQL Server Agent service is running (it drives the CDC capture jobs). + +Learn more in [CDC Sink for SQL Server](../../../server/ongoing-tasks/cdc-sink/source-database-setup/sql-server/overview.mdx). + + + ### MySQL / MariaDB -CDC Sink checks that binary logging is enabled with `binlog_format = ROW`, and that the -connecting user has the `REPLICATION SLAVE` and `REPLICATION CLIENT` privileges required -to read the binlog. See [CDC Sink for MySQL](./source-database-setup/mysql/overview.mdx). - +CDC Sink checks that binary logging is enabled with `binlog_format = ROW`, +and that the connecting user has the `REPLICATION SLAVE` and `REPLICATION CLIENT` privileges required to read the binlog. + +Learn more in [CDC Sink for MySQL](../../../server/ongoing-tasks/cdc-sink/source-database-setup/mysql/overview.mdx). + + + - + -Before streaming live changes, CDC Sink performs a full scan of every configured root -and embedded table using keyset pagination ordered by primary key. **Linked tables** are -neither scanned during the initial load nor registered for change capture - a linked -table's foreign-key columns (present on the owning root or embedded row) are resolved into -a document-ID reference in the target collection. +Before streaming live changes, CDC Sink performs a full scan of every configured **root** and **embedded** table, using keyset pagination ordered by primary key. +**Linked** tables are neither scanned during the initial load nor registered for change capture - +their foreign-key columns, stored on the owning root or embedded row, are resolved into document-ID references in the target collection. -**Progress tracking:** Initial load progress is persisted per-table as a document in -RavenDB. If the task is restarted, it resumes from the last processed key rather than -re-scanning the entire table. +**Progress tracking:** + +During the initial load, CDC Sink stores each table's progress in the task's **state document**. +If the task is restarted, an interrupted initial load resumes from the last processed primary-key value instead of re-scanning the entire table. +The state document is described in [State persistence](#state-persistence). -**Batch pipelining:** While one batch is being written to RavenDB, the next batch is read -from the source database in parallel, so reads and writes overlap instead of running one -after another. +**Batch pipelining:** + +While one batch is being written to RavenDB, the next batch is read from the source database in parallel, +so reads and writes overlap instead of running one after another. -**Ordering:** Tables are scanned in dependency order. Root tables are loaded first, -then embedded tables. This minimises the number of stub documents created (see -[Child Before Parent](#child-before-parent) below). +**Ordering:** + +Tables are scanned in dependency order. +Root tables are loaded first, then embedded tables. +This minimizes the number of stub documents created (see [Child before parent](#child-before-parent) below). +--- + -**Change tracking is set up before the initial load begins - but CDC streaming does -not start until after the initial load completes.** The sequence is: - -1. Change-tracking infrastructure is created in the source database (e.g., a replication - slot and publication for PostgreSQL, or CDC capture for SQL Server) -2. The full initial table scan runs - changes made during this time are captured by the - source database but not yet consumed -3. Once the initial load is complete, CDC streaming starts from the position captured in step 1 - -This guarantees no changes are missed: anything that happened during the initial load -is retained by the source database and will be processed immediately after. - -For very large databases this means the source database must retain sufficient change -history for the duration of the initial load (e.g., enough WAL disk space on PostgreSQL, -or a long enough retention window on SQL Server CDC tables). Plan accordingly before -starting the initial load on large tables. + +#### Change tracking during initial load + +Change tracking is set up before the initial load begins, but CDC streaming does not start until after the initial load completes. +The sequence is: + +1. Change-tracking infrastructure is created in the source database + (e.g., a replication slot and publication for PostgreSQL, or CDC capture for SQL Server). +2. The full initial table scan runs - + changes made during this time are captured by the source database but not yet consumed. +3. Once the initial load is complete, CDC streaming starts from the position captured in step 1. + +This guarantees no changes are missed: anything that happened during the initial load is retained by the source database and will be processed immediately after. + +For very large databases, the source database must retain sufficient change history for the duration of the initial load +(e.g., enough WAL disk space on PostgreSQL, or a long enough retention window on SQL Server CDC tables). +Plan accordingly before starting the initial load on large tables. + - + -After the initial load completes, CDC Sink begins consuming changes from the source -database's change log, starting from the position captured **before** the initial load began. +After the initial load completes, CDC Sink begins consuming changes from the source database's change log, +starting from the position captured **before** the initial load began. -Changes arrive grouped by source database transaction, preserving the exact order -of operations. A transaction is only applied to RavenDB after it is fully committed -in the source database - partial transactions are never written. +CDC Sink processes changes in source transaction order. +Changes from a transaction are applied to RavenDB only after the transaction is committed in the source database, so partial transactions are never written. -**Document merging:** When an UPDATE arrives, CDC Sink merges the new column values -onto the existing RavenDB document. Properties that are not part of the column mapping -are preserved. This allows RavenDB-side annotations and computed fields to coexist with -CDC-managed properties. - -See [Property Retention](./property-retention.mdx) for details. +**Document merging:** +When an UPDATE arrives, CDC Sink merges the new column values onto the existing RavenDB document. +Properties that are not part of the column mapping are preserved. +This allows RavenDB-side annotations and computed fields to coexist with CDC-managed properties. +See [Property Retention](../../../server/ongoing-tasks/cdc-sink/property-retention.mdx) for details. - + -CDC Sink preserves the full order of operations within a source database transaction. -If a single transaction performs multiple operations on the same row, all operations -are applied in order. +CDC Sink preserves the full order of operations within a source database transaction. +If a single transaction performs multiple operations on the same row, all operations are applied in order. -**Example:** A source transaction that does: +For example, consider the following source transaction: - - + ```sql BEGIN; INSERT INTO items (id, name) VALUES (1, 'Alpha'); @@ -173,114 +190,124 @@ INSERT INTO items (id, name) VALUES (1, 'Gamma'); UPDATE items SET name = 'Delta' WHERE id = 1; COMMIT; ``` - -CDC Sink applies all five operations in order. The final document state is `name = 'Delta'`. +CDC Sink applies all five operations in order. The final RavenDB document has `name` set to `Delta`. -Multiple documents modified in the same transaction are also applied atomically within -a single RavenDB batch. +Multiple documents modified in the same transaction are also applied atomically within a single RavenDB batch. - + -### State Storage +* CDC Sink stores processing progress in a single **state document per task**, separate from the task definition: + * The task definition is stored in the database record. + * The processing state is stored as a RavenDB document in the `@cdc-states` system collection. -CDC Sink persists its progress as a **document in RavenDB**, alongside your data. -This document records: +* The **state document ID** is `@cdc-states/`. + This document tracks both streaming progress and initial-load progress: + * `LastLsn` - the last processed source-database change position, used to resume streaming after a restart. + * `Tables` - a per-table map, keyed by `schema.tableName`, that stores initial-load progress: + * `InitialLoadCompleted` - whether the full scan for that table has finished. + * `LastKeyValues` - the last primary-key values read, used to resume an interrupted initial load. -* The last acknowledged position in the source database's change log - (LSN for PostgreSQL and SQL Server, GTID for MySQL/MariaDB) -* Per-table initial load progress (which tables completed, and the last key scanned) +* Deleting a CDC Sink task removes the task definition, but leaves the matching state document. + If you create a new task with the same name, CDC Sink can reuse that state document and resume from the saved position. -Like any RavenDB document, this state document is subject to normal replication behavior. -Different nodes in a cluster may have different versions of this document at any point in time. + To start from scratch, create the replacement task with a different name. + Since no `@cdc-states/` document exists yet, CDC Sink has no saved position to resume from. + It performs a fresh initial load unless the task is configured with `SkipInitialLoad = true`. + + See [Troubleshooting](../../../server/ongoing-tasks/cdc-sink/troubleshooting.mdx) for details on state loss and recovery options. -### Failover Behavior +* Like any RavenDB document, this state document is subject to [internal replication](../../../server/clustering/replication/replication-overview.mdx#replication-types) behavior. + Different nodes in a cluster may temporarily have different versions of this document. + + -When the cluster elects a new mentor node for the CDC Sink task, the new node reads -the **replicated** state document - which may be older than the work the previous -mentor had completed but not yet replicated. + + +When the cluster elects a new mentor node for the CDC Sink task, the new node reads the state document that was replicated to it. +If the previous mentor processed changes but its latest state update had not yet replicated, the new mentor may resume from an earlier position. -The new mentor resumes from that replicated state. This means: +This means: -* **No data is lost** - CDC Sink resumes from a known position and the source database - retains all changes from that position onward -* **Some changes may be re-read** - Changes between the replicated state and the - previous mentor's actual progress will be processed again +* **No data is lost**: + CDC Sink resumes from a known position and the source database retains all changes from that position onward. +* **Some changes may be re-read**: + Changes between the replicated state and the previous mentor's actual progress will be processed again. -Re-reading is normal and expected. The document merge strategy means that re-applying -the same INSERT or UPDATE is safe - column values are simply overwritten with the same values. +Re-reading is normal and expected. The document merge strategy means that re-applying the same INSERT or UPDATE is safe - +column values are simply overwritten with the same values. -Patches that are not idempotent can produce incorrect results if the same change is -re-read after a failover. Design patches to handle re-processing safely. -See [Patching](./patching.mdx) for guidance. + +Patches that are not idempotent can produce incorrect results if the same change is re-read after a failover. +Design patches to handle re-processing safely. +See [Patching](../../../server/ongoing-tasks/cdc-sink/patching.mdx) for guidance. + - + -When you update a CDC Sink task configuration - for example, adding or removing columns -from the `Columns` list, changing a `Patch` script, or modifying embedded table -configuration - the changes take effect **only for new CDC events going forward**. +When you update a CDC Sink task configuration - +for example, by adding or removing columns from the `Columns` list, changing a `Patch` script, or modifying embedded table configuration - +the changes take effect **only for new CDC events going forward**. + +CDC Sink does not retroactively reprocess existing documents. +Documents that were already created retain their current structure. + +Common configuration changes behave as follows: -CDC Sink does not retroactively re-process existing documents. Documents that were -already created retain their current structure. This means: - -* **Adding a new column mapping** - Existing documents will not have the new property. +* **Adding a new column mapping**: + Existing documents will not have the new property. Only documents created or updated by a subsequent CDC event will include it. -* **Removing a column mapping** - Existing documents retain the property. It will no - longer be updated by CDC events, but it is not removed from existing documents. -* **Changing a patch script** - The new patch runs on future events only. Existing - documents reflect the results of the previous patch. -* **Adding an embedded or linked table** - Existing parent documents will not have the - new embedded data until a CDC event for the embedded table row arrives. +* **Removing a column mapping**: + Existing documents retain the property. + It will no longer be updated by CDC events, but it is not removed from existing documents. +* **Changing a patch script**: + The new patch runs on future events only. + Existing documents reflect the results of the previous patch. +* **Adding an embedded or linked table**: + Existing parent documents will not reflect the new embedded data or linked references + until a CDC event arrives for the relevant source row. +--- + -Simply restarting the task does not reprocess existing documents. A restart resumes from -the task's saved position (see [State Persistence and Failover](#state-persistence-and-failover)), -so it only continues streaming new changes. - + +#### Applying changes to existing documents - +* Simply restarting the task does not reprocess existing documents. + A restart resumes from the task's saved position (see [State persistence](#state-persistence)), + so it only continues streaming new changes. -To apply configuration changes to **all** documents (not just new events), delete -the CDC Sink task and recreate it. The new task will perform a fresh initial load, -re-processing all rows with the updated configuration. - -If you only need to backfill a specific property on existing documents, you can also -use a RavenDB [patch by query](../../../client-api/operations/patching/set-based.mdx) -to update existing documents independently of the CDC Sink task. +* To apply configuration changes to **all** documents (not just new events), delete the existing CDC Sink task + and create a new task with a new name and `SkipInitialLoad` disabled. The new task has no matching state document, + so it performs a fresh initial load, reprocessing all rows with the updated configuration. + +* If you only need to backfill a specific property on existing documents, + you can also use a RavenDB [patch by query](../../../client-api/operations/patching/set-based.mdx) to update existing documents independently of the CDC Sink task. - -The task's processing state is stored separately from the task definition, in the -`@cdc-states` system collection. A newly created task - even one created with the same -name as a deleted task - starts with no recorded position and performs a fresh full -initial load, unless it is configured with `SkipInitialLoad = true`. See -[Troubleshooting](./troubleshooting.mdx) for details on preserving or resetting this state. - - - + -Tables are scanned one at a time during the initial load. This means a child table can -contain rows that reference a parent row inserted *after* the parent table scan had -already completed. For example: Orders are fully scanned, then while scanning OrderLines, -an OrderLine is encountered that points to an Order that was inserted after the Orders -scan finished. +Tables are scanned one at a time during the initial load. +Root tables are scanned before their embedded tables, but source data can still change while the initial load is running. -In this case, CDC Sink creates a **stub document** for the parent containing only the -embedded child data. When CDC streaming begins after the initial load, it picks up the -missing parent row and merges its columns onto the stub document. +For example, _Orders_ are scanned first. Then, while _OrderLines_ are being scanned, +CDC Sink encounters an _OrderLine_ that belongs to an _Order_ inserted after the _Orders_ scan had already finished. -The final document will contain both the parent fields and all embedded items. No data -is lost - the brief intermediate state is resolved automatically once streaming starts. +In this case, CDC Sink creates a **stub document** for the root document containing only the embedded child data. +When CDC streaming begins after the initial load, it picks up the missing root row and merges its columns onto the stub document. - +The final document contains both the root fields and the embedded items. +No data is lost - the brief intermediate state is resolved automatically once streaming starts. + + \ No newline at end of file diff --git a/docs/server/ongoing-tasks/cdc-sink/overview.mdx b/docs/server/ongoing-tasks/cdc-sink/overview.mdx index 715f08f119..a67930154b 100644 --- a/docs/server/ongoing-tasks/cdc-sink/overview.mdx +++ b/docs/server/ongoing-tasks/cdc-sink/overview.mdx @@ -4,6 +4,10 @@ sidebar_label: Overview description: "An introduction to CDC Sink, the RavenDB ongoing task that reads Change Data Capture streams from a relational database and writes documents into RavenDB." sidebar_position: 0 see_also: + - title: "Create a Task" + link: "server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/create-task" + source: "docs" + path: "Server > CDC Sink" - title: "How It Works" link: "server/ongoing-tasks/cdc-sink/how-it-works" source: "docs" @@ -39,20 +43,17 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Panel from '@site/src/components/Panel'; -# CDC Sink: Overview - -* **CDC Sink** is a RavenDB ongoing task that reads **Change Data Capture (CDC)** - streams from a relational database and writes the resulting documents into RavenDB. - -* CDC Sink is the reverse of SQL ETL: instead of pushing data _from_ RavenDB _to_ a - relational database, CDC Sink _pulls_ data _from_ the relational database _into_ RavenDB. - The relational database is the source of truth; RavenDB receives a continuously-updated - document model derived from it. +* **CDC Sink** is a RavenDB ongoing task that reads **Change Data Capture (CDC) streams** from a relational database + and writes the resulting documents into RavenDB. -* CDC Sink maps normalized relational tables into RavenDB documents - - automatically and in real time. +* CDC Sink is the reverse of SQL ETL: + instead of pushing data _from_ RavenDB _to_ a relational database, + CDC Sink _pulls_ data _from_ the relational database _into_ RavenDB. + +* The relational database remains the source of truth, + while the CDC Sink task continuously maps normalized relational tables into RavenDB documents. * Supported source databases: * **PostgreSQL** - via logical replication @@ -60,64 +61,58 @@ import Panel from '@site/src/components/Panel'; * **MySQL / MariaDB** - via binlog replication * In this article: - * [Why Use CDC Sink](#why-use-cdc-sink) - * [How It Works](#how-it-works) - * [Task Lifecycle](#task-lifecycle) + * [Why use CDC Sink](#why-use-cdc-sink) + * [How it works](#how-it-works) + * [Task lifecycle](#task-lifecycle) * [Licensing](#licensing) - + -CDC Sink solves the problem of moving data from a relational database into RavenDB -without changing the source application. +CDC Sink solves the problem of moving data from a relational database into RavenDB without changing the source application. * **Migrate from SQL to RavenDB** - Transform normalized relational tables into RavenDB documents where an Order contains - embedded LineItems and a reference to the Customer - automatically and continuously, - without changing your application. + Automatically and continuously transform normalized relational tables into RavenDB documents, + such as an _Order_ document that embeds _LineItems_ and references a _Customer_ document, + without changing your application. * **Build a read-optimized view** - Your transactional system uses a relational database, but your API layer needs - denormalized documents. CDC Sink creates and maintains those documents without - touching your existing application. + Your transactional system uses a relational database, but your API layer needs denormalized documents. + CDC Sink creates and maintains those documents without touching your existing application. * **Gradual migration** - Keep your existing application running while RavenDB documents are built in the background. + Keep your existing application running while RavenDB documents are built in the background. Applications can start reading from RavenDB while writes still go to the relational database. * **Event-driven side effects** - Using JavaScript patches, every INSERT, UPDATE, or DELETE in the source database can - trigger custom logic in RavenDB - computing derived fields, maintaining running totals, - or writing custom transformations. + Using JavaScript patches, every INSERT, UPDATE, or DELETE in the source database can trigger custom logic in RavenDB - + computing derived fields, maintaining running totals, or writing custom transformations. - + -A CDC Sink task continuously reads changes from the source relational database and -applies them to RavenDB documents. +A CDC Sink task continuously reads changes from the source relational database and applies them to RavenDB documents. -### Initial Load +### Initial load -By default, when a CDC Sink task starts for the first time, it performs a full scan of -every configured table using keyset pagination. This populates RavenDB with the current -state of the data before streaming begins. +By default, when a CDC Sink task starts for the first time, it performs a full scan of every configured table using keyset pagination. +This populates RavenDB with the current state of the data before streaming begins. -The task can also be configured to skip the full scan and start from new CDC changes only, -without scanning existing rows - useful when you only need to capture changes going forward. +The task can also be configured to skip the full scan and start from new CDC changes only, without scanning existing rows - +useful when you only need to capture changes going forward. -Initial load progress is persisted per-table. If the task is restarted, it resumes -from where it left off rather than re-scanning. +Initial load progress is persisted per-table. +If the task is restarted, it resumes from where it left off rather than re-scanning. -### Change Streaming +### Streaming changes -After the initial load, CDC Sink switches to streaming changes in real time. -Changes are grouped into transactions, preserving the exact order of operations -from the source database. Partial transactions are never written to RavenDB - -all changes within a source database transaction are applied together. +After the initial load, CDC Sink switches to streaming changes continuously. +Changes are grouped into transactions, preserving the exact order of operations from the source database. +Partial transactions are never written to RavenDB - all changes within a source database transaction are applied together. -### Document Model +### Document model The relational model is mapped to RavenDB documents through configuration: @@ -125,33 +120,42 @@ The relational model is mapped to RavenDB documents through configuration: * **Embedded tables** become nested arrays or objects within parent documents * **Linked tables** become document ID references to _related documents_ -See [Schema Design](./schema-design.mdx) for details. +See [Schema design](../../../server/ongoing-tasks/cdc-sink/schema-design.mdx) for details. - + -1. **Create** - Define the task in Studio or via the Client API - Specify the connection string, table mappings, and transformation options +1. **Create** + Define the CDC Sink task in Studio or via the Client API. + Specify the connection string, table mappings, and transformation options. + See [Create a CDC Sink task](../../../server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/create-task.mdx). + You can later [Update](../../../server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/update-task.mdx) or + [Enable/Disable](../../../server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/enable-disable-task.mdx) the task. -2. **Verify** - CDC Sink verifies the source database is properly configured - Checks permissions, replication prerequisites, and table configuration +2. **Verify** + CDC Sink verifies that the source database is properly configured, + including permissions, replication prerequisites, and table configuration. -3. **Initial Load** - Full table scan populates RavenDB with current data - Progress is tracked per-table and persists across restarts +3. **Initial load** + Full table scan populates RavenDB with current data. + Progress is tracked per table and persists across restarts. -4. **Stream** - Real-time change streaming begins - All INSERTs, UPDATEs, and DELETEs are applied to RavenDB documents as they occur +4. **Stream** + Continuous change streaming begins. + All INSERTs, UPDATEs, and DELETEs are applied to RavenDB documents as they occur. -5. **Monitor** - View statistics, errors, and progress in Studio +5. **Monitor** + [Monitor the task state](../../../server/ongoing-tasks/cdc-sink/monitoring.mdx), + or [Get task info](../../../server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/get-task-info.mdx) via Studio or via the Client API. -6. **Retire** - Delete the task in RavenDB when no longer needed - - -When you retire a task, the change-tracking artifacts left in the source database -(for example, the PostgreSQL replication slot and publication) must be cleaned up by -the database administrator separately. - +6. **Retire** + Delete the task in RavenDB when no longer needed. + Retiring a task removes it on the **RavenDB** side only. + + Change-tracking artifacts created in the source database (such as a PostgreSQL replication slot and publication) + are **not** removed automatically and must be cleaned up by the source-database administrator. + Learn more in [Delete a CDC Sink task](../../../server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/delete-task.mdx). @@ -161,6 +165,6 @@ the database administrator separately. CDC Sink is available on an **Enterprise** license. -Learn more about licensing [here](../../../licensing/overview.mdx). +Learn more about licensing in [Licensing overview](../../../licensing/overview.mdx). From 45bf68bc88c9b06ea465f2eaa91fbf6a7b5d0a25 Mon Sep 17 00:00:00 2001 From: Danielle9897 Date: Wed, 8 Jul 2026 12:32:02 +0300 Subject: [PATCH 33/84] RDoc-3836 Added article: "Create CDC Sink Task": --- .../assets/create-task-1.png | Bin 0 -> 48427 bytes .../assets/create-task-10.png | Bin 0 -> 170769 bytes .../assets/create-task-11.png | Bin 0 -> 82105 bytes .../assets/create-task-12.png | Bin 0 -> 82612 bytes .../assets/create-task-2.png | Bin 0 -> 147652 bytes .../assets/create-task-3.png | Bin 0 -> 131971 bytes .../assets/create-task-4.png | Bin 0 -> 61589 bytes .../assets/create-task-5.png | Bin 0 -> 65474 bytes .../assets/create-task-6.png | Bin 0 -> 154451 bytes .../assets/create-task-7.png | Bin 0 -> 81070 bytes .../assets/create-task-8.png | Bin 0 -> 315597 bytes .../assets/create-task-9.png | Bin 0 -> 131027 bytes .../assets/snagit/create-task-1.snagx | Bin 0 -> 187362 bytes .../assets/snagit/create-task-10.snagx | Bin 0 -> 551835 bytes .../assets/snagit/create-task-11.snagx | Bin 0 -> 286172 bytes .../assets/snagit/create-task-12.snagx | Bin 0 -> 256242 bytes .../assets/snagit/create-task-2.snagx | Bin 0 -> 574936 bytes .../assets/snagit/create-task-3.snagx | Bin 0 -> 450069 bytes .../assets/snagit/create-task-4.snagx | Bin 0 -> 212359 bytes .../assets/snagit/create-task-5.snagx | Bin 0 -> 233221 bytes .../assets/snagit/create-task-6.snagx | Bin 0 -> 490104 bytes .../assets/snagit/create-task-7.snagx | Bin 0 -> 265764 bytes .../assets/snagit/create-task-8.snagx | Bin 0 -> 1014946 bytes .../assets/snagit/create-task-9.snagx | Bin 0 -> 425287 bytes .../content/_create-task-csharp.mdx | 384 ++++++++++++++++++ .../manage-cdc-sink-tasks/create-task.mdx | 35 ++ 26 files changed, 419 insertions(+) create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-1.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-10.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-11.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-12.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-2.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-3.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-4.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-5.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-6.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-7.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-8.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-9.png create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-1.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-10.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-11.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-12.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-2.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-3.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-4.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-5.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-6.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-7.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-8.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/snagit/create-task-9.snagx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/content/_create-task-csharp.mdx create mode 100644 docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/create-task.mdx diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-1.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9c7d441a5b9748ac363451789c99c949554edc GIT binary patch literal 48427 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 literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-10.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-10.png new file mode 100644 index 0000000000000000000000000000000000000000..cb89b14f712f3de2893a7395c99ef79fa9d9d25f GIT binary patch literal 170769 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

%7wE`G3khDfz0QQzM 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 E^3_@%CTimun|p8^h5HU-2axe>Bj!IeCUPo8k40 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
#&xVgGDzlkK#*N$Fue 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 IH2m^E0Q&r0cmMzZ literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-2.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-2.png new file mode 100644 index 0000000000000000000000000000000000000000..59c70626e0436b51e23754bdf713f9d9bb6524a3 GIT binary patch literal 147652 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 literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-4.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6b59da9595392bd01e3dd0a45e7224ef6bd4bae4 GIT binary patch literal 61589 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 literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-5.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-5.png new file mode 100644 index 0000000000000000000000000000000000000000..d23af318bc8ca02a133675a6aa417b00cd5130b7 GIT binary patch literal 65474 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%0Ar5fd*lrN5KX^3u@ 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%0D^K@LtcQEYX^rCE$bQ7}RS= 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

lg)#ayI3eD;r(*+ z&0`cN*J5Q_;|&d@>*!b8?P`mP`LwFmINM{mXKH_rWa_MH6F_JGhcYGE^=j$mMPPws z@mXaP@fOf~(~0`nu_wJPs-UQ^#$+T<_lG+{iQOsmJ=%s{4SJ9e%6RkEg;I~OvdlB-cyQ>Bk1h~Z{dB)Nw^HSinR5b{uNq@K+qCB#rrQwn z_jV^dnFzdfHG)ISes6tx5{MbbNVC@86%*R&o;}e=4dCCu^Ko*==~0BavB{sCxx(qhO4r1Rwv%xPjlnAcm z6jT+!?p^6dW_Ttyu_QnJUdkA2#)D6Qy9u;__K9+2E(?aJuP*VZ8FqV{6PA$i{d$F~=tPfzhR0;Fe+9KFOOxe?F@VHYYc`;KyE4=f`8bht)4Z2HFZD(xIjb)Nnklqqr)` zoSB!%Ug6jKTbD&y{mC-qSn1UQ=scP{w$4~gI1tND1x~_GK%-I0&+B>oW1zS};l|je z%nJ7b!UIz}B-lY4b;iG~p(+MSZjN+vznFMu!MS#pp~r}+1OSot^ucOu3&F{n)<7E_rcs_ zYrPrA&k^|Q-S>&kC9r-cM%0WZwJg5JVV2++JeSL03c5Kq<^a}+%Bmin?D+TN>XCrC zi^ZEBfUnCQT|f5O%SJuN;F0;~qy+@EP9(XHh6G%D4!7Z)l>HDVBgc&Qt1`TSUs1;G zGJCpL4Py^KPI)mwHx(av*>jms?GpkT@?f5p~s&&!TvQH-JfNy`_ zeXvEU3H#JJ|H8z^qqCK~8xmA4DRBvyy9T<^>BlAZ2h?~%Mt?HW+11IGevWuLukUHSB1+p{W zZje3DJU?o1=J3hqw5yrY)xP5JZfu2Xdy3BOs+JWVBSWV%(7**4p3u-UiyVBp=5zAA z;tPbqS7Jw5sx0>PX(4>rmAA1QU~G`hQOR>!FSk01ji@AR7Spkrj+g2p{!IQ4q<42- zqdvQPBXY>BRmhmJtH@&Edcf)oT;#~=Gq5g)>v(3;;Lu1$o^ma?E}1L{WiQD!>~RUQ zol<^FSMl^)*anID%WSq5%gjuE|^6{W6~Dy3kr%9?9bJBGIha zxBLOzuSrSjoDkJNXltCWsi~4yKumXFmF_EGZ?KmzR8_itJ9F z(6ZF|XU)}!&pzd3?v9@2yZV#! zgJ_B241$7BczGc{OAY_b_W9;t$qjBK77CNSI6zI%r@s2z@xy;sVRf`@EKe4|s|!z` zqFanj@n=dSqd>?+N{#zDX;1t+Z}Z>Zs^~-#k~3X}GgReF5;JCp!~TUX*MEsBUsc2P zU8_+TRWzOVdo6Lw9tIg%U>-8ri{Q8QEs^ecwciWSeCiuEX`s)EaJ|CmLOWz@O8_mm=J<+3}a&_lh1nDB_9rbc-2wu%5j{X zx#%ZHz9ovY-FRyV)TSU{U-jA>pPv8gNvS=(WU<&LPFk+i)TRn>lA?XorLSMVDug%G za|`fvuJpkhBUigji6x4zj9hfXn}-or5pQkcyZ#jm-uRkTqA=RtP2W zh+^Y@g_ml**wnN%|NMqQj{z|n?*LPV41WH-0Ic!EWWe0J5heNmX}BCaHWIJ86OeZ| z$6r&7ulI$ZECV)9Wq?IlVjgl_cAU4*H}-X~OslAPepy@aFBeDte;Uyh8W2WH`U%___DZ2_UKSU(6|HwBf&c~X*& z=Elrloj`mv^=YRC#TC+dLaTR&5(TbE)-^57tb5OLGz)TA_ts8%2FEqN09e)jmrsC_ zmL6DMPxp>t%-gOJr(H>ri^oRjZAp1D9UgX#rKh4q2SRJUtG)%7OZ{)ItJAS@@=jI! zKh#;(smX1Wit$|)V<{|!j*M-4U7;)04q6QFU# zs@m$a1!jFR{o((6fEYg18yje7*4UCsI^VCF<{T~FF=jRo#KOfM4LJ}j!^@V^uljx~ zL@b~1GRR$hzj~$UC4t{Ek&Sy6I%+_Us%yOe3$5cHol?lfCBYGB zEobYT2|f2*KD)kjySUgoRgbfk`+-3=AcDy91B&t5EY{;2x%vug%D)H;ZV~P3!Bc8O?_c7$&%Y%3 zh7&E3@VN&rnnC}I1%T4uRScX%vc@0p@#B&jI3N6f<5hL@Pm*dOO|zU7PgBNR49Y9f zh9@SNXo^-Zt^}<&xcK> z*V89^VuI5wN#&^6BxYS!f^A-0|p9rqrtZ9hhtYA;1fj_vbyb zlC||>ANU-54y?dGT+i_PFW1IeItumOvNGHvvHQDdV+@S$Gp$=LiPn<96wr4a4`t9$N^`2px9T13xI^W}6%-8(Vr~^7&XX&4lKN{%k z9@>C;0*eg~;ym}^Uaeda21c!2selP&W1?%W%6R)Aqe|pDebFRwBqjrI7(zs@8COQW z!(}!0T^Szvxh8f44`MC@ChM@571M@o2Le2)p>bF+n{y^p9>|d|$F=@7`G1qLn)qCa zoZR_LwLP(N$Sq<*vgt4|76g!#lsR{gjRF1*r-}}^0@B32k>S5aoh4nFIrE1C zz_eU7k|!yCBlE*}N^zE3+tHfnO;#xv`#IxY4b{C|mgF0`couZ7D`EoIc5gZH1X1iv zR4}~oK=NO_k)0tOWe68K%j~#J2klnu!#-}q6gah!1+D};Ny0+;ZR^S*Ep219|2$CX znoik#0jl`d>`##D@K$?zRqABLVG2EU{TqPrvU1vndJQ9 z3z+Y?wPmH;cBP~4^vl`n43O=heaam?lTThA7H|y~m53I3+=1Cz3brMFk;1|EIeq%{ zDGU8m?YC9*M@z!uqB(K3cU9SoS9V?kXjiJzoxvZ`&=2|RRHZOqGZv(#Z_u=4+C9T( z{DQweF<{aS`gU5j4juXodMMnthsZWuMpl3)UAcuRe7`5aN^K806L)bh z-=3zwp{tOMVVZ>ofs#jHP2YnDu;#0b4~;hNqxnS}tK2EAHlS!zSfn*>OY)jvdGU52 zat?QeUe76U{JB<2MN8nk0mW3sYc`cv-mgSWT$_&O?cvkkZE2qn&8LvdvP2CnO$tR$ zex^lT7KlRmICOP97TNV1kLruj(kH;8sWa~V4P)s zh{;`~u}m&aD1d@^RM zdg#tVviBlcV+D!3fi}hK-mB00sUn?ut4Ty#%$!~k4Ze=swa{m7*3%?h_s*h6eqVbZ zV(rsLd$wJM^7-&wdJ zd48zcRU)JS_kTL$@Xyu zNerTy3W|N`(fbxv3#Z@ z$-8N~nR^S6^|ix;R-xZmh*p5XT0Z`tbx*XJf3;lTibX@+DiP~Y?x$kob>?X0P;=2otK4tdp^{%2Tk{?;tQ1g-Jg(lMwSLpH zcVgXj`^;s@re1B3Oy)fdU7nZroKu>a-%6fV@@B!5Y4IXPkqg<7ZcBIarCh{Z11v zm&=0sh(k7ma|9CIJNe?CNv&Ks4ofI6@JJdx#R>i?f-y$XJt-kjo4V**`xLiGtF`>E zzbK{Ddgx1JlR*b-#h|@Hw-_{LvIAH8k+Uwq zxSl#^5w`Hl8kmzQfsq8xg289?%8F8p;GSJhzeOh@S~fD>{ui+wgWFdDi&-0M-3!(x zfUEiPYz(KBg5osa`#_h3(E65Oc&>M*HO*tHHBHBaDBi|kXLvEVC;6|$vc!}llxA*m zWwJ>JXPJ*&)~aZwP^gO8I3LJ`^BD59Kp(1BsG)BXxOki zJtCTlPx*~Z)acSv4DJB&@YaiG;vKn7pQ7~Gl20Wcg0As!7{J>d5N-He+2R*@>h@Xt zg)j&9Zdw3q%wBWx6Fn#^>$Ru(o1LIl=x1?FwzYQ{UA@;}sTI{2{a2VewKLz9857w# z_M)Ebz%14Yfzw|c*5K3PxMlZIcCV=iIDp_G(>HDXmmL;-{dCh_YqF;$3Yt~)5Hh%M#lBR* z^@a0dD4MRmNT;#6WQ^q%PNj}oDHt`pCs2eAgYNCwWW7K&_t}z)z*18&IP*ZAGkh<5 zWoBIM78tacr~=u>IeE&%e!-Kp)Iww0jI$Fo&Ys@!D8m(VM|+y80-xU^}wJu!4xbC~od+2~J+Nn>=?M_iqo_ z;g7E9NHob7;db+7hPq^Ci3eOPweZT<%V<9wlGeqvrL333x$5|ht%&OOY*Q-BcFEM0 z`;(FeeyQZ{Br`6Anx8zuEoy@kly2hdS^9TpN;;HFd-?iKgvphguE1^=XEAGZxcoaAkHJIcdqn!<5WJKB>^8#o6DrL~;f&pupb`RTRvGK8KC z?j*)=x-Nah+4c*hJx^|!=Tn66>@|l8C4BucX>Mg__*UIx?3I_5aX)=iE@In~RNdWU@}MA9@0Q&EbS>`E_xz8Qx*nxQxxfM3;w;o!%SirjY<1pe`Q} zMK3zC$&-qwuh%eN4g8HQ2pcpxbWDs^-*_oADJ=YUI@K`AT4DHdtA?8uukJZVM191_ zp8sVn4k%>}ef2?~Z~+Hv>lYoJo5P{(=d+UZpkgh!@g9e8?_}-qCzw|Q@U3EI>S(k5 zk_O@SGH|T@8$EiX71Eyo19MP95B)17jst7glQ03LBXS{|$xmPN-eTmB*Dtk>><#=T zL4RN0MBgBO#ejS@^@QPc%lC&LNa41qK8 zLyacqIDKA53v-g}*&VM%0Y*^y_R>kA%&)hJ!I6X3<3Q&$lC8HSs3I$^Ud4S33oE_+ zKXs5RWW6H0*h$}cMWO@a>~q_B)2IzZmNX<*^8aqXvtk&9%vU^eiX7YE)US=lH}`A? znMxmZw?0sH1v*qutV}Z-@fm^J$v?S|3vP)@2;-u zs;jE6DmNnN?x^hK>!?(;>qce4?5H+Ax_;*1??Ii4jk%pu^2U0yBdqC%I&r+a17Xj( zvd~$VjPI?V0~ctU4z9GD@S~ylQm6d;pY2&f!F)=#E)I%16O)?CZ&r7AX}#?Y=O`T3 zxKxVYPgMBJuAW3dLEl~Zo7@Hj1dcWu^JVM$_$+H2k#EE07S;Z{)&8?6d@q~!_LZ)K zUAEgnZ9@*7!0)M@w%jb}mHI0>vrXxWiD|GYv8ogQv=U$5A1k}IduX4$(qce4TN8&R zx7CvFaVmesq?BY#Ql5!{)$QN#V+Ut$u6Gzc(ys6^X;68%8tC9f>Ch~aH6Wz)7XUDN;#u4HK5;$<^ovzeUsl8Pn2|KqsrPOrvLI$Fb&tgz^=76 zSh1J_^1XqQ3ydUQSO7&i8w5I7$!83>7{0)z?t1H=`7cB-8uiqbycwJjqAoJzBo8f*EUw~24ZXt>ER5~i1aXh62r1B$y%+^0MU_$*=cjD6{D{A6gSYBL+pI-TcVZ6l);mO^F{d~ zUX&D_4{(5OplXg!sYvmsY$hyw?Rprlj>--{_M@rwxl@+;iVc7^U`|OI@3VH_C)Jrg z(^glFIdJRfV5{`|8MF1fudJ+^V7{fK3GFGD3AbQz%s^f{$OyH8IxxpZj~oMupt8y? zu`B{*@pdub&I5h*nwdtR$QSpughfnN=|Z(VcK%B)ZyTn0V14rr`zJp-&5J%iGr^Vy zYgX{aN9KP`{4}}Qd8Ssx> zo%;(k{~C&&&%>L8Gh{><+ z`WoD~GX9pYZ+rh@t!tT20iqLDRX>V9>+~XbAn7no=C1r77hhn6!_o6hicU4DdvVeA`CuMqScH8LHhCSX=`hR$Jg1J z>@llNQC;Eap6ffdpNDx(9CCWIdc(ZekIW{q!A5BYp2}oRu_aqJ9;p_1@oJ;>FHY-# z`R$`10JoLS4EX@t6dgc8?+e84R{xg z%MnBO_E~My3IZB9=TdFXDj*4@P8Zk)FrH-p!H`X2ExK9dB5}CBL85RjdH@OYu9eR< zA9cs)S}U||$F52~vp#)3RecQBOQOyk+NdjGyJ}ZkrEs9oyC?~OE>4H#czvE>>K~@1 zc5|QuW%bf{FcfP27f^`T=^Z15=I{F*a#p#RXSYiX?T^z{2O#n+ z*9BTHb*6>u$9LX>%tve{xzKM9=QZGdi}qH3<>9&GO(fi!KPjB zjT0497W)y*H0!-rIR`!$OKr33LHy^WyaSzENZGa47Wnv1`|VI4=rB?*>q{k#KwB^$ znkp;9^pxRWjmWQOPQN*{dT^1y8mrSMcyGBq*CO~P8)8xDs^JT8XchT_;e$p%=4V3i ziCCKtnt*X@<{<Pe%1GJp zLqe2+9K@Jl!t<1z`w{;&Gw@ufV!)5lu4y2PK{lNC1dSL6)4V4TckBqyPwyuKL+xCB zb6`clm{H&O9xW9M&6{Bl%@wlV>4pzyUoAd3^OjEqJf%M(lSi~{$d4P|cVD3b*?ZU5 z__+m}ext0ngiOc8R7u5*+ek6z>u z<3|DjPD5jF%K2|k6qN*4>+CZn)A__6w4aC8C>YZH(>Ctp=8=8`yKePU*IJH-M%rKb z>W1<5YM-B@gz#;8L&`5;d%znm{r)cI7I(A;c-h5M<|osbWUd}+|A&W@WtKnxSjM?k zo5&b31uN4-=iYS4I21Cv5vwA>6YY#orN^rd9OgHB_ANza01k%5HZF@fI=FT9GqHRr zIDnV8Aj_m1wBO18qo1-F1*W1yh;?-jGFU8<`7+Ij?g;T<+9`18J0^u18-yDH2BMT;b8bHa z^u;}=p_zKsanjSJ=PSKZEcoN&0Bhy#dcU7%uwQoxZ@^Um0|zG4{kJ!N<)$jS7*q{qAGk3S%aJ^ufPLHkOWg$+ z)YR8UV0G4hO=Ug2cvB9{?xnEh>74;Sy_)ESP{foVW36(z2^NfQj;d%HJMj1K1FKQg z7q=b~RI^wYJALsIQlY}97iSJ13`Jco?6+A)P4ARZ<^(tt2|$?) zEw8=;y>I!%*oU`(aW!(|Zbm{aj$3E@JD*3-&s`$o4CUS2{B`QB|9s>x9Y^~B)5TK$@Yh0usK^%&c^ z@>jE!k(Ks|`EF4=Vx!ybH8rICG~t}VNY8OxS9y-qu0LcSU_0eL(uVmDq84_usD;@2 z`0K(WSGuD&jMj$kIFf(gE|tIVq?m#RImLQlP|I>3AEq7n3UvB;dx0p_*w{OuK~KFI z3SxN+Na~%^o{uKS>llE+cp^PaGUy??v)$T6)T3j@`w+oHWlj!-qUQdJSMXO3U|w|RuWVR+U2dE<=Mi7RG^?L&3nqe2vgD*^j3!xY>v z%wl8YyAxO@qXARQ6TK?KQ^m$jmQQZ;Dfu`lu_+3XKyF4Pu?ZUJyrt-H`jx-qZ`4Vm z9H?8^`>Zgg`}%U2x5|DN*{XbSTu+R(`8l|LaID7bv03k3PNF1)PsxDreV>1duF{xx`Wv+0>0$gL631ZMPl%cDm4pTZm2n4fTM$!AJJcg4c& z?qfTKlXiwRE>Aax+BbFUX_`9(nb(;4j-nAskeV9b0{7+7sZcoSJCT+3PId=ue zET4jBxUDG}T^V5{+^lu=^;FxJ(q!J#fRizsAtAFBq0PBvK|$R-9Fg6+6}YpMhZ>%N z;G6YJH6M|`ry*WEDE&!863Y%ZEw`9lMb&|HK@M;a#kx6IPcu#*oJzS|}{?wE0ssjv5Zum=`49_y3# z4vTc!?`{3_X=q%U{zh4eUXanN&(kId^#@g|>Ww)o(Fp(_lm#owlH=F^*)3UIG3-iWKaL2WkRBza#BcRnN|#vw(!ElfZl4H4 z6f6j%|6^UA#IA(@bjtmA@cu8tP_q9~$rCP%^}ov6Q2!@&rfTs2EGYXI#{OqQ;Zy&M zpVWq9r%FRWpeTUOqoxWy^uO<=;T@+G;j_Uk69I^x3eK{4wF;rpy7UR!gp<3kwS7Fw z_pET8Z+p}B5%vEjou#3R)rN-zG^(r%%RLtj?r#snnGY?FzwX>r!(v)4I!Q9h(ua6) z{6>N{gk;$r9%k#@OnFbl?%3qxsyt3ga*gk`!}R(^%QvzDLKU<6BzJbWc8(9cEfn43 zK0K|=m{i$@fzjt+BkZ>=BVb=XO31Z8xUCl$#C&@=-Z1Y`njGw4{C>7Pzkg+DD*tB% z8LkiUteODK2X;)rU*pWEDK}8?Tv_bW6%{SzqovsDO~#m8s~G`_UyY zq;_O2%vVyr<0l*ZoLo1625rJuyVLixc$<;t?lXg}ndJ!?B!1qSkJIu|?@;CCEr8zAhWr^S zJtUVOzB>|3^Ez~1@*A^SxGSu3-iXT&t;>J4A@dz;PWrx1d18&Hcs7Uc^OcruQ2Tw> z%)2Mslm9{f@rw6@2=B=N^Pz8?ZfL9LKB`-2+QXujg_!2Q9A-SXy78YHJ@=Xxs=1zqDE3XT4Y}4)t;-Q%w65;b&tIe?`&5Dd z-7c~be9?9jR4ZLqBl_p`a$hG4wy=;tLn;w4(XdxLerWgWspm8O#)mJIlIw<-{Y=4B zwpd6NJ4~-y;FRL6h%*7PN104o?u!s0g%(uQQ4~gYflcWj$5~dsevBqFAGZj+BNXcYqdxlkozGSm!8l5B|2L zYEn+ex@Y0(X~VK2S)PFBz2u^gobdkiS+7cxvd5%GTee7qrbbc{_2T`#LV37O7lxD{-xeH3>XkudP6AT?7L@pax6Er<2ggBzsvp~)HgWz!$lcZJ;;wuK62p`Bj7}b$eYLfBF6Swg4X4Ox z_*@w^G>X;u0c+4p-mhNily1~Zxc)IoID`ITwDi%$qcwF+ksROdy|FRA?o8`wiSBm1%C>j(+%?TO?bRx^ z=omfQT;0iK?aHmq-phcYa-)?M1tX8&7fm53L2;b*`ttikV*DU4&r!g<%6@yimQY>R z02ZYV!Is;XYqEuFfh)PPPvY z5{>IzyWP8sb?(!O*$CK<{*c%sLCDHg+=cx$p2zGZQI5YkPuat{+;VL=9l!#2rixq? zcE-Yby-npS&=!Oo_TkS#Tk~`7>ngiz>P`Or4{=KRjj-g1sawX#HOYthy9)}UKVJfN z>Pny%CJy`^`#OR|{`Rg3s`_l_-Y!s;p^V89mKZ1nJJZUWm{>V?~=x=M(>??|& zCQMZ(Q%*S)d@WsJ>!}dS$yfq%nOqG^JVjIhtsi0szwRt|zNfDbyk2dDwSZm#;}?`C z5f%GYLigcP-8b{WKd)oSr)4MSR(F5h;F4u?DqGtiSEvL8YR(ZU#<4ka|1d`el9t@KZ+LKJ zO}N?2$3=~2zTaeTIJFpxw|FZYU-j$*fwmWe`s`Hg$lb>ddpLt&yrp%)OkCjUTz(Y3 zSWi5S63MI~!&(jfF>1BS8A3Fr;20O0;JgU!r7^hl$>{>~SzI*ZaKqk=16x0g1k!s$2Ltp3jGr08c}U6QT;N!* z_WeodnMm%c_GBC&;9Nkm8GAG1j{0K#ot5t}@(0gT`l}*h;NIXo-E_wZmgza*q=5RH zW`yP6gv*%tHWp?yR!B5;+5v1Js|G5g;l3wZ(Ku1Nye`@~|EceaN}M)g%F$79(Rt)-!DlTu zg7wrDLqETI#Whfw^2K2XBIdC(j_dX#^p~c=nnd~t>{#cWd+sd!R!yVvX}ds0CouXl zd#Kj$)&4sNJ5o90Nn(+^gOc8zj(Rq|fH4d`GSvwBN>mj%0)h8?;>!Y-$&`C)$}M+v zfMQ&w#Hx7~Xgc?Pdgbi=%cLU|jmU50OWCIih*79|qAxK(w|K#`lRZ-)JmQV<3u^B;+d-2VO5~NdtV^as1LL`(W2^><<+iPc+U^MN z!5$V)do?B#y5=*ZIitfM{%nDpP2S!Ax&%^coszATkM&O!V{{)-KeU`{ z!VclNdzSU#-sVm`#h+scWuyTb+!WHfY0&$_NotlF%ZoMTWFSQTuY>tnWfX04#=6QB zN^G#UtvRw(MZHLnMTl`C(=0BKbt(-nA`r(P*7WZiQcXshxU^ryH?$RQXJLOKjX2<+ z&CgH!`7B+^RYH&c8Tu@@=O{}B5lSF$l(jDYt6JfmP|X&5^%!2jV?{3~BIcRIjXHp9|P!Ya-Uv^(c}Ee?fZ2Qt_R*vop9^_UB#%W*a8tEQ=C&cOIhW z|Fte}AHiB?t{%NFBU$bG0_u?9`on!2J0;cIO!I@y-T{6My}z!0H{GZ%-ado&;U%IA zrTP0_|3i^a61L&p%yT)SY0HQz1w@tw4#nS}2}T%RpRDhPy1&5q^7AU10bt-%`3mPb z4eg&RNO<5YBOKph(e{oYIKe_8RSr{AlCMIpp5gDz1Itg@nLZf7l625&v#Z9iu zPF;C8XSWA`msVzgv^u?X#@a_)}^*cCDjC% z$3!5gDqnIuEraR-9JbO0ZZg6&Rj$lN1gQ3wV{3G3jE;}?M>NpdFQPnX4hjKR0Y;Fm3d@*skjgiZQ4p8y~ z0v5mK99;)+8ltC509fs`UYi~l@XCF>X)+g(fn6Y96Uk@Q71)mT^OCkJJI%?O{)<4z z9rbXnyOlHF25M4UaztSRcdaEZt%FhLgavO&Qt*AP8~JUl1*ZQcQB#u8n7aZ=vBuvk zY^p))FGd3_XL9K5hKpCnuYsjQA-fjcdq_^J%JoFz58FTY47Y#!bX%l?SpWDAz71Gu zCm)`V2r6qzGMJ|rYn)*%5ugS4;P}>?-nv^_&2J!LZ7f?10U!Hsg9z<>hWd374QJiu zbnY@H37cWvd$=kSs1j~=uA1paJQ-9+Py%@>-D^KXpQ{0wo;H8eC7jhupj`#mtaPV= z$x5r)Wk+c8d4UY1Xm9P|YkF{Fm73=lrF-0>B&Mg(Ic0t%>V!4_k$cB!P**J?oihs9 zeni9E#GM*Lu2dl)b{znWs$Ky#-*@_+z&=#aLxJ@VW~hb_=~8ZxC{kB<1s$XT-7;RC0yWxPIg10@^b2*Do&VEN|_W zSwQUk2Z7R%2=>$Wi3zUcqV@EO_b%GJ8)Af)!=eG?Vm`s_zGB03*gw6uO4wL(+H;U# zqq}0ikYc}<<%g(OS5-a*Vd;GtZI-p(tmy0P%*}Xi(JevzJJ-!tw#}u#Vd>6 zz$XFC;Xpn&^Q3TmR9uBf*s^`-Wp0W0Zdann^APR%>p&=`=GetrO~7YAEpztIEyYX2yo5EK%?cF z$J1Y1o!_i%tq$x+2itB2T5FMyQ4z`ne8eYj56B^&x!S24WF3%Q(w6Rjx|10XT0!{G z*K15vzSUr#8QZkIeX}w*amS^@*A^bQME$MNl;)A|t+Vdzwcgw#CmV9*q*kjR%~_10 z(dV?;z8RL~dphK?ww!m)n$DVw>VeW8`^qg$CZzM)y7`?+&WaZsCS!A_#P;L4 zm`=7QC4k&7-dFo|I-{!>B(-Qb+Y$zYq-BVuw7a**85}cdmoTJH%ja(1iV`Y(yH2I8 z@|$KA$#G+z_1u>S&!kS&bENBomv_>!e(3pn+g7_M*{DS_nM-}(uTgfRZ}rU{zNRE> zXoH(IZh5^LjZz(b=j@XH<8))5wwp~ws%_S{g~Fo;LO)(5+w0aRVerPWM9#2o{5n8N z_XSvv{zw!UFr{dJWiC97o%HDByhAR=$!CG5YzPymi4$Db^#XKS9S1W~+cHkT`RM6K0`tDu z({85XXf=DJ54N)6aQWXUjv&8(xWnBNnY=51Ov$Sk>DDi4gZLO!3#8R;Pbmr!!+0uk z!~*k1m0chi)XH~jLk38mdyAO`fO|hZ=qEZjc0Of;hJ8O6G(_KEfL-k^?;gPH+tM#K zc2(0*Y1i$HQ#@(%?5DsteG8EwB%r;lD}^`t%>#h`WbW_THf>-zd6_}9kWv@bs-27@ z;Ch}~!}>^zUBqI`{Q^)me(*GVIa*8lc)vr!DDzF$*KaBkm~%TWR7nvncmy@(U%|Q6 z?S1ja0=7>CZV?^S|6Qn5KQuXhywuP+h6d9`&7AEFectyFjgm;sl?)s3<7h;p+HeLa*?f ztrtB{_j#@#NY)JW;1J)J)aA{s$1=hF?WZq-mwJume)T^Xw3^6qZF27hNzXBTw74iv z^>QB;aVd89>z8>dTFn1AU7ORWI=a~Ec~M+Y@z-#MKlk!^3#Ix|aWYt#^MtXh)?{xk zH~)PoO}~eqXre7mO%vLGdqu&2F7y8l!v6m=pl|7p1NW5kxiH~%r2RNWAT-cg4^Q+y zRl;9+gimp$*qag(s%mM8OGr@F+iOC;{Vf7^Av?Xe>K|vvO@cRjd>R9CW@M;^AT;ekM zRG0j++Tb~F%>$CZ?q1C1&Ors7v+M7$L8dNZ4`_o;d-y%AlnE?jt~-CK*Fu>Svy{QuXf(~-Yz{xgs*W{W#CwJ z%e5-o-fYqz1hMkhPmkMI=xr+?|~c#v*~w}Ri*+q+rrL1kqV zNWB#L^L&R3pGy+apmHRi^96l&PWqxIG@lIg66Im+vQ;B1_c*w`BUX1w$oPM&Rd=jK z0lwpGS|(;%rm`r{%h1t8*>Io6rUGlIS^SS34E}iP8I*4V$3yXnA4N4q-W^R*3FUDU zW9@yYX~I4SCCEj`(bwQUfBsVWc&8i+fH_DrR_xmOoNTQuf|UA}On({vlSJWzKB2d?3W^pzpqalnpWk9d1H@W!f2Nr?n_KR5(gqj`wzh@qGk>3P1s-x1Hx#^_?pEf|gF2 zcQH-Ts}k&nziEl^V3d#Oo30=6JlPFX|W;4m%fOeD;}f|x?u#nwyH_Fiu>CI3ceSL zZQw2K-_(#+4}w-TrY6cM_Y$j{JWt^5l{A7LWHT(bj295TheGJi{{cs-j8Gm ztlyn`TAy2<#Il-L!E;(EKf1ixKW9QmE?p`tB{JhYBRXao%{WRq%ctcBlT zXH*PA1%1Kj>hN;g+3A3*&G*2x&|Z5m1OqIEz4?4*pA56zTUY`^j2FKd!BzZHFim0 z($$5R?_?Ou2xIej1WWjxuxThyL3zdALjSs>*G^3Jcy9O}#7+&P*8SN?M#0s4jP zN?jx=drL=jb;T^pP92mO-{+`6Z?XcL9Cqa3iu)&>*|9xmc+5f8>g=F@wgu+OLO`{P zXl^)eB6Gg_)%emug&07;W$3tAA&(b;h;Z5XC~5H$k@j?Sj{fFX*9C+3k)Mmb3>C#n zu0{MifzoGO_!_6v%+yH%F>Qx0ETV0OuJ<;)%y)PfIqIpiYqnEcsMYuVM?mLmxGT|* zWE(k|B+DgKol3L5pY9uSPgPO;H-xcog#qMCi58pz0+j>G%4WCpYTmZj`w5WHH_<2L zp9xb<*Kf7Ai4C4d>E)KD7dSIhT@7G#KM+U(GCknIy9YV7!Gf#$7vn6?!BX4 zk2}z!;RTCR`Pov4UI2CqUO1lX0?UoJAOBkm&>wcX>ub8FR~gyh=%4~~^ye1#|?TUn#i2!alZ?&g-{!`rGJUabzai;dTSH!Gu&n;BI{dn>NYx$J7` zp;?0eGM@txH)oKtO?=7r=97&fBKNpfiNm^<^Yu|oYwC`*(cv`iBl>`qEa^{BSKvkO z;Nr^z?FoqvJV!M56{h_Y25o#2sZX*3qB($AwDP?VNRx9X#|^V*LxT!Fr+PXlmQ_cy zxoLtIp6j4zR(zXGRQ_jtW9-ZF`fM!_YbpwGN@b}Rky7U9NIIZ;wjJdSH6U6BO0jXz zB+#(JXMsCaOudogpXKY5A~<$a&Qpz3?Q(2qF{Uq{pr4zwak5?DJN{-r9E}lh+?xeM z4nc;qG;9mn`Mkr4bBqCAC~uGG%dHy&GB8QU+mG+aA!5ESSR?DJofc?j4%xpe^+z?H z>^Zx!)Qo@VrrwzO;XbGXBj*-{lDHAZy>q!$>0_cP3V9!uhfZxZ);JjFwDC>L&jU7? zWnGhA<3!CP8bxlH)iZ}M?sGhwQK`k|>rc~wWh-IifzGInU=OsOe26BW!nHjA5RlH7 zsl8HB^b0(#&{Tr7_O#b4wvve}%#ASUeTiT_Bi1$Ajc-%aBs9-<^KJDj6t%4nm(mA< zE@{4pNB2m1oG6$<#)9)H&uH~4vR{wNoF4jH5;QrYh$&=_vNL0^+4&G{7$m3d z9JZ{!_g%Yw%LTPeko(K^Nmm`*&4w`bnppOZkl0!WGV!5M^V0Lr(|vB=%_Y%(54UfW zd5Wz9hSi*S;MXfjARD)~+SRXP0t;DpU9w~de&fa7G~Hrg%vut>oQ=X5XMD7pqI=lI zBaoW8Te%6^0L1*7vfVsGx0eLnp&aT|RpuAhtJ!9RZC9C&5w|=X6W>?U#eJJ8+uQOM zaer-FPmH_Ng2nkbzU<$>;|2pz0G8%`!)a;oO$hL&sOUW8lZz*e-S)(Fr_XKOciEPT zSB~@Ce%aI&OUIBENE1qgv%XFkND>7AXkV*^N*&Xl>};&52<|M-x@R|^3GVonALwbG z6+}*bBzr0Z;nmsPkGsv=aus>`CuZ=(eQhkCgbkT;=QIa!Yu{}VOGtwECpq0U6x79& zBgNLx%qLRtUu&tN#6UR*YJ6ZpBeeFk2#Si+G4j_ zCp1lcMD{nja~0h-I5qvw{nOa^jHws&psJRV2O;cdI~U}4fuOzCLNs*6FMYyZh`Vvi zPyx06q*n`)?5Ab+vOau@zEa%zj3 zXgT+hY$_DGlGVLC)}6lWNjL7ec77H4-Ox*joehb_zB|b?$8@Su7zj<>(MmaK(y8^g z)gDDAx)*u|b!|>N1IS-wj{@wL{kiRZ-A$6%M}(6cHCKWbR}oWT3kKisxy~HKMTbe0 zD2MpT*tcJ0YEZo4eTx~``1LbaW!K30(Cf7@HeBCeeyZil6BZg?`3PqM55M+QP;ls~ zm=|WbuEwTsb1|tYw62GS`K$iQ4nVCenlo>NvpNeBH>&USF=o>Uw(4oe-yR}q=QY;2 zIG4}E!OQxsL&%9KfeJ~_>H{bHM#PlrzkR#t9pDc&rt;Zmo;ebb{M>|;!|!Ig8yt6f zybkepkZp^X)OXlKRVJX}1L&@H62Cg{fcn+Y5veJQ-MN=q>C((!d$b|5aX49_k)_dA zddjttnrb7LO>LuM1lHEeH+Fx5_}Jrd2&GkmXN-9Mj`+JPc#AhBA- z!XdXdu;3T*OzHGC2e%`;F9b%NPdS&v9)wXDHQhWG9D#uaRyR}~Adu2^)Ve-)F=_w`aG%BMabZs)vxR@B9g zizLuMGW6{_mKK?MOB`l8W=Jz(6z7`gqQRgVY)$)wzo7q+DDh^uav#IN&Ia1wGxRMk zCgiA5Zvbx=<9{paJHL%+4U0;rC!VW3!Nfti0ez=CHI&wIj`$^s(!gWAifk=`OxWP$ zcUF~haOEe%`7?kQzK`b4izbbHqP;~9lhtxk>p27 zEy1RiAO7S?NTNO?|7axx)Qe>2>UXe`5`nWa7M@nFC&u^usg=cx;3ST+!%&h%va4iw zAc+j0!p8P*gaoZ!9vsGwZpEOEAgU$42Q}$MZoCg_oOw=<_Udf{sJEwi6=^4&bb5Cv zw6I(N3DY}rMSj2E#kD^-vcIo~yFbc1lP1zVOcFS}LQ3z5j>#Am#o*Rj{KuUo3nUyx zO6s}$ir&-*v{Xg)&A0X0-KefaJN|-UyNdAY5K5UW^rP#pFdypmdO2Gw5bUEr_DlDG z)6KzFNoSR)P3W`Di>*!hN4x+5Vy#n!{Q9VMu%jn;t)yd9?9osd@IdmCVqG4I=Jo=d z9CAE7MD(UyCYq(|2R}c~b?BUx%D-6#32(31mWc+zP>sDz%I0 zkVqRLYdJbUHpcAeVk>1GGDdSzKB2TL07X%LgWQ{E@^gsdLVI-Cy77{rk7>=EDN~nR zDbAzSgOhn?G^+Rqh$4{Xmp(JfukW=OB#Po(*@!ygJ-U4+N5z*rfd046w%lrsEl4CY9H}zJh6icEm0~!v;9(k79BD ztfa!C3;2cygI$t=qs`@&{u#6x5WOR+cMTB>ZNTh}}ygI|uKh;yA1{b7X( zej~Qhoc3G%0!U>6pU@?9b1cNnD=rB0(TKR6>+26uy+M(-*xX3BlqA*x#d*G$4+pXS0JgLPCj+SW4&+A9472RWXq_H6jV#xNc5yYG_d#2c>kV6L(=v8 zi01*xs&?5?0Z8R=6+(!NO^4U#1_t@>9imzSe1g&12gFc1ISeRgN-$9YAyVXDpO%mYi1fh-1&>B$o1-mI^HXzF3UvLm}fcYRHL zBfrMb`XNf5n!nZV0lF|oL6CCAPE<%QU}UKQQRz1)#gt#8Ds%QKR4ka(4zSwQ&MriZ&{bHco#0`wnWvsv}j<;A=$Y=Do zp7eSFHxMhOxM%%M96aCE#}3TQPeJuR^}4c`abD_I%{nfMX!uVJ`mjOW01I$_b+9%Sgw~Xmr>m!E(CW8^s}in%f(wdhO$HwKA0zP9RhJD}9RbpSPenr5bSCilOFs2B+_T{5gEB zXr~QGh$>gyn<&Frg7Wk-GDq64u#YOrmTv?*`ktO4wMF|~__t`nhAN;xf2~yG1ouJm z>-6!_-a)?_x}sYih|!bG6rxBP0I)Jo_-X`67M46P8r-Tz8#25Z>;1Zv5l@^nch*K8 z{zPGw)SsVd!<&lnWf_Z-nRuU3dpwdp6F*JJou7c<-9=|~?>J=M*e|_%PoQ5;LEaQm z(=T8A>ksguDM+z-%y>gAN#*B*wHal1>=9T1t8!DA&m*&QH4v)(shy5l<6e>>XOY7U zH`v#^V_uO(Uv;uEl=X1Y6Kx6ghWqTu(&`kX0gG`d+-X#S^C`@?6XV5CQiu$PlosBs zT+u)ZVI!TgzfQ!GzDrq*uc9?68)+9*Jl%Q!@RBL&cM z{bVXk=i~g(G7rc7bK5@*KYhFaI{Ar1bR+b`fO>CEgkaA8asM`bCX(Wrl58fW=WbFk=ZJdsvco1<1rE2Hp3i( z6W>^1a!^35Sq?NY*;_7~b@=vZyFU8hT|CY<@6OINSOCvj@@E@A=k|8WToDz`osleQ z+f{IuApaMlGM}^kaJ74irLQyT?HB58g8aelD}xid{gYcMvEMwt8n(69SGmzY-o+6Z z`0qN)d(vEt`)6iI*||}?_j-ozqObhHz{hlUs?IQ5>1*NlT=?C6bn5Ju@4&tBYeTP*?Hmc#U5F9J9b$UK&iwT^W^89hX zKxcm;uJx+eXoOe6UlSiIZ^|0Z%TQZFW(x~Bw{8b951a{bE}Ix3pC==PYC|CgI)2k= z_s@3t9BB0W2!$GkasD)Wd2T<$&&?g-Sb>SG&OUw=4YIw-Px9gOyT{9k1(AYohi=V2 zP@44a3}SlcyQa6nL3~xpyI7o*#`7s;!@he%-97{}I=rT9PY+LW4L385sxLS9zqPZ{ z1VUaQWrB`094CLW zZ4c=%55PdA2{hgC`F+vmOg^Pfr{>@ruhnBlxAZh!4;>z~cYwJ068TK|*D~Jarh<9% zT%Mw=25m8D2179rvu{r4%57;6#%*4JFTFK}bjI6A(FdT+h_==X%1qbRyB`V{X^;Jy zQJ#|l9ymgZ-qA|p3qS1YkMHk3y3l*0F!Q7R@d#&5^>7^5UOm*wN2%J@l2I~y|gD5u;L{`F?`kR9*lK;!!Nj*1PCGS_k2sY7caBc$>Gnm|Ou zVjIn18O;*6+kSh6gVwh^6()RmP;~`q7s$XwejJSS^Jg84@#VA%WOpF_aj4a<7)AIo z+w|ATcA|e-h}+3RZer0?6#TyYpQ$1`==G!jwCVc*kDh~>Mtq2{z*NbnrE-U(Gv~3r z+>vm>?&a{36!7IAM}uiuO?SN~B(nZB@``=)f$n3h09FdA|JZ%c<-N@+d!C);O? z$m~P5#cb2nVN7|xkaTqV70EKphh;RlZ3iYOO^j3O70uA!Y9To1eZ5-P+2%DT{(cIj zOY*1O00KAE=l|mEEu-RUx^>Y6P0#?rEqHL(Mv~y3KyY{0#+{Jh?u{l`hv4q+)@X2O z+-cnHbn?F6+55*m+!})c-K)vTH|XU*rSSsosI?E_dU5OU+8v`jKphRDxV z*Vm_dGH7Cm?#D+EXcJ#j5k}M>EJ~Y(YwcMaj+vM!kBh?`MMi>h<&~wRP7>4;i=1^` z5ym_1sRv;d4b@9ZRKUSu)Dkqd;M6VA3sqoCj4X!@v^=C6rV$Lc*@QpoYOPy(mWjN} z*V7mz+aL11ukqc^Pc{;XH2T*SWMU3Pf7O!B3(aaD0n?G|@OLbM=_u&msiU13SdpQVgi6n~*0ce5s47v_8(q znGtEHQ1&BgWs0(RR%NM#DMnKX`Jt!q`$Wv^LYqXmDF4tX<_Cnb*6%)8PCTFl*TQu2eQ@_#}8xMdP@i2!UnYdS~~^XBG<2=gq*)_Y(}gp8m-^^YQP z-TVJ@v zl!%k=&qMw#k*V?j!lZvNN-2du%bNcbnu0$|(Ek*izaIO)w{?dy{t2@ETa3H^mCN5d zIgS5^k26PHcWC{~8b*x}=mD!SNW zC^nPM%%U>)*y9vNFp;#8dU@cHQWhbV>T1l*y`sR0&NUGs@$#4n=MS(J`ZJF5daZX> z6;+(6Eg)IFhW!oW@Azw}RZxjA<}w7mNxZ#7NUjX?XIZITwItW-8CzjPmE>6qtRR%*EM(Y-qO5_@N)o%aftDjwttF zzV%EW9Rx%TJ=yc=4}Y(f!3UZQ%O7zTYQ4%{KI3Z3OLDu9626}>%y`o8v}q%6qQHC| zS9G!~6?5!A3;Mi-$=IF4_|UryNfq^*a-Vi3LUUy=V>}~K>Cpe3dc-+YL z?pU^@b{Ywb?f~jCk2rERVLrc58LVw@W}xGukj+nY2oar8C>9p(HwLZx~0$=M2Ll4anqrmNxRHXMIQKBRUWXpXFl#YqMZU~)zRqWkUp}B%tozuV$2rGN-{p=(tZ03md(%*|Es3J zvkler^hYa3`kiR?hfyz+n$E1yre{= z{sfNS{fcPs@VtUR?KSl7Ew?bUW-^GlKmy0BoCLSNCiUAlWcyOsGoCZ6_uSb8`F;h8 z%myT$Ue8yO?x1PClZDSS7YA?p25KAA^){^y2*1G{0+80^W5KQh@#J%MLYv_MYF_%t zc3y+i%kY-&=Z?(m>`j@sJuPhMcT9&pW_TXQr6Yp6HBL zRl2U=JV zXQIJ1g)#ZEC&QYn=$n?#sikdTZ7T21Gosev@ms@uj!xut(E;j{@** z#e#7A3ZsTR);D|Zle#ypFm#7Yo+J7$&vut81Q;e?c!nbPB*w+P?%ExZ_uSphKY$cj zO!OTzLcfhv^>TPybX;QkyCIKahc&9`KNnA}bLM+akv#hh!y{a8!5qPHZ~CE#6(1<(2&p7eMgPH;Z^fZmUQ2K)WU670Gys zG@%ewBqS!ye*mwnY!!h(b78?qV{yN-p=^R)TbB{oeE@E#suKJZQd_YHeQ|85oE^|1 ze4C87d-e40dX76o$vxMMStC?rbhrHTGl=vifzfy-m_SrAz?;?^xJEf0{Iw< z#Vd1Q8pJn}{|uL~;bLLw5rMp9QlQ$Cce{9gJU;|me7hNinR*vcAjsLoccN$NYmc!L z0L`=TjA8(tn8Lv)b*&x~kt(Twf$h1ALJ6rQEZRR@^am#z2YGmgS(ju!0)4is* z(^Cl(^$$JfqIY7kJuI)Q8+2bcQXI8%*z$RD+Mca4LhZAXsH4dBJj{H-6D*$h>%wq; z|7v2c@E|)>I6ELcWoZ+q;dflW-S2#4HrjIFgSA}x;pIU?!i^u3G)o;(Z&g`jZmuVf zG+(K?0Z~14EMmEf(!5nw=&G4myP;ySlfe7V%f;IV1uGbMpk0-~QwDLdgNAuSv!W)Y zG^DU3b>D)iOnK68@8<{oP{ZuCeXI0h&rDlzHg)`!{`3J zaLkCO)${rV%jqBNeg|(}eV@y{ho`jm8OarF_QQY5lF!#)Xhp(EA4E__rAVs}SW2N5 z1Rn4>u|=I+RZw3JTd~n1e#Jpv5llL2&5C^5Q1ET2w|hN;2^S`nWmh%wNI(*F$iBb9DCef-WntzuMAR3na5q*mU8LG z(g!mi@l>qJj5)AWQVs(Ye_i1J*q8h38zmIqjhb)0(NMwm>xvX)7D#V;C>m`cy6I$I zoV-Wz;?wMkAske-cE8ur5+8Fe5I)nh|FTM&Y)?9hxZH6d3y@lD8m-J(T4(XCVLvc{ z9DMUWtqaGgqNHmV3D$FH>t7toEpB~Yr{nQZ;{6itn@Tf4HdA~OE}I0T&PJxRSR(pa z&5q@LxPQlVn2-rp?!dDM(}6R})T38Rl#lZ4p36Pnm1c{A# zfyq2Q!2P0}Sfzk@)`REiA*$f{F#}oAVz6FPL<{CCWfx0)b!TyJZOyK6x=D|udlL=U^!f){R- zs*9_zTq^~L8(-=I?53>In61JBo^u3+6MG%O^5 zz?+nrx84zKF)Zs@&=s`g#&|Rk#2Qm}b2A$#5nhhM(e>tZ(vvVUs6W(pr!tE@oA?m?-uL|8~LI&OIf#VPut~^>0_-YEAo{Q+#&R*b8J$!GqiV{ik(Jf>c_HwJU?uB)qCGA{_xK z*yLw3b!9s?0|R#{m77Q&E~E-G_kalmt;;oDddI-hhxyeH!hmF5S+tGBCw>REdGXE~ ze0J*m@YVBU*4C!MY=5A=J~sIJ^=WdkQ;x=~SQXc7|Jvk=ge z1qY}=@t9m?;IK4*Vsi4v9m;0BZp`igbO(a<7A{?mnN!?T+!tKgs0Opu{KPhF036It)iw|J@`CZUw(>@dr2tx1Z7iyI7al(VCxFp zKO?3gG@bfIMrgW!kxbY9KlH&Xg?M zM2d+7rhBxcZFRT20={(YslxoI<`7D8|24+XVdNm)e!HYhI`*|w^iyrgDwvYrxt?WP zw?mVHQtd6BA5UaNz|C&%>jTwAaTx(!ta$v;&6l5y%o-t#>Jd|Pn2s(;oe9oTvvrsK zT13w0=}1v*t27i*J1E6W`KHX!M^6js=&GH9XXlR0bQQaoT+nA%V z1QDf92}Fi~RMe4O(pc)!XB$FeVuWxowrN5|j*?tQY2c2~5&HEovdR55q7ZNHr|i|? z9sG9qratcdl-LRMXA=`__-!PJye)S-A`1mrMS^cPjdNWyRqciJ&{i{!CUH~`cbKKkP;piAj>b*r+7;3Z64%)p+u=1=RA-Rp|QuTAlM;D`%ycQON`jpLp z8dWihOtH+?D`AMpf_deRHF|ee1Qmtl+5)8?i#b~vsn0PIBvb6Oi-F|E^mdx#mojzx z(hRPlw_JSB=XrB#2yIz17VNhRQLroXYW!XWDFi=zZn zt!t-+YM3VBtOeY2p{zQsngPwCt-M~1Gn~s2L1a0l-0s=Q5=Cau<0~O@x$0URKOZdE zm=)71zeGwEP-*K|w4&l{tJ>BiNY1q1Wc1(v0BEU)=LS8fRB|>1_RxF3Efj6as&n*@ z>xpWvzsn!hyq;C8{+Th4HhZniF~E~IdL8fq+D5p3v=c6mKgCGB>ApHF*qOi;MH7hL z&ey8zmuhO`Pv3IG;Txe7J72)B+#&{wp5Fa>xDc1#&g#wLZp#(Gh#lD?e1<`bcXIVK z>-btBL-&}iB&_CbGBaGk{3z_`&jzroc8{`TuhZB)yd7ZC2DO#^1ZhjR90_QB+UapV z$NLUGce5k;y#%Pt=rS1Fp986yU3y~Z#~zvccoTK3yzCx$Me zDVp^asYhY7@(@;U>RoSD4GK>nK^F9>L+sPVj`uc_6i?99{kM5ni;bNQp4LKqQK;|e z-~(aB1xb7N_{bZ<*xZhWK62sSx$0Jz17B2Cx9%#izV{;5efxaq3xbCu_r?~%$bfA^ zl_#)+W-BjJb0de#0f!g=z}mqed#Pwzoi4RzwFkPd0oF<_GP>j4s>L)6jjF=WTS}Qo zcC;Y*YpJj*FFK)}-f%dTUFxhiiNP$t**O1#K*Y@EQBAxGDYbKn607McV$&|pBQ~H& zBrtuwGfl%|!H$Ak8f&YNF0={okw+Y8?)1zW$Pvxk53<^(2uu|RzWZ?9j`NyCguEBf4Sdde;f# z5G{{Rj58Bm0NZms4>Ly=fF5A=@e0*PYu*Q&S9ha_3vxnJ^W{&RSVfwAD*>!e?F7k< zv=>W71zCAupG_IsDYIdl7dDuPU#*Xzeq{@8sfe zj@tZjwn8<4ORo0Pe<%o$h#i_W&uo0WbWDv9H zJwV!mP<%T|wQA;~FViA?saqM)Af|rrT5C+M+uo%t$>Dza)=Mc>>gc7$9-!J(e{;rN z>jkvsTF4woVWAMRI($rtwc%IB9W&;-nwekb#zH;QSLpxt4%c!Kj29f({AMnb!2XY!VbsxWrIi`W+<8er~8@-w?(yb9&j# zdxM+eO7&OknAGj7_k7Iy{owmSaQfWKPg>kPF3Pwiv9Rw?DJa6zN6%s|jAox|Of+Ga zk+TW59-Ej2Wh`8UnmDA(zCoiR1{tuSV>2iCcaAgAfH5?f#D^!-hJbb$Q)%W%O zAatgLj-4+dUK@UNG5jiv$>a-oWTk>d*J`?*n0q3u!7)5EUg*wF*h&pbz-27pEqeNk zCYEf!E-w&MLyWI%InOa#pXJt96L7O~XsBOs%Ow77kMsnkZAs%a=k+K5=E1MuyyX_L z6ZgIG<8p4V$cNz|m6|*EVDW^pdsZ_M0Gp>dz zIprHXo{-OMb6rv9v-Ih6+pRC2k_(JIjmuXgqstuesCq*;Kl-1JZ?A42#Of+p?3KXr_JZKFUAY{zN|G%+qu0W4E$g0$JniR zd+)-U@S;;z(V6?Mn5b1GJWXUkF)=jfwuN!cZr!JqABzbJCzUd9_kV@WsPr6|$PV0 zP3Y+LJLkq58q=w$RqQgzGi4Q;KQE2EC4@r+ai@I_L1C4xDkA4i7Q%lppg0m{CLuCq z<+45d;82;Glk;F(VaH(!Ww`76%!Hb%nzgA zOMla9!2v{sVivm>H*+VA(}laQ{{uZpNc@k1!G8t!x28N7Op#`%!tLmi5?@z-N$ZO4 zZg~mG5TNLRE&Su@r@t5%^3qtijM)$b!e-B`PN0=n0E(@e`Dj?yVfc27JE@3IM3d1i zLPpP-^<-giFpXej9*2}te&xp#9Q&aI6xHu1_SbNx62V7R_s|fk7?cg(%dv@x8+-Q2 z-~WyZM^FB0SvZ3j;Fp+MZy7$)1V{Q4GV#xwI?$d7wp`9?a`d=?!y|71q+C^Rn9(26 zmFPGH(=!7LZD%t(cgr!jxQf`~Y&Zg{Ohkl5NPqAAMaMYl`I2MfvlP{nPkN8w@8m?k zLA#2x8lIw(4+r*S<&>zdHDAH(Vbzw?(e2_*MNL}&7|^a7_!q~a97@?DL4md$8;i7X z@abzN@A;8!&xlA#LtzMSEgwA*hM{%*8TeRc;d%75saZ#R>GW_tb3`mUaq$AElYbxg zMFfNz&~%EZqF~E2Ucm`h8eJ30;@3@*c|x<=@7t8ruj_cg>1A|>Y1)QH`sF}-Xa!Ha zO69E6o1~~FRRK@YgvjB+!nT}~CODW0$0X%eq{HaO=S8;E>#U@h?iMtL&ye z))qm>e^tG@r9VA8mumP-L2f4l-Lae+Kzi$5yLAGneDQMBa0$xzrE|rj_3-y-M`qNdoCd{*gwp}AnPqpX;TncnJcd&&jO_M`Mw5RNCOc& zR`MG<*g)3pFC+IXy3&W%G@H0VQ|E)E)@hlU2?3(+Y+vE?#LUlsFjP7EhD;!9^KdH9 zaP%kN6046;7Jeh0ONgL6I%2dNef$I;fpG zJk|Y91XY#nP$5-p1XPe^?$gK=*e#dQ$_F5Y-~4YMeMSayb8wmhf$VU}RD+Ak=+p_4 z#sn?A@`11lC%8mxMsy4e*6PRy^77P*OW@7W?k=_;^ydEgErmECc-u{GihD$HHn~l; zleJED?eZC^x~<&WJ`}J1mG6bp%Lf=S_CFA;DjdU=GkL?{sRJEv*AusEcvANk-b*(& zR=G$hPfH`R+_3L8StqkxY)`x~=+W5IZTJt8ds4v>;^jua$T<}ZKwX&VTp&AR+RFgC zarAURzIsk(SngT%GKkSRG8P&?S9JPVN?)dG?BPI4L1ZO8Q=6=*y>ZWGVPRpQ3jUg# z`5ZtBq#)gH|Jgd-+;D)~c2w*E{;DhXkG(1&HN3fNbZ+<_&=D*QojB%}N#)06Z9(br*S$i`=_S7ljQMIU>jMD#J$?hBQ8|^+}tZ z#MpiDKl%v|ez+F1R94jRtwN~ygoUO9QGO>jkBoLqf8|6x2$k(Of7EcIE%>ZN4bN50 zHn5-3WD?4H6grXMQ+}&d5J_wp6!tvpfi^l-Uh8dvyd=>xdGw!0mYw9{whjJY z$uafHprqoMdLte@aCylJZ|4j`8L4JM{vnU3*l4B&W|jng;-5e5*94?_rGYjI>(@MmXsLm97H&<#fYRd?K-c(`kf4a&E@IDh1&((gxHbhGNvO| z^g=)}3r0NvK3W!y-IofynTlHz7)?;O+~j=7-fa6^iqdGC~NblVe_6tE2Z`2{RJLPLjjvDcFgy&ae4`ZMk(WHon8&qli zZC&Ly=1d^LRxdI0zF_LV+5TYXIDHQvU3rhmI-+s*$1^!QX%3F!&h!R6N{KlEqkutjW2KC9O-Q$Yhpp z9`HjIyUO0ewyzONRgI)H#(4?~l}tM1f|xq6jn0sqLG?j!t((SDcFM|y zy`dK4#gbPpW|<$cyfq&YhLn)=5SUb?^U26U#g!jvtL0pdIQmz#=KL2ZuP&h11CR+o!Q%41M&_7&61M0aSD*a^mD(XL4oPkOc96qz-8HtD^pI+_@{ z!%^#dO*^TPQGfXbz3B$IwW)=Z!M{Gm!msFljX5I7P6^yy|Grj%*es?dA4h*(K6Zw& zf~!uo^99Np+TRI`+--qdo_K~Yb<@3VIA%uWV^PTUPJ@2=t{ugrv%$A;%drWM&^MzWb<=8ZU!$I*(n(5rb;+K?&!m%$AC?dFx@} z6thJ`Cd@Z`?!jnbD5j$P1F`16Obs&TQ>Qqg!6{l&e)uli+M10x&P$i8n(kt>EnX;P zhD>{+cz3tO@o_2&kCo*>fu7T_-xCJ&W2o_Ah#fO)9NdnR>g$k6$A5B#2(C{qV?W(m z(bDI|bC>)io{pZrc83j&6(-EyLy8m(JTcvK{;$a%W~OHFczQwPfkjW`3D%T5S4lO0 z@acW6NH8)qSP!NPTbzyt;gP7%KfK&P+e$P3q+>JZ+AOK>d6j3e6O!H0zBvU{obHTT`4aLa+(&n*d9eG|jR zofU?|gAapU%zbyg;7o0C7$}PM^3u@G&+ZT}t`b??5a&tp9v+k^K^9*o}1H}InogP z4@pIT{J%&l=hbjFF`U#mF!>wlX^Y?-&UYAIR83n7Dh&LwWH;N$o>Z+6N$;;yoJVti-2ug?T$vm@U2o3>W=WHNI>0(7&U8 zZGpFR$|kth$zvv?_eQ_i~F}P@^ytcWGWb_Px11*43@4vq&b%*g#DNCD+&I zghe@mQh%LTM zycw9e=$5obA!W8)?$1D#p5tt6<8_<<&3(%^N?6n>h?CYCOQE#5*wp{^%gpdX*TJAJ zP>RQpSvg8^L;IT3>sBOkZ%tCfhPz*e{`Oqd?{)`KonkbqwPA9#UVHx8*x7DA%P2~} z*zagUamv)e+2yc@-^UG-p|4=;cw`^sW1 ze(<3bt%@h87juMYaU^~YkIbobO)1R5Z&X(05h{`e2U0yL$POXt@{p6>oI&}utrpH| za|41{%(dXCQx-h>z0VULWsT!<@dO1RoA5d>SVbth1DalvQWg`YGQtBPl|0mtkt1~`%=t1 zcyiai+IABSPE{aJt_ttD`MLOIUSv?39rdFaV`PiXG*GxVZY$_^%yU9_+1)3aF#=1Y zi|~zc#;`)wi3@M80|R?rW~C2;)7Ba)krQf>*5>OB5|kcGqzWl0i-7SX?-G(TN32A5o%9T0n*a9 zm^(wc=o#gy0x1U8H}~GuNmOM(SfGv_@e-5(Rj11};>a^>UM~bUG<@i7?C`_-QO1o# z<^eN5@7kulls?)F5nwyK%IHKagTkG3MCiOHh8zij$2*a-H7lUZlP6@RYz+!5oU&O+ z2{2OCTG?$E$0IDiQ=zqp&ZLLrb3TfycV`KXd@~K;$ay9VK3$qgIBC;G@i^a;ZZDU< zneAD7nrk{b{`spUW*sW~;U(4AkGOAWU&T_>BH_dqyheXZ@EYf}mD}r<9BRT%ZGB0k zj&QvW^q+5XUKqcZjAeeKNPC_v#kAW3@q9{^rHlO#529@wHOZ2NWC&W&McP30y|Y^y zP6Cy~kSsU86s0pO%7LbP2YT=|>J&&)NIcQTJ32BTmwDdG*fNnT=OBe=kc^V(w$DE< zOUQSA=Tj*wTla1*k*L%N(Ysp6>4$Q zUemK6C~6DvRq=YYb@bk6)@^Gtdj`O_x)VpKx#dM(=3blyA@a_n{(p_u8`2aE~=l#pV9Tem^}{)2({D7V{?^Ts1y{RS%pAeekD&@4pjtXFsX zS_BgADZZNhdsx2`JX@H--6h~+h-!4iW~%lWT2j*lx)`W}r{$;VN+vH|#h;QqNRc~UWY+b-()@J1(Zz)<4N;MCHGQdOr})(~?BbRF$Z4cjf9#mYPaE}7xdIJG&pK?fSD|fMU~SD)R%Q05 zRI7*5P0=!C&qA(A{@1gReP#QQB7#c0Fw}#GjF&(@{o&_BQ+b>&C-&_Rbv$MV$Mp5n zhF}R#a-pP8W;3kIb|i*ud<^!i9%3_}nEtT(6UUx{{i@wV*T8g=X!Y={xhn~yvqCFc z!Pw2gqC;4O3N4PJ#0+hlHQVy`OI;4$5U%@M`JGA3+RxT>E^&>$Z}_o4^ubxglM8P}E%s%n&4MMxcyngggcAbr86pe;wBaU$1t&jY)wK6CEkuiBB-A#h~> zz8amoRp8T|7l#e(!lJ*Xymi>kkI28+CrnJvHcI=6kfFdeHw0>U zy|=)Gp`T~(WM#VsiBt42|3wuP$bL*>$1c)T~#0>Zn~K+XW_-1b;6 z_DdL9m*pdu71)BjzeLdmWYsb+*GA@vWUJbM?vCeiNwKRO zhn(oIS`)Kq0`t{Ky<8c+`o@Lhmw-?c|0JO!kKS6EuZs&& zwXME^BKZfOJ|u`nwryicVIAj`53j!yZ}0dt!WehP-9PYc?5FOdXtE?fG?>TEHXSDd z{fQKEQ1`*nVXOPx$aG{X3UNGm@_` zJ1b<4OWx>6kx}{i+HEvLJ!0ug^82^S3X}u*0td@mw4^&d{?)Va&#f{k7gr|5JcFNRmVb_`iv)kH_Dmo&8iCq7DO z6KrPn)~-G?ZxM`GE#VFoAQ=u+4S6a5%yGL?r|gH$@2^ZMs9Nz}@UsxN#lV#!96?&{ zO`JInc=I*R-Q#dvW~=m8FnP}5+gP2ns-IV#bcLW319UcRJciup8ZkuRL@!%~P^^fh zig<_z%`I&~-Wp)_riDa&;zZn*c{WY_xWHkSz$c3^pKN=|GmA+8_8VQRw!c!e`@|$L zW0}w#1Z-Awux}~hGy5bDmT>&cb{9Qgs=5|T1yi7$3BH<<7jdb|cYcC@LVgDd}!uE_BI>?!S+T9-)H0`C&#; zh|aG!gSnlj$C4$Q4d3mAIj^u&L|xi1Sd59p5(UlQPnfM1`8KDjy&oB8|VB0U*!nI@cKG@^n#!QEbY+OOfKS(dNzsW|!0r z>pZN9FK@rLiXiCrn*;TKW!kCc#t3=~ILZJ>CvXmDlD(tJxxP5#O}6_KmNya5+)wFY zCc8cPLiJ$(^vt>V%vFEYE=$3N)Ia|)|V1EGpfks16 z$gJ?%;Z>>tUV5KNL@ua;BYr7_TOeK271*pNqpM>7p5|vGSmj0ZFA%hlE9XOJn9^vG z2(oU#SIRkHr$Vl19S3uJLwCaRB7Z5n;s{vq`0fT)_cq7Mgd|Ssv&;#F$aWy&j@E7G z3bl%Y(KZ>;{nZ^Uy%=FfiWq|v7fZxqb6Psyy^rL2^dZUfS0qVlX4`1d<FP`s@hV9AyjNK(Lri1#R%|xqMWzD?l1NXdKV^z>egMEq$HjX)4C6rm%zZs0R|4GKg%06z&>~xS8h9hfTh`kJ z;;6)L(zxuL<$qxUeWTtopA=BaMyq8){Q4s=r3zeIo%m3@-d-}iA|03clMkfsQIxpD zw2dt?&6TE4qi-@F47w15(VAQVd@8EoXZNPIukribc=ZTf_SNRxx#kj!HKHo2UY(2s zzVW9y9V7ji6K}BX&lD~f0g14BtvapP_=O90SHxljUy%=RUuCXVDH`SRo|y0GB@i9j zG(mN`*+6f}ri@-g4f#m#YXOWPwDu4pux`O;QLS%3VlGbq1};W&o%{RBvH=jDRN zYO*U?ejMXBVP#Y8&p$&^Xh~s)E=vyuOdl+ihm8fj&){@l54RfS6t%&>GwGl)#K2>? z%rCsT#|f2by^j{mUD@ux7JjS|2rjx6I9v2B*_r==Ljn73kS1X8gH@nYrPn9Y0wj zk|N|<&3g*Cj}j>!C2Jjo&*^L-q})Y+<8E*lEATyj3p#?)pef%fX7*=lG<-ZT*oY}P z2x|`i)CI0`sUS2cS$ZGY=SVN&N7K3qLfVcoK{CSvLyu*fee|dS+E*RGZ2$|aO=}1m z<3S=vaVBotfsE1R6oKy2=r{PdoVTTT^0{%xsj*oqmy5P|_8v#@=T{rb&wqe$ul?C= z=IffL1YPb8eSHc9Q_9|EI|dsSZcQHG37Q9#drIl} zPgld=vt&&NagMSZVwfBIp{;_i+^hUfyj?P`Ud=4=1f@7s9%SM*#f(ljIzH9!rCX@x zxiS7+M4(qlTpmD; zgKlqDk_8dUOGeN8a+;;qBN>d_h*S1Ja|R{<&f&SjW{x{`ujurSp>>w@k+}+_$16Mi z>w@l*j&w1zi}IUAaz`5Aas$q=#SNi?=2|FN{E;Pdsi z2gy-cSSQ?fsxz3Zl!K&L1dm+K3(m|2+53v1`3(;#&}?nE`FWqYZaok?LtugO;FFIN zAF}Rdk|H1LD052|fOyJh`$J`?JM%kS$~XI@Wv5{?5sLs*E_RGGTR{i87f}Cuh9Jtu zU;SC6TGt+^+RfZyk2BHRyEc7@4c!k8f=Bs_!^8VSLX+U;vw>I3*|5G@Ne8ZE;T(RX ziu1Xnp~#AR$YEk=XqAf`#^L&~Kg>o_BYW>KQS$=G;tmmnppLq2byQ^aWZgj@P2n~! z-yvoVJxdRxE8rDr42#3YUQYyO26`){IjdP?-LaYG`mNeDPtECZ%Z~GHz$1+Sxl1$C z8r;FqE=_RIxO}QQ`*QcycRTosRd(A~l$$xTN~|XT;%EOE3^92$dqjs{jR}&osO_4s zm_UY`^CeUeoC}S*6wRuCW>wKA2>fAl8eFow*h>yRw~X!~czVc4zgwFue!fBfip1%% zIietJ$|2Yl!aF2Gm^+)>FnfkcwmQA4=;>_C3^$_RCGpv$5Wg{l*snEEv$C8aNWN;+ zfWF~69Tm{2F%NwL4SfP)Y@3YSO;ICFuznvzFTIGackiQGLsK(Ty#Lvi2tQO~rRtqT zaU}JbWm?3BOI1FX>Btd%LPtJ12^Y{CJ6?pZZO#b4%)8S@{Z2Q2 ze(mfx!<3HA&o-b?1`wB#;bqB;r4KpVx;WiBN`s{5pInefDyzP^z|aYTuwEw*wD5~B zG(EHWiUMQ!Nwz&0CNgl@Uy0t+!?O$d4q>(WI42-)M(%6Vg2IV0+g+885FO5)I;1=qGC6DhPckuaI4b$&e^$wBKb1G^X7`Ei z>X4k{d*_V9MUg2hoL>{3H@lwkl*=E+{bTdakp7MZ{6XHpg^GqV)Fdn^OexQg6Qqy~ zz*nRn`n8N~kgP*^R=2r9Tztcu1a$**o4EifT3e7=(*YBCPQQ6lv$EFI?0Ob_KyxTV zZOWadGhL20ZQ&cxvm>3rQ3RZd%GX{P`v?Z~h(me=!HB^F&xVsL8c@ivAX`5)sEN3T zlfd*fIpPZ_+bkd4I8O<`+}ipobbR;-8_7r&Eycu+zM%bHB%hSQFp8mbm5-AhA2P6^ z=}o}L9P<6U7`vtit7@lTEq!9kf@C)H!`lT!=DW2sMku+stQAU`Kh9{3e*wI^(Mxxs zuSW^g78r5He&-uUxAS5I<$dNReNxztFKyJW zK>fQ|3=PdJ=fPH(u2p$ls!I-TL!|F|mSAR@GGIy!XXBY3ZxK4#UekO7gR4!az8BOt z2u%F^;adhxPcqp8lNTNcq_)LI7k1}{$}D|chBOFw86F-L+Ae4IZj6t3ZbTDQTf;t^ zsj?^#&Ha*-TF{qqi|(kr*vlwNXPRZ?6pQB+*Yn(isk>Neh-BhMXh?9}u@3c5#v!Jk zT~4;bUm3Z7D2UaY8*VA4uUtBGn!KRvMF{>z(vmY(Lq&}}FAtOcI=Ixv7A#3R2}YF! z&gi6%H<*uK;@F8&F;SH=23A)!a*4=RhH2Kd9n~lab<+ht->^2Qb=VR~^lhH*S)Alq zkfbVL-E8iEk;aK@{IQk^d|7yWx#z)mAJs>*z_ zMmaDb^c$QGR%E-NES%da*SI9tb690shW@CTr>qC$Nt&f zuLzRFrPSk)-E7~|3>kJ&G8SKRf`qGFsko!2apS!H2-MRYwe}%lU}-euY=boJ9w;1? z$ir=3b$I6aX%~cYR1DAX^WcO7pCw*y_lc<9S{Aby0s7By-TCXg<#UOQ*rvpCGcEoP^@brWM8rpy=4 zf69sP$4spPR%-^bG0b$s7jqobe!+ZF(W4bXyy}^UyDOP;3wc+?7}+U0;kT#vb!E*0nE^lkChVFF$A9an!100tbU!WjBTBxT-Ma!QDYr@CzZA znYeT2e)Cy_{&KsC{n_gpM>-2CeFI?5*SC>XvO$ zBtY=s5F7#ocee-@Ado(>5Vg9WsAKnYq>~}!aDp#weE*S4vuodb^c`610Qas&}7PS5x^NXoIZ1$ z4F)?_W8za6T6poe4o_5ySx5?%_(?qkMmnYg6bmp_t_f?tL7Axtj2LLL(opQ2hK01E zXVKwh5sB0g$vxvb3U=b^zDw%oFU~1@-c6DaH&?nuRK1XAdCGaFC4s;OhI}hdq9MTuBT(*8b;>ODK zZPZ|djeQR*nhJVl_2|`FUb)3oqI7z7JJ_VazxUZ*lg9_C@TGSLriDa*?d`Zc_O{;s zynVcyXlY6J)hn9KW#!y?2CaVXA_R@T{M!Rmh&0c){^aKoy(>-J$nI4vSmc;=5*QZJ zZzj9Yw#WThL^>tk<{78*+fez9q4^CoC`{LgW&~G)a}5X+$MYlFVweIzy$P=um2GfK zdJVt`lYmRm4zi^4IUIg}F#9`Hj>MM?|{^f8&HTk)#(A|Z^fJnPxB z>TGsz#_grWI@gY`qJVMbPEmXuS0RASu&UFRQ%yIJ#=Y?;rs+qpx!d2tNK8q2yO=#! zWxn%1Nv3{fS)n`(gjMLqR7?7jFmTPSolT$6sNaaw2&C1juccLT#y(WvbjS~UoIGG5 zqI2l>tu@vG5hyj|<4d+-BjV#zP2B>!M6jjE8f@^zW$bv%fRHrQ`IZ+Ky>oIDTa)7A za3Ukoi$n#1PfVHuM!qb4<~B8@@931AtjDSof1EHbUtVRY+qqc9q-!M)c?s$m^}U53 zVg-RYS{6qzFiyADy{#LTuXs6$BcG-9_WP0|4eW}*v424C>9P2bsc1gq%D=q!DS0#_ zok@FbVDImkL7`t?;Ny!)DC0|T_iwO_FD(nu*d3$YJ5j{#A+?##j>Mz|sR`0tD>W)E ze{sfNu#(dqu>O$FZ%zxYl0%l1Oeg04?r{^zWj)~=SAdxVSK{%MFy8hL?)gMT_5LaB zk>>OS)3je}FENK*MFqw@2-9R%-fA3PgOX9mjyG(WNIc9*dt(>a7%Hf$4Pi=Niv0!z zX*?x#kAB6wYbAFVN6{P$A*Q2nT$+pW33$ih@ChU{Wq>eLt(Ag=cE&cHVdLU;)UJL=-{d?kqkXtvc{K3+%KYk0)+_RtD!20p*C(4EFlakgoj>#eW zQMV$dOqU7&>ECa+;Q_-Er4;voj=yCjQSS|n(#IquynUy~6cn{Peilml`7xdYRhMjW z)qA=baV0v4@Ns#3<`rDKA5|q9lEY)8bdryMA#M;I889?@)O@p*KYGU^j#@`h9-R^_ zb!Vu_gwigcDc4$*6D=BAE_L74^N^`GdyLl8$K5j+&_?elonEkLFD|gSn+uZ5(8kT` zCixc^z@f9#Nje>aX9`SCLfYDkl}>^xNJAon8)EVUNp|4hK zYnd0M$<_P20E%(Vm0~A|%WJZJTw$WrR zCeGE(BxYD>on!6KVMa0UYo40@}?hWvD~d~@M{$c0-7AvpElCR5Vqr^PZa+e z;@N98n6e^bJ%+2(0PW)C;^5$jLXg}xoP%@^_~{iI9L@`BYB1i4Z4zB68NKj~LX zk>)zC1_~8|_i$IO+G8Q;epK3t;h7JWhN6AESDnl|RoQ&WvIq-lMdCVZE`=Wu4rZwi z^ed-Z(jQFn7v0)l&$H@&?{S-M_4hj)9&SBOejqF8@zh)Rd&4o;FS*6<0sSf9DCZPE zAY>4oWB*e9lGjXOW#h}=$A0voTxB*qp&z*FkRQSSQovF`eT+1H_?dNebu$9E<(v{B z{MoVu?4s|!enkP|zL;2`mW8T9z~hZ#1l|%z+5Kgb~Yqr@RY=e{nkjW;Xv7R3W}@MiGT?Oa|ZIi+sFQ+$m#GfYMw;pE`=Tz;NO zmTAAWD+vV38Vs4Isc!~m$+!!S40*-J^$aJ_(CYO^3>qp2)pvSAMWY$P947QcVVg(aGtbc3wWc$bu5B7a$B(j@NXt8}zs}Q}|W* zoPz31&2qq}nj0v{`1xJvH5Fdo6GUxR4}%|bT~xE)GV`)FSW4+L8E#DI(@OEtFMy*X zvhcrrf{IG7JKcixzhuLLd%z@z*1O?Bg&juJLDVVJVpFeZXP-v>@5y4jpE$`H^axdW zduZn@=2jQ|)#YBuTc8_6eANG?_IHZ?tpS-6a9u^RdR}|K$Q@iJWAQTbzimGOV zJDANY3RHU&McEJ8M8wo0A5WPKvp`1EP*L41_IvX7!nf`Djs0iL=jEpn)_g`gI?|ht z?W0gm3Lo;Un`Gu13<?J zb=x)O7c{R~JZt-nM%GF?EL_q$)AY@FM6k+Z-U^jpid;7&K{MM@w7m?c>(NQ1A(xe> z#0}9KWTfHNsFHRo)YIqtibD14W1Zx6xx|^q<9nohcW1&vC-29}wK}w(hEu_B#(pmZ zV$5WP=efq*Sas}JPj;VrRO+sR9^<24P;!aXaqLu0(saE-5M#FNh5(=QpeG5e=vXs} zN!`vnvQXDP%L^c#<_4{Zj^nh7ul}CRRBOE?>sIr)ka1UBi-ENg(RleMZc}(;c1hZb zOc2J4_uHAO=lrb*lFXbuzdC^OcGo6}!WLJ2kQr#>DE@&nXf^okl(gfAWd7mJ&WW@A zp11~rtMGu=Iz~6Iu)nAZS?kzPM)2PFrxpYgFJxGchLx(yo*Ez4+F(0FJ4d{3J>$QI!F##9JAr4e#fM zDh63lz||`6lk)58>vev~Zo1D^pMp4Xa5B6l8(^W(0}qTu0X-GqvE@SV;*v@|QXQ^D zdA9~FF9w%G3Y+ST_KAzk_~Vetl`5hIj}-*?+d_uOms&5r|6*7^HeZxg<7``ya&*}x&kk{mjrP8F5xL!2||g$x~ju={Tn(;or7w7Ao`KX9`YOG1s41B zJ%x31mc5C%bFFz8XLWLO;?i}?&6UrsrRyv;7!5PyO)Mxt(6HMC4XO8&VX1F37uO0` z`W_WO7_|0dPN~>0xQTQxmD3UO{y|lt>*)<%+ML03F&q$yl_qH~?iS0unl!1ewateG z8;Fsv%}#1jUZhK~e<^$;;||qT_wZpWG|`T=!;#cj{{)#6YQ&mFoPp zSszKhFed<>qqVnx?aAYb?AbeiaR4YwlrxeqLNKC^PyGRg1jrYP_8r4&bq*n`vbN*k zON_>rd+)RLTXWp|z2ckvE<5)%>Ml}M>c zB6YWL;O@5jVnAM_y>8wQoVSFij0e8^0{GZ{$nBn~*1apKb>zj$b)lcL{``3xouItl zaM%iwXCd9kmv6L;u-`(8SI3h?R)*|R^4U$MTZq_f*M6k|l_xgo2`VBTvw0-cyuv<< z3o3_RAmvXsoGtN~Qx4iPo?fmbl}@-(2VG!uXDb7ZrK3=yUf=3UqWK!Ek1!>foh6p? za5krLShDxlQqtUN!{ITZR}S&dUG~*%{fx)s?x|Ug=XDe@Bll5b&`svon&V^_f^bHn zhdSrxRZ_}!QnwHJWZCww;&f?qpNF}jY)xQi^d}s<`)XT$kZZg3(xsH0@tc%A*^0C2kssQ@s_b!0aglm+%pPUL zmM94J!ojKNaG~66nE=bph<>EcrD(O`J&o!V!rz#?| z+rnTN`9n}zm?y=TS1Q-ST{oo>1@d9`aJ(hD_vbLRGzfl{xi-Qca>R$WG2fau_ zjFwC1#zYM2iq1mzu<}gc&1{Sul*_(7VBE3gm}PTc?`yON4aa<$mvz23Bm>vL4~EcP z-u>b(T6ih3;)8kI^VJBIbH)a_F9l z@Ni!k_u)1ogM4LYh+O|P5B>RkRU{sH@p^$UQ5Essb8D|d!aEp+L2Ns!?_` z)$a3mK}{A~#4tLa?O|+yz2;aM&USt=C|_xORO7(KV9p#cVO)ZM!ty$!7mdF^+j6O~ z!2~^fqPWjV%|U=b*fJ*Xdxr*O)I3gpHQHK}@4KE# zPq5A-;`JvCrs$Fgl=+o85mYdA)!Xh_8F?HtwFfQqlowW z>-+iL$H6rkJX+t{%IbVN-RAy#<^X&%E)M11^0d0!;%^=ZxnD-N)?4*9dQl#7Hlb@xl;){>F?WwfB!UkqMIqo*9Kp`56)-X!++<>sO*@Zxu|96ETZF!kaM1}aNn==i$C|71TU9r(}D2*(bS-#M?8;lo?=S25+Y1~dMSBV8lUj0>`lXh8?1&z3#>^{~TXLPmgN~qH{ z9q{L#gZ}))tn1#6bexQFOB#?bzBJFG}T#2NHh5CS79(PXyIEYa%X0Rwk{Kr$KpLyQtzJ;Bn3RlXqqK-8>CF6ls^jbe}`uhI(L74#G2DV4% zCYJSzF+gt?NMjIcS1md?9dx;$lhJ8iJ22nt<%RC+ zm;`Df|6}vo!;P!MeOYDxH>I!Zf-Vt@ zg`JoR=l$;IH0BS8iMNXGV{)6cMxG))Xd28OJyUpHI#zr-(Q^k_}v z(GOf&_|xCJFo}jii5!&@EcsiBS(*dJu(L|?m;exJ5tJIP+37zVZ%KlsP%_VVr%xmaH=X@F&;>wzi~z-?ZktqKu3H$ za3r=PoqFK4_4SH}7AqFi%_wzFUT}0sOyEMkbYl)<&6r3CM>moYbXb$7uuKmd9+k}nq~vgY3V@X zN5OMDF8CQtNX9Q>d{N(_fm+UQo8@!qwusAZ780K(ACged4>G()rXR7F;vJdODzF47cA4*a zC58xn)q4ww9rb=s^_fa=1Uc>sZH#}s(H@%HScQB*+e1@Bx;RGt!lqI`oXh@#xHVf3 z!SIQ62ZfAVtHXWhN;2Okjs%5lq{EYKtVC(+eT~9@gEo5}q-(V~)Dz1O0Z5?GsXS-+ zQk}Pz8SZyGwvhpe$7g#(yK=rYD)T*Mc9Kj~4&whCO|Eh1y5qm0$pvz3NLWwQQRa%{ ze6i>$p;Ii`e>?g;Em8to=6yXzUFD@vLk1m3S%ZF_XKg(bFK-Y8bC>e)kLSHeS&%** z(3Dmk^Pe>{(d_;5q2}Bn@dGw$T8VCZKF$lazz`hP0#j4!hG6Q#PF1ZtQG!H|@`z83 zM6Mf};rnxNpecFxW_n0CI7Ggg@a>S>4d+RYi~aqjc}<|tkWwwDWf5lQ&x~&Q7pd&= zeO>+QHoj{zwd{uh+0gUzS!eg=(CUYdWvs_X zE^XmvOauKyB2W+q7D#uYD9CgI!cq9W>U#i1JYwq?uNqOAckg@SM)PO)#U#O3Yk+#K$G-Urb}FaUl29t{>iTT5`!90l0W1rR7*RS4al18204Zl{ zJdnx+AE0GfqEHuy@V-At?buWhsQm9}gvLd81-zqy{fml|`$bw8#FF}&D9fNBs3f%4 z878v$+PC<<5&P{Rg8SkbdR8g_8`)o4;Td+seyN5rO0Qy)n!l-im{o=Bu>?Y$`Ke1m zMt%8c@s;A+uWK`9HS6P%uS6SavTtaLO;?j;I#>^m5BPV2nWkL+KXC4#oBu86&SJV) zw5EdYm_Y(PYjC7f%e~qWiJh!H<@7S*QenH(#ny|2`Zb8}E>M1XZ3laLxE?c8a6#8J zfMCB^bFix`zA0|(FT`~hf5?1-U#)xJZ+_UYC30&8*Khjl;Sgg-K&1B)l>a4otpL0* ztbcD{#8Nk0&zuw=CwerIjv2-s`F;}86DBvrX8xUAKhrak9R_@~d*#d$gw)uz>Nr7K z$y;F)gLz`C)&8R(tCGbiP6j%-R%GppsUO;De>ZwI#btaiF)6u{-%W>`bwFL|g?5*y^)ZzA@BpdQpvR+<@ZJ5v9by+GE(H&ZXQGol!M@79MoQ~-=fSY;{Cf?jQ8caQUf2F95BHjhfSc}W z2FH8-tkT8FdwIKoXdsq8kMsbL>T_AZKOR>&tsZ z4+)HEikn>bd=8@JJpCEc4>qIHq1`(zZRCN#j^10>Idqdj*&A^%rhRUk_uC?F{j{w& zR?%yRJr=q7tY_W?+SN$SjXhHJP_5Z}{;#NdAT7m_QtQUwbbyrHL3D2;n@Po5BR!@2 z!%-HR=jKl;H!Fjs6;hLSR~NZK78tijDbr0?$VZ zUjA^!5Q3Kps}gSH@)|vqlnlYiCm2+(!?U5?{U0f~mUqG8q5qKbP|_>M7G@7@mHUaM z`%ao}7YU$;yQx2;w8a=KI{xfTfz5#&+3VV$y>rS4{FoFGKmHt!0KIkBt2X7W*9ySQ(n7^t?GyR^X8vovS z)gXOhM00hG(N#bn?HXA8b_3tNZ*@K`dr#Aw>mB?B&X-8gT1TdVo56IzvRZF6Ez!ZlQTd29~6Ve#(MCQ4(ggM)kc zIf6s@hz$ z%&TkirDSw{P)E`YdP>F8x0ldd*tTP5(K#s}ICxG9gA(<7)W$Q>u#W6OK{U!Jjj&k}hrh*v? zVxcW94!~KMsK;2TmwvkSxLmqGaDk-yt=su`agdWHG*l|Xh~sV8`u^p`ZUFEF@V&`S zG=n(sbq*3kUDk$ogPwKZY6>Q%;BY`Hr1CTRXK4>(JGLe053Kq5 zX5fa66M({&_@i;9GG1U2{Up-^xU>?F!|5LC=y`R~C<`cT6(0*eDs0s_yjJl4OUrw7 zk!o)Nh}bskz<>6)>3(tu!0?Ypx&D7T%@q4zuGe1>XE*uZ7owtalzkkue;tDP|0gGT zyghLIKY^q8Voi1OuQi7qot@(o*;1s5iHYwt+_`{(t-%lv{fpQ?(*z{6JU%D=1+}s? zWbdt@Qz-zJCnYQQ>hRBkfq|iJa)ep1!nR3sUv6<+6Kbv>b||a zXe?6JG#^vKsKEfV@^UMH5q%{jgmxST0}vhkbzx|qV`AnQqROiWDN;T{oLK-e*ics& z8M&CfJfxqe@fKlYNkLf=>ZhC4|P0X%1oXKGhc6R{h7#_a`>4B6->>V z7e}3bd5cBn&RYMIiUoo=$mIY+NUB#^Kis*7XVQ`zTq z^5YdZpN=aIO`VAJ8D?%$?PJyD@|0wx&cE+B0m6^Kkt<#G4{)a;`3T&7q69Rf_ND&9 zbCK<+S9ZfTPxu^h!I6aFI8*_+mm9 z8xES+f(|AC!H=Z68*Jm*j@MLr`k&R;+4fSHJ63(-lJcSj^FxYr7&49lJbq2={+x@| zi&RbvN3Y0bYBx+cIt1VTk4psKniY zv!TY)XtD;=c~_|WITRd%enK}~y6KYd-cn*|uF7@@y|hYi$iMsxKc!8dZR{%VO<9fxS_U{oM3*!9!&7#Wd*8rd?-kjx9 zgk}hag0A-P=K9@VcX-K_UudqFPKNLo%MI(@TS9HGd%_%6%QuJl4n>zH+@gEE-{v+Y zop1cQnZ&2!EB(`-uiM)TL`&*Pu@%Ta16_-~vW3x#D*HLbK2c87z23I->oQ6%l{vck|j&Fc`Xs3g=6KECv6-u03BByFgA}TH)x>>g%VT>a0S%cnH9Q`g#fL``tPR1acC9_d#13 z=RNpNC#mMx{R$ty=yOf5CuZsDN>JCyW$w7FM!A2`J}jAPYYb5_vik!W*z;k|TC>kXE9+RnFyH!hS;k}*6hnpCU=|y5>V_X@-J&rW zekP;8NcQ~xj=%%%dTDtC*W1yu$;RG(`A-ZyKpK30xZ~I0rdw+GP7e+V?jpu`uu^GC z0sSc=!yXd9E1ihG?cQ#KgMlHk&_1T|LU#^V*xv`JSb5N`&5a<4uFv~HD1rV6acWb?JSEdF?}51^vfeICXl5%zpu3HJQR{fYdEPXhO+5S_Vq{Qy#% zaJ+hu{@f+pCzG2jAy|t01I6XyTR28G?8$5gNmo~O37EA&Yop;fM}Y7EMDiGhVMJbD z3V}He^mi9ERd9qiFD1J&H)t$pK?r3f;nX)6p7C_~QLCXC;_J({7SH&WbANvM?^Dfh z)&1$X-#h@aox!+0w3VJ8f4!nQo4`oypZ>hxG>eutRH1SUBLnNyJSUqMEq|phwyIZ^ z!4<6)LAiBFiPF$v_k8{oeb#sA94PbOA(E2`Lr zNHHf6FP?XdL&e}V&VUhC*BA7rZ-+0ZO7#ScEk8l|=b|Fk1On zxL@iwDzP1T=)hv4GYQnfN0NybfQQ@Kkw&(^Bb@rWA=RJ1)%jH#QbKZ5*b}+dE*K@#|_mW202$ zz9*^Uv+sxiEdUz{CT@E(#SUF;aOJ1))p{IZP(5!$9-5t52V_*e<^+_ZN#2`e%Q((C zf3IadN1!8(ScX%s+C0UCqRL$mz1vV;U%Q?&tLX1%+!Zbhi++DI<)%XbsQM~YWGl8zl=Czjzh0d z%ez?K{)~RKdW_JL`TV+Nm`Vy?M;0tAq!q@y-`UYaAfP>CUf-EoU*$EGLgzbzwB>Sil&>MTA+O+_`X!FhncI}5qX zKM}iK4Bqhj(Ak`ss8yf)O|e_c0$SB9dzJtwfHy(QR#1?KvpW)(S0TZ{<)TFd^Pe1O|WaZn1Y!lv04oIW-9&@!mKp^?}_MR7ACzJ z+(%WDe~u5T_{WU1zpsTFicX~qJL6yftx$T}6vo+bP^ZLov9vu)A!-0vj{iF7GoJ#% zKmWwZfAK_K{+mwlr~i)&u*tfjhgcTRLg_WZEXPg0=W2DVhQ3DsWRo!yIDTg8-wxxb0ffWI{Ng>$8N=Ga4TnSFXZ<%qNu%4DSAcu{PLccDSLX9zi)>;EjxF;pT zi&WI4gKEr;vF80IL|a_n4ph`EFmr0F%dcR2iea@>%*+YV?*&a)_r*_Uzv>!q=FrGl4vPX_3V@fSV4sX4@dpD?QOD=rYLNy!z${LEYr$cA>JPL#t0OGL zpJYbH%vFGYnm^%F-k2jICp_RA&aSRFi<3S$1sJi3iDtVM&jKECx&h6(?2jKlu6Ok6 zzk1afmvaZC7P8S0Z5)e&f+SbWJaqErnW?G=iq8)K1Eh!WeU!Bbzs~#eGkuptL1B~+ zU@KddSaDq((XIZG(@&y#oJBEaCEzGg_VUmE0a>kYFbM6OVgVWTpZ*=r%Q!eD+vB-2 zWU7TgZo%@){QX?dTo~}cC^mW0YpZW$Ezkggc9Ye8CF*^cpZkx~RjPU%_%HEe27~@V zx@@caCf`Wau?i8;0!e@mmKHzN&XE4Sm~!U5CM1)XGU%M4C4nI+4jv0D``P83R`EHv z83U(20gx3`&^p@z+wN;T(?AErq|HLoNm^hw2E{)?GSkZY=y4vsZQ%DPWN(*5>Z5!q zv`s8DCN;C9eCMP8-c_<3cahgrhI#)(D8cVy`F9tA zRac{DW96;mpA75<@gj2#Uzo)&2y$+Cj!CE?zio46ZkM`SZ*QcMeN={6l|+!JDTt>34g)_@!EX z*(jSSq-2?$#QOEinnUURm#=xe4!y$FY_}&=G{%6Ui`^L7bge7g()%w*zX;fs9%qsm zLx_GQ{_m}VXD8I&sC+LQaIxq~4~E^3wsgK~Lpx5hOUq}(d^OTqV)|Xc ztRMFV>SAB^O|KZ&h0_dbeLULX^e=3^DBD@7b=LRjD7Nk&4x8}t?AWb8Q<^hr0;FK3 z4n1xcQuWLnE+{F=Xx8zX?i3Uc@C)zLkF0Rs==h<{F4gN)fPqDFJ^ou`K{Oy@oKv}Pb|acYSx&Mulo!_v&8#O{)fgE9qKD|dcfCBT%f zLREJz80sr(zOJ-nL=+K@Ny@Zn*Hm1uD7tq>^imk4xY(cI;taykhP3oNbbR^JnP+V3 z*OUW4HQt!qx4`>Cg@9KsAahaH*`zSh)K=a6rJFOh=Q$dkyi%px>xz*hGkZb!->&Oy zTdy!PrAy*tWdl|9Kx(4I@O)_@>?ve^g0@gwz- zk1%YM+Ga=XOK+&cBv?@8>K2~Dnq$eZW! zcm|j99{4#dE^|(8gnMpQMD;LrR)(X7S<&-lI3jKAetun;BWc0t5M!_$zZ-%VlVTWH_la4=judvS7 zdiQRLAIwhac|7i5PfF7!19{*dqJ}XqM|-AGI3F+aJJoAwy|4X4fccs5;Boc|Kj`6k z;3>p!^&sfznw18kNo5BDzumXThs@%rU{Y(x%w~(u2@ljYTGF6i5JXs`25Ytw5WBMf z@`73Eq|jfF_iJfsfGONR4m;8YjCTku9NOMgbq*-V&7d-B~m zg|B*pt~s)r=?8x+)!*TT+GR8Wx4LNC>VTwA{m@iTB$M|F)84(%iFH|IfBdsHPwh4c zEi0whj{`apy>8C4tGhMHl&WGIkGq1R#fXNLlH$_nh7_PF|o{O3vhfInc>;ZX_$vYX52!8yov)(ZuiA zgoM^L5>yiA{+{2zDG+2x`q4Fd`zZ#ZZ#HJ$J^tp5De%}6-C1kxt-PBE_~ckLC;lt~ zTnR#|7kUjIu`8J*4LDj_dXG>2qRYY|=X5QBu!{dS#74f$IU!@M|3T z_;T%X!XQPvyS6qzK$ga>zcG-4T%r6{LJsH~Q{`5~M45YAQ~9Lw11bKahy;kIzuJ!$ zCXbMqH_4!}i^$e`iClpx22imv{-gFEsJ~qW4mc6+TYq%jMfQAHf%!04yfx+W3ZyO`r)y&ERoUMT+Jt%n51=$y|{X>pIor|E%aQIzKoRq=hdrdX zPx$JiCe}EqJLoO9g*#RjkNdh%zAkzUMhP2XV6XKu7LjgD8E{y%CeXd0RwB%--K27cL7h!p2aT7ghR5awpaH*2z!m&8utbQ$86aZHn&rRGLkHx&S z$QurJ^~NmQmJA$B9$0D5T+7y;U%Y`s8qjJ!o8mg7H`=dv95*!`cLMi2QEM+(PW^(U zv9dCy|Mu8(WuI~(4eN8zo6o$y?G(%@A%n8EJxpV!jEj21-Yrj^mJVOFZqs>%>-Sbs z2nhc{JuhvjK|vzu=j}JRylsq5x4vARZG5wORN%6hRI3_id&c>5C_o$a*>;NxV-4q) zXxwwp`wyOEXOxqH(WkiyecJsb96=vZV8x_?x+X6#I1QQ16A30E*CQ{Ggq_J)clwX1 zHmjeue)TOb-%B7cTdr8$A$4O>U4!T*&&9Mev>^QRNJ*TIrxmx1M#MnhbH7{5x;kSl zR!9>MM0DeVwg;UE=5Q^57jdPJz4_%CO5bs*>RsSCyz$Wi9hvTz1@e@}d!q&NNxZ&_ zTG6~KWBn~5J)t2B$V3C9|9g)qwz!Rw^SM$FqMIeI>*^i(gOjurelsmk`30_P&iU=p zn49|6i3o(r&#Cj4?eKA3*t^)>2MBUit-MUrLO$~McpaniMaDY?L8ZkPh=6Yswu0gP zyU;qidx^*?{4@KLFZeu343G5NlM^1oE2ix)HxxuXJYTE?G8^~A1_(Xi9zwAr!yPGC z+Y1O!jD5}~Le^I^;r)wU6I6Is_Xt>TGm{|K@mQqShvD5DvcgV`0oH4G$m-eMOgyai z0dv}%&d2q!1ivIkMnN+ydv~S1h&8!%i9aAI{xO!a+5#iZbu1gDNeb?@pKgVcc@N@7qDZ zY$^6NIWQML4_UapC=Do0MbSPH5hZY;uRr`Z24t&MHmDYpUCjQMCTNlKxbB zO#b9I-s1X1L$=g&n`9-g3|LN;m$eL&46u9+h99$kRbt$`_^bA_304NsAe7b#UlJe< z`Z>g{+cVYq?v7e$R5aN{V>S3r|9an=&+X*sXPz}o>3Nyk(?~RXbzJ+)G5lE9rZ z^^6mDF*IHdP8SIiyQ1Lqfi$!(9b&%@j_A+)R1M4Gtx3vA5m%)kT)T>GYU`SDXAC9D-6a)_gMlh zaZ}e?B`?>iN=lD~nVrA}sX2)M$AXr-!R7!6PRWgsSjVf=x}=hi{UNtkCvdPt!vf=dWc|TjKxskl~ z{c06`$djU~R01^cW!=Mh&|hnM8ZlGrs<;F&eP#OM^Ff+o9WYkn$}b37vxzkjNIclm z`5KQ*hVgm6u6jx+!wNMlyJa%x?uHB>B%RZ)nXME*Oc2F*Tfq4jh1ZyYr-_Q ziB~63iF{&HS?H#}j5jJ-u}|#&i|YCa36_@DAGb%wuu`EL8rkz%7a2DDeCpOCX~*2= zQXby-qnCwV?6Zz16y9m>Ubxf_4?;$zri0H8RS;y^YsQn|%|HTDp5Yvdk zdU-C^1)u0oP9G~qF4P_I)v3_c$zuQFyF){P>RG#D=h#TJk%pUf$pc_8zL(3J&pUEg zG5r4g&On60gmlLQg{gHku{**2l2NU6nq+U}+P2!aP*|*S0-3jvpyny$0YVtP&G3R? z;WFw-2U6H$a#u$sdkfs4D6+=kWd-=nETGHbm=@6%^z!ATOm4!G_p!7YQAzy3bK{c= z2>pIZc^_SSm`mrWp|P=Yk83~b{y;bBYLJ6uC_4N1_Y4McRCYLESSxvrfe7M7xLrQ? z#8VNUs?AN*8*9(lzWf5#k3N-j7YSBtM5dkYbkH8W!Q1jw%g*ZERmJ$)G;$3gzr5N3 z1LuQsS#-hfhXjytUYxkN<`1PZr|tvw?rZqYJDQNU#p)fWb(lM{X#&yqxBrX1w~mUd z*&03}2@oJaNRZ$O2@pI4_XG$o!KG<5xVuXr1b6q~-ncaGF2UX1wQ-pP$#dU3v%dG6 zx!=q`vu0|oWF5Mz>(r^*XIIt!?OpXe{y0nRjq#10F*>zw%Kv@ZlH=7ZQuXw_EES_@ zt$LhuarPA(fy?pZJ}YF^C-}?_m%kG{jP=*{o~d>wTk;%!RMN3uFMnIK=g$ZSsMKOn;sQR8L zg*a4j_M8}efluwXo3V=r^C20V4BeTR8~TOeFpr!xXT5T{|0G@)%_6h$>H2y&u<)Oh zZa5sx^&_l0&3zixr}nu91Bhide#YkYo@-$`pFn!^B)UfT z!KZxRwaP-p6-j@|m5)*1zTC9dp!T@wO?Y}%FA2Wy@#bv@A-tSN!a4Zem}jj@_)T3KWfn z4ao^Chf$-0o0-j!zAkP8GgktmW(D*gI@+@k)&VRBwh)O0;mZr0+ql^Sp{KZqYY;t; z!s$$j1vZ`=YpS=-+tQJI&GaD>{LVFwI5`wPER`QtnkAHh!)-MNNQXHXE-`uYOIz4V zu#b4(dY?X{;ha&0Lv+OuVK##lMC;%P)hlHiCguK zz}Khv|473|5B2_whGFfNS3FiaSeCjzYjYC2K2xm>!hYBBTxBB+%$l^Z>+jMeB9vC; zj!nyPlXk#X!^6KZ(_O3D0FsD`b?~Y~vcH)z6?%vq*&v4uuhr{S#_{Qa3*C&_vlcWYumVXyiX zM^60R+QBmIAqi8Y@+q}a&FzyX=o+0NoJEEC3@G7ri`N_0Ym@YAc`(d(toki2QqR)k z30iNfJ#-ut$G*5-sk6*6$JX33ga>nt6&ubN;&ZstZV^V!X^S!gBZjy5y zp}E=?#NQdQ%zBE6IY&rKzQV*pyh*BMK23^lw)(<()2c-*1MiN;G3<4Y3{#KvfPO-o^y+Z%)ez4FKa;7o zz2(!p4NakxLDk!tR!BDS2`X`0Dm$@rjUhoXr0E&KIEk6);KVJLpuWlnA`kCF$$5ba zXjzNN)gzopra69QyIVe;8BEel(Ld{F?+g2-24Pnd8jQ-#f%6InsjRO4h3op&-q?zO zp@8?1)o#RQynDMcxJ>oS}BRQ6u zgYxcQR_uIhcD;$g^Li8wuI0U?)lw(uX_+O~bPg6eTI*Z5{=O$ydkfbz#;)U@=?y5N3&BdKO2mcJroGz+WW~4LU=!va`fiKK@a6&-C|>z)tx;^XM0>aGb{iF@!FT4|W{5#Bmsm_?1tlg2~3-XZB4sc~;Vz9No<@(%+x< zEHS`QPCdrNWDcue-7es?*=gJSy^Jj#4D6+5)mIBDGP^sC?|*sd`8Ejy$4x&Gz^*-Y z96+viiR~V_c{F9{!tifAR7l8kB2i3wzRYj|MQ)s)I>4fyu1^g7_ zVd?l&x>JQoZD-g5H4QcY=y*i=t)DrJ`+eJ$+MDE1;l2^-Z2Do(-IoYAmU*&J)TPq*zvNt#K`WZfg-IsSrdM_ZPXWXDPD z0Tv(aKlhJex?ii4jtbIDyI!=nni}CeP~RN39zItckaDtKbfg+(dCZH4TtG%3X}yrt zeP=Z^@g?T2!Mg+w$?1Rc)$r-%R3w505a8%mc9qMq&oZah>RKaT7;K1dK`b~ z8L-`;r?+?3AIOY>AqCLY0I*k^C#EJa@vu#IWFDxqVNJ>D{ymiDu48`UDaY;!4_xKVA}`1N zsi+Z!BvEVMXd+w#%l)Cx{Q$1ie>n7+ys;1sz{$Y2Nxvt^BK;i!|8bVep@z3<%@(=a zKjQP^0ltXm2@mjN^W1H@2M+xQfvqT{XJovv)TaoXsnd4_Q9t0(FdyLzfTRnkIzP*j zBw?|oTm|S5Y58Em$v%KOhh{oRggP7r1b&3YB}q!!N|MP@mM1p#x(AjsCne3XjoRc^ zPy`r}J{V@+3J7{_KPv_tsnUQVWH=C{ToKM^A>ryWIgljtr|f0J|KQg@kSrHI5jgX? zj*0xg=$jAnf7aLkcq9C;{;c#5Pk)d!nG(T0wUNU0pNWZ{#bTlOG=NWl#UTUmPy{tt zl%F2Po2OGL*r8LY
5CG|~>BoRT})p@u*u$L>plZb>A1qEl;i`q4|u!94A)dGw^ zSQI*XI|~qLM$9Z<-$3bx2+_#!M1E02{0=F?roPcYfG7i`+TdR(ni;^z{e2iB+A~PQL*#N22z`75n+A)C0iiH# zCHgd)_y^YF16ji2dSeehJo`CAgjS|a4MY$$g|q-45E5=F)ch&zp7(B#TfJTRt%gt~ zvubGxVB!e4hUvV~dO-;t-JM53Pj}}5D84_@-#rgty27-f;g4S}%s`)RjaxC=vg@SY zOPjL8Wo2UGL)Z4CZ z&O7?VzVg4_i$#BszyeC(FyN{D>eI$86~L3_i!=#VXvv=!GR_uoL}$r^a2HjN0m3Og z0yv`Q|4&p&Z}SAgKhovnqdE}a&cRZJ?m3l0RRWdJ?3wNYGRjuM=X= z5)htM=$?pL$-LY9Ym;c>@R(50tt@e*_JTScsnR(KLwz5GVEu#PV7=d^JfJmw80SnL zJv9#be6(t9>5X09*gp8P@f5sq*8KAN_LiwVe+qOfVgH}f-ErY-m&X=17Rz!Q$bc6_ zlwmARWqD??H^rjffccReGbfzyTwnO%sy{WouADh7x#0b)-zlLqIk~)`;XO*5-_ksW zj)YWHoL^J|R8pXYoVaQ-PJ8jUf0tO+_d!opMMMnL=Gh&t_)Lj!Ymi5Zvs1R(L$!xb zW*PksYbuZT`e(YZhdgPwHTE?yDma{9gc|NN_uCq_qqV&Y2QBiw+mv=tDeNx3d0R#vLOG>u)_oKU$tIfs4##=3|3~sM6 zzj_ALPl})Q?Aibs8ChPz=*yA0p)hCkN4jr5kLctC*~uR~GDcL?xCI$Zh3%a2r!+)Z zHj$-&44rix`;RR5jb4EI$6Ezp7_eldWwTDpQ546RU2V9 z{ziTatxV*URL~8H6+J2LbLQOVcl9msvlACEd^?O{$ygPJtTft$=|gvUv}qRW#<4#@ zcB%mVB{k`jpUE%OCQg=Yri`YLR+mS@+{i|EsD`zX8aI?RjnAd-`7=?tFH=JTs0;lG~smZO8n7n0achkM43EVsa+s4D8eM zcBh+oZEy4HAehY%*_pU_&Ghxkhd;HgY{&U^CSYrv1lKq?;K*>@FI6B>>jGz0L1-6VVeNrh$mML8zTtO5(u zEg|g=tR+dI5V(-%Vjta)`FrDd3Eg_^gKq1iT%;Gqije>W$1pw_mLfYI8uvo1b(8U1 z6>Aoh`duO?zc~IUrb9R-jb)8s{_a3TqoU^aCgQ7Wke!LW#?UunGc%Eyl)n5qBGf$- zfKNsjmnK#n^;)xx95DP6NGG+?JvqtJ-ladM9~~w}O+$ndTwFCiH#H+^Js;GI zx#^-$pn;r4PI!VHPShFkF!g}~X&qc(wvMOhT071Z`9B-l;sU;DH4i+uZHvUA1;1tp zE6TQpBVD#+4d+zl-$L`A?IH@xlDz#KednY2YPR7`&id(L&rjKR99O^JR?!AGum*Af zxQQ__P-iZmeoQsU_egnudaL#ix%s?XyC`|mpHydoO69F28GQXcyRJwmX8jk}q3 z0eGe9#f1&`U9_L|#YI+)O$>n?tohe37&J8#`pwfKld0bcT3#CC!|4quwsXqE{$oA@ z`EZB{GOz=@@!%8z+V?Rr2mpIgK-7d*F~9npnW53ni@bn`=|?2Kt+9x9sQ^pgB?V() z(l0gGTMV>avF0^Y^F3Me-5*WE^?Fs>SOoJi%_SbxMO*`2H%RQq!!^!Dyv%MFJ_e|- z<{-G9iQ~m=OPq5q%bXlRw*i%xjVXnh2XjqF3NyZqQ7q=)*azyWY4*t%&6G+UJ`6Y# z=|w+M#iV?x7k7E}azW)NfmLg9(El!;F^oTrXKn56v3!}_SnmY}?Ru@Sd2(p)KDS52 zgcTt&dnbfN<(Gj9EhTQ;WZ1<>U6OSP5YR!fKiAcqN@pY(e_ zIVU6>!t-r(1vmsRcSz&#vIHn!47`t*@OGnH9bQLbFrBdcNu%6(ECoM6yV$9Z%g5vF z$KZyeWR|EexySx#B3IEthkx!XDr&>}Y9Wt~fHx1<@*%ry52G`GeL*d+CiO{7+nN`o z=*kFDO3jX%nn^?vqN;gTPgHhj<{hrRho{7<$olLji;}X+(uy^0V_=Z)%Elo-;PU?} zPc`S=gHxq~sA$*g`06tBE#K`>UY|ZVpM|T8w&^~3 z?eVIS(xT~4MRmm8_C{+$wLfR>skdKmxkX3#$U&bpqZ7YNf2Oz;2W4s-U_3+l)oVo% z%bk+@c!rD8?Qkyp`IwE%5AVzQpm`ICs}gl_#8 zH|kJNl}-L!MIW2&L}p?kS)kR;tB4(IAEWF>sAoStc0P+nlRGhFl-t`Yeo8dawfmjO zB0v6Wq%aSIyM~H`#ji!E$7R$fhV5Z;N}U0@aL?GyVk|rJcg8#+JPgg6XmF)fzcmw5 z`vv+aG%sXts!uZIgk9y;p@9&isjD`Ky|1e49{NQ<8=K~*2{~T(El&1(;881o? z!^Op<{6>IEVMgsx!G-1|sdrd&`^nUub2b};^|A2MLDT?yE!i1GM`j%!(~`xW5kc#Q z-NMp_gE6fHeWgjquPox_JxOAy_S_?lpV%6}-MmF}Xs*saPW2Iq|6Y;W0EW-r;>X5H zFlHkZwa+x9T3Bcn)=#u#EWJPLuS!04_nu$wY-yuenv3E5K1!B9S+o604c~^-@`mH+b{RF+Bbh$47BKqLZ0E!lv$kCzO>evUy=NR>gOzxtZ>!V$_(S z8ct6n=aw-uu`0sx+?OxcCEfwc=*~1vLN=QipC@p7rfwT_Dhh%r#nko=t)`AVr%!`z zG18^uUnl8LN7nNWXr2g7W3Tx64E~4kCX|!T;UQK=hQlN<`rkMN(%C;8BIxJW?5+pH z18r1yR|Bu!)O_;epmQFM*c^UOJWgGD(7JK`W|#}{MgVn+Gi!aPr#=U3%3YlfO-nH` z?RRa2tP7_F+cXE+(<0|Z;;6?glH7QlM$bOKZD-Ireu6_0VNnB|LinK#ZoJq)DDK_v zLZb~gePjUv#*1;zr+SL?zkWQg1o2i^eco`RI0iH;MYD&&(QmL$e)spwq)#cw2D^u~ z(r*XY`bfm|4m)HTE6Aj3Psu&^@Y>F2rycCp(bjM=bBrq<$9&{^Zj^elyNwMUPJIat zAXAp+J=|+bqnVq&NF6>v|IYM@`7nanZah?Jv^}&eLRJZCmDS?nK0|TyWqCpCH(V>HEX{0 zmQbBo%BsP5?7BA5lj3dHso6jgWpK#hD7==zr)eRiVXdSGvxH)aH(OJ zTjDLG>LR^e$7Ye$-~u6sk@;x&(oD^oZ$x*TpZ5U2`4Ba8veU#@2j=Q=Gs7?Tb>>S9 z?*Jm<#CWYqB8;{;ahPjA4n(~pgFC|q_R_6-=ZzV^zrk8^Rce!}Q(J24e;a$8%sE+W z`1p>~0)BjLc4MT5diHuNl<1gq9s*_g@VS`#T;si7Dadl&hxJuNeSiyYBeOXi|If0H zdi}S&_8tcTuTA$)F_NYoL&31A1xF3ChE~3dOK-8sxrv08YvTrb$0+&|nU^JNse`t#Z zH@}b3_Zs$CEw;A0k-uA^=)m8}fEV)erJIU)BZZMN!3)nisSo^sPM^Nq-0_(OFFmIF zZ&`>!6W-l_%R(4BFOoZ+N}y))AAFeGjPGQLwyiQzZ%hqqcY2;9_(xYnbpJfd)QIKy zp5=6==RAE2a17t+TZDa@dfT3f;=O+!ODeW852wV&OOmlqH>SC;EE6)p{=O`onCJUhrA`KfVC5oujnh)OlK}HyM>>ySYSQ+6TC%Vgjf#^z{vv;J>zldZRwKh=3=kdfyZO>Fry zgBwuqu9BPXZfjxJW$vRA6dyJW-wvE7=G^IZwRW{2J6bdCbH%Z8GbVva`WHNhBhMhd zK5$Ne#gB%#`nWXSBhNGdbGylHOY{USnc@*PWxCsC2uMSob|| z!W=*f_jBQyfF z8EYWDdr9OPwB$xz^gu3F11rPTg}S!83J^NQUvtSwG2!OyIwHVyu7U#F>C#51((N8= zcpANxN}z=^{hjRJ4>rcIO)rinu${Sff~y+KlhtCgP0`P)SCA6fhN_4e)N=}?uTh!Y zL8|JNUFYV&hb2gK$vUzduau$m!iT*!9Z?ViNqi*#>eB!bl=Q ztQXG%F-m0nEof@3<3%N&ttu@Qj9Lt<0P!o4a$0YLqfgFDjI3~{J;T`u)Vd*#!)oA5 zN7GA}*Q8n=eEgL&O!lFHRiGO0-*f=@D6P&vybRv8KBdPG@Rb`WSPT?!>e;G+l+JIQK#YKaik3f0tEiK^y zg!mT$*`5dZNKtVGWW`Uwv=?9-Q;8oSIS*>492*EsD+nY4Y{~c09idd?BYBhn<9INT zN8HEVg-${8Z#e0A5CNk%TGMO!e!wUqwf}EaWXe|-$->Hp0w5T$goJV{!0H{>1P5Fq z9~gPY=WznagUME8^}#0G2M`D#$Sz@vV{vUO)0I-bT?6nRV+H<}e~8Ze6YvGaHZaHm ztl%PV?dap?$51#qk+h?MLp*YTXh2L{l9rrd??A99^dVl#n)>Dnh_wTvtvUdEHxS>H zo|zRMo+yhfFKVLqfl))-Brq$BRnjIgcNd^A!uQ=c@-$R>k%ONG2=sbDK9Wu0>hP|W z+bhv>xp@?XeCWGOwv;mN_iI)LZp6nc8{LoYO}(KW)<sPYfX=qYF21gzRwIsLGsg+QydQVdArcg#I#8&^_N($Y0Gz30ME4W3#cd; zDymp-A8luU|2t03`1}Op&MpR91dVB4)7jPb8v2qbSo7|yL zvb8mhT4|rZb;?cpDf>^59?)Q#)h~bw1&}Tw328?I;NU*V&^{Q4sMaqu!ivTIX3k+@ zO7Qs8O!xo)ufm@H8CpVph;S>HZN&%zVweBaH(k`8C&pT=hx$G;H4QpS&wz<};dZ*m z$&>rh>&T6)*t06T;;2wwzcJcRL zN?)reQ-@0{lf72U=Axz>}yLo8R5uHfO|+#8Ji z$jRF&;r=9dlDDl0f3JB3eNg{ix(38n!MW=;ZCX?D@Q7e8N~55ohwhqpAK6IX=Wxeq z5w@(Ml9Q3i2V60y>Nr8z*x2=SVlUp%!8H!B6QYxmmq{BNd-(bJm+7e|b@%j;X*+}Q z?|=F$qnHNa$&>dVNmUHMjs^oss;et|Aw8={2FgFG;NTio&DkOnW<&tHob6t(oL3L8 z>tmGr-|43WNINLU9vxXm?3+{3K_Wf)`N~|bbdwRGy}%QkXLQ3UwvRy)XdbEFXKzH7 zU(Edt{Ha_L2^5F!-J)0ieCZL~wTu=Y0Xxy>?&hFwFcYO}nua!=k@~^_MlR+*CK?NkqEe-Go8GLg1sl#*CtBL=pLFT!Jv{46lH~N% zB~ron4>dm2;#xG;4;gHPm?jPiaij%fVUtf*tXSKt(d6lVihuPM8aQ~MHWc|XJ+Wr? z(zU!`5;X(tL@N~z89m~gMN#zf^TT)#^w#7gMg5}Bb6mIuJJRN~`}QyFxxaxsPS>ln zh<9nn{U7j$=drG8{+=Zj3g8c2|q zzLWNSucEPaLdh3EKHNP#`Q_Bq_O?IXm-$QQz;;%2DE4Ni`dff>vMdb(l0%#>ZLIds zN}(ldB|qN?(iYls$q>OaR>xi0=z5S&UV5+LLG^8RZLMlk(;FUk)_alJpFm$1VSP_> zUt|zc&qovt7LGIPv}3_n85PAV)(RM=@#NoZCS+98v4~7J_rwCGDDWk&RHoFOclPFV zTV4$e;U=VbDz%)IFyyM*B?xQb-IB)a4=l=3_HS%l=SFjuB1A-IFa}OD0slawuTa)-D8! zV^b|LsZ2^THJFF@|CuQG`k(hFj!}EX`V|7AX!y@+n^^%$%DG{OZL!dlp-FyYY%C}& zSvd;D-&iVS`Vohv6cgWrm;x;rYpEjmxk)fhim}?!V+2}2=G`(bPXzQmm~Ch%Q#_46 z8Y-`1IvhF;cP}&d>64XK01XHQ_2ZV6-=L0m#^>3LUvTQU3N;hLo7Gn7*aU$kwgh;? z9xR-kpPyO)?>vy)bz9yuDQ$&(vz}!)4dm#PG5=L)#8Dx+ODjRNIwr;#=qLIm1SIv( zE!-Oz1)Dw#iZBR<|0Dpj&&lYUA0vNGtgya)DyB|rXE2KcGG(UM2?!J+<#6R zoIy?BkUF>SA6&uY8iMueb=Rv{!4cPzl$W>h`J8Oo)CW`v*~V`o3}0;ZoS%dJU{6z}3$`SG|@k zvmpal?-h15o^r`Xd%;_dzpVr3rUkstGooU)+o!03N%j2rGcATCaID;U=~M~aaanUy zDL~2Fhx69I6V|IY=klfu`>keA_K`RY%szV&JG(m74a|}^$qdN7owghf1YrQ}=#Hbe zQRrIeb`6u}{*WW*DVb!ZoQ#2*q z*cQF-u69O2^yzE~kHPd5(>m+I!8Sd71m?wd9eURyu^W0&0Z<)k@}muK8NK*`f_S>@ zxP*cH@+kqmeum_(2dw$TI72UTWcymuJ7d@h(04B|O=mFy^`{bJfzJyql-wQs(n29M z@*6S#d16AYtkb)^(P9h}hg6mA2x4%Ar3cA%Wn zx1aK>^EMAYa3#FF127tZ8#^HUc$b?q>vSV?J6j{ zMnyFomf*;9lIv_G!_F^|RgU-LVdk_%b^K<|qIN;gewVn-K{}#^k?SC1vy}nAb4+TD zaCS%6@Cvt!D{+aQg$>+=&n4p*05*`^nNrAj>vs_pJ5k6Im&x^t2{)|WSx13ar1Lr0 zp+in$V_Zf0jbs-X;z2~fyuTWK(u~1rh!er3e0JmLfoK;bTO?~4xvRK##t0iaCfV%R z8h@Q$Nmsv0mB^c4K>FBZ--2Wly1!+cW5gpVwF|1hlB4Hll;s`GN;R>-|89XB%9`sG1pFj4NP;)9d<2!XfxO_06-Qcn(a=U1fm_e>M|-J61y zN%ZWAeT;oGib~S^S5J^sEER*keh@67x`RwJ3%|0=+uOS;O>%ZMB_gn0V!Exg%bj1! zI*I<$ckE=Rd;g9F_=aD-m%b`Dy)_nzht1UnQkBYDPkkvjHji=!l*Nt=ngp`UVmnzJ z<1PX1JaIlxCC{&(YQpPw&F%c;2s|JNUOS6wvFJ;?!L`pR%5;OsakMbLc~+9+3ZYFf z<=B9_YcAd}&enRfxlP>)I=6*bd0^!uJ}ex}v^m!Kw46Gk?igN0tNO|8*}YdbbsH?) zsy7oMgN_GKPV26sv5%9y26JUn%w~sl(C})bBNCE9U=uJiv3fqKyBn0iogKNgYiJz9 zu56z=I8`ByZq(DQo{u{ZeJ6MO&N&!DJgU%y04g_c&$>LiB0?dykG*wv=`LtR@D_5lED7{Iag9~FqePXO)UB;GEpHYPmE`iiqg-X+Uh43^n;ZtZuaS9Q zy#NIrFf)1@n=AdeIU^C3sbiWU{_5~iLG^|l+AAJue)YR(90j5ok@0!g3Q6S2!g6}v zlp4MKLPxOyf0FU!LgC1jn_c5WYnM`Ek7_i$RDTtTajTl#M5_}x8-Ht~?e)^KuQGg_ z=q9Q)e4Og%{%VtZ+-rT9jt8)5ChPN863(tUy7IH^a)(WMCqtvb8)@C>lOd=ltpp7+ z1G(DE)?JUs_4T!&t`5i2H;z+H9Fbh|QnxT?GK^Qh)RK+I4ADlw7~&(8qT@&n_4^AK zuv|yA(;vjp6=N{>s_ZPxBB@%{xt!bvO=hwC?BswXlVm4B;$D1QN+d%gtjdhI%kpIS z(@*U7hIh@J3Wwt@@ZBa?4Udme_RX5NRR*jsceyq%8zjaNLfKVLYLHGu%VlZZjJ=o^ zOmFssEr#NxPNo~iEgCIU1N?X{!%eS)&*JJR(dt%}Z(RA}`m3_T=Nw#0nU(~>oK%vK zz*3kur#h!S(cDfhL6YOwbutC@qHxLWDbb+19@r6Duu;(2nA<>1E@%7x_*w5Z(9fT^ zl}~e!Ra^<-f>$^Wdlm!}|D{ z-w~m!+#o3_QK3}QBpK3CSR)b5bplZk8**o~Rsn(7=UvP@FEWznZWWA9k=~n3JRy58 zsdpkJ{fm=-o`SMWl$~@VY7*1V1Y>i{0!_?5==t|LeMAPg(U80?19BG+U&%8syn$2&=Iwq$?L&?*rtfd!~SfkRO{o>q8 zXQ!K&>te~Hg!1$#)g(*6d?&p&C+na}pOK5Wa%k(Dc_FYbRWa<$5~l4q(p=hxD& zrld+vsXEvdW?jaSF|%aY@L5vgYrwm}8lmLCyc;UY;z-9lZxxEEq5eLVlI;V27D)fl z-0>8VCVZhz;Z`6t(RzBL6xLDMp8eh~dW`l$rF8yAz#nxB6nru|I576X3&H!2+*Pqy zl+5c(n`qclDj%7S(Rzu>9>C|UR1ktPe zb|PV6;T~Icwt_)GtFL4`E7_Q|6v%NYV$4%NY40A0Jpe)yY68CsIZoaGot5Kl`0cX%PqLi=S#EQk1rk zwZ7}?1xmVlMGUpjT=!b>n-T^w5bJ7=T$l{f#tb~Xkm`-nmYSZ|M_lI=l9Hf*lO{$&3;1qZFr&F{2>3yA$LRJm;7Jmr#jyH;-*k!5x-faQnpqN2#~dX8#!l}l(qP^a1ItJuf*Q+Way zszjL)W9VOm*d*<}TCN1B$cJ+1arX0IyTd&5v?BNuZ)?@I@wFq0dt7!N2WJR|7*V^9 zpgD>TCAz8S467))Q$NhG-Mi8H6zWd`c&5Jgz-NK8k?6R;Jf_FbUQbe{GNJ#PlAa#q z^3H^3Wq~c@-51d*+2yhBi|QM}q%1lTJ^kyDCr}m_Nbr~f@t~sifVjMQ6IGq{@LT5g zch*pdVhi6)+L(jStQW`YtQqM1=DZp4?u6u&;_Dm}&O~yevBmh1xL?8|HQQg+)-cRA z7fI&Au(D+PYt=Aj2i0ZwYSrdv5B*ripv3c&adlE#aoH=FVdzBVoYkIFBeq#f@^KeK zRDI4OGT+>0uNR2oxGpVcZt3 z6eXX^J4X~O{CdfW2UA>Lx?h0Yukw-_c+0m=ad{^)`eMnd9Sp-{rV+=DB(&4Lc%gBb zjVc~9dX7Y2?NtT*QOwEi=T31oxj^e}g~#$5ZvIqJyFDvVz!vu9Z`V(Kx2uwwTv>xX zVN_)*1%awIhZr%D7F5s&CtXwr_1{=G1-6WGmZ%b}xyaEz36#?>O0Oj>C^$spQw-de zH6pY(u30mLkyk!)O0+pg&wY~y1YekK7EnM2g+=0O#J5q>R|cauYM&Fi?ugNE<>d8$ z^5-$temJi-{ zhRq`G%2!>2Z7SOp3mLxo?A2sv8H%5xh>TA7?~N69$T{(1(Tt;#+@?EwQFClQ!A1jG zHLB$(K%|HkRAJInK~zE{$xbLaiSBJYo%5Isotv{xAey&KF`14=Ud?rtX7c6oA}DOM z0aT?HlT>h62^j`f)dtrE+t$Nr@z^gnM_MZ1kvN4K1~5#i)3`v(n!~j~QCzsGm|w?6t!>PX6A`4;%Lk_m(ec_)1xqjt>TGzq*6{HgV4H>anG zai?FR{FH`>+>#Jzv=RQEaVtvYO7ZN%a`&M!L}?h(4czEt~#AsHO4>SY@xh&4Dv zm5ytJ4+}7ave!rJY-Xw5q@(Q`23ZM?u~Zz4#bXurmGcV1D(V^d#SmwIrL1%RQhc$# z(Sk8!b-Fk)#)T_%x;mq3<71Sg$SQTZN=%eZ zqXSl>rmJ9G9+oaOq*BpAsDpj$-jpAE6~1b;EDtyp8s-82oJO>lQWG3+Z%6Q#vGBWB z!{#nZV#Zfc{^@*@KyriCaU19)ggGMfkAAaIaE1PVa5Wt@GX3* z*k1vn;@rFZQCA@626|CmUm&&LL~*b!njpD3@|i($v$3C~ykfD&MP5XBCnJbKGDj=9 z!dTL*1g&tZ)U?L-W`taP=({m(-;Bi$bFhW#?o_suN?7wd`JLHJ604&i`)}awLqf%r zx@pDjX#R#x6cPD`6@7LBIU{bgD$w24@@weYt(fAq_UAxWc`zfkQO8eMH&=Zm&^W)m z7~6$Ee#|^-qty6&Y*mt-2!5^@6J0q9%#1NHFWVXC`@l|3;pJz5_njZ+LLX^g3rJL zY~fvWmO2XwyR)&+Ou}e)pTQ8>cAcs2TCfcYE`j1Udco}1$`9ob7$K}`$@)fVy4@x) zLeUjr;Tb*f1d@{SY1lOT3VKmw%eG<_S+a_zVo|H7 zw(He8P_QK^>Z4_#>s8?m{)xP=DF?53iz5QnyUtves3x~p+GT~m3*02B6{K?j^Dbnn zu|SmZskw_UV5EmjNaxs0?I0fOTnJRTy}`dJV*+n|{OZ|(A>DuuKXucGbV;xM0=T{T zBPDOdmoSokCGW$TWp0WL5hqoR!JqVgx6YV*T?kZy^ zDJ3YIqsnb64SlrJDB1XUZ{$gG+|%CNo2)5vKAC_krM=!(Z=Cqo7_GD=fxtRWWruZ& zCnE&M@y1y9R<5tOQ92@mNp$jfcs-plEu5CzDG=Jq)i8#r8B?)+H!$E1K|RR4{$pbe zwHXU{H)QzKB?h$j@zPKv_V&yHI@A8fyCuqG8p%^t%zAO`!M@HWQZT*~eVaZ>FA{m| z;u*v+eQ)Ju+oO@v%avZWRYzC0>?xsz22z|eMS-H&Uu{&^%~oU6iO~~YwP1MyzQzZE6;I&Qqi}7b+fz@#__7WwN?CO zKr*a%_vY5e)aTiL-Su<*+U`diy-4F5VOc!y_}-RbTF0FwP}oPO&`#G?l2~Hm&Dsd7 z%`QQWmPWDR`-j7wGe{{ySgT+&OUQP#Vo}D>x;GG=$&c-;o82(mb^K)o$$F5RL!Gcx zoz?8LQ2=z3v74KIzjL{(wf& z^mNMg^)So7F@>3`_Dsxu7$1%Wsc4qzn|MXtB^0JBftC@Gw(`F>0gDv#I?)_+Je?g& zgZ}0heX3tmdsWlwyuwyOc8heT(b;naDcNeR%(>IBoQnrltnSI>0cZR81Il!7$g@#{ zP_#13gQ2FAQLMGFpVjU5)mDMU@{5+#j2#>0lNpXz{x1Nt8S_@zYn$B-xjV?`tr>`} zwUUBqnXVO7v^x+dpJq6$955qoE4YSA-?{=i-DFZe#YCRMG>`#Bp_DjnAum}G88GL% zcI@UJa22#aUk65cAhtoyw#+e;hOp!!w)h*(^vgK~R15A>%Rq|X%%;!)=`T5hnKYFZ zyHwKd{3y>R3gNu7EXFFxKv6WH-0Xvd%IuNs?AEZJg517t!nwenTt3xl$W|llNmT_! zqX`6D6}5WdFp6|aKDK$_xxZ;fsxOpHG$9N~HC7VkAI5j1LJLr$ zrN4MdOXuX&?T#Fo=IKtBeCyH#mE<;08v??lI6FuBNLA#%7)r|1F6hGpWtqFxlfF%j zjE?@xNPk_hSs$0Sa9DA_#mPmgj-0J(XPJ9F&Zw=}-nkL-y3$gj=Liv+pZEF^p;I|quJd#u@irM zwUQ49NBHH-7q8QuE_qc|>fP?HBOCVnf`4<#PYdK5>Oyq5;#0chY}Ot5z-LWxl`6Op z_H^v=+_^wd+S_rS9Tq9%KF-<#EZlKXr_+_(R1biB!^w4Z&894bJa20wr!vFP#=bA` z7elV@ngT*`SS}xUd2guWtZE5WNjo@tLTue=M6booX+K(&n!BvrWCBUvu2f>Dw z%y$b4Q5o*;a9;!ksF~i$0qsCVVdpLNSoMB{T3A=5i?-F(dvA9p+15cp$-*HCkXxXB z4wgm4R)$gJ+WyNg0O+EXQoJf}Qee1YLIpeoy8HX(Dn7b^AAmj_ z1=cA^o?04gY8)xa(K{&|bK6hX23dKh5_4nx;?+|524miE}^g29i5YZ$&<$ zPL9NjrD`y?B^#kcG1i}N;L3z67(baRe!1Bn$D*L8qm=pj)f{kB`1>ubjIeOFpP1j4 zO9MHw1uDuZ6%$h}aKiAPuic|M!j`mN%6~1YoU=0td(P^l_><3r9}7#E^&jL-NJYaW zqnWbUJr@bUA{G%Jkb*+ytV0bJ5z#nS&)@2O^2c0wCKo?ORK{r*-QC^2<#Gqyjf|3! z8oatn=I1YAoJ;mM>n~+gbHrSiD>*>{&o26HzS}>Y(VKrFxS9s6D};uB*eD=BdnPB7cj^}qAT4a3ZR{;O zcF6XiuYjAM!@up?&HZX25{d#en3JNQr|tsrR+ZOZ_XGf58qDc#cD3L=7pfOIL{y}RUsgv0_%H%sTjF1p;i8Lf<$o*U z|Dlx>3-ogfe`Va5S8SnJG6S;9J*~foNfCVZ;)Pn0)mcp)n@yCuzJ4k`0Rd2gS65%c z%N9D};W$?>OU9F23B~>^mt&H}2V;9b_!Oge3+lg%-WPkdRz;%$jTFGr;*W>cYZ<8L zH7`r%qx1{!8@6gRlttP=QZ_!HC9 zOG82e5)(61aD#L1 zc<~a2K#WX}JSmHq!yO$=FVv}~kRDz4x_kAK*lU3-l)g6%UH1*xP&dw~8*k=betG|Q z2X%t(kR=Hw>V2KX?9Eu)HLk`(SW(jy@MT%5z;TQbi?Nw!YW&!2m*GvLl|ZmE$6M`>$(}rVP1k2OOEq_`M2L7HZ}#aCKYu)*27&)mzK?zfL3CA?TQBv0K^9ID zpV|b>FTR-EV03!<@*`WO0Kiyvw}f{iC_f*XM1#^4eus_wa6~`1+x7~EIPTq1{hR9* zf6EJ2_wfD$SLRpw>4U_RT{dCQ8nmwpp9M8m>1A_s?c+2m8yM6+*?Bk$yb8|k+!Gd@ zxhu+#+6d3Mk~mseyU_r2ee&a7swJ5OIkJM^O*AAF+FqROrb*f8e4|Yq(z=U{?KyZF zp{SxV5tT~s;J@zGKs_CaIUmKs+EY~~U#5EV#h`KP(q;YytCIRs^g_2}aH}EaSakRu z{qAHMHyPYeHS69e=)V7r5BJ zVk6;}k>kyoSLE+sXxB=ozd<`n5z@SPOA5;>Ld&F72q7j(R&NdFOM)>$#)@H#?2r46 zhm{}0C#(n7-C9nEgIX@Mt5v=*OoBc{BP9VH5>at{6TN%i?+CIo>n9C|IGWfY3skph zR_S&f+Fj3f-cv5V$26AnvpK(c;6iP>Rl|Dw)nkh_xkO=-u4Z@TFpT2%b%%^7DJ?u; zR*(EvVynBk+Y)6Uy`V|qv zB}v{pi)GgSa${rVfKs}_xQ3_MwB&v8g=e`*>$OkDa$Z%?m0!#C38HZ?q*&1@c?aQk z`$Vju4gu+m+?8 z6VA6iYweP&>u^9K!ocuyLnSLmKYM_w&G9Z`vU0KvX1z7ntNDb4Wbwa8K&+#p;<6ez z4M@LyInDcAMd|&aw$34pG=S$JAuk4koMEV`ye?l&v*l_SQM_YuYioRATDZ1I5ss(UKNFM!+AE zpxR*L-M`Z3{$%r6POIpsM|l{+v;H;SQ0(}2w#W5t! z#kzQsaC8VxNcqWDtIjP!`o=klNN^F3m4>%6z4ZYz#vo%KXoNi9@Kc_MNT1=;9#$WY zQWuR$;xWwGEV9k_Qab*(UHnMeBaq*=8JC{>gbaCOaq{JuXrw#%+a!Xxt0*vM7j5wr z2SlG=)%F!m9ksxSMDQ=Cd@o_0zf4DBFJ`6=jsn#q-M(_w1coCp%WApvu8}_38)=#y>_8qf3AG z^w3MV_q76_hLX1#vuaQ00lZO_BM%Lz7QsOog$ z$*0UBe}zOA!|i0V3YVMa`%DfJ;5W`G@^hp5m1a za|K~fWEN!}vhrl{fmTCl(28yPsu%^veLoj)568#Hr>+mt?6tX)4{k*8XTtg9z0^UV z%Nkkgpy{974OaMeQ5`lu?Ds2nEOhN{4{yE;}%OIG$5zkqkqyX3k8 z-iNn(zNpL5{fxpw&`j@b?j#giIn;%A9D|2gfZw)UoH<>s$)rY0+vFFy7{cagb7Ql= zYR1N>oI(HCbZGwR(bLJrp8Mne%>Hc&4&jH+$HpqdKTN!}4GLdQhvEKcVl$-H*-?M5 z5_b2o#rV~^Y#P5%K`)0i1T!ibHsYyzGVz>!H2`$?)!ipgc5YS_w>du8lOF>J;vFWP z98=Qs9Su+Hx+7@-`5e-wtI}!(<|gFR3<@_>&)~W|;8LTmGxp{xi(1U7;Rq%$IfghS zyw0K3)JTNnFR7wp#jfP%J#->N-g((y`}1xl2!#oWJ7wZsdHyCNw^iE!G_HszU!N?4 zXJ$`p(#wyy)5rK&wGk7Q{~g+VBsFdSz9a;I}ZIgCz1Ov3Ug(2n3AyJV! zWt06I4qiv{u{*i7ya2Vi6eLx(-6x3g@ZRB1-?w(;9Pg}V_RsLSQ%tV7C5{FHB?7c3 zT+vX@!(%8Xq++>;%U2o|PrvaRZ1`t2tBb94s+QJLmQ`Q#sa2dfQcbso=2Vc!j#$<7Cm)8CvZu?!F?ooW}JE zbT`9uZm56QLt;P|prLVr1-MAOMlLZ^o(vckJ40s5GqjuP+*Q>QvT3i`x%!_MzrKGM z>-$WF1$yCIn3c9F;1*yM;^vOvKU{Ok{PR#p!m!Wy^cO_hz~Avr%sS*S%}c>~xP+T^ z98OXeWAnbG_>~6PBL)EL4A2W=9ehx3Pm|=+$Rh!6szX{R&rT?}iaQsLEQhcrmbyUQ z0?)TL3=;fLM*(u;F+;1vp`P|l55!otpIC2iux2}~hj533GbBjIE&5+8iw+pR^Zmsi zlvWxmV_cEJMzfxd2~kh$KNlF1{9P+HM1$>#d8>I}z&1R3`f6l-5KO(SBaCM}@TMd% zG|BKfz5+(RJ6g{;?03Oy{6xmyE)-@+uD%36aVmz6f6>|(WMXgF+ zwk(Dxd_2Y{M`YpwBDoAesito@QBj&cUs)&RH0%OS-SH$F<`g8i4(V9stnm#X^bS!Pp zE~d59Bef%rF#J<9e-EXMtlP+-kD>@lSGy(8OBtEX7I^GWx|<4$YH#{&mZ#%6&y%SyfKG+Y*fW zwDD5Mx-BrGx``=3^~e{G!2KmBz^>d&;p#;nb;^J6 zn?^eAjv4UEoK*;GeJNaW9N+pOsDFoi(>p<&b4ELF*^QZ#K?5+~y*Z=uJZ(RA!(;EJ zLeq{EHKuJ-r&DFb!Ofu_mbZ8+NSKyU0LR|gIxe)KF_N+VTG6^I=lSh>-?tMEiPD#M z0FL8Ur&f(%!;LhcpoXk01XEI#X3cl2tRENn|BObY&y_raRVRBKj-{WWHXcz#YSlIARqUyS z6#~Z>e>@12YI*%mM9~)kUCkI#%nXsR-%XZrK>vc~d1%eFJ$qwAZfjQHJ@0VgF!WvR ze!US#FQ>*YPPO5P{q3N@sQ7r@&6O<$d{u0+aYjWvb+|5e2w6JSPGFY?2yJ3kh@M!5 zl9F+N`%cJ8tC(KKxmGJ)X#ZHYaHyaUzJ3`kB~en6gpGedpRHD;#L*hM4nu||H5{eI#GpWci>L+g1aX)c4I2E_2U=l`YB z{u5P}s+2`pv>~fJ#cE;Is}Bj(5leQF&h&Y_bZ7b78OIjQ+1}fQ0J*ugwwH;Rf)53u zSR#8e&gU}k(y6N04fIfWR9Q4XrJyDg3k!xDyHTDTj@ziC8=QwDXQWRzt5bzKmWqC8 z?do6G(3Ocx>&^2t8cv>|%7#~(wr0I0Z9B7qXA)ww-QLnw> zNn329eDx+4QmaB{U)VcoT;ybS0Yv6*9L?m=px!;0T+!gR zh<9qx95WzJ5kZ=dg}!rjIVKm_x^K#D5j?A}4&aNNgm;8)O@XLfZPG;AqzpE9)X!2f zFVObmP#HU4E9Gj}?O*L3?wT054P?gr7iS17a{0J}?DO7;hvRbq}Yk@#T6P41PAVQ7VZx^;lseA_y zZEVXPc&09DT$gxor(_nF&nmLA+S_KrvpvtIij-efdjDLWNw%Gx{dP1i>Fn&i*6k7w z+7{X-w+bHp?qDjksi{&6cSE(6fR8q@TSrY~jC39AWW$651a+yQ`JbIa6Wum5Pb$a4 zQQ9()*9hs1N^Ym;lE7qfOlGB^nWe~mPThqY^jheh3Ks3v%?n+ViP_QYNzKtoU%BaP z8wb6d@<5s9U%DlCja0eC4&RUU6I$V`P#35R!v1bWx7)NXYON&4TakVq_(LMREZcA> z^ONZvFs9C7kT|@*a6Td5aSIsDVtbc5c(^7&yy{QEI zc}rM6MG_;9_np@fq4pSVtW;GePb7Qes8E3=e#JpXjSBhrI!&Xq^ll?3iU>L`+Ns>5 z)cpA6@nF5EyL|*lhn(Y>%fi0FG2NTl{41}oGxQ*pz*XC&?2WCK@RIvM@a|S~?T9BN z`CiPN&JVTKzOv{xM3%Axr&G_DA--wXO6N;=D$E79*2+t2F?l_HG=tPVx z=movNgpyLe2G?Lu17Y{__2$H-GdcI$ih{&ol};^>V0Vzs7Y%=Plu zWRESX{aA?Z@RKLCR4&$z3y{hsia(a=gGc<#XFxteSeL+swOC7kbON#QaMZGOdkSot zFYOalE7F#@jlTZy5y!;2*kgC%c4n+>?1x9>DDOXmAR^`~O90}ooD#37C!%Nd$TVC+ zG&EGT3+wxkW6$mW8h`q|OAz{wA6Qrmt)R_GNk%&ELf%4&7}v(i2= z2~eQJC2?v{7~}Zl=i^=XeA}acQ;XHiN|y{3mR|AqD^JP{638#~Ivl8(B@Dl1_fMFI6_0<_5nsCjdvD0P!qK$d z3$VMKoz-n_4_p-)@EGyTKH$+l)iB~r`T$jM6$hBh| z&?{zF$Q1Tk?!h2I>QMKRYp_6TB8CD#)_;~YT7FWsBYkDzZT4wRPw(E_?Bp-^y|M$d z77it${O5atkk+;Reptlsr1;Jf8*>1)+qCG>kXefx#BFT|-k8o2%A|V%??Eh?Hw}GAy_-A|W}0;>#Th3eBn72|IE2v23@1 zGM36dmYOMc$r_s)m*HdExGBKZ?AlnXag6^#&Dw{67g?+R$u$*6FTy#on0l`~q)T<) zm>>I>gTkt==PEuWL=CDGtLqd*7G zP+M0qN14mScV`mAn1$zV5KMvrixeh4*DOnn4Xc$=EG^H{k8(atczSBIplHHP==t#s z{O~!sOdA;j0Qe0A_M$p`e@vS%=4M4IQuqd?acv9NLgSKLh9(K7+N(oVi#8W$05abu zkChq+WR=RuHh(#P?ra<-EAwV%kBMAD%jk5!kW)g>8D_c0M(s>P!Mv!{l9)3^MU?FZ=6c(*p()ucnO4yU_T2|E zYmHA1FZ+%=o%f@C82p=8HaoWbcc=_DvCO;Ac9LRL+I~0P?8BNRQ)L*VHO}`C?|4)545BJUaQNGh_4lyZ#L>!~Rz$ zVD~L8^1z7)8oJ%2)Y2!1A*JEa%HX!@FzRVNlCDca;UZh+gKMj@=TV)uP6bE7B}L`7 zD>WOB(Os&}mKMJkfr7}=jlM4**30`@4)aO1o?6DonJ+f$soI6v{37<>!dchR*-Hqf zY%<*XJXJfjS8Zv|JwJAhVpYj<%02T)mxwY>hFPex68g#!uzOv_k$O=R=nU8lmq)Ph zeq}lQ6_Atj<){fraip!I79bvz(`2D{(rIr0C#|io3ARELWMe~b$|{a4DmfFAwGUXBbFIL@9O(!vg=a~?3H&L*+kO>Ex3M2Wr^BUzLqdX7g* z6=Qf2F6ecKQmpKl+I{wI8vT6sN0Y{pyPffAQgXScLqm&sYjj)1c19JMdcMv7@ErQ3 zwLO2Qu=%fZ@N6xgU^6c7fnAjBQ`a=_0cd<1aS`vEILE5Ua zXIal^#^|`|i>%8xa}ZSDp9~zt{jo>aB43u(CXnFFvqOEa5~)gBKGBn;@_Dbm05(KN z-bi#`JJYRh+~@!jm_MJkd*CQ<=;}g08I#u^rPpTgct1``9h}+C#nHjO$aoAb5Be7C zn72N=x1M`UDAh)@tjlt4Vj?TK&u1#^ts!up6k3o|K#-vJ_<)}>Yh{qp=J$}l{}u%2 zwLax_WNq9Jnl`bl%`=)pO7CW6*oDeRjJ_d?4bQL*t?lS!Bav>SwLN1Vb&M7F>p|017f2jA#cTQXfUFU3yffQI*%B5EODnDlf2dJeQcocHb=v5ckw$pwRyTyOQ|k zb3~Ae)JbA?TXw;E%KUMUBgQaEfe_;G1}7cT92cIICgQ`jA+fcI^DtC)K+w-mDxn$Z zxWkSz%8N43$zGm;(*R>-1B66KJMgj~^tznXSbX)?7O8`1}!V($L%F)XKF z_WkozmQP=tX1~gmga}b2;1AHiu1Zofc?E}O?EGffeWcHC_*^8yxXFlgc5FsNn&uaj z*1i(@&@=A73`8sqchHfJ6n)MqK2>b+>^U#|GbU64$i)%td2$(jlo z!z||f2p#N4w6WmW9ruCV--5%gnkNHN{h>Ue%7@c++E?=XkIt-;IfKEmT5}JE+!M_Lw%H_dvFcUdIS=_p9b|stl1)inIgs% zoK_;DY3n@et6sk$Nw)lzpO^ae?gIacuwv|ctNl>dJn5P*xXJZs#xc5gfBJ0Y{N;VF zPDy*tFs&;cPYrLB#Nh=IpDqH~)nxHpFEUhAGR2jH-rwm8ho`ntr9D6E0yhL8rKLeu z+yqHwX0CacCb+v``+9IN*7% zW%-HZ;?B?WmW6|MB=MdM`n~DFA-<^RwqW338#Mz4PzXakJ9TI^@^V@g^PB?vyA_DS z`n&|*t3~{Ls}^L{#EZG5Vzd2#ldF{TebJ1TIuDUYBHsLglr|xBgHpjiVoLJMrsH3J zP~nHV%9oz9FpI< zC|}L%e7tO%Z;rW?fv-b%7N)z?T8-q8auU;5q#3EAmG9S9q4~}JAIjRwqC0qX;!h`2 zS=RF#H*&naM&jJ#{yf_7$&8Mc|1ss_D|iP#S>( zus|3*e{xK3{mjn`kwKPFv=F17Y;s8tmMRnIU%80e9p=1^@*bWa>r182UVAIYqx$q^ zCF;OmRgK1*0PI{vxDyI}b5Z<_1_iL$EpffZ62Wzm{xobteJ#Rg5d$_Gaw~rnUhBPM z6)r8rXlJHYL8aGh`-m8hCRsRxgV|ea_C(_?BwYhx+S?T|eBJMD1ta$3K4VFhLt0!z zJ8iB82j!{6n9x zVQb<-_1zBA>}7B7a-{D=nvuDrs%OcF+H|sq*y0! z?W0HdExJ@i^zn6FJSr@HJS$TQ3}Q(~ENI^YaK%qNm+TAl9o*e~-3IYD9cfXY*(VO$ z3La3sUx1aiQXc$-U8|hb<9JAS`#455MB9nNad0kpF28gn;$BKikD%^7F#k&Z*nFv& zHhcLrVudCUHE&v`@#UFO%a_aMfS~hQ`W27H0)Nr}+$q4~OMQVzk7td!*#q3*4A(1M z%6ki^F!`(tZ2?DPwo|PIqI;mEYaRSkoOv7jfg}I1VTHgI7$H1XaP0hc63Q1YR;`61WoCP88&p#|PsCRISDq$&97NxI$U9Y?N7~O^ zPvAY3(XNM=7%rUPU5QK%#BGc8WShLzu#7BmU1PIk|4pY@U+BE&2qA7buQzaud)34f zI}Cp*zsg@fq7TK4W^0c83Dn%fBs#5Z!2)7BP;@$mVGPeP)92|hQH?m;a1o^$m7@8# zhro-EbEyHaw)7zvK4a~@fP}x_H@YWaRIx$Vs_ z2j?|8A5jFd*y5< zUg{jajYL>3oXyW=UlbLR7yv5fEVnD%PJpSRz?lzL<`h+^OC%rmT=hLn4Q6FY8pr#y zV<#_3Na)<$T=7(=GNXt{GHonsG0_B7P*Pyu7|#5UnaS~&>30_JS|4__k1jN}J9O=i zO0`|@c}<`2d$qWYk23upMNd?j^3An4w*P>zhsy=Hld zjG!UbK^Eqn^yEznvocmd*OpgP6Pk~{CHr_>SUjnCFF=;w@QbYCeMjyr{Yt(`b7!vr zyQ^~5R`tKV#T-_E0kIGE5G<%RXePvHVef=G3jp2B&g-XzH-^rVz*wvyOURc#4*fs( zCZJZ0qAsq);T$)Mbg6DekMMr@(+Lo1Uw^_TM=$cTXCv;nuvhSY>yncWH`**V7I;***gh&omMl z=fL+nW7^_roSk*bBEL&L&5lHCdi)IYo%{8){wGLv;{UDvxhX~-A9j%rONO>xV%K?DB#1EXvRgMkA_6}(-Zkm{ zru8J!ItWr(9$drUx>T;3Uu9O$dwpCE60(-{kl+Q>g!(_siq(Zop9xh&}hCm998Go75CYdkjLwoF7(rf zD!5JW?Fx>}VJ|5p1e0M5Z3*DdlR}}yV_@tWL8f42VNWG^6~u^Y$>k$I#(u% z!p6bLY}utLnS){0zKhCU$vNetWxs}wIWC=fgPwymXi;%-{^iJ<65h$7p`n+Ch6uu0 zx8L?a^V+WODJgIL?5Xq#$m5cd+KV*{#ZG>!V+_$fBJBQQEV{}@@mi8tbDSS}1(p5${q3Bc3#*GiL4iP{l4l#2XYNO0nWIvY z|EyUm&I+-s*%-ql^>SK)>Nt-jTX;?Rvq(qk9IR&?Uui%SBLwqLl096P&Ao$N5apoz zf9TRjFJT{L34E1lR>bNSIgU;Z||!>3Axm096xm<;k>X&e8+F zBduXO||&vOpoh_gV;a6-}rA;f9-iqiG#ydu(d1T@Hh(YD>yG-F!ByhngtQp{bD^ zMje8Dgp%1(iS-59-&|YF%Cqt3KGA`(6A}oCgK;5GAH@~_x^3HaOO_x?tvE!cw!=@3 zNi3y~9by+kXI^6&eZxI%er|W!NshBP86&PMMAyQ8}gYw#o#`KzEzip=Qm#n#+yUOqimXJY+;{Ib{ zV+x-DmjFa94$e9Mi)Q2YMQY5;;Qarir7Yg+A+F#Xt~e01$C%Yn=5>;`4<{2p^Z)5o zl`2nov5spcwf?;Us-&buYQ*zG$~#6Y!hr(m_3(;5l#SbBYLbb`EszoqKycL({x6ot zH2kruySe84MfNDQSL+tg^p@N-)zmOQZm3`2kM-|Aw}1KhZ<`(bj|5U~p;7;%ILg2M p`TiN_uRRY7{wLF0vEp0=Gbvbx6c#df-X63A-l)8;kTVVW{{VwnfA#4kbToOod2~L8$yL$ozw*(p7-IL%N+$A`{VQ?ATVQ?7Sok0c|oR4Sk zo&CPg?^EYgeP>nOGgWJ5S+DM1-M#v{Lq96ZV4@MBAs`@N%E?NqA|SjpM?iQsh=TM~ zQ-RRH^7MsjFRSf@fPmHgp9e940gL#l64_Z!NeX!%83hH4zPPE{4FTaDf}Et7x_kQJ zlAE)7Pgn10h3&gn;=!-Pl|*$g0%$WtQC{UM9803K7W=Ed`2I}(7zIU4>OFT8Cq+m* zb_}!99@h&Ax>rUQ_r^Q}1=iKy7{lAZJ0xIKubt5h0k_L?4|V}~zMgI7<2%ZK3wUWL z%GN*RPw9WuL^GF?{8LCI5zGGk6cX}-KKt$KKgHqIOW?n~P-5lyYy4>>*)8^FEbQNA zydlqY{xo|18u^nb!@tee-~C@P*o<av39TPM4?e^=L{m7aO~I{XTE zv6Um^pe4+UTQeQgA&pE%%5m$&woRKmZLefh5MCf8z{0PTHIRLiX%fxHX3WXMLTc1A zH|h-}9KR$k=|A9DUWF{$y!iy6F3`-j#Jr8@*;p5upcauF8WN_Eb1 zNwPb!apDQY>_uk>=ezX@d=%ttR(&A4c56O{cs9&MHmx>ud)j6%&m3Q#`^gG#R6PWY za`yy!?73IW^3MqEM`8m@+o_VyxuNUwGmP4qYsup#)u$h4^4vl#elQSb=I6{gd0cXb z{-KSrP?kTp-MbC^sC*kaO(%B?>YI7(OLD>XQwGgOXPW2NLV_oypJIMzdf0Ol^y}p@ zA2WF;up2K^x(|T9aNF4FASZW0ibS-zZ-fdSo|zH>H%7jL*tUKbPel|foMbJ<=0rzT zoht;^fJe6C4n8jnCGX)i>njauZl4U_nNDs0Nh<YJTfH-)TE z4%m**Ukx;N$&f4(#Q4Qj3+)jlBhwWMzKF;G)737n+qhP6C4zfz;${c@bwvT5nvNd@ z{s{YFdmEz7a$CzvOVOUy<9Ht`>0CIA@@E0Ia9&{TAM#oZmMf47 zl*=x%m-i&?Q>xm)qKazKs24Ty-$aM&ORzMy}cjYjV zSXi`yTo9zSvOoSVU@Tf!b#VHpx$X?3FQ-pmwDeMQ)%iUchJKPHK|%%Z)}ZI}y}7h{ znk-*|R3tLgW@_}U17x)}X(7v~z3zoXtF`U(JZEh~*aQ+=x&zBvc=MKm@@*{dwhN^r zt&0W}m_ag#tklw-ny)lHsn)oAU~5aMvAR*o z=aroTR@l{*Dsz3~y+_HU+myX0ayRgRe;jq6dHxGK`m$F>j+}n9qs!jsa&D%D;e5b? zHg(2y^Q6(CAZ;DHJSzQ+5B*cCs%hA!L+`52cdW^zxFN1arHA3C?Cx zZ0v;in|G>^>7pUYKh!CT~_24gLKY1*KH_G}b1W z{dgDV^)a?1uGp|PKd_Lm+>4~=2pQh+NM9ZzbD+&gO6nx^)U-I`u6jd|r`=iTw??iO zGo9mSsM78P2-RGG?h~t)#T-cikl_o~%gDu6=j055XnPtoM|X{U&)S^Lv!l*CzTgIv z#~S6*iC4mDV?nCS{%omMeST&K%O!#c?4I$3e+LT1WCBkEWVM1u<2HjK$MR9wF& zf|`_*3`exBOnyz2>ef5PEoga*`yr^tXV5-qSk7K49B8`zor3d%NrLS*-GbeKqQOf- zz9D(O-op8nK5nLQK1HeF)LU|V{K2|onWWGq?Q|1;srLuyp8%TdP4`}mwIp`N+2+BG zjHE}=%^iU_N6UbH7F~C*xX2OUuFS?r>o6&6hzbs~=}(@Yr{R5*zmm~2M^*s)DyIj> zL?5H95qiT*y$he;&-AXW{rM^OEH6$O5pv1kfHlVUz5H|H zD;ngSiQN{}EfqZHGP#Rh2|^CbkL&h$M&K9XGnpLs>9r(?b~I}GQwC;q7=RIFrah?@ zDVfk`tZ&|BE8TVn#+tANoB_3SmtnHqIuq#Es68A3!6&6Z+O#uTUrtz8Xz)kJ^kTs z7YkxfItEV>n5SZ8wXOBy1?xjqD4|AD48qkn?KGt$?l&cJNjhv5ZWP(#+>_BsJRBEY zCgpo;?}wMy8~OtD`ObvU+p3q_gha?TpCP0S=yvy6HY(`i>86a>lmiw?xKsLU>d+pX zYx5mE1YUof;S91px}m)eJ|oR+cLObRO&eag+~`_2;hH{JNn(-j*Se~-uv7wuG!C#= z6sX8N1P{Gm{IPTUYBq>~4vS}>5q)LT1}#4q#9tTd;a`@T8HWj2ukEZ)vIaU@ ztgn;bnJ_5=8_3|~fQ^xuE)R~zCU%i^te-Ej!_;4N`s>h~a;nT@h%|8ZIIT2nv93i5 z$@24i8?+Sd8vbMqHSinufvG^8@LtBE%~SE!G32|L)>m#B@hZU@CAP&|bkNldX$n0o z!cww$U0Hm-h)ZLswA~H4`46w^`Kw0ya}^|kmVimC^3wxmPnO;xt?$7J$APAe(MVnG zp-_fiphcnH*jKZ2#{Nc?m0uFO9Xn1R{}2Yb(opmkK+W@QQ8Y?0(?Zj3RMCX<(Otl? zS*h9EiQ@bFO{D7BgSYQKiFyU6S=_yz&w zxQyvOv@j!&x#bQz(w)R5xQMQp{xP=Xp2!%PtPD_PS$h4&96^v`U-?b+MuKMwMv7h*MT-); zbk6b8&e}@d@u{2VkY8ZUeV4|IfD5DDpRQ93&?p6d1UkJlPuw|U9GBF3BaM|&MLAo- zz(OO!(Nq)8K;T{wyZHlItgfiUKaTI_N`I6B$zA*C$_ibjD|f$MOwjWsZC<9@Q+b4A z@AV-JkBHeq>F+{`2y>4;%$xbeueUOv_bj^@mp1hvY|*{~+lU70)`v2=Jo_7lkYI7`4B4a-_WQz- z_5C!TIPWpYWF^K^x7gLJn>-&P&~o%HBjOMFGv(;>{_*-_9?6=8sjW||S(ynC(~HM! z-`KzkY#-&x&-2|%jLfVT`wF7>Qw;8)7)ir&X5$k~ve#_l(5d$t?dQhlQc-1c`ox)O zTy%VPzT9e~u?fXl;-~DjtpiD4^9lQtt-}r^_B!jl-Gm7fXS)O-(}1!CmlPCObe*0W z_T$$#^1l>Qt)@Z-x3NG#+ZRl+7yv{A3d8C(Mo~nA;uKXvxB2)>_QyN?Bv;5-FBSgC znyIpU%Qm13tB${GdHPqxAtY$OEs~&(hJ?z<9==nSIYS=gv*c;#R2du~_GtH2Mj>cCM zW49Wx!0rHJI;F3@VLI&CSDqyem}^xWZ5KfwX&Wi=HWJb4t|5uqzpZ??l0Ckxf9KMf zV9!6x=smrrBRy4E$EG8bYAJoO1-PQ*jW>ioBRF9+=n4wT&t5d|eL;r;0H@YxD7~6+ z^@wiU%Dn&i$Ax1-yF~&9)SR@+S)=g0bccL6H|xNbu=shXsN;6$$pX|m;0U7%m*(Jf zEgPa5)^AJGMF`3PW^fPP3@^5PQ@krmxgNNzpKCP3)0|ib9#W>iNB89f^SXBIl*ut3 zt|l~SE$>I9@Y9@_-C=n`j{-P-oI9e;ja&#_ygB`^$n28HqTIJH-#| z>$y>!MWn+K2l;u&T3sE?jM)dMS(Y-pPR0%!T!ht)J_Ni8^zHD z@nIHU(Cgc*|4lyuWMKQW9ST`P@^g5E|F^?7{p8jofQIt1MDYHyL(Tb_C(N_HigBeX z3XH57jR^qzibUCNT=tfn4d$#xED*rB4w@ni>%WIC-7$62vwWx{?iieovrwBNWW{N7 zz>xq|-a>@al+;p8A8vS&-1dDMf}UHMv3-$!rF6f*y1Jo#*WgLEmf8;fO;ZolSjSH7fELHSi#*)^WRgR{#TISb49-nZddW6K4-Gi z%gK@bp~dRbwlMM^ZgD@x2V!;?r2-32#^tJ-+wyO?+flOQ?!9 zfz5uQ>B=ZoQM|=v>1k)QBDq`lwi%RAIDwowdD#kzNM7kV#E8^pJ09)+sbWD(qXL~` z44BPasHwcYAu^m+Aw*#eEzP6idB_EsUC<9*ijDiXF<$*ER@a?|~PSYAMwdbl$amDAQUCIyBxUKGNBv?CaAx0rPnd8@lZ zw=YOsfKBKAuuRPzR0G_3cgCD1_b3lxGhvZPTXVAD5G)RhSX|@?ZW97|d;@@cQ2-X; z8CJe{>{Ry{$f{(y=E20}bQ3U=$#@fbYKj4M$P#XDDVwRWpKv5fIFk0ze7-06VbaRl z)H5>DaM1nu6*1Q4FR@5~{xnBAp&gv+Hhu5KbyF;}ruO$BgJi_Gw;OB$!YKD5mb*{d-6AE2!pYESzsL80-xKy zj)rZkV_o+4tUh_ffrtBk(O%}od(CmS^rg%%P z%!{&K81FurpFs1vb<8o59n`ewg6DJ2?Uuek#E)%ojR#Mt)2XIS;e$q&trmI6cK zO}Hn$^fUQD+9!LK^N2eT(~ov~RvMbQJlwaWGY*q9ndiLSX9?i663v1vFqH=*0>bSt zPmk2BGw!hvM`)>igf543q<*+vSwC{+7}H(yr*vsQx&K%v5dWDMEYX`CT|f(0%R@pq zZANcjB+ri;2JIRXijoozq$jugp{HeXgASUnJ|2mp%zUg6hZqiVV98I-7}RFe^|Zd>@G zp>OO^S#ZJFEWqAEXHR{)GVQ+^LBg)EH(GGjXcL{~Si2Td$igd|`#E1b^i$;dBJbPY z85;q zTsJ&qIq8Wqfb$;CZMs0LYJNAgSfwdFm5Iyl)bsmKs;((%Y+<;D*!i#%%uup3>OY!= z@(~LuNf9C=(DeGN>oL}&$&kdiXV(LJ``tr9&L;K)VY&uxXWRBP68w_^JAL&kRUZ4z z!1OB)H_}Cue`oCBnJRYs{p_Sz=Ep3U%Z z|LYcKm*UI6bNT=H;^xfz*}V0|9yxo~=L7Cj7+7HLev-D1F$eDVHHkLXoj>m7o) z-`rrPP&1^)=B?p*DSCV!xTWl_$rMjtKhx>QgyP$qD8u&k)7Iks-GY$&Y4VQsMsx!G zm7wZ;PYxgGvjVsBuW+-0@ZyW+CZ4-ynl@0quNz|cPE>a7bKPn4%@4jyjo&}DVOaI_Z`o2gti6fl zn}t^Aeor6rI{XL+aHnzK-}5{QR+!C6xuSt?J_uLfy(`R3qZ}yVj6LSDTfc?x3;U3g zNu9oje~=QgrcY}{pc!hFm#a8b@e{n(9MbJf^paqO@z_yX>s0E`zq(px@8o7NR-|cG zx8q@vZpK|%fhD@X&2p3)u-c)b^Lps@d)UfK`+NUbkm$TLpi6rkX6L80_e&z$7ahnE z5TE6*Rul%u7l=Rj6AN#1!1k6akr2&82vN2wpTPhc4-c5ie9~)U*`L2=bDDQxjY}u&TQ}UnSOFqhoxTR92e<0>MI;|2w^tTAM1FswTvau(X>01 zPVnl0@;1r0w}D0%HJV8?iOmqZz^t3cS$n5CjT7FgzEu|8>zb33A?Wkl&89W$lbrIZ6I3$Rhx5wP8{kZO^zTjt}c!a z<`KoDtJ0$Im~*em;1CB7clX%Hdkep*q0Gtzxpq!2E78Lw!Wm4T zG*Z8egN~z)Mu@kT2JoE9gJ;>TcHj86ywzm%^;(rve^JO?VRY6|F_)!xpLs+mkn`4; zX0d8 zf8Atrd<5M(Loj|Vjr?Q&hOBhU=iWuTS-vI{ogCr1EuHQt5Ut_KS$_wxC?=Xwxxkmd z?kg6B6OZF)&gdK)(u1V6mXd&cJBr`<~*Bt;+WU>su`by)9B{Obglf*f1a1 zpo8y~`HSAoay7-YmW+OskNZlU+&oCD(%-#w8vVbVA8e?E3Z|^z7%%M%r=PW6R2jA5 zHKr?}dutNcgjRwOAAs&)T3(z=#o<4>05Tg?P(y)%-_g=qi@2&yZoPgi$-RRg3fhRJ zN&KDzb$Tzo;%kDl&CKz;Vc`Dz}F%tX;TO1?H^{Kt#y&Ox+0*B z`LtcnjJb}pXz5ca_Qz<7za;U@&ZyqMPK-|lBi(d%{pfwX;3yO~@zFKcqW@XY%cfKC zMa^B4B?~@%yVYj~)v^@=aYF|h^C?RhOZlGtK>CxaAZF*GMpgz~R(mYzSF2aFTlH9u z18lhsEXTqFKk+m=?hEd5G<<4_C&s26by`DeC#8g@M(wA+=SblIP(u}V+Az|EGo$h+ zogUZ4xUKm{$|7vzOIE@O+hPc6OlbKp8TJb*keX>P5?o-jklcyB79-o5Unr!B$^|Cn zGK($e&5fjNJDG98_}JARro(JjW1eRii$O0r=ou+b*%(dBy8Q?C+>Idk73yncjTC~` zPt#)il>snJWVBR~+qu;f0{$2YhW@NolrmtL4EYrv7V}uftSHbN^#gFDwo*ZfDYR;S zi1UWVLaUZHrG|iByB2X77S$J6PZn9UnU(^oC#%L86+fb&+Fj_*_|Gi9TwB;~(SOeZ zu^gExcQyJ5^k%%&BjT{wdu7@D*cB-PuU<8%Y#MAF z!bWU3OKOy@tqM>+rvprV#wuOvFD8c2>wu8nHbs5$<)(_H>-H0A&?uCSYf~Jw&0AVEl?#?7Yt?Eg!WG`Lv;P|I0h0Hf!Z;j?Alb7R zXPE+KUEiNNhF%76zgLdhO$#8u3KuB0FjgJDXsWwLS&4||Z8GK3O!sjw3!?i*5%+7# z$&t@(2zKOPF5sjf+K|%nGK0g{*UN7Rd8iC zZdk5eg7uk?=DS(wei>b$0aN*ctu)Kd;~9t@;x2rtca+m6ju+P8Ux(t+ zb%rA{d*uA!A7pqQyQ_4y=|7iIE|(#5YfJ^h$e4hCTK>_;}9cbR9`bS}rWKIwBe*Ean1 zv%EdgHsw8R)qgApR)Lp5TN5WG?D6`>#6cI+ zCEY+)`msn|(D3@b8xvsndctRh?i_`rKUn5b<^(MqVVH>y-nOqWM7V9VrB)=gsVi&& zm1t$A(dOOJm4@Ho{f-1ozTu(delbbIdF|>BCsS;mAPij;%v7dg^p(q;O@2QVypAkc z2%TCV(vIj1P8zR2a(0!`&h%2IbC?ZY^{FS%HSaO4D647I=4nLz9PScKd#T8!tIE1ZTbwn?8Z#{yk9%1bo zY%|+_K6E8&*}Sqo>p-%BuaSzqzS$6j$|o#|F29_Dk+G87;hM zyUN2`LVBuSbS=^k`pSIL*ZFQ9933Jc4HteRSiRuszUdvwfgEk`JB=dUGxfM9kHmZx zAGP&-_we-~9UeUBFdxm)drkEFcHc0Wk`!@V42Ko9pjV#aU6s&{bu)m93zg9vNiUa0*Di$&&OIWczp)d+ z7&=j4sj2fjl6%HvF##s@hSSwywkX@?;bAz_jq$BJw^FfGnzi6&D8yqnnd=32(V3;M`e@9`(Ydb8P!auTcjOP=8$${1DWw8)z$QO<1 z24+_oe~9HQ-Vf|>kGO42R>7J_|S|?g6AxvAro3HKH+^RQ3hgwAZLUZy7Od zNlWaRv`-<8^INO__49qp%WP^T16V-Fz4day+Zah9R`I&^Deqj~s>T6GU_{DUWU+{z z&ZlN?X|nsv=M*LDS?BW%&R_fJ_TdRdFh4^lahinUv_$y{3m zrQS!;RDC*zPWXuN#|k$bM)c}TCNHXYR!?l`9(!|?QL@pgjX7bQa8)PZhZv-=gNA?{nMesPDY9rJ}a`OfbBSe5_AiyS!PdeVh>+Ye)cl_ zL`M;#t{*OQ*Jf?`ov;--h1&~Rb3i<$$p#0=n0{1)JIouYGm>X2<6&}=BOV@`XIc8W zM9hMxq1DGij~Bf=GWZSuhnJD5pDD8_(#zs{X|(vMzB6s$ojL`4^Pb*+eWhM2Q)xQz z@%ysM7`Z^b<2#b-#1HtOWl6ZQx#nzesbn>*W-nBjht|)_-z$+Ne|%0}_4hGV@m*=n zhquN(-VeRF2ZZFQ-S@Q?PWxENV7p>L7xzJjuai4)QZnHeXi52Md*W4Fom~YS-VS#( z{{%oDA`dx#xbpDWA-;rt?0#A4;i~ZRteJSV)52HIGOOt6Ua>%kMhI;JWxY+@?^a`d z;EQHX2$EjSmS@;O>$JUTWlAsy`}dPFPwD zM;sXWDqp}d0q8fmajRweUA6R=5h#HVIVhFy@j;!u4klkBw9`K&So>5rGN&}C7KxiC44UPzaO9GY zxG22%USaOa606_^uiQVV&~lustA+fX1!G|1s{7+|R)l4;%K1x6T0_Ugrtg|lu01!e z+fdH%hB*U=9aX4rdfk!t+MP?lv{jVu2(W_oR=r@#eK_}4gL}y@z?7##t2xW|flHCY zRFgYL9QAn;XrYtYwQG5Z)7lcv&SEVbKgN0?UfkT%6;Ge&INt?411$QKdS_}m-l*rY zUzR3Y&*o4A$`k~$Ki+6?s;IhEb9+hxYlY?dm1m3f#$M1~GAcJ60Qh{*1q)RqPhMqf zVa}^7WKBR%3Daf2e%{pLfmfJrP*?%%G1Yo;ItJO4_!=6qeFUa^>m?C?*FjbCdG=3S z?0HJC5hAp)xt{E1<@;*^0Ji=np6Dn$r?uYVwpwLbq{><-TTiW!ni~@tZib1`eE=xZ zKMv6?L|}VEMlL#oo=SSv^apNtgrjb+4xjAwl@HO(JcgvuWF((i>#_6V73_syx^P#P zrjiwh*Nlx+zB-ndF68M1+UC!@crxjXd#2Bw&b!_`be;hZIhFsDT~;aPa|2pR=YJcf zTIou)T)wB${$0#jju%(!FPYyo?6pNaDyMneP@mjxxiQ1GWVs)^X)10LN@iP#_L~_k z7TA_ibe6z?xYDOypG_=0M_(=6CsmMoQmZoLh(RDe0(hdib59 z1Vb$ySrU`1shjU|A=;CTJE7}fmBO=&N$w@Q*YyoD4qYsn`z zJ6KpUQ#oe&NK=kyJ>f&8`d0IHv-1*qwgy>_N-OR8L3EMWE8g{zSc)eduHtpc)w>u~mbIN*i zUjFO=2QEkAWl;Em(<7Ic(C+w)W62eE>nYTbZNQ&f0s29-^YSJ}0Qr?~3U25n!c!o8 z_GsCH*0*W6ATeV>C{3&x@Z2`u+xV55^i=lJu9!7c@cn?cJ7%h8Ph^cZzP0bJ?qQGx zr?qt#VpdM11w-v@=X3CUds6@lNS=bn-5IKUC&~-(mG@{L46t(Mp_fNoz05dhXIkjf zdD!f=`>>3xA-ULuoZm{Xi>5)Q&`?XAj|K?tU&(@&Z08fL8S+!r`(-NkxnpNA3{>vd zy#y9Oz#gZ+k*W0zdKL?-4*BX-y~yQiz)eriyP)EZozB^IgHr9nVEM+2)fs8Ci1~hu z_N7)XiS3In7I)TT8*6eqC9A&za4~+w0%c<8dMVwpn6E!p3R9U~=7lM&Q$lHwD&19m z&RU(ba77*wNC4C290VCY=C3D`15(5rA0j=N!ei9Dc=Fc=W>l!Yk2EWv_OD9i{%k84 zuwWBxK2z=r7$Q!m5PUX)&mz(6zO$!ro0>^|#a;h)+X<}t&FtO>*M@2Ko`c()FQ#6e zw#v$~Y@y@V!q4LiG7Lrc56m{Z(_^@{S*w0u*jUN|w-2%y73$kIA}S5`A(3n#Z}NrC zZ|F#Z2k>lpv4$oui8I4Km-osW%o~KuV@%LmU4i72X}d*gbiOl0&6$%0RI0rp9#d7O z`WJ7n*h_6*>O}&08)n{k9Sgznr5E47eFa)sw3^Ow?p(?$P!YVXHkqW=@R^IracxzG z48$XbG>G4Y`m}L+lo`c(ZK9iJ7!8XxX1}{T>pC*NjeBTnZ1mGF;WE?8N#OVPa9g(2 zh&WRGoNd2X7eO+UG+(tq#oOkKqpSR#LPoizG+k~RV{gs(#m@RjrAw}USu7jwRculi z_q>c{MIghLE=Gu7MSEmHtJQiBRn)P3@}j3|iCd>vI?Hh#eK^A!2?Us?zJxn-v>_Q^ zdpZ_2Sl5PKdgTdwZ5tQOZ%5Za{tSxg`RW91Q5Z;f`OB|3b}0};bhAg|^!Ok%lHSV3 zpQh4m@-^jv_?Ga7g{8*>^Fzdu9>qg)&CZviPLNXt_xv(JSx;t znX}!X*2Uy+!R-_cS3}1(91UAO7ttKI-*+f8}N^oOh6^ieJDQo)ukF@-7?RW$5 zWvfsTBpas{Uy0&TlX%WWi0(lw!$Ru?8N_p#&#| zAkdH^ouzckIyL>qE#kJ6n*k}YaOu0LJCpWkSnF&*%+iPG<#b2ig)m6zc5WT@q5vV! z(1_`5r>~_&EMm!e(JLir1Qru#&t0nGslUK$T0C2h_nAGRz`Tlvam78;3u?MIR)_|P zOoDhItny|l-p35q5UYAw)BjpY8C?6E!ZXj4m%1aOrzI@n+N*xmD@1ajPLjn+BuO~2=cbZ0=l>g5rCi}aTy*}8jRj2Z&iGsE?v<9b&oz66pP z<6?ViRbJh2&!5IJ`p|pogk5y6^NuQ5pW1oa18T|~;P(+gL`|qJv_7+vPgrS!*J$Q9 z@?futHftyKF?`)5f`6bM7N>(exd?*Qt6AlUjNq5G`&?s}u6$|2Dr@4-b$ktAW)bOQ z&ekiF=CoG*>95&(qJ34iN1((%md7hN2M?Zx_yj++Jo)W!cX?Z}$6?s^k%I9DV~HBm z>|cO;o^#96x3WjIA)6Xec#7#sp<^E>g@!;*$VBl&-%dL{+Y}pyhcZwirjgj)yb%)_ z`PyseVDjJ}hMF9ccab&=$Eb$v$Km|$@Y3$~W0Bn5!?)H#KRg8A03AqAeA3&-GGmur zQl@XP6Ynq3@*`JR=@_4J`wVMV_$fvIwn@IM#b05*OT1t6pdZgev?2D~@N^@G2?M#8 z6=z6V`zu8aKe&-g!*oG0xnFHBnI6LKksnsQ)tLslh&$$LvS1r2UJahpIZ9cx@8hi_ z@m!TnM}t%`&`WzNr&nM%Go{H4ZlOSn3S9YZ@fdY7n$p)g zp|w%+FT-R42~u>7UExOoEnHz|$>EXEVflVvPPKYMMm@JPA` z41VlED&KI;zu7u9oaMb)l8F$}3%^zia}Z#+^;}Jr+n`VOq0acN@#`Yw0}v@wZ>4W% zGS{3vFDSB45A0<_eg@tA20XDESa@JkVj(7XxF2Kh&0A{>uGk%F-#u+vDdeB_#Qdeh zGI^k4n`OE{hf4tbAeL=nu$^7EV2V{5`8cgV$&P&8@3zOPtEz*>YDwthMUc$N9g2gVy6RwT**-6@jeCgT0%`tdojG>;d&~T5&yS&ws~hhZcTa?m`jiTs6g3S*I%jjG zwe-pH{4=^x_j&wJb64`Jdm4#yE1aCy8s;9BM2z2ck@SQd{+ssG`g9T!hKMSyyIwDURxPf6C>-y?@mK(Pny-$aMrUzZ$J1`Q`Se!SGu=*KR@I3(qvTHdJPqk%&Q2LX zYvgG-LOOW5AGfy~Gr@Ok20bi`CqGb0a1$?jCdhw~A%TKcNrGN* zdsP}EaZQ>3%DqQ0aW+L#U_}~3cM2uq^_}w#!{srG>0v{sqHhJ(H!AUA4xTJ~ zO|H42O2;cG8c}H5^J~KAM;{|6Fw@j-#HazjI_;|#+PgJnyl~t5x0-@ne@TXI=n*^y z_)x0Q<1=vfFi)L4p|n2wc+zQsQL8t}^?4@?X@mMbfNre9kaI&qr~9^reOU-R|ML@L z#53=+I2KK_>O!xVb|3%20zQ6V*>Z&4?Rbz5FWqy6ZF36U(ViVvkf`k8b0w{-Uk-=H zm2G9=!n1oyq1y4rH6@c<;V+155`H~tofGOggpi>T;;)&;Sy-Gyf*XZP-d)B1FVYdz<^f<637d`NllGPiy3CbL4}kq6=GkyY{P#NdMWwXEgD z0|&<3x;85E#zUUXWnRqi7(gl5cjwW1qdRp@SShD95M8t9{tHnQ>EBk~&SoPL@R1wJ zY#Sg$b0r0)@vq8?rey_x+D5)KT1Lkq3J)=+#xPgI5y?&f#%|uHik~Nw%EQs>A!E6O zU23Uof9o8|bp%&~_0^S9zOJ?-m8z2Fxog;$%LhEUaLF1jk@NI&4qsdNX8&AIsegO@PiL^CgQXdDP_1<pIsEU{p*iBMS|ZFtp=GhW&0N+!7kbue=YEJ%+weT zavf{M4xANpb{zNhYcJL^pHvE_*{Xk%Pphc@3vYT>olE>bFxIojg#X(?rvIjE{QnL< z`~U9B3U^$x&-W%bG7Ay3t4-*Pk?;+;c~2)`{0;vm>-2M6Azv+A1t4SRHaP9juFW!^ z?T+UH%KrvK3wpsyIS4Q|!8=mr=^pMUCy1Xu!9${aL!PoAcfLF^`NOAlQYNP z5w}f|)vY9hb<;v;li^+QQ4){-&Dc;7Wrf4uSqfl~|A_y`%)mfsj=^%CLejU85c?c* zA>hv1pL8Wj$;0(yzlXKszUYSAtJiMF%am~nc!Fnm>j{+1>HJRdbSjyGpIe{8FEd80 zAE$=Wk__1Gnbxa2wf`2Br_XD0m`4n=J`$y! z3v8{aN6H;{8em(KKNnPsgp{t}@-2%OZn+XSW%6^7Q9& zJt37RV#sC*`}~I2D~KLEQ5Ty`c&r-f-(JtM+(h=V;JMJX%tF!M@Y<&yX%t*@a-fi0 z%YSDYgFhtl%7f}V<5RHTQ?vO6kdUL{6=@md4`z;%^6ate2l6MA;nmpv`$L?uHf#G% zbI$qy>SA<7g$!2R@qYRiLX+(?K$h@7*z%U_hlic4!a=Dcod1P5mmU0nhCja}_kxpV zZ8Y{d+{Lw0nY@;h3<(jUqPV2D1glPc%Kz+auA&lLH=h}$Hm_Qk-(|6<`uTHBEl(|~ zrA$OW88tQgC^;mYx)axXr9#t?1?*!8ce#fa-st(XH99W+hk#%I3-^xkUm*K${~Kf< z2}OB&Rlwix1z`Ixz&+A`0q#Zr_ks!j3vmDZe*^CS8hBIKEIeatL|5IZ)YDD=J(r!% zR7Fv3=;ql8d3%VA=fv>fSi;}3vzVrcsqY`M*!A0WJ5@ADp; z1G|u5r`AQ5iuPOm2C3SpIQL(EE}eSb`W*N)@-SWmo`O={hFzVtpKw?2n6)8C8*FF+$6t0TB$kLIp#b?Lgw^?qE2A2ynH z72IuXiE-ux90>@H^erv%f^I$w&uhhoNs)=xO&9Iyq9gmy@yeeV9_nwr8p~pC(@0() z>3U3m@lt$#*nWnXf$C&`Ig7bj7+@2-wm9(* z`8$#9d3h%iu#UOheagOH$mnZSel1}hwSy2J72Mrf3sr)`Yw=*_7jqTwViQ|~r)vE- z9@<-l&vhZ{uN(wK08P^zExhgM3I}%-Hp}+hLVFkt4{EQwAQ-BX?Ni-3;=#Z~mxIaf zS&p6Bi@gu8NQ~RVHf_%=K0X)t3h~=r4g++&L04d4WMVjcMEWc5vHy8qr!NQOY6bB0 z2qNpWwPV`>zuUkFgpK1m_HkmoWaffWyk#{A(%w$YTL-q6dvrl^>O~rE&w^_-qZqg1 zq*!;a+pZv*c|T{;xJlDd7aGGkETGOs2l2<&TRJ1BoVpT4q4?hrr$ZJSeyAb+R)+%T zucm=N=AM&a@%+1;76_bfIybd9 zR2fFbpyr!?gU*rby;J7nbq2=fkF&J=);NwSt_VKMstv+Q7z#Btl;$Lt^3tR$Rg92R zQK07crV=^w$9oS>d}BZOP*qONH<&q<4F=)_KuGP&YlO5f&pZ1@anw{B zeYbc^>OjhtF+Z9ErbTZUgrTE5n4D>8|hLdwM5CVE?8O zS^oJSj{)Bk?x|_(JW)h$<&%jeEG=J9(D|(mt&%so3mnVv+1Rb>m7rt0*hsn{qbq&` z#`7|hFZb+U+%}{meT*Y}+*N1|$f=|1U;N$vaH86#<;H!GjH}dqndj2=n>RTPfk!q1 z&2%MfWsW3KyuBS@vGL_Qq3DHZf#3mldxE#mn^K01sm&M6(1m{Tw5Zo9lOO8qt_v3l z$9{1uYtZHu(&Bj7Gl`V)$^SM+c#c%xG1NhVYx~O26@SPNA}*`5e9PL$kWG$Vd!82- zN!XhggX8vXX~@rbBXDu+KBYFe>L|`svhGlEVY{}W4TkH>kB~f-tq%$|*QjCVF6jN4 zDZZGWYi(E;c7Ixb$|C#MX#s7xrOv)E9?Kg)x7Z1-NqC<}i%ah5Z&;wRlQh;@rep;N z>~9JKPpW$sc@qxSejVOj6ANE$%rVJWUX5`?5KqLWmg6P=RF=P!y7Ycza?&6hh6R=t zxxT(@Jwq<=15p_Yyl#Y@1p?pNZZYz{xF}R8>s(_*7*BhuGSDY0I4ZAzd<|hD9G++2 zrBE40j2NzDWoSyNN|7=n9zO9b5+UXG8SN!@D;pH(IkB33Lnz8Zx$5xhcs+f3Ff_>(RdX7=DX|b3`ut!T!LGaxfeOEL=SW}L zW-{$AU8qr3;E_xP;wf#jLkiJmaj`1*<_K{V_02bNC09l{9Oij5!MRijtQ_?{Go7J$ zM{Q;eHLquJy5>AdS$!h_{FuMK$uSlxv+VT0wRg0WU;v@Em?iYWn*9n&!IvMRk1*49 zqc*EXp~*CT_77teqjWlJpX#~EM##Sg6jCXG47%hLS!?P#+4GAYO$X-x4|Q)D71z?W ziy}z~!6CRM=*HbOfdD}R1lQo+K;w;s;2zu|1b26LZ5nr%#$6jdoxR_0kMI1sO@v591tcG5H74BmI1vm|8`sqhTmU0W2S>Uj;x?hO4crug#O9i1|h-Hp?xz ztfopMtS?r=e>0+D=%}!qF$eMLb+#$%SAo4K-#h#^a@C;uqulIz+^9o*VTN;iC?Na6 zSrC(Pwx|39o`wD&WTMgYOeCSb2JK%PXTmn%%VBA z{FlfpBzqBBm&7hCkEsI(*HedMF*A7jJ@c%P+N(?`EZ@(*jbJcZ%mv6hnvr6gs_ZjY z-C|7Ke_IY9e-ZYTTO{r?(nCJjYy=Y=`VYNf|W7`eS(*m`t2QeY|s7Ycp;jzdxH)1 z3+tB2J1qeyEDMd54$HaCT2=zq{bCE4S&_=Gi)ZE6oBc<=#7!ESJ_`bzkA^zx%Fl07 ze1O6bwdr*7`9=qtYU*kql{vq0#3TC+D$*Hw=s}uym7nH2NV^WxO=0*=;m46dEO%JP zdD=VY@j-q0!!ul4ZQ;Q?v6UgNJe1nfdQQ;Z@ZpGl8L?%tHIAWxB@Cp_I| zhZXD&;61v|w~m#J)D0LWZKqF~5xy?J)|7sEv8=QhRx(WE$tN~yklH-KQ(X3qWr4F| z(j8g?!INLqim5mwZJQ^Khk5vkMTyQ5mqS@91=<5(^S;NCTK7su= zCScoQ%yd5iFS)H8;Z9hZ3jg0Jr7Bs=LWoCCGDe8`AL&OzguOzIcj``8%nuyZ^UIn} z5h)`tbC-W=KinSeEkWxdlWa1&W1k0Yg@EHSX5d{v$ggkc_pRc;QcIsEg`W%f$nMh< z4Rkx;85d{|L^tDK@36>6gIDv6gCi9+ZpKkBl)k+hJAe3K zb>~QsK_)A{33Vz$?>DYi(lwi`6Ncws4)LfU@ZEfyLQNkGnJPIOZRyQebdwu01|erc zMfqcTR;|zdtCK(BRjreXYNy8FsVC^-4l?YmX_L1L#`A-yM6082+cj0Yo;^7aLQS8C zYG2m9mw9h;z0d4I^mO{&X}2o&l9%CBL08TO((qzuZE#n1oax zEjq*MiC^n=98QCi=G%D{nmeL~-$YI1g7At+q^r(Sh1YFnZVgKKW$SlHHdgziPY9&& zKs*85hXu=Z^r9&0j_2BD%_nVRLs~f9RasRc{-5YqoA&g~eRJo*-NtfUXl1MHHb)wf zWE)FrKDtcElGs&zJ|eR>0ru`mSQ!W!67#O*LDdMDWnbx{TccCMgj>Z9xkE%*3bly` z@W%RR2`o<5WKCmGF`sLL^}V6;OEf8qrtNl-sp%X^yj$bGI&L*d6KUk%)4ua&6fnIc z=^5Qx+-#G-B=0%!0s&b#!qE8?3&ru zDGVN3fdf7x2bRaYz{W}o5yr$j=7JUI>?HJ6u;NDGpC*Brm&T~)rxbWzwRT_ln z10$23Dc{aFC9Uexjs`)Bk|C8vYn=f7T)^^XMH#82GD$c7M~ z=Wf1!CKVa$53yNn=bGtUp7&2!WPefR)LxR0G8wlDTuld!@EIPtT#+hw^WMj!>4RC` zDalyRkAxM?vy~K0Hng#H-bl#Ez2OT*<5rCgbMMfIj^NS|O!zv1^K^SpG#e&B?l7zX zrk(>@V8=>iZj9d@6`pJ;4hP~{>gVHyJ(FcN1MCXpy02f&s{rCSf?GpwkC>C317Ce8 zMLoUfsx(6uoVv^&d|JJ&T4S6xI*`q6cpi!gdkp&$=QJT#)!H!)JX`^_&2emwE;oh6 z{oHwPF690)#r_5T;detPlPU+{^?VtzE|pgNf9*FbHTS7_PV!- z)pg6=QPE1W?{EyP8eWNCj(*HfCtog z$u;i?auxr$wBy-!1nhW8pSa^zYKx7GoN0U?7$x_-HdJziQAQ@H1wFz*z{M^13&NWw zU;py?+P|)@8)Kk8wKAVNKGZ7JC3#Ju9k&Iw!al$I*ZUgF1;3SirHY0E{N{lDqR@J3 zGPbXY$j7X8_B=Id6t~2mjBvj&Bo7PK+3&hE!wbFD#hcH)N?PRpwNnsOxZ21^9`zK3 z5mImPPeHyV;=VxEwK``@B{agTU?Ro}BcKpx2RFZ4UxFfzHECt}gbPRS;{MY|)4e8b(Zvm6^N zaTppO;O@4R+Mh8AF9d+9(N0ntN)67BW-L??RTC4!VYBurNv0XYq@yte;L%1P2JR?Q z&!cm2^-B$1?WRe~iLat}mtHH$U)K=7Aq?&aT+WJ+!9x@Q+XK!8>gLQ|Xe*g#*iyG1 zomcJipyHn#o^1Jc;jEp|M9hn!(IF!}2Z^BE{9lgifxH;?j8a~RLvc!z)@V_Pdh^tnx+UlI; zKHs=4li_1V_P9TfnAOvh>z6I$4V%yedXmn(GbpoFL0wH~-P^Fv05QXmNbA#~j5BlU zZLLisUP6-t_%R=qprCiU^SzZfx26*;)|-@H-4eZazT?P~Ek{8k>v#LQ()*4;*jp)} zzi2s<;_umzdFPh*J^qHmI0`^wziR6`(hej8wpLfC8-c2xp+ov3UVEnv22aN7>F!lZ zE}d$%`iWma}5SJ5h6rVR%d=@ptz#=AK0oXb{|d|C4f6^7yI zlz%th#De{Tan%4{=Oic?-0?nV@TJUT$9yK+0aUgYr0cLX!7#qb?mUmpaY9W~-{>YjBJ-&Z@WbQq5Pd*xqs;5nkZjr+lrhjN>EN;u9QLD zoI7I@f79t>KtoLUARY0`JiAHjh$6c_)71BfR@n0G+;?@aevaQ>)Gg^t_7`^Gu^`V% z+Q8tn6bLR3h8y=cdt<;-iw@qJslJJxZOgJfut;v0l{#sx9W!Atf4*vC*LKCTtl>!K zbtKB{FXix)$;iIxWyjSZOp3V_8nYP>t_0B&C=$RjhW3c5bsro!P!>?`cEj z2!~5`|5kuT8?hKvLYf}yIm_oiD!Pekw)R3?Hk8DrYk7!{} zEiy4c5f6+LMLELYg^C}UVT($D$&c#SCH-UHl|Ao1*e0+pcJ0YnFD>2}+Cv2AXer;* z-3qVC__3y2k{f<*U7%prt_ed6iR5-OL11CZ2f9ncN*ZyZbr{G-M>C($Q0&A{HBL9? zc)wPUpj#&2b6lXeDOst@42OlII>N7HjtHvZbj>q=vreq~YdX0iy_r82s(5pzG~UnW zN^Cx{PTO+d4(>^E!y)<-F%ZG=s-*5gxA_!(a^eZ>pHO-RfFV6;^{d80s%-D2Jt+v3 ze|xiLcm+g7tZWqKUG1%0J2xTc^gG%^n9@#@M%O%0`!&6|Dwe}Wu+(iP8`-BF=Fh10v0hp+&{8wyUrq&$)#Rfn_+D~j60zCxxn(=?npyJSk!uT4@D0D2M~%#ihgWF+=4iDb#&UFp7( z{^(+#E3QW#I0aq+iPo1r(#~tt^(a;zhGhm*PK9-N*zT&8E6kjc_GB&(Z5Y%oc`$|C zVvIcV#=l2KE?jIBbFKym3B-7{KMiF#mTLSBrVOP<$I5|!CyFlzB0MXm34ng5fyf6- zw!Q2Z*i+ZJ&g~@DWU75*-5gB3$f`D>mo%&;D;)vqSa{fHLL&OQ2sP&W^>~)#XF|`q z2b~w2q^i?P{PmA{y(1}SLP6Ed8jwTN z^~=2n+?4v|Saj=?z*+~p<_3}W^W)So$A0X_S+%1PJimvEmoof)F|dQz9QL2*$&fOP z_OqQUsC@WS!4s}u)Me0U($^B}#mrl?xU}Eh`+hV2LB{3tL*2J){x|=Xn{T~`I>g-z zI=hq9*7^M<{+eDjCJH9O3g5NMoX(34n>RW7TTYHziP0V#W~$^&aOBDsOZn5II0u`t zK}$)Ip~}Q{ZzPH(pCVq2N|kuyyUYwc;)&Oo&+MtI0N0ncqBHyg0*075x{Z=w9ekD* z7?o?QF#2fl2=T#S0_@bqh7A)_BtF|z9y<>zWsb8?!r~?V&hd$9_i~$7HvFijuhmPB zmhIV5LR;zonXa)Z+?a+t1_yG^V3D_DE1{%UUd2YpG=WE(1Emx*F_WV4b7K-|%+s8| zaU)H)6}Xg8M@>LxOqSoir=God$RM&_5Su}4iYs@BelWo}F2$PIH0a=Y#3rQTmkl3R9G6Z{=x zwExkQw+C%#7UV@9D%l=_46~{-OdAjJ78fI8Ir*^}H~zI;#~B&+y(9x~c#3OHB>`gm z*Fvkdjh^OckZk30hZ=|Go;tP!U;#7vTW2=DXjn!vwn{>!q$FblGKwon(~Exw&s{vu zG}8#&%D_-F9oza8r> z;VZ?zKgf+r8e=QkwRPRQJFdA&wl9h%yfrEJ=TnVP*Y4SsriT#LCa&2uNz#@_U(7<6 z_f~3Nsg)>jP^HJ+qCM1_;rr;xj;<2+-`Xm(^FEbYs?KKoR1>RWDCwxc@HqQw%_l#C zScJoGNA`rE5qY*4rSlrO;wHQ%f}=v-QSpXwzhhy5Pr}#mn}R=&?D>+UOLMkF@bM1r%(dGJ>9{;A z#3iGAKn@(A?xrbDXMiRoXlga$avQzyN^v*Lz*X{e#ObCpi;Vq={!{+rOcD+UY7T-X zpV8VW1$U{{$DYb%oB6ubY~?kTc9iV9DWik&m199USC zGQj)PHX+&;K6}f>#0-U^Zw^eZG&havd=>w;ti`X$1jSs)zJ-S!t+}8D^SwP)sYN;RUBY8AST7x^X3>& zn7fJ+L+F)*{SzHk6%T)Ia6E}$gLzwHsj&FtncI;q z|4G3@xBL~fFzca~f!k*wnPey-8)xlHSf6{4oJfCOE+4A79MyY&TPE*e40A*oqmw~) z&Tu{Z^7MB1zU^)sflQxNU;oGAIZ{OEaqU^_5lD`1Tk4f&vub^Uv)w|by}#`uWND@K z->?B;gg-4HoaeT7c$&`NE+SDojOeI&rAIHHXU$PcmgajHP(OsE$vl*Ix_kzmvdgWAW zw2bbY0OrZ^Xx7E&Pi3S3R?d&sy|EMrCF){qm-`X^WhJEb{q|y8D6LSMQ0lTY=rMwy zH6RGrTQpP>L5EG7+l9##&_|TKwB_VhW260Fu>hY>Sk@83+C`;ppVe#53w^UeB7$x+ zxr6Jg$?fmIzW=vo|A4|@zgS|4%Jh*BV^LR|gJNARzpmyv7f8Mk@_q;*M|D@6a>@I& z*>zNE6Y3$Gh#GIp@?Io-0PRy6>u_sspQF{im7*=mNc!oCNYbyspK`!gqay?z%v@S(eG$fDWDKe7`nh)um#rrQq>e z7=uocj4rqtxvnGhD%nb9dGMoUbs5uMYqEN_a+t@hwug%CDuK%bxk6Psz3swm zFRMr(-lwuLe4Ij}<31WV0ihDT%;-O@3%9peP0d%xaxZK6oa3B@Jc-Bq{M5aq$3oFJ zu%sP4yI-y$S-0!Rc$R0pn8D0(P45_yn@|mDuZZX!zQI-QQ_gm^fqnsta-Z*wP>YK1 zznoC=cQovOGqZS;FH!1(UXVP`OAX(82t_LAE3|e!9zG^Zls&rbW_5CNjoSL$Lbgi; zGF@Wd$hrXv^R><{7*!~aCH)9Q3dX4p&M%A87AoQtqD?)K|MkKsu%#4PdBU_k-F1*2 zgdCtYI@4J zw+oSk;7ndjJgvI!jx<^)}H1AoqL_3@iWY&q#@iX=^8V<233;iX8)qTBnl-mvy{O(Ko-WR;B@p^Nqg@EfO*I-5N#mBWm_QcEPdC5D?_pXWZDt?yR3 zDi<|Q`jTAjE4OE$s11q!hKqQK@A0xUIvR(Vm^hFXUQ+d#lbRa-wVzR|1Bf-QTy&1h z`NCXBH^RlHBD>FhP8kPF8K}?u!&S41Bo(qaIMJa6Y}BvrzomP|1jOcZGC{1gW(D!w z05jtI&&Hhal0~LcNr=NOOw1K^a9X~vYb*f1XuMSYhP<$~Ws*jo9ugeN?gXEHj)?+7 zg0X37HoKgTHP)KQc%#)vVXJ61ruG@MlcKpEDhSHfQ5$dkN%JKCJhaf%*h=F^PpS2J zKsCZTz3Aq4GJ)`cQz*|Y`q#`qPxu0VLQl_&rDYL(cp!}MclaOh-2}T6u|QdV4iZ$8 zA0a^f#>VtINC(YeYdSSC6BMU-MOInIPRAk;U67rsb$aHM;J?LtAh=Dczf083)|#<1 zjHD-gwyyF@;KcB5_eLxBap8o!{qimeNZo%fQ%*<2vNzn58A=g5b>L6A+6SN{Tv~-B zD;hub#y;*VPs1ZaR2m6fe&AC+21U81x5HAuEoTe@B6C5LMPG-w`q(I2hOyj_i??bK z@>qzj7F5wswgS=_a%ev}T1{igr)sfdvuQ2QpDd2J52B|mMJ%vFlXCRwJt5^S&(PTi z)0H4T^9R4{mFuL`9LMb~MQHn@lWV6|??Z7;5H}jS#14Ykqe8LO5 zW-PPaL9R~}Z@}d&&%IHA7hQqL!p$YP#(kK-B8G9y%)phJ_2x_MQse!r=|eMlKNCJa z^k$d9E@M9ejbm5J+1({ctu(58{GC)bKF$lA07YT8N|j;-;IwXqN~D6tAhCp-7w^ov znoeiNcA{iKdds8XnLOzlNYxCW$vGKkL}e+9 zK)pBZ@RP8tNfUJ&GCjv5?3br;VvXIOmZYa%Oidj((2yBE{w{rCpxDh|$bZsyK?Zno z#Z6~4Fxx3-n)lp#Gb8#zSY-2P$;-c3WRwutH#t2UH+IFO#qC48_%Y)2kT+wGGNR*( z?gWllytTI>MSFVuq;Zu1q%5pwe~H|dO*D~ zQ+1530e;Rn!;x@($WxzNSTxcwe+}GG%#o(Hj_Jy7Kr&p8y=n7`=of70&h;uuZujTW z>6US|?)r6Oe!kbSbdm#K!oJ;wr5D-~4Ap&-)8zI+?wl=}IEGoaxW=|R8MFF39?Nrw zAcTyk3E>Sja%Jf@c=A+#VA!G9S($XV)#TZzdm8)=JK!g>{5bvHw*_`olX?=C>0By36F!k>$Ho@K(JDyI&ZCrh0%YQ+K>fLvMZ z@<$MM8{Lkk=r--jVxoC@t6BN!Uic_F>_(2v;}V%Sv5*AIN(f-?@m$C}sI?u#llSRu z>T1%!a4K53fXH{c53S$&IdxImy115$urGG{!+p$6k7YBG7@A>tg#^r>WM7Gk>hmK$kG2xujjI!U z+&ic%MmjJ%y{##!%Y1bPjhftDsG(2)U3ak_%%_>aqYs%SIJ2rJa5_O8CO{^@NfU93 z8`}n)DY`rwu$XU{XR?=AqDXzcKSrFRSC-6avDqHBlskRM5xbIZ8^P+%puV1PkEC4c zK34NNRkeSbE=qp+CbqS%#8V3wv?U(D* zjKLXEVqJ9*v5jq0ErVU8=82*1q~T%cHkvtN*G=m%-$BZ`RlS*$Eo!POA;%O;K=soR zJYeZK36<1m;Kq~*IKq}Zb)eT3i;zaV)QG4)C=ENyj)(bRa9Pr>mXJ!0Q7i1>yiRp} z%X5uiW`JVFZRCcGB|3ViLf!`BT48o(X=Jt4gol(M(Xg29toNT{6-7o-+Ltgp2UQ;I zwAj{H9ofItD;9F_?#2>;AEz+nEbU&TgPq~M{9Ww53GvAzkQhd8emygZZn+i)kX{S= zy+R4c)?{x(AVho?7+6?jAEF}LrmoK4cT5I-U-2WZ^kJZEO?$M4&1c?pKJb^Wm0wXB ztrQo(*5>dJB){+2C?EbRH`Er;BFqL+e=&n>u{sq~gC_@L2k@g|b7t}dl~D;Z07Vbx z^IzK0t(PQo)qk`tOO#| zRaLJMY2Bna+P}|yo0iSz(+^cGh1aHy&#*By-8&J7`&AMFm=@K&z5VJ12G006(I}IR zYoA&OTmHHTkg%p8<_X7n+#f%NX}GhATGNI`F{#OHm3MzC7u9OqL5H|le{dH2C68!} zr2Mi?%q%jw%hyjX%z`qR9@|#dS;M%(q9bYgfJk-Zb(yGmG~!XFCnwi;K|r1PnEAzS zED<}G3a6H`t8f^}d!~=E^O@cO_GvM%3Qci4%=IJXY0tEg|(y2`PzU!{`J#qcy z45<yVi$+)u{fI%Y&6v3+8Yn ze8o-;VOJ1Dt{1kqI$zCjYEI0^w7i7pQdHpX!jTVA=vamL^?l+01#Z%~FpD}nfcA$L zcHy6Js=*VQ>Lm;~;7;-om7S0ncwsaU8E`QzRBFj(MdY1oZtB(8{6W?MYgb10{dVMA zC%?EJT;2%Lp-}vOhO(aF`>=Ly&kG%NvatYEy!(l)Mm~xo5IaKwdHT~0$)=+^Mf~rC ziH3+KU~a7UCX_{YQNb8m^R7s@d1OyjTEKOe$^k)*WUM+-sZf>xC;GRfqvru(ONFyJ zbOr&#gZ=lgE@lZ>(2F`CiK;y8J&Yi8-89}&q|F}#9zm2Z^0uB>b>gh*k?u?5s0dx2 z!2K*Ct;@633`Lvz$oy-}1UqiHrlb6QHlAH?77rFky4q;<>|=fxAK*QI70(f)kP03@ z0ge)ts9XJM5I8_1@Q$ZI(R70!H|C~*1=IVd&z>S*QR1cLS1seF*^8j*fc_EZ$RxK8 zo{&icu-P}%W;Pl-mdw`b1PFr0ETXX3J;RSDj${VwKF;i(+BhkJX}yoj_pr?o0q<1y zKrD&#jN9)St;eTpR8%+Q=AM2en^n#%I&ad2dP;0}i1v3R@c9N{EjQO$LZ`M_*GC0= zn7Xgc0izr`hs$rG_Ku(kl7zy_nlj9&-*t`>#Mj+L%Lf`H*_G%Wdu>D+c3KDIgl^^p zV8}0b=HI0;BCjWgw#Al!oE3$;=?z#|GrK-X=I9cUHX*R=X)%?9!LFoFq5Q+H>9pW7VlTS4-V;u-9MxKPS3<&2o!zf=K{LXfFnl^_Be(E_ zhN!mlD|yECEwvPF*-hR9R$3uBpiC$YH_eH%d0^c|Z=Po$HjcaDW!fF_#Y%ctZ0w@y z?M`Gw(o)_lY>C^?@b0O%5PzQaAh23B>FVaLm)jX>b534-n}$yR3fPj0HL^Nm&CcQ} zd#lE0gMY7>W4uzscT&s5ex`l1)taeZaoLWy_l8-QQXYwCm)p`XYXPp2n~4UZrm}|M zmgPNMvHG^k>ajW$M>On5g}jRe1#;s*b1WPQU42GP+ga#G12hHS-1GeaRET z#))3c!vAxCBOe}5qCr9(6y^(dJFh-LU8+cNW>UmnR|#@~#}Vy+4H~jkE-_%|vsP-( z^}JOOYD=B-f1l~)HyafOa|XO%^-kY|X-e-e(p3Sj`yW!Ky>3&MA4Had?)+A_&{Anj zbRCdVZnmSPQ;kw}C#cZEVFz!X<|slHF51wEXJSayIc!!MBDoNNK4z+kgnO3*pog!{ z`0XsK3cG5ADZ-pTpKL`c_}f#eds*H&p60tgkGeUP#{vy__0!#*e)7@0ytwI9nNfMu zZx>5qV5L|@*VcnCZl3M)L`fF)OYxZi?z7r*WLpr^?+ zbsirnLqTU8x{g57oC-V|vx1r*z4x{`<}0z|iVtcQ>7E_Ex;?&U@!$Adtl#R^;3wo? z0v&GDqP!KVb9mRnlm4TR{i4+Bq0WJVM}7_ud~39{mC2$O4{BN=`H~8(IquG zt=f$jA^Nt&+;vPCX(|G3jzF`u#%mq#gV`kI4@#VXI<_!xt^SbLI>ODD#**zGa|UAK zQ=Qd(#MWZwqgb8r6md!{!QS5m+T1b*U4*IBasoFw*oouc^LG^b9Y(1zCFeHgbH%9d z?+xRfVpgH}wPLn2t=_ExbtiTCt7!m-M^gbG8!X!KTn=QZo37QxA97(5XeWAb;K?=Z zPvT^>j;6rH%ip64Cg+=o+y^2lX06qboLF3kI0MlKEXtE1Tgo=KH*9(Gn*k1pFGSCn zeU(fol)|vST}X4eyK808(+7Eh+r^x=TN%g;S3%rYAY{vsG#!{g`>bc+2ihg*yVa!Z z3>y2dz8t`enFo4RN;$goR@6(tV&-S^J98fS_xoc;D+S>kkZ7Vud^Oz0l|*?DR1ZVcSG>;k%G&sRpCUZi3oWBYx-A(b zj|@hdVWKC`CfCIj{4HYsX5>{nfnSYWpL(8go4MM6sMf-l?;$Ne2Xx9W`^s-DNKC*N zmV?SKd@hK~cMdDP(;D#%phMOW_99jD3^yjw_pfDXOG9b(t7}0Uys{{3Y;9@HA$fqh zexGxuTV#fy39V*WvC623h5)x0FGrLxgc{H~oUJ82`8%@eG`&8F+%Xo{rKR_l0nhCq ze&u#2Jv%m={~C<0pQ&*vp$OkRjB+|U7A7mNq`$g#-58n2+g^sFzA}YwvnAcWegU(- zX$IP;QEjxIL^6nFW#Gc?B-jO*bliN7-20-UGSHl zgh@D^q?S%9Ho|=~z$O?B9xAfOHR4`Cb=u1j%(DmS)g-m3Qbx2R|CphMAwyP4F zEASQWgZ&QW3}XC+&k>hJSz%>@U#A56QSVAPTOgv^o-SkEe>m&F2N1hNR*$$0+|?U# zvk|l&Znc1;^#K92JXW_qe_~6YMkCYcHA{JTG-VCLYk4!M;G=-xaGM0M01n2`J9Bm8#=J8ksXM&!{%?#aESXiN+%6(ZAR9g_H50-6A+h_2-+m00s>h- zZar;ms6_bt^Ltgk#fb(5hRN~xJr|j|kf%t%$5r2`K;SDDDm=%#5f%QPA0a`zVQ>h4 ziHnRZ4P6iE*B^n$B7rFqwLjEzxC6aAilQqTG}t2&ZaV1?><6F}0n3f2a9W37Dyq-wc5Ve3aVAG`WDsOyO{4 zoaQHY>_jO1psdDOA}h@4H`>uE7iMecq7{bh@W89Q{vTXlkNKmuB!(9>gsAejkE~y) z>LgU92C$jxuUhjiW`_Z0OotLnNcO;khYKJKGYSzov5Wy^DJ(AdATf}Fv*32MKJUAF z4!R;M(a6?et3F|w35ff)hDa+gV`EPA2z6y8y`Bx_VWE~SU-rTRhGZ-#h~50n#qOwM zftYPO@;}-7@Z}kv*B-4BMtv^7GMoB33_(|S&vDVq{93KCXvg;EYj8bRe8}dUnXUOB z6x%UhOXquK<+VPXYhu8#mSgAjIE5-5ePB}2r|P;mWYJMSDug0QE_n<50l6J_<~2VC znI&*vb9A@+zPz$d`DSM(DfKERSHi>N6^c@x{gw8sW=#5O7l`wyzAQBlcq~3FIG8B1 zl-9}S+vn^Bvzj8n2N3{JUSWXG=U6PdtM-7{Ml5b*L1Zuut@(p?Q*@SGJM|yMs2lmh zbN$6a;Bq^p+SvU{ts_~+=&Wy^bS&ZTd}7lCSnk9Riqg{E@dXkgYvb^UjvgX;`Hq3V zo)e{|QSdk?vWnaBA?R{Do^Fgjhb^N~J~X%l=~5njk1$hJNl6+u9j4uhiI_hUC@caZ z;&J+y$M2y*6hbuMK{v4(P_;&DK7J8ZFTb|GGylX4BTBqLdm7}+Z<{~JiK1~c< zy`zN3xG14UkGDU~ZER0(?X92L13z5{2PaXn&#Qv^#~&R5{<UsK>d*k5!kbI_xRP3t1=^-nC57%jSDz2a5ho-y5P1p6Gos8t%$iDXXU$M?{{V1LC z9SMm*n9(K5<52%>4%C@Fho*`1Nf|pw2Jgiu!5=kaAK&HNm_S>7)AjsBI$-MP-^YyT~t;?wGpK2GZpUPOV*NlxOuqn$Z4izS4G<5aS+MB11ST!x~ zlH8xJ5lEyOPFGr-COFxCl#0XW*q}oX#5xe>cx4D6nFV(CstBBM(R6(LRh~?Eg8sX6 ziF@T)G`)l@AIrJ(uMhv6ZI>vFw+4Olp^dJLV!t~g+p~bws?(SxiwYZF$IywJ{nGk zB)-DZc#Xl%<(|a%OtLLkDh`bAfoOkVl_xv&n@5joi~T624i3wd9ScnhE2l8r)ld^b z{X-5rymHkzz2@d{_{rxQd6TP%Piq!-aly;Q+LyZJ;YQmu zwupm9b=ioP(DNG(;PUp0&1&kfD--7+xcDF0{BYSxZTd^z@mLrKO-6+qSiE5uHym8f zIcz%DTbw@5ys()RJhAwH&b5!0`_XHIy=I-KL&|4IaU=)1rf6tXhXm+UvF-`$OZr|FtuKz^=~$bCXe-FbrHgZUY;<=?Y?nQ;hWEl$vlVZ3UJ{t_^o09 zJn-+OM%NfNzh*b}#U2|67Lo?XNqqQ?mW&@p)!qLq7Qh|GL+#D@ALSurF<`?}{zgED ze*JBM$Uu0x_?Zga*=w}1@U6}B#+okmX|S997acPvd`}I%xZ+f9uS3(oIx|}!TD1c8 zf7a4vrpt>wU0*bXujGa=i+o~cbf@v)Tzm8z3ojuqv4@|@d`@f{7oV}b1`;VnM``*4 zRv>2w2G&})hO0v#j;;Y7wIjM>OJT5be}|hFJM`un09n&6zh;h4&w&hgd_V5W zc4o|PDo1iBC{_B75Uv}2y+-`Ct3$v4^sbD;+qa*KBW*3F`73n62Xz(_&5;p>I&QR- z)?kJ~8Y&e#v+56;Ka)S`Ey32t4KvaRWJ=$m(a~qJKEmaDC@lAFI1es4n%ZWxGlhQ8 zLv{m=atJCebU~Mi6-lj4*w}Pg-X8ucB}N0M*xhCWHQTK)A+E*y$?%y+^ha_(wY+q9D4HMX{7H;WJ}(7F zOl{+j$EQ+ru6$>3ZJ`GFDA`l^(4xQ{<+Oc=BPvg{rDs`hd@K|Lh6}^n-RU}a)fq1< zbX_;jzJJL97Z=_NAOv{_y9~Kqb?NR-O+*;*K@GX&r~GwztOW@H2A+?d!?i``aNivE zw^+w*gY3hzNu#nfqG}ISMgT-WD*H8-cjk10p$|y=JaGIQdZR50{Bqx^zAyTLR-3|K z=6J+V*+g}_l9jYD5j*wO+d}d`umN0Tc4MP>_G`4*AUCcX*q1!?;+8Gu4n8?WB>Um` zS~(hXL^^cLEMqy!Yl=~q1y*fBLOh8k_YI@0CIA91PBcjm_$7(7W)kOAsyo}v#(pO} z9`_|bS*9GkK~F&2<*qGe@rrh|8^uE8j;P|8G~SG`u#j)d!W`ee-rpAfJ?ykqt5gE9 zLaj}XH%zN%_nD+~ji$&tvyTIWuIRZR&iZCYg^!Nn0v^-OgPBD7+B+T$W-DxmU%5Or z#+X)TnpkC5%a<(TG3(ZbE0wc2w~lLO+^tDJX|_kE_ue%Zewq^y1>!`bWh(|JdnYzt zJavB%b_F4Pcp7aduda!6V)FH7ML)v%0^N-KWUiezZE4IK=J*mle7~*BiMRY|>FQjg zM5}&=BJoMPd*Ngi8cm`6$##^(JJ7W)NU6=BE3ZA&=zOU^e+>1_=4SRI@^=Iek^1nf z;)HY(KRL(&B)$Z8$8)@|%cw61odIzxjp%=2hiX6R-txNEzefI@bbG5&!V=u9qv72f zUP-R#MHP{EI&nw|t6uZ!sk@R(dOmc%JY}58GdxD4B$sy!I}^T|aV<%{f6917xEHQK*5Kmud^x4C8w+7ijQLm|=$M{oUfAZvSOlrHw z@B9d^0MAFS;gHw)k%V+K8aEPl3-byW>*COV+Smrdn$;4azIZ#SS zqsPYPiCiG4(mLXJD;1JAHYDOlO{!6KTK*PE&?!sj68q^2S%=*F!!URmERf56E`cE0xXCgs|VR8m+VUvAu+ob7Tw=y zZev@8_0+2*c0$Y1fWzS@Xn!QcbxP!lKdE%%{XvpdP@iI~pbV`({LEB7JYUs#8g}cM z_4uvsWWw)6jo0ME_M5bEGuVv9;_sqY-f(Lqwr{ng|^0GF5TTs-c?R6jT zq>lWMV{=-2QZm@N%g}(I6@;?XQeh-=@2{hIeRB3Gtbs2xZ&IN;$sGjj6SGIIwqule z%1|@N03BIrH&U8^J`145UV(iU^=>94zmN2dUsbpHO+}@+VZ>2@xAE}=({71tFf;E; zmsQiKPIx7m6tdDi&mDTopZm}W3q}X_s{hR5VV?)gmXsCC=f5^yu)bk`C!BZ$Sm|wW zeP;A17>^ivvS5t3yUe>F6w>rzUBe&6i5+Redf1J+@({3tx#I z4-kl6~zA zHbS(RP)V&+_3&gJx^dh^sCi{3<`GVbDJS-eUG##FQcvx{Z#Hq)>A+?sl{cd~-?KMI z>yv{}f%Dr%^Oeq?`WgHd6pO*jYv)RulC8$|n{x$tnPRim0o6?vSgt4Ftz=Fhu##vB z!y!wlhV(}9I^RL^>aVKS6B*uBW`V&)U?dLQB4A{v*H^Eyqwh~U=7>gEk&6|3qS%5B zoWg=-Oq=*cM}|!=4im#-su3P~(aK8=Px~c;DL8Qmyp^*uN`(?Rsx>+B4ZE8moIY#x z;egcuWzUY0bEhc~k;rf6oQHFV5cn#*bjR0NHf!8tngNA}kh8u6VBy8S0-c>+JtZ+! zD(Zi-SxN7#$v+~liF#g~EA#?2q`twenZEytmwyH?pQ4zd={mX|vN5Rjz4hcQ^Su~$ zBC)|WB;&Iq!MwQ1EJKgy8SZcl!Uhal+COTkFVGIzSZ_2Pv4$h3jjb$R^c^EuVHARw z2TQmo$O+6ViVt&7{zp3C=HAWYA$*(Alm73oz(g1$Ou-Q89dG*~Jr2^9yAZLmwxBZP zemv2Gh%PJ>pm%03c>uftu_k6(?<)izrMS((5A8=$M_y6VnQW_*1kovw{>h%WZ!5x1 z=|I zd38Z?FWxzFtzEm-#_+%^SKcpIWd{gSJs{4B?>ZDn`Xa@wn|xe#k(9jI3{-3-y6e7> z_jb~!Z9&0_-tVRmQ{}=C)%w{7(BXtZ;t=knK-dI_D!FIXZX!41k3W)b$L#1tYf?u` zy(~2AFZW3CjjQoJe_DS%`H!!XTP(MU*nySHR-gNUXzNgkp^p8$x7}_p6D!+t8DXu5 zLFE3`EUR$~JJmhPioBkLId^#HD8(kXhIO9lcFt598Ca5Z4~C9+$3mJI-lmUog_l$paW4pJXP@#ZpQjez0(^auu8 zI)JF`2L~OWbS33>Sr97FNdeoWY% zX+HcN*-&H4a?6)(RI_GPMjR@D#Ud!{lhKjvG&!k#6;arlN+E0K6=%1})Vjp@jQCJyCrw-53rbWggj zf~G7j{x~z$YL1rw*x=Z%Pq%(rUj_m=zC+Mqmu^H8u+h*0zG8K>~da?%s)O(_4#h}Gkaw;yG>lrzpj z%o8B_X6c)$#@%>l6P0qtA~b`VdicuAi>c4&yOzqrAq(BKVgHSd$;O%sOC7{H@{y{= z`_lL|Zy9uFN~%%8t!rdnmCsanR3id7dfROzp6`)60g}^-oVLXCEwS`#`*$akC(<6M z51rW0Dq50o(`>KtQ-694BPq`?vQIfsZFcs0CCQUN23YexrV*s>gKq7s0$3d0JW>1D zj)q7;K&Zp{ZqQ9tS3o=CYrD^^irGHtBFWi{$656pj_b)wBsY*IpK*A8)1JRZyHdh+ zYE1qNOgI2}&&tK|0ywiW!vxlK~|URebR08J4X>VkeJUV-@#jZk>Z(&c-u5 zqCQf%j^0J+0&~7^HbEe7*fDOn0*?O~KL|G<$u38h>jA80A~uo(w5(j8Rli7g7vNBS z$5&n#;IThgan*T{mTVR?nj$er-g{>L;|y@Dx8b%!a)01MV%hAB@(@0p(kwj#Ie(7p z=)UhR^IKS0>b`mbi@1DrEd~Ov-wQ`7qo9`4t-v&*9*F@xiWA4HUjY1eUN=^svBhCM zx~e?`9?BJ{eV0w^UkvXX3`qih5y~qcuzXoG-L~hO+Tx zIbS-?@>a|{E%IVvVJR^NX{>9W)A1{{eZF(|@eCA4~DAZW}jSnojy&k~oyFUm%I znZuSr{MgGk*VC`N++lQY+8WLXP5K-}bgTK(KH^hH(ohCMVt#x%&_Mh#Uqs_a9^4+c zdF$Tr_^Dx&DU)1^g#dREA+E-&!I3?y>L3JuzV&PY0#t4wmfCjEd22(+GN3D{JtY*w zLFX!&%9(Z;!LG!pghtB9NoI+afIN5T8;CVmD-n|c5+5LX@I$P|cyxA6h*&st_%%YK z=(NmyAQ`&^)y3m+3i=UW);~nr_Cs41#Y74H>PNUjMXW9^5JH{kL#x|O9af;Dm~Y^P z{bsV4(THp7+3kl>9qHnT^KR7)Z2pt}?R=|fZpNMzU#1^;dW%U&#!!c{`&%H}Ey8#> zMui7>XeiNssv+viuHv0c`UH1a) za{4Xa>AI)ABu;09mqw&=r44<$DG%$?^uD@Cz-nYm7E)9f%uZBQDJ!)FeH7Z-Uc3P~ z2;0?Jk{EC$-62k<|85>(3m{JwjI%#IKTN=C5le0u)DVixR8=v$iUG|xphe8&gUitV zgDt-sZw?6_%lY|O5*jL)P_*_$8KDFZoUq^~c@$vOXy+qDvxHF(Z_YqBQtx+7iA$B4 zgoeYX_b=&%GCMf2RNm+TV7b!VRo^k<10b-0#bC7sZ%GjlvB#6K%5lAKZKxNPf zN-*Gs0~*WYfZ5RueI(6puY(TSIPUmHX!@z@A+0gZ8-pJter2(wU7tGu!4?D|EhP3;R86f0XDwF80P@Ux!;c8zZFvOK|s zN{HCmP$iA)KC%{x5B25+YndmX+A*{C_5I^>3h^B(OvU~~V z&uIU3BYF&cAmsoiOWS7>WvJN)bdP42t=K6d(i_&AtN{z0Zm0E0vMa)py>>8{r-R

wlP$;y9gHXtODBLvF*8bkTXdmMrLkiVoCrrhH)0Li9+Y&NjwY9Yg zZbPs;krE^=YugvyG`yceUNzR9uO+)kVjXS-fnv6sEiJ%gT}(R{w;iu`Sd~pje~C_1 zQ8opHQ`wunTNu`)*G@&`r0|Qp@0A95y)O~W`_DB9)U(Z^**2T%Gga)`p`@?T_ zv6xIhh2ddpL1P?zea?`dJ1R6xC$Va>8b`VFklrJps3GLOq~MxfYBC#Bbys@sdk8bW??|4U>M zsJs5MdBw_pltTGrc&TOP6>Dn3r$j02xP9al?+rBKzOrrLtZ%|SO7|XXDJ4;+TULxr zPI556kkGTRq+nf)Z7+s!3%Sz8R4WBdVNuj}{P@zIQ&rOa1$+Jh;dx2G7ZIRaenRx< z?F&dbA>g{nBBz5DYkxoYZc~2Khhfv|V{%lfFIaArSGVo77*V-u_@uI0o}0x}}!%{qn= zJLH$ebLq;d!!WgT2Uwn&c63yUJ&IlX3_V6~@N01CiG7uxw?rcl9 ztAIO;!*>|XD}S%;e0~=|OsSsign|`RLb;jqS9jWkY-QeGiwy5WAI|Vs3=F5i2u~R@ zRD#tkDkeYLSGZq<$fD$NA_w~`TcvUe4t|(i3GATyfVQQFUGYJs%p8i>{m3ScGl#3; z;^*|vz(n2q1MHTAod;YjJEV?9gx`=V#1ycj_qr*)OSQ0()V3^MZTl6mDsFR2%c*ne z-%N>|OMgFx^voaQQ#3@%gI%SY7=YU3sq|`zQP26nV!UWNS$$Q68gaEbU_ZsYASTyv zJ#02lwS&D`=Hi|>1<_Uopf!?WR)|0oj{PXmD6t`iK!j4TQ62m! zuq_Tx%c@^qBc02yg2PZHSZNR3JDWa^+4OM+dxUlLqV}mmck`2m9s;n@FT!j7EQ2U| zYre8coURN=lY8zepG0H#e}*#}JD?a)@SF||?oHPcXCqm-`3;h{g20i>fG^mHva2{k zLi2|!ElHniI&7AU#f-97w8R(?E({4P*FsFRlXKvvD(R+m_qiQ#)QXpGi&leu<+`ZEtQ3-jq{UgmNS5BK-b%9k-j zJV)9+)#u&z!>{R?zgYxgl+GrnQY?Af2m5pQcjmtIB*f=uSZ{}Mna#{ zKlS#8h}55i2YaVux$-0k#vw_v`MUUn=UX4Sw_(oF%VMkE1n1+BONZHjD_1#H+(B=j}EAEF4u`Dbfm8b+hoN* zAWX`JN`hKv`F_Y8X($T$78|9scd&N4VECco%?sfm~?gMcT)3FMYagmUqV*k{gTm|d6+ zUwDy}*V$#qhCiH8tO~QJDPa9!RHurIc{yO-NpRL^98Z;C{{GCjc~g$O=_BWEa0co8 zNZr&fb{eO{D>lE$`P-|e=DLAO{n@NOa^n<9ch&j9QKwPU z+vrW$Y=NQ90$PUL(}COLNhh|<16Fzu)pAe~4Qd7~^I{O;@DOW5m<#JmD$L=HI@blK zW!BNr#YK>hG9p6X_zMZ^5jthG zvq5ndg^_1lRF-Gx7xU>V@`h-WHML<|9>!eeT4(Ang(wZU6KK4)*2k-Or0x|SQ-#b$ zKo8fz`!%_dXE(m<$QA|Jtn;HAv$vy{vuOoei0BicK_Ta;1Ecd8J@=k52wo zRVe((!3gduU{jztL99BGz0^a(BW^O>{}O9TFx*+E@7@X%lHvgeuDqOa7<>+T@p*>h z@javO)6yq19hUmZW}_F*iKTld#Hsre z75@EY1DPlJRELAXvEp^7Lk>Dzg;M5$27}k!e@7Q82S^(^XF!asK>fbNlmX{(BfvLf zw*E&G6K@TZ4f9*CPohE@jTufX>6xg7BuYrmYir4q{QZ3+sLwFMp5q9X?ZhXjHGVPw z@C-S5^RDy1T!8aF1u+d{Bbm++G$g!vH`+L>)cgW3yja~Ee@D-qqA2y0^BF81$24-O z+?{38*Zkp0-S$fl6&@yye7vb4V!$TObv;Y zDU2o8R#F~)o+brjD$mC2nwuIo$42^n7>n;_{8yxXevEfbiaK7RBmDMc6Y>0&e#f$+ zVh>y^#wn3Pg6XM_M7#eMD*rp75&bBYu@7f&*hUZ_`tLH!&1}&^qTyX+{DL=9o$#o& zs?V`4=JbPumGH~!D_^6xI}AI1FbD2_kCLgi^WKUr&*co0 z_uj2<{f5#NF4Ad%$Lay#<}4$W`RtABjfglAr)h1b|Koq>O1I(1SKB4&0&_+0w63)K z=7z|}ys2`Aaa8*_lVZy*cR$rE4E0cjZLNKD9)w8?z{b^fFAhQp-G zhun`>npFJdcL`z`cuR-ejfTWs<6^zmbM>BT@G0XP`vAp9o_uk7>I{{GtBkp34tzhm z$zm_2^yl@lEmkZCIN1(suT;|SUtkoCrZOEDj871iJfiQ*)a6>u%5kbV-+;m)3ja4? zbr%wuKw{eCI@B(qrpW}z>4e*!fq;kLcoYYHe#MNWI2rnr#YzZxbRDlsniz7yXyA*| zxez>Qdg?5Uq{}m3cj~_~)S9WIFs&Y{|0v9nud;LJa%4SLii=H|_o5_?(g@B*DDt7J3?NzN#@Rtdo;JluR%J0v&*JZCnhWmmPn|G2RyUdeqxG8_Vy(4s;XW3$ zAtIm4`uVx$42(3x8%?Fkx_WGkANS5(yfVi$DBpge`8e?)r1e^2)dq2ag2Ai(C8}<3^Zd?N5By6S{P+1C{$JkLU)ih6B>qc9`e({T zbpMIE|8W_b`2Qhr{nM~Gl;B?)#y=|4>dGr-LQp_me^K47K#B_xKh@d(LQ~Tk2njZ9 zG5>{#Q{J%2A?Ua2UirAJSEl)YC-y^E__9Ff}p z&+(=dXMg44L!f2;a4+LAF1wKF_RdaBuwH{Bg7r0L&tC=R5h4aw7Z?092gJL_)wL@F zMMawnX{JdzIA{>bvaM#aV6~nUY_C~APJ7beqr_g83`9UZI2dxL7Ik)dT6}r-A3?Iq zkWAw&U>14mQVm&ZXsJp`+X~9&Oi%KGJfpa6NVBCbeDrt=vx2(qO-wp0Q8G-;PSm`r z+>{Rmce{;!n}w3M!lx~JEQ*&PGM3=51yc_}yru&6-hUK<5Fz3&U43NOR*C0ucwYm{ z!maJvo@JhYuDh_n;7`R1EYT%wB}UGSHv6iqc<-z0kzPw4{N*8m95u+c^Ijd8Q)9!ppJJRyuVqG{yu;X=nZ*k^G5Vt#{uL$H5pm z(<0TwrZo~u*ooWB)^=>yHf`wpdKFs6M1AU%zjPBzB$F`Ove3)_f%yMNj7gGz`#aXd zXU6Sy)Qgx$BXxI*>)AGpx6$T6Cy6Mn$P!EQImXb6=x&=G46iFl!h=Zr)TnI!A(FhW zTnrKYL&hn@r}n@8MhXy7wj2W|779tkw-{OK2a(?dlj1)@WBpi(Wy4UI7*&+lpbnkA zJRupuR7|38Q$RE5@d;K%)yx02&<)DJhAbFnN}9^)Tse1oHBLdVaCz( zWxVEX8%WLW|BkwIK3(4aCclYA{$DmEoqE(?9W$zs?NDQbu8UU<{-k&smskSEd1*R=Nw-3c z=D(1ikZiN_hp2sPtLd4-#D9tdX$t%uspeNx()!Q#-t~HW^Y5bKmJqu0;%xkD8Pi}#EAP|ZluEEB$^_=?BXxRNdM#6=Ht7dx2M z*7sG2274*5M{KiiEgHNW;P^k!p-zSP>53DWaSc6hjVj#!GCDwZyGOZLpM0Wy@){ft zWlZW+vznP4R?vNq!*!%VHqM5sLy{YAr5!-bgSD5~Q(U@28G7B(_Kb8v=D%{s*37jH z+t3_0uRqDwPvw7GTx{h!{vw)scv>ohn9&MZiCz4=7j@f~B(}?+jt2SdirKUpf_>27 zm`a$a*wqW2OQqtet;1IO`R7-LqnIE{7h4FjIR9O(VyAsA@tdrujxF#%ehon)qB=rQ zd_&fD#|@U5D7^@`vgg_-8X%Qo0$*WLXp@j4j)2mp@#}JbR&ljy9wIA*B_{OKjxohp zdhn1F{b@EVVA41zdunq;ApI7kv~D%%d$YDlbmf_Ke^8e{jV=i#qHqG(9TXbcoG%4h_n{iASx!3sJ8# zqPVNJS4;`YxY=$ZI-JN+leR4xQSx`IC{?$&$94cq#p$8-A-Y{Z0I*R2w}XM{ zhdKPZl8piP^bO~`%wT`?@n%_BSefpCmp+cpm4(a}LEdwRFD@~^?LauyB{Y!*n6V(4 zj&I8)#%D}$H_E8=F`$9shfS~3?P8$H9$oW;$sKR7{~&Q?t22r+-ms5*uIwL9Ux;qM zaB~PBq|8+39p2QpIIcKvz%9xe{(Kz9=E5Sd`cjbnSM@G|GSt%J>h6WT($0V+SFocGU)Mh0DB?y}|$rBpHjGKsf=gF0j?J(r+9M zC%cMlEUDsS*4{jrtEL50yn%H^bzP%If&^Bw9inVA<*<C=YU??{VXfPs`Bb92^v3^RE_m0``6RpI0k}hVh$Qn!}ETH z;hxWjK8~k9vKJfbqXmG?fs7&$^HZRB*?zw!3(CnuD*Uc}pQ&uKADhH+$;Y9W)6C>m za&E@W+2r=&+uT^dr=S1>ao%+NS=2Q?xbLHSr5k=x+_O;I`FQO&1nxba+9gDfO3lsY zg0kM=ZBPAP{;TBUUBX6N(jtzQ$P_8(#VhPA|>rOzGXTGDu{h}s=Z zhKFCzqSfE3mwQ<4^EnLV)3ko+Zx?Ng`5fm_XvYrM5FY(p6B_zmlYA;s0~tQq$F+jhsu7k@;W&>|=H1Tja$@`d)YVrsz2$5=Du*hGbr^Pz zID26>czEySz_kV|)flBI_idS_GId&aA+xXPI?&7eOJBU~V`7;_v-Aqg`OIyiPJ0YG zW;jpJmQHu;9}(bey1`p0q1Ty#Z8za2SC&^4(6UpA#kXRMy_QIs`u?2T5CtR3zW?jN zzM9ps4y&MU>~A)2_TMsGCJG`8A&t+Rw>}9OM_edPpw*GJ-yq|A3%TmVc~~#}LP;sr z@0zuXiH&&hT7E}K3;JCz1r_+Ii6JXCW3nnrJ~LwZ0g}L5nxaurUVToO@<$+#`(IAN zX*XC|$eT3;-6*EC`YflzwQ}A*bqEG6rK+~N;HtxYs_#l#T>U)IH3Lr*@FRE99{&BV zjfz8p#;h}z87*_VZhN5FG^~C~i)cPrU#0}g) zpdV0|5BSaU@t#rq!JZBE47EHssKMtG-Y@*t3Ug*2V?A4mHziJ_dyB-JZZ3Nks)8sz z?o0zBpqo_^9DVvu@IC`C} zW6xFj#m;w$w1;7zjSJ+IPj^u?gI`RQ_Xt|T{V9&*XG2${b{EHjO8o88;G2xT`fY3# zgyu{hzqk8dQ)UQ(qPmSJPLfl`8O5SKR!dDbA1&YpgIAw5MGJ|`h3qT}oDaRx*uR;6 zziZTJ(g&hZKPDP0{rxCkRx)L^>gY$#&Zc(jpF(_8HQcZ13&o!jbe^9-GMghOd$ z=2-L_MoUNK*0u?sS3$re+IPP@1{RIAv4z``ml;Y!Ut6nJct8$XBEI+yU2i21EY_D7 z@wUV01MO zcU+Axk#VVz+*y@pn(WN!bhwElm2Qf*7{$dwpjbCGpWr!^0~G-Zus#|!gs`(M5bh^; zC+8ht5|(X&Om6RVKSvd+I%fq}xR8tmJ03l7SBD;I4FP| zKEe5i2u)YV9(5b@ShWy;c?+PO^CS*vNuJ9Tb;Zc({T?TM{8&jVWVg!TV9{G?sd8r6 zp}tHO{H@!beog>Xi#^d$rAput=!O}eNW!l+4{o6mTZCt|{7RU@sWz=4OC93J>hx>x zX|b4sgzw=-{;~pp5;bf~PaA5VHa?rsFb4OJTXwLprZ0s8En_yi9|X9L8cA~|f$Xee zcr%x_#{p{!jr^CL!)EjXx3mW^@W;;+-zwXfMU2bwB5ezoUjQ?8W?@0hZbr9Z*#Y)u7;c{I=ya|yEf08PF6?RCXzG@hGV*Jhk4Bj{-yrJS_AELLarhWg zx?vj*Dtev#oCGJ3&WZls<$DXu4F68Rb0wJ{BN^<4;gkod`hNk1o**1e%}dAIEE%@C}8q# zmI)Y}=xznHX7~v35RTkSL=fETPgXcmqX!tMS5xpe5-Fop&0j1-{hH7hqU#YC0_%_a zpWy_c2sV6&Jlb@8%`Yu#fsy`oDl$c!u*eM<2O=BfvVLWyGWPWJae{dQS`9oHoOnzp z6ZOz~1JG~XS_y$vK#Z^VJF_OAx?^!_&b$ObjJ5MJ9t~L`Cu9l{&M_S>K<`ILB0M;t zTzu(rjW6<$Qu1dCrmma3P*sqzWwYnN(jW!P;DP-K?q89dttzz?Q^mDM*Y?iwKM@-F zIAK&q3)1XZ0y)N^p2Qw4*k6G!19V`nl3{*4_tYyaD;^K{qL(M~UDa4UgUgY8OhMnN zSkkWc75%(^7S7*3W~&yMXUK_edR4h*n0L>8-Q{1`jds{N7}a)uTaP=d9F`A&qLti# zk%;Y~8T1;58M9f>lh-m!vCxsk5>%@YYc0~qnT+1mbJIxNUjsCiV-^S76Z5Mb$Fee* zLcmAmV)iTGl&(zhleG&r{WIs+At+6rYBOo{4fAE`l&oH5EH-Vh3B_S_aNacVU2>zHfqKyF10^K<~I-J9fR{B zuq36Cz)7Qs2^IN~fXb*fu7us@Cv@?}*uG#VadW9GM}`D27@FlJgxcWz(rctqcW?D| zn*0M*9^z~!)o;f#6ENA2JgUPct3N*4e2Upeyn|Jz6y9Dt)77quX0uhO_Cjc;S-xZD zW5dm_wt9a1S}u}EI~v{G+~O_yGSVz9yin|skA5_$peq6LjJCQE4KMKs)|xW^@hsR- zYhr6T1|$<>X#3r}DlCPsKBlKNUzRi0GaOnDXC8G~-HuzE;QFjyJU0!%<+_?=dqXWQ zSJEVLg{a%fvH7MFu7M;c#55% z@f&u-)AOtL-ifbaAW=o|nn8TDBUIX_NGPAi96CXCsC1SqQ-@Pc>LtLzSKjGg*Q!x} z>V6GtXZnduxO$-a`^ag=zbV{12JLcxHhJY*R5_?{1HJb<_r|!u?dVThR~#qPd0e`4J5%==5T2<1Iz#xIL ztC-yn3%zN^r@stzPnf(P!m_`U?@{X2C9Zl(wH%K}`rc}73|@rHacQSU{T8FR-L9j@ zBU0|AJ|eqbIzW{5d3~H}7sCN1U>VF6J;6PstmJ)8U^dSQqz@@nEN~o`Rt0>mOP|_l zg?qVej7gfg*^U1Oym-?~NRfj5-k`lq)3@QLy}~Q?VjvIA2&=a$cv~RZQMntU%uBV1 zv)!5&RV3m-?nGT7AO>2!*yAg3WD|(@Jb6njKsa}^DOzjAFemXwd60JSr4f6#Wp-6i zC&m$?z_E}$9BzP)DEZ3CV4d|YoEC`0g1F{x9LOp$suu?ECP|-m?E4Z#;W}@^GT#fU z@>w5zDRiiuF zO-@Jv7f2#0v(yEvlXlhCnRR?fLUt+iMStgHOGknF)LR7Th28m9VZ!KLzm1iUJ1f~j z^4V9o3(RT0y`AQ1Py;nga^)#*an&a(jOvbC$d8|c1b)a~B}4lMlsbT-NY(Tq-Q^^A z(|RYVZ(r7F`&*I>$j86>Tz&;uEb{44qp%kDwC_sUWN~&$&u<+TpnvQK1@x#ke4}V> zh`=?11T`!Tg|L)&oQ#n>HeO`8O3d~Ve=G63-|3KMIuRlEKT11YdnEzudYz6fn5jMmDKeC^ zniZbHb=x;m&;*T&cB}->G8W#x{pkMU&BF=9y;k$^FU^VJs27gU55;;VWu$GnSMio~ zAl+LbP~yj7Yzp{0(DHOL_2$R+2*?SP3ia zHMQV|y=qxgDbt0q0XEjgagz_hfLcJq33a}cdzYl_2g0{4LV4cDDCR{%!9u_?`n&lAmz%1R_xlne6|lg4HT~pjxM}Ufmp(kyJ0n%cl=|eS zIwu;Ek^R{(S^jcsyr6e{h+r`0TD%QR5n)tPu^W>^i0jf-7;SGnx9lX1uzj%gT!rx*Sz|pV0zFuRM3J) zXrZ0z$mdC%cS8CoL=11Rx!sgl?>a*YEK$!77`>vIGAgw90s=V#C+jokQB$iLbjX>Bzqf<{^C9 zLL#Y81A+1K6GNze&Ai0>o+j3H@el02Rl2UQl2&NQwu|n8r{&hyjajBiNCwA@l-;eV zJOKWV>525C@e1CfQAbI~9RkBmX%w6pO4r|T^1ol2wpT`hgrZfyonDxLW2^vjm?Sa& z09^Kgm|k5Qe8J*Wq63i*(SrI-2k(QC-47%WKFJwgDXX~>e&M}uHevr( z6yxb72I|rYVd6o~$i$7(L-UMyQACJP!^v)PIgQ-fOl%BoYn-+=K_UIX$73` zsD$%9Ngn#D%iVi4q``5-s^kp?LJp+*Fa1c}FAokpg zd@#|-wE9Rh#zS$`2n0Rt=cWBFtlY8gOqNIb;XtF8B(gJ1@QM{6+aEM0d_$=Jkzj^M zAVt)5v{L-!wwYLFUyWt%@d>B5b}j*ov_-Q%%VAXsRlhKtWqSw;0YrR{%X$y(r1-byt9zKXi^b}-L66!Wkqg9to<}B6 zl@TF5|1_$D3QrcTwGoL);tp8Ne;=T2|I&rXPt^4qsxQcAL3b3Q+UAuZq(9@OB>Ume zO|S-b@IkL;n}|H4W39(=s^Ggi>gxdSqBF`xjStSX-zeBWzqDfT)qZhSm+*07FQ-?% zf8g1Yn9cJo$l+LIuQ9A+5eefL@YQGD-^zx~*e0`%bP~tex(ddvylB>l8_!$?J)3`* z4ATe#0m4~+gQQh?<+~LRuPB7^vefXZn~NH%u(qGzNEZe^53GwN;*iz-`dlX1^9VZx(4^xYW)f?zX9}G#%>-2$ol?< z>i*t(VJca}3iDZ`=cA#uw#CFX=Arygc!&Ofxd10d9-*uC!47e#&>q=>*eKlM_IIy^ zSxD%Az6~}rR}y#mW=GXhIGe+=9P==A@?!vbDo1fO-#d12dyJ4_rm)3k@7H%@hcK@P zVk`%ekviFzQ0R=KK;T)6nA{R1%n4@50WNxJ7~v{krS!PAyYa)LerW{4;x8;1@BKP{ z&}LQ$a98}?%8u7fbK*V~5?q$SN$xRoZ)tMPmDC$zL-%+2#KyEn*Fw*6!4%75}FGgr~ir-q>aFiG)?E&Vg#S6k!0Uik**sL;9NT)3OH(@Nx5QQqY>URKEgbFmU~ zb8C6|x@$G)56KD{35J+PNU}fU`Q=E^4+S!$H`L2rwF%wfV7)G9(Wljht^4jO4zLc$JZhK4)g?(`4&P4^H zavSvr|8mL=97O=i>#kA;bs&%Qk6q}Ec0IH} z8yO}in5e=S*>b%to_^&glEaM`vYd>^I1 z$mKmZM*mkQG$`bAn-|f83DN21H9F~Pfy6TPal34W?>L(r!#))I-W!a~_#}C=jo0W- z{yu1O@$F@aY{>Y~;j<8ulKf92YDdUR(^JX2Ex)QHQ}I3|GQcTUC9d9GsGqDyJc&t{ zr>SynjM?pQqo)waBR5ZSoc8O;Kx^sD;^hmNucUwHDdY7K%gOYqOTQ9{lXLxxhd69f|`X)>xAE$M}mMYXEPiobqd4gUL?{keg;fK(i08LMqh`fwkNIfSIr3jOm78YH_`RimdbpBB0676 z-FeM+K_eR_aZW!dkolT%@HJ$WJu9eiGgDD%*HPOKnEH;nJHa*8Ddm`s^&Ls?on-aN zY*4_%!lZE9x1~ZJd%Zh)_@LTs&4<~X%(BPYmA@J3Ms=)qmlR#%BjmlDkV_~CvxVS& zd686vU;d0JUoqc^w43cBGHs^uV|{3U4b`<0N2|I1VlQ!p=XjG67W-^3>tYzqobSiZ z^4U*D0Y3=?@*@rnwMU{pD< zK?B>>c(rokEUy-_v;8`I_#;GgIWBy$I)$+Rlh>H}khSg>UjaN#_zhBg=k2DYEvi=6 zwAdjw&&De7xxbx0Bv#qhk1mXP{)dXwn8$OmjE+1p2;G?;!cj7kRcq0uga+B^d5;kb zjD8mU^EFx0&&(Dh#&wIJ(g_zcBxU||+sgj!Sxu)O{A_(A zM5AM_f-VvpMm^L16%N^A^66wBztZj*(65Cyb$ZnasuYR& zi1P9Lv=48oDjMJGK4*I?*Pxy|cx~q)^}0<+yO-}*UTrXkXUaorz=wEr+#%zy7f`!7 zkFfh%G37Y>d!M~1yGe(P-T}!7@8&_2Aw$Zx^lm#L;!UZsiY79#YM~LEUfs)pxVwNN zm()h_{sO02tL=f!uAA!hR{74osk!JODTVavSLj{$evwD>mS z)l^;*xjy`Dj{}VC$ywFU+kz)`00E!ugvB2z=@Vi$=3Dt?A$nhG^b`aKYrk{(eY6U` z`j$yAQFT~u$=Z9e(|dI+>Ux62*Z`>XKT_%7{yLeVXPMNY`A5w-7~3YI{EWK^$QQCUqGua4eC@ftSbIxNHoexf?T=`8tG|2GZ{pK( zONJ>>_GR;q=eNLNKS~1n#KfT7P4MzgdX)f=PIBHeAWf!GeX8=ZvH9H3G}d#+!E3u( zH^xrT%4RS37Q3qJ2jKQ>GkGO^gdlD?s8+1!R2^i21E^_-kCBwrYfjM4aC^CMBoA8; zrarOfuh&VOZmyI1rC(d^cC}VJ%R~DD0Rm6F3JrO#W)B~2C3xebaV5fg%c$%{JkvDU zt9+Nc11Ark?Q&Pp7)oWzi`S<`{i;$fz}uKfKypYLU|`@%cV#dn*9Z&ac#@8dBR6b) zZy~h6=B1y+CKA@C@WMxX{{}o-X+ACFIaj~2>8Pshn)yXazyg0eJ`hdzQUk_KOeNa@B@s%5vRo*Gfdy{v<7RK zQ5X{q62wHUkXc5xJww)6?`LDGpH`)+v(DeeIDz_e{GBekz>@&@HoklMDbPL3M0_%l zs&}uO=Im}3RaK5s|Bn1*zIjA~2FLU!VtDxCCs!Q3ajT?v-MpwS6m1!lIyeNK_}iS9 zhAS+Y{^i|E!+T>R<8*JkjB>Ixot-0fD6?UA(t!S zD8(1AUurb_k!#(7n+%1oHaog0oXlPJDG1r9i<)~KC(!$xtctkkpXll1m#+#gY94{8B1{eO#K(#&v2fQ`fk&3@-bT z#p*R&Uj^XVgs^y500b4`BPOPmvlL^(zuDQ}FI-6o#%X>QNxpC;6a>QT_rCR%Ih|c( zQg;PRgL;$IPtzPPTe+9LBY7U1ve5mnPs`z}CMYY<1ss$d7AgE0+lrW}C}ui{>CaMd z2m=WJc(%44*{Cn(C$=I=gw{E6#U3?ZuK8|b-Y4s`J=3rKrR9urzh9rKIBHdZ@Bi=; z8bb|TyNVaEMFfNcpJx1Y^W47h#a{b9^|(E&7)E51+MV8z8$NyvPE5qVkmIgxzt_i_CxCeI#kl>KuZb1fj*93P6?(Xh3xCVFk z!CeMtfE~`cclX=B`|Q7Wpu4NOysN9bF@5;mx+K5B=x}c*a!%B>)*!$u&jy#2;6;dk z{MKj0787Ie^MIOyKgv{=1g33?zKO4RVR3C2!x5HOe8E9#5 z(suOeQdtw#9Ip&=WSR|chy{Gdt~r<)U$SHTYTqEGp{x$_(m6v_tWjB`;}!)t*bL^n zcA7qkcVTV|;k~u*C5^Asf11xLNc(xVt90D93j1C(_=DuH*UW@bg@jg>SyD+1X%l17 zw^B`M@}!OtjRtzPE!oyK^{t8mf-M9yN6U&0kg0WU%cNua9p&8vu9kf`{P8jBeQHiT zw}tA8C~StoWEpkuF*NL@7~pxY7B<)B!RjfAn6U`Bzlj}kYt@YtJEBSQiegG+X_>UP zYqS327+qzT-T`F|xcN?+kv+c|l za{^{}lRmaD=2RPGhEzW}iQgy|@4z>3HPZY@O^5Y}w1BuopcN-KEG*#|y~Q<}l=g4n zWAJI?Q!r*5v#*+R!N&a$)w?ObK*J5yvRX6jZxZt;LvLt9LkqA+OPFZAvdjpO%*3A` zWBU(@sr%7?G*vc+29-vN>?FW_t-bWCh5s2d(xu_o)gL36nka&zxc22=5|aBjJyCw~ zz~Yb-D~|-iAd%C5)16?m!D3b6RA)2iEJf?N^i3~-j3_%;X@X6DR@2d=cz?cF<%+O_ z)wjhBa9`WavQdHmHqGX!dh$z!Uj?LS$@p7C3l*MFd3Kk@3bVjW6FXe}zp(B+V&9y| z{T&+W930$n#t=hP=tH*oWWwx`b>y~Kmy&<=`@M<^D;{dX6!giSStF!5f?zpT))#~b z79TFwn!>StZ{*+C48p0Z(~h6E3^p~>bq16b*{!Opt7|d-YwH0Bm}GJ!dq>kb<KHIg@-dEnqR#iBZWk&eDRn6c zjUh=ea>FPy=B6znJphi#w8`^pj>$^FE33k(eB-{M0z5gs_mfrEzxsD!F=I{11ZBP{ zSY5)_?pDUs0vJSnq06v;#qjIwA1G;uhK4q#b{y{R=lZ(3q|B#~FSzY;AL`to>p{65 z{i-e_wx4X+Mln^gY4k?ft2(^WT_NDK z=*>w$7{J;s^FtG+=zdGaErz3`qmIOUz3*8{V1dPcOJIQp@wl)A4WBs06(gQ9F(DzG zAB-}#vZJz!2uyeiFKt>ntOjq^!CW$M4!;#%<^WF2d#)^}Xt#BdekDuxzY>Ls?IHmO zHTxjvA0zz1*$koiuD^a3YgtsNl`_zWQsI@-!*yvMy{U){EjTizPA7^*clSP0CI0RE zHq_VGS48E<%!jvip(#Gv|AUg()G(Ul{za&6T^htPvMM57M0K19KUEw)&(W)=W_~L@ zOdu=gP32<2Y9y1im@S~<2{X>E^j)e^711p1w0v%&`H+PTmBBdDqS4`^ zQIwgKTC>qEwR%_lcPis7E?;!B8ce6%PWAwO^t9$8$$q}0Lzjmm(zZ~8^6wBur~l}@ z3VFwhh^}I}Z_fViXy4`0Oi98oD-kBmqhpOWN#ydM>EEjr_+j`D4ze zzk`w{Cv<1NXcVL7?LCavYMP?Cj|ZSXgp=BDuHnkat1A1-9!2hP|Tc% zSHmj0f~<;PA8-M6E{Jcz0 zt973H4p17?)&>g$BRBY0a__i#nv#w)v;QIUavxvmoM-2y4hw-d(~Xdw1>8FhDr)K<kv7EJKw;H7JHn zCm%k12>vdaXV)YC?j6U@NOEkWhvdBxI#h8L(p3_9mEYDuzgGY1$kcUcTmv$2?;vcKX|8P^Nsw2HzN7a#`eDK&zPBEEGX!w13pS> zD&^FOrhk!AS~>j}De_*lzY+P+8Hd`|AgHtn#!5J))|M>0LIDO(t&H)?m`}X2o|}w2 z5eifqbo|C^nSY|7m?>S0XQC#A$+=@*gyHTw_mxmFpTWzrh+FO_eRrS+4+wO1S=MWy1DF;`Djt2I~W+*NI=X98M_uh zFpD|ImZO#Y3v^AuqC0m2Qyl#P*r&8RZwdHe?t=HpSuzF1P_po6_(s;|c6Uaiqn@00 zPMnVM@Y3!E$PfPnNTH;+pu_U+Zpp zF2HgD78WwzIw6VtSEqeox!}R0pkR_nS^OQ*LQIe2laG!vl-J_F7ZsQ570zv;L2HBY zuDY7|wez;0ak1r6qLiwoVftD~&m)cec{2Ktel25=U~4Jd`92%x5fY~^?;vP7 z>2%x&$cuG}?y+xaH+Mu)kV3D1*m{<&aj>xFDt|Q_|G@OIK-LEoZtN7CPv`@v*N;SX zSYS&uuesgfRkAap(7s1FQFV@YBFHE;;n=hok}Q4{MZCDpe&gKmV_3x)@&iCZwEtBf zR?8AKV6SdS{kTqdKaGDnR{YxP?x!5Vfrd}>!LsPvI&PyVpQCKlb|96U1^=69e4j|H z)W*x#2)4C!<>%jr?tE z-P>rR*{E4Oxy3x1{y$%>T4nGk-Y`3veq4Ds`(%)D3l<&yOR1(-U9J<=KvA%9)*Rfo zczdbr^WA>h;q%YVW_hwz8o`K4FoI_*Kluv<&pY8xa4b-1pi9!({_P)y=B9UdQ_j80 zDV*z_E8iP;Z!Mk~;VT?d`(d|yZB>5tYHJUow_P{fL`*=)wv2dzGNfbqHfK z83r9%Zv1{8qs%`T(MXZiEO=)Il}}}x$eWELvyE(Ey6Z6suBXLnd%##VY`Ow=K%%fr zO&n?ouS3y0(_u`WOV(41P3f^~ud<}ZP%$?J(I6n+%ZPeQV^d;?OXl{|D3Wo5Qp{MJ z<_{UEy*stDs&m(d`z$N3(`2EDv9;%S_P!CBLOuP2mLC#?`-g$|=3NBcmjerF2qv<5 zdSM=JmXbU#OX@t2v!mmF7Fy5462htM%EX?5mos6oW(!a63kcbHpYOFi-RRNY%-<-v zS}7v_h7Fvuzhx7JvGiawws$$i>^sYR3ED|;=n6pJ$}~_+B$p+2%V_j&(Vw+=P_brJ7Gq-L`ylFyy6>C&&!Gqan3Z&*->y@jS`_qMUE|fl%BqSSLs^s^ z;P-hwGmaHqgon@TdfOv@@eg}vpmxYUQj715)h$hlR0`=!#d=1fd zS7iM5GSJI9-vMveJ;4(4+D5jvhAqOk)IuFk{m*_9yaa!KR7>20`|;d;g{6tMm~Vp6 zKiyS4_;dJ+B_it%HGR}&WVrS;`n0n1^*BHFTmPTV`X*GT zaV{!|9l|%1>ei3ap4(iBm!+F={+(gm7Zt}99jM~eK|Koh=_yFv3buAG)uO7;&-^yer}k9jk`DYtq9gOr$O zuM|~b(ag7CD2ym_!57DD!64h;1Dk zpLr8U;y?hEq5oP(L^Ya#ekV&j{=dn^x!QJhmAoSIgnr%r1{IJy3;2Pt-JByb5on}{ z*_cwY-vli2=cwB`u&Y2lKK3t{yUvXAeQTNQoXK#;Bu~wcTk;4EE0?Ay^As*7%GfLF ze>?2(a;LH{Kld;!YoDW;4g8W%M>Nw(ETAa(JY1SaXsFS@zlnvIM!(g|5tB1~i!?+N z6UUJi*V2TohV&nqLPSB(IxjZXS0+WsaGOA5!GH}_tmihF2Iy_n&MH7|oMhbVoJ!-k z+5}L;56*fIWavH)CBB+|YZz`o0JW19KL6j4VhWw=#?mzrc?&N10I43GduUjaz30HX zH>tXQQQGM7W_GSm{R2!CH4`G^#XDhwd8fe_I(k;(s=jj7a!_Hz#X#juE%#aACa_j(QH0<8@+LOgxPd2?3L>$mN?gLxtchEPJ|b({Is7IQDOnhPbmMH1>^)@ znYcrf-o?dEf3mdR^%3cNtDseh01wdKfhe<_S$C+EZDo2GpAa?ybt&Z{2^u8?r;K*t zygkHA@{D4)5WY0&-ycF7>!%@9SUO?4wm6S9h@Xl|4Ek*cn_gWEb5P8wAKWN4L=u^H zB+}OD98Oe~2)A6JX>7N&B@8ln=KY)KzbfPE(?eud8-`Ij zU-wvy`OGt%&#};Gn@fG+Y*COIVMDm#+{to-$rMAZ=>U?dcT-ZESw5FimjzUUIFob? z1Le|&o}N-S_L8`t%#CQo?d_M%6DpSacn2dthz6(bo|a9NWiv%Z*qR)FNz}Tz+X=AH zkj>O7Uc?NTxvkGu3MTF#85Ez!9uZkOOodVATrm@Vpv%CUi)qPlzSj_MPG(J8uZ`c) z^BLbPDVBxi^n4iLRR$UpevdI7C$aX&N0Q&D)W9qpgzf4r$sO`zE@Zj7>pfy7{v5EL z`@1IJT1y*3MEo)TVGOzuU{ZNYm}r&X7ba%rc_yoCW0yu@fMjGSaT487hvFC%?r^+l zxoFPdh%1q!Iaw+~n&B}TMe$e}?aGn=*5@MMQ?m?95f(*EaEbpEg#^ zRZlE>w<}JPA=YmSF^H&+H3^t?qTIAxI4_EYV8OAr|@ zHWN*9sezi*2%M#$DV}l^dTwUHYP3k1=cZ1A&T!e~g=5MEwhelj+(M3mKx4%a5SkXI zHwM6>9W8w>suirIZrVC1QFZGttFNvdd$XH50#;+__?#FaVqmK#;Y>O#&aS9)#!wnL zPNwT^fh>5q^oupN$e}P;4#Bp&((TPCeB@qwJM03l2aW>{lG=)^&o zeh8ePgITKSwb|*pold%1uw8;{DAe;NhM_okA9Q~Jt=i4#IGBY~^=>Daem&~jn7D{5xF(9eeclB&p4VR@T@81AYA@f4og0Mv=Z;}*4LZv<<&}A-Z-mR>ZTHYTrH7v~K{7z(m z?~KFgi=R0Lo$O}lAMlUY_D@yZx26(pH5<1=qKv70=F&6Sya0nN0Tr%c2MnPkqsuG9 z8Ja@gP57anCJcnaUIka9z4Z1>{+K!9W}Vx(1MfjeVs|kb0^qH9P~o<={*$kUzeGph zN|0akONfD`7eG*@rU6=b=YmLsV5+&E0Ci(cm6cc(@+v;;8Z#M&bR!Q}Y}4Y8taU*& z;Essai&X2Fj?9RBc&1s-i$Y|cDW6@Ahli40o6Me>`$swwce&m3L$xI53pkwCx%f3D z>Ke2Dy|h-eSAL}wwMR*(e$j&Rt5BzEl_^yQBOsZyv7$_l(}t3#6NiJCxNV8q5gN9& z*8FTz9_wgU#A1nc-k0%-Mb_%#sV@t9Ua*dd}>?m$aVJ>VtGVP15nUEMvo z4|!n^s?!!A!a~m%Mi;48!2T}|V;yo*|GiPT3a2CHDq4E>FK2^wfF1CYf2ae*iPX6hqQs{%zdRiPZ{&Sud z_uRo#OK1Q|ZtlOlgHf4@AJdqkJ@?l~yr9+Wk*75RUTQ-E$%S#ea~)4xvKce00#Pu{ zA%KN8S5`fu_88$a=oMNpo%y5cyRCv#kbbaMQoT{*>;mC5U<5Y&bP<^a@Cy|bNvwa} z$Z%ILNtY{xwQejKJ8bFcB7B|c<=e%yQcab(4Mxy-?E5*V2faW_MBw`B$??{urmj9V z0IZg>ck^jQj70yi2limYW(|%?@PQJD!(=3t6Zm0Ai#GEzLF(DB{oy8d}U zM&&7n5xGvUO*tV*yBxOL$$HD5ZA=(u>QL<+vH3H_9W(E!<-APT4;)G{_St=Xygr8j z1;9dL9~z#~%vd2vLI(>Y5d2GP@zp1@wF0=_`n|#LX9ntGU@S@l?)C|&aU59`F@UVf zw?c{@t&m1`-Ry7R#`H!(3qxEp&Xo^Z^avh(AF|5Z>%sJ^oedmHfyt^m|ZCbs*!5%p69;SVsah=cBv-s0QJ_3%H_yEmE1I@lZ+Wa{R|g#t+B>iq`dg3 z9fY0>-@wZ~w)mA14p3#Eub$vrcl5o0Q$hT@MT^#&eEs%Y6myZ%g!&7J>*wnuqu3O) zw}fhkjl{jNq_YDD#cg%z!pU5Ls8h9^s5iPChr9{5zMifgho0!$joXrq5_{*zf8p;l zH#H*>exm`|oSn5anNs>3jxHbSM^*#F!rf0;NzOJRk$VBniD#N+v1H|#obeGNh3!#j zUdzki5kG5=VjGX)f#^n&h3qPh4@%+TZObSwxUl@_l;FifT2<>v!#!LkQ><-mGcWkN zr5v+gIcm!R^8e-xRVa&ob7PL@PiXy6ZaDhVa#xafoIIZE;G)SEL4-u~1ph*?En$m! ztaJNGY<^Wg_A}6+^#LjmCx(mMXI?^(Yf%v`uZ-Q<JFYY9s>9oM?j-hV?(s3c;YpV{+@YMyWBwEoBm>Xexjl&EHbJAl2Oc!fn;UE4 zKdc}g8Mue}Q9mp!*L_%`8X7&XTZI^ojr@{sb8CGs=eLX(+rGocdHD_QQ@2cUmuj&m z-kR_`iIY#l@{crnJ95kNg0Ag z_3~k+NWC%{5!AESPd9Ej<_-f$aQ%|eN&-&-j)y#!`ic>1h1>$yqT2t)W`DoTM49U$ z9?A=6IDWVdVq7FPFaDz!Y0-t9L%-LJLT=3p7A<6F5!M7<&NBUpG3lNj4HVH4xEq&= zfF^16lGLN(Q@32t^VzS`-9u|FmQ|KM6{Rz&?x2y?mp1%|Z{U4a3op3DPam z|4JTgo@HTk9twk0rX}ZhZ3WpU=JxlUt!<`5Hp=qL^#I__Kw8_g&Nd1!H@$4<8oZTe`C(Qfd_$FP6VFZ1KOIFTV$pb z;Ncj>5z%flAmrLwqr+VnM)PUTYpx@)rK$N%KL;qb3>|R1*=B~7#AoAm|28I}nbCMW zaij)$>@8&w)6cninn6`U){Q?I-`0xWH=I()*y4~S>%2Thg#F4jWaIBp*Zr|ev-ei7 zOz0~C{d1QNBSPxsf|r%;2om5rRkcfF7?1>h=K3_-az&(4w>}Jkj7*QL;+WU}Hlxx( zdEF~8G--qNcnMruO0vKPN43!+DV-!ivjghAL*;Ke?$g-kz*ik5Ae} zLNWbJz@8FLI2LVz(aLWRp)Eu*1Q8qEnSIg%X)Pa6IJ#GtAr6Jn4-2tU{&c}ew+Prr z^9phZ_2i>Km?M;Zl#6zfDMu)l4Qkpt7ssq%3R@9l9N2P{k4+T}Z>3s;H z6Gsoo&#qh60`UrxvcL4Fva@F?`Zl#xVBrHe5CAXobajn0tT#j<`RmcD0?!@aP1_9^ zI;_^9x8GxHJ+O}(n-MM6*7l|}Cu=#|8;LTsz^{Mf_ui6xW=OmTH-0*k3@4+BUA>svvQe*a#@jc~wX4kdlokvaZ#Lkv;j+n9Dp zK*HJ#n!W!-O#^rFyATW4EftToG|o^QD})QvWf6gr9ZZj(#Na(fmYQlcGroyV+~5vz z^`B->M$t$`-e{%>aNKUm_eD=>RUq2Q3#<`^%&`T++!EZBN!Y^;N$L=aD~4*Je%V{ z1JB8-3c=N-CRORo7IfUo9aU*9&cWYdlcqBT@;%I*&n0JPU>9|LFly9|)z>K2*aKD* zws9&wqw#qZ^&k5oF;mHVHMQCT+DrJwM#eB}?Hpa^=u|;~V6qq$4oIhTq5(<34>)v?3mbTnly1^>mS?;W~VcGmJEYKLE zp`;2rosAHp@c3Nh;PG}zs8cJ`6?aX)RQWw+!5g{O3k2ygv|7pFO~+<&6`^V=voBoy zddVZ&i~BN&3MH+C41zCvM;GE5&$NMSC&X@6HQXZ4&aNKHqgL`!4c1qtN2(wTs8@TX zAO_k6{dHPu_K_{!l)Bl;ES|^9cK0^sTmGvYjK}->kyzpbE+f1}U^`1I*}>^=y=MN_ z?gF?MqiNi=x! z9pS{F2TGC9p08iSwF+b$J~;x&*`86u>Gz!gr22#T$>JegJ{Wjm{Qg}psj|%VG^iN} zYs*M8DVcfZAZFI7e2!X?LVHb><&+RX0@f=`i{ygNR|L_91ZH0{kYtk~9Hec${jFk- zme4aVL26GR8jpsoY?lKos(};Z6E)KF?Kr8{MnRICr6KM1dl?o&+JPO#MB{L5dHe5G&em?OMbWjtg$IevcVp8?o4SX}}n{ z2dk2DwZ(7(h-Ui$*(qbldhLlMb(4$9R5-Ko7)+#9hW_EqMJxLY{)mbO6H27B_1(vg z+d?1c2{{`3pS<^v_Pgz@e$~_M6aoW(qBnDCDOfo5*0kr!EF=eMI8G(mZ6-cZ@MuQf z42>$H|NiymA<;fGcU5jA$7fR$k-UTBVAQc!BQN?dAkbY|+9$^3!hvD_$Ng^b-D^A^`=_Y?dS&6qn z?Sqd|@LNSXfMK=LV1zp`y#hf~-Jz%tuzSzNBabEmxn3bGl0sL%t9u@A$H+?{HdhVn z4fgC|NdC5?gCLEc+{L8jx@(f_vFUZEqdPyg+hhd_JBjJ7+ImI_qrQqN`!hKT!cQ6!D=66X9W8pu7u)SB3 zMUB$l$ErGT&rLa{Z!2RR-I^#5pcR&?Qy<|}kTWXv0XCFI+?t4~PIyn(3<$uwhY?XJ zgOk{qTA}2v znde2)$`9){`JbTcO@-RH`ibJMNI!gma|pK36IUer`^7wCUJOP05}xbLAMa$7_?dAy zbLnwDq^|;Ezk?6SoK*;vZb8n0B|WSp#-!f_7Q5R>#(PagvQQ&K{i#lM|&MF5($i6z+ff z!s>bUjm?cuyKI0N(Rll9mZNNW2Z`4k((x83-T;0sHhZzyahn(YBPf2f>WK)7KSmsA z>G=qd>G%0U%=k!Iz8itpI821L`+muf-Obc=WvQ+~rkgTg*T>L7U5R58&MOy?rIXUe zeg|5{2y}90MxV;Nf-Y{cc_-+C#d1OI375}eO^*(m`1p#3Rs9HSl14fbM{`za15UUi zp03&WW=OAgTWPpi_>KE=$Y?cf@vik=fI{=#w2SQLH=1KkH)C4jb3NZ#I}dr2f}Lzw zhwq3g1(y;?qDHcUcA65LlheUM^oWqRL=bK;HLZ5!H3%O4QI00HWZV~ z%j-n9n=VYga6Gx7)&_eJPqUGb&9iHbG#6rs`t7H2O2JW-Sm3nf24c!iyz%D(dxIl3 zA@!<&VETPEr~=W3{$$Q9q@~@Deu3k2e`d`ssCAbhSjNa_H%OxSF0>Jn7=$JtsRG8_ zEO?2#RDaZqPS35q+oN>oKVMhgZKe_s+@Zt*2=z~(N9+rAAL4&t3R+OoQoqjZE9+1- zGHI!bcG+tNFA4K0RSuK&JHdR8aW^NnIl%z64U|9M4lRza6z=_b8dH9NE_-4pa;(Jv7dIAIvh%g=qQ{n28MW#<#sh_TyQ>0vV?K-dA$Dz(k< z-OlI88Fg%(QI>+AIu6@m&2SNVPJ0a-y44j-P~eG@o`O!pvdw1I;Fb+ezR-QAd?~uu z1Z*ohvl#G=SMY3DYE_bmeLx>c#_!ys@M5q6S83;tRZt{T7O1`i$oCBwD&z};r}LGB znY9HRdcg8thBFoJ^s`x90o4zjq@yU zNlU(>zh%`-){7-@#PSPk7Akjf>to7&EozaLd?ko5e398TYW2w~M84Gc&-&Y%&8GS5wAS3y7XVA?2 z3|Ru4oDRz!uMhfc=x9DNU;T}c@vn;6?Y%IKd0phjgjH41vJE&#O-r9klt0L$SCm34=gbBkcp zxZpxLt6VyP$VJ?@Ml_g>Hfx`@g;#Hm4_YA?#`W??&XGfB2Xd{Qk%lF8%Ox+s+k(@! z#Jjay_Ol4IT4EDeaMVkgl=Rf$%2wkj69K)1DzV`q;(o3v*{#?Ye2TUw9+sv)CefR) z3O-309%5~<|L^=XdKE9eG!n4^rb}pB&_kibPr~KfQgRg1c|XnqRB}80vxIuE>kBM} z2{Lb=NKVhKwzDCC=9e3Y=v4h1HH+8Ol>RNNA(xJ8R7f(Ou4>Ix0M{CgB(uS-N2Cl@ z9MS>&e!Wttn zWa`mNS`*IkhxbrFi>2b3%|4%Zel#gd-Rc&BD-^M-?s~1gFFQP;UPb?h{XHk(|I`u% z6O4HpYTQxR=2?eL?*`7i)`5fTOlIpkpqjE^ zKfs2TDHZriwD?jGO8O!%^17w0!A3aZ+C6>Xa6*85IRT@iiOE6PYWh%3#2}~n|A5E; zwM))q(=satwjnepCl@om=;CzV?kdgmx7#pQa3pt3s)q$^y#_Bq>P^8#Kdzm21nVCc zv0{DVyn0XZSO2fLx*`gFIAsiS_Thm4`V%-|z=4S`vFv!caUwas9Lif{8}IiLKk5H( zsFG_D#=2b5vuMU^Xfy$&%OfZ=x>574;9TXWIxGjD$w((V@{Sg)#IaJRRF^}6nW!DXt@kALj;joxgH-rJL z#FhW5j6Uu|&?mtFYW`53eI(s=SJuc;oN*ibItC9nv^0oGcdMM`=RWT}bkII;*kV|g#+2u!e@E|ThET~?I}I%Hsye>OGPf61U8+IMLM_AY z&CrQP?_O)i1Y0mgaw}w0e6Bny0i&yGZ*`v|E1ps+rY^BGskzzt2THanV`n)kpj5~9 zL&OKPZ*+7Kmy;u+Ldng(H{~E+Z%2XwqJ;hhKgGt<(3mMiltf%`rVID^@$!*IhJyHM zf2eM4_E6a1LV)o#iEs=hobiB-qcvl&{d#S)z?JB+_#VsQfjB^ea;RiPF~gH85wJF7 zyg8(Jd2>#f4qq1o#pLEar{9vP8xNtD@vn!m#McnISM9}(b5u)S_aZSj4)u;$!eIJ<>Qxkw&E}h?9vPBn8sq>*EBzFAcX0^5$e{3ba5P!{-Ku? zIT-;kGAuB-CO(U+0WKalLxDEpEBV{L{8<+1;u|1{2QyVRALLcUmQ|iY?lBI`ilaOU zb3PTP$)?RWR=_Ez-|5=3M;zGsK#Fj2LEcS{7-Y!JFSdzk{AXbjIqdcn3J|`|YkZ}d zl?KWmO0zwGdY?XKO0nvy29Rj2K<_GLT6ya^YCH>y!aU_{cFK!^Oc$earhxHy(<`W9 z=v)CB9MT$eadG0=MK^L|ruAE$Yo596=Oj>$pPY)4AGYo%P@Y%~^~_9pZl z5wv}*UUcL1$qa(97?qh`Ens~g^^%=~=&u5m)RNftw$W6!S7Fw0G$mZlA&5oUjTMhs z52qq6j`AaNVpKq5a^|H|T+|;4H~wsQbN~!r-Pu=pd6Txf`r23gycB{Dxyi&hyJyTZ z)8jKEwC*5fH%cDB%l_=2j7vYR4bPIugvHQIp`d*0E!6(RrHM8&ulh27i}{#j9;K+N zZ5j9zD{cnWlKWPPm0I^3trp2hUhwskO07cIB8GCy%j+u`FRR zV$heEymIv#Ba(FfTQa74q+vB?DhB@Hiz`aAOcgsA^$SEmy>aTJ<-&GK^)q}kO2E%3 zBWKg~ki6}W35>~VHdgbmw2*R&R6^Oo3KQx3jHqRkUy`oL;#^j;y3aoIOBFgkEj_)_ z>57f%Y74R8&6%9NqVxonRE#s$$RJIP*l!7WUm!S zh?skFSHc!F=00Hs)@GIhhXF+}<&;v(rqI~{M-6kKVj%^k9;MadoVDxR3)I?lv2puHMmoL%px&)t0|fBP`n7B{qnrz2eusk z=U@5I?a2PWLH-{T`atRk0|jb6tSgDp^6nMF6iL?BMKhW=DirA{Au~14zyD0`MjKe- z5G6(=`TsD}{{ip+jeya2St!x}5O6BP`qSR`me4F*m3;|A!q5 zeo*Nlw%a~)Jzt1qbUP5W_I5zH5#H9!=rE=X7+?Qe?Bb(*wlkZWE;!yMW$%JcFcoyV zx;#P61oI1ohF_*z6>ZZF@x8x?nWuqzE{wz3lkv0}q4@AVmy6EJvqq1X_ibkY%S$!L zQ5b@HReglg*j7%L-(dP93W*NzepJ)R$A3As*M2MJq|)sC*UNb-30&)a|A9ce z0nlaLNmFl-Q;@&blEDYVD*aU?_;Yl)AJ7j)AXmgzS>ZLNUN|#foF4>k;mxiHcta>K ztR;R@Mjd|}PO8s(WBN6g>%^4X@uOfMaqrOh+HOG9UNyf@Py(gY5-{zre>;N1mrq2| z_H1WN9lv>(7ez}|y?Dv2h~*lLxBTU=Oy?8Bv9%T}>ViR%_yNWm%Nlacruct|mmTJ% z55{0l+~2P)t&3?HLq%N?vtV@uV_=QQ5qqfw9hKkUQ*O%u^v0X{yS<>=#VZSEhX*3A z-*!Dwn+`gUIVWf*(2;`tIbr=}>nHl?9mZb!T&QrG zaKe)o4W^o^>}mISviq{20GG?rDhzx?TO4?t@Z0zt9c8bGhBrKT-TTku*%M8s8YzX7 z*3n9DRP$bka8@7C#bJr~Y(`t=b86Au(*!GDWt^f zVKY;oq)opU>aLo-bg#Ra!B{4}d|>gi!zm=<2<-tp#kx2&zC=TL2L$H%XV=-x6h(3} zNtRs*{n@1pnrMq;8kWYXYI3DPV3Olc_R|U+)Pj&y?t06`j@S_`TT^cJM4gKgZ^3ey zxwGP;3kQ;zh4d;(ZwB(VJ`C2!&CNRBk@cfBMPmV-s0Ep2^B5D2Q8KqHmzNkCrazvN z&iDneQ(qS5&nD22jN>C@^zCyoNrj?d(G44}rrahy^pW0|Rhid5d%X<8t+Kma^o6;? zWgT!r>}DiuOwtAr2IuWHGfC=-%8uxspRczVmkyH<%MYgS6}@L{K0i{?eE9AU@>Lnh z0Ds09@$kFm9DA{)MiUAON#~p55F+^$ux;eiS33PNGJMo{el}-@e2ZZ|2p~-xqu}LK zvwBXe*iKbdv-M1Tl0=iBWmfMV$kgc(!w+yg@#Mrs!~arx=laPwc_f)NfFHMAM#L>u z0>dYMOHpX|x0wY#=jA(iZn;uOqu0~4mMb-Y&I9??863)7POd!c+u+Soi{3z3+`zHe z6K;rN5+oywE-Pa5!jMn~VOk92tyoE`7-G6PAi=pV)`8+$!hmkWxuhOOyQR@1SCQ=_Q#Xk8Yl&_OZ%}v4?la3Xf?+>xCIt9`Kad?2qYc>a$HOViL}qe=V#7VA*&a?Op6& zZiU8;>Ncu+5GKwB)NBbCA$OaVhE|l6u}gWp2+ud}DTUjgU%P(AMJKR(^EB3)CR~VZ zKb2lBH7EXb;{pLKaD8NYN#V}a`6^#qLF9b*M!tEAiy#w>Wv$mL_>wf?Y>T@T$GBU5 zo1n%_$ZF)1vdywxAEdWo@!$aZ9+|Zly;-%P^d_N=JGRejV9Lr?Yt75%`iA%iG+M;4 z{gS!vAQiQ%wf@-+Z;wc@Y)oYlY`xiyUwNub9CRg+G*`9bPPEl+yG^B*7RB9x>K9Jo7VLk#ahjrT>g5nbs)Q_Ta-+VLNEbIhVt z;S*EMM<+xuY!#vszFy*jXO9oc@?ib=F^o5|N}KE5_$wZd71-W%57<864dW%_kn=n6 zoiXd6%LTC&4U?xiZ^Jsep9!35H6}-MF(=RT(@_R;>C`Ve9Qp`8fkKmNH#*89j|Q@s zb$C5zPCi>O^*mndKV7=Gkypa?0MT-8f2%pbEkX=7QQr_y<;A4flL4Y^5`ThhEC}50ivvIgwm3>kX?w7ajhDcOw z(nR%{Hywq5UGJ)64>+wq^^iWNd}q*-%vJ$87Ra`z71Ena3;B6u@&}0ok&cGAc=tM7 zfi}EPf`=dc=?Y&m5{I~fN6EEKmrZD`9k9e4?hO_qlc5@(8di(9HXXeL_8LD>qvb^2 z`-4h-(o+UO*gC7fk88^%N0mJ7a-RrQ1xDmD1w{KGYTrHeNUB6w3JV;YxBGy1ndI%~7>y|^TRo{?7%}WKlQ}~j zB3u91oebD(cjpS!CtvXt_nh%oO2~xH$?mjZoR$j|0!+|AMen&C%!grlX%7^1=}brO z{8&tkG|~0Et`JVuIde#bw!!a8Kzg)9B`V1|NREbGhfGDt}_Q zML!$g_dXbTxkR>B|5&=2+>C2`lBaaA==EV0cT8X88*GHulrS)?>XF;0D9;P+r;kgWM6ZF`L$v3oTm%|L$d1g4qTtm#bqLsnf7_N zXUG;ue{@=py%H642>?GB&YG)VztJ0m<#RSRE$32ge>^LJR*bwL3Ei<_Of65f5r4sf z3wSSiHkgg&K2fm5yUMpC%o*geK<#Dv2c6JCbxu7czCIXEL*t7BJSqR5_EGMd4Ig$3 z%US^d?B9o=*Fnlz`)WGqvx6+4JUCBzZd!5({C zm2klR+^6iBM!^cw8fPM=Azeq@;2r{`B7yFANC28 z`99JGSEV%jPS>OYHpRL8TF`?k)92PPVyy>m7<%i&CrOK`2-Rc!V-aX*=!LhCp=wuU ze+qC~Q_utN-ZDOFU@SQiVzgG@JI_@DV!Pl}v46bFZbutmV$g-2B7gnUy5p!F?(>=sQ<6c^#{o>jE256EzU2b-I!n+tdG1u!LUU3 z=CX>lC~e@F-!043n29=>c|qS{f}4{vf`wi9yW@#^AztLn8u>i;eTUt}2R==o<;lPg4$poKF=yi(b!dmJWA5^9QV&^L^(tZXphs3m1e zaXeoav{OCJq?;zGsu=o&sJDN?Nz;HJaxoO6Z07{H(Ks?OCK;t^3HOcliEb}y_|*F< zH~TL1ZhBopd$BFb106H}ii!(#1$>dV`k2-a@DZRTK!_H!lF9cJU@I>5N# zTC}ebFW{>nzwmBG38h(}iX4nUpV)nDCcr6A8QmDEDd0wmJPekHI(u&=Iy)C9z8SdR ztt$USttN>DZ*fTdL|1g)<$?#re8}f@41v-NH>}%Er=4<&6v2{X?%uK?>_4Zq3n8 zxPqRHIz4Eu->{@1b7qeBym=BoJ=N%fwppUpbI_7P&>qj#oq^(Vmgc5z7MP@UIFJh<_DY@Em%8NQkNsZ0cmQfnVIiSMxQ=L~q>SZ!$bXR?0Rfw1^b5 zJ+)5GLVAZDC4o#?lZ6%ICY>I&?r)aTM(8=&a1c*VmE6^;-WKJb8!WkfpHQ6g4&8Om z>JEQR;$t*2h?8ewNfnA(>8&AJSaxLUy~*=h3;8@6`8ke@iiaI+NR+1NF4${GFcJ`@wG)aof)_9j#wYr$up$A6=X{4_vtAGuxk^W33VJWX;NH; zT9Y+kUO%z95L=W|uD_o`W?#ArR9W?IWyZJh8@9k+t*A`7I}Qv*X=+{>w*_DMB%y zrq7z{Jt(5i?-C1bzlgRh`UsqhM&M^(z1OmHMGw6b6A36Xu2I3unV`VX*WjfsQI(fy z2pfc{>CYieaqh64#l7{U9vMM@idUiJwVg;f&{_@4!diRGwXI8VvH(+25P|#jMVE3< zSh}=>U+joThj?s^;?PPsy{+A-t~A?j!==klM4roOan9%lISrUUO1wcr<8>ny=CKu>J?nO|8mcl;gpVW!PB?DAzPj3ev@Lk8nQQHH&9AWettBP@dhq5m->tFM z*1!wC1CWiZd-zsM+H2EQavF5LsEn^&IPU}uAb2B(wWU%M`#&kJ?5<**ZZ0hJhBagd zOr_bqMtR++*V&FLML4V@a~zLDRIcV3Nb5m^m79ir1b zVoqDX<1zAXLf@qKTqczG=u?vSB^3*^_7jT^-lki&rymIox{3k|&`FeKPo+I7SCpij z5qvX}^M~-yBYg_QL#X1k<58JIzo?KWPYblogSPz}(c=b2UZZmfW@14sA7naxy@pJu zrMY-+FF?#KoDoDN{BcV$-anjU=HRC%3}2+ZKcQ34=nQHaVVc5mA7Kl4&=YNXc3$(` z_{KB9J5!2|VjFGp#3z7OU8d~&+070*n-Rp93-a!_g4_E2Xt){1#P<)oqb zv+J+PElcI5@$&9pfv4;ApRaj$CZ@HH43G`epq;~E-l{~W>3p6T$!&E8*7Vv36t+#Z z9(jt=K#;8tTdlK!JdXG3phat0UX63y^lH!4qaDv$ql%6bY7drFKa3wm2aD9PNRxnG zN#B*INaVX_*aTg1(B`Nw@WJ)>+*#12QimuY3R~?qdH1p4l}nqYWZjOtvmKwlUwq!c zcl4Yax`L-;Jr&qi35aE3d8O6aleXCBS;#%XSgq&Lwr0C5dP9NFmJf>p&)xLSuD-#7 zstFGP)Rc*2S1!>_ue0su;X+i;MB!~|U6VH=7f5$+44-^rE^^PTOi*{d`VyW^=0$kF zQGRpLCdOB#B3`&JrYnZm>^4B4LrC|#3AAMF!p7;mtei=Qv$iD}n6*YH=zI(T2M@`b z#T?p>lc1MCBQG~>BroB=%KK#QN8`Yc&{u;G z8s9nFY%LqB=L^!pH4h;?OmjPU6Wd%4&!tHh!#m%Q&JC!Q8xB2u`wvn!Q;w3qa!<|c zl$*svFhV{L9q^KQe7W^28FjV_!(N{&%(}IWLa29iS<3j=Q~Jv&3DkO&iM~)PSLi=j z$m6%_W$ETSHDtNaWmiLUmQ4kbP$E3*h6b56adX^}(^_q^_U7&ANpPL@Inn!6Z_bcd zgk#Oe@seOiCPvM+)zyHfX++cEIszDkykJEUZ?nczBzg?1-sMVF>R$+VUIwLWLi0nZ zCd|if6y;xN@OVrAe+@?d_uoeUKSA$@ukp!c##1w$p&(A{`RMiRZ|Sm8$l=4XGc&~; z94a-cEiKZWk+^*oZWs~mc)cSg{OBlw$D3PoPE#W5wfb)qUz-PX?1IOfMC3%!nA6!w zm6Xkub9VQOMw2lH3JQwvqyYetj;lHCEq(!*m2$homtqnW4>FWSRe$5?YP03WAy3fI z=$M$ug_`Mg`Ogeb&p7VocOZ{EuaK+;0^!P})fA}|q%oq|x{kEv{C(h}h4szNQC^C# zAQ(Ri`=W1*9{_fu$S2nrclGBeVGSeU_;J$qj|tYbUg8+?6UmPptdN*e4LKjZ|1aVm zfd2yyG|id@26us>J^a^~?RLLOj7cRVLoxpwgrbtsj$VAxZoooZWdx>@1DZwl;9>q( zR#WqrU)(rXf3|!*hAsv9Nl|2u(V1WcN&GCVmt4n{NIZ4Mvb`ydlw_2pf8|)iY@PaN z?Ys|srmPYz7Aim&B}4f0cv zrs2RxX5bptC82L7%hb3C{!l3!?FNqn)6Mc+hEu<_V@lCZab95|#5JXs#7FNE*$jN>Chkcpf;tCG5qw6mZq&Ymo9_Rh8 zXhcZc**zEQ z9FVsIbji%g90ZxB(CFg{i_$sZn6riM)vE zv{jJJl5``^P`VCChC0Z)ZX>t^&-b~QH1r;~(XVMcY$%=@eHi)X#wQh$YY%2;PMiyI zpl8UBr}@M|?ZLkPk$EVhSs=ILPKn~vnoNib@3vN5Zx__d-P%y9Usv7d(I3rs zKzyf==Y{pxU!Bh*2EFayG!qw!C%XikSP#1E<6?yc_z3Z2Pt_c{i31TDTiE*mpZNB} zs45T;EzG#W1DP+oIBtG+>v);+%TKgV9+^Mn8U!czKqnkt%+pp&@uJ!7`o-xu?yKN2 zu^8*x(7zi0By1THfyQPp@f>&#SZ38XA@1bs<$`^Lb9Xon8Fi%#R2wG$*EOWKM;Qj& zNW;z{nmbQ-Vnulu4|Xzz_#Ao+J?23@sNjf~kn@)sh``ien!B&`MwXs&jHg zk&7D2hSVWHrL7Q-MW_9Y*8j|FF7$=s;ptaR+PU& zO)EAM9(ImE%?G=RxQ4n!AZ2+9jG{@{4qX0W>%-W}_0 z;W8G_RnzG?1-IJNW3tDIJ8kSf(_p6#YcL1v*XYky(@gz7+$0tpS1(Fl%zin=*Znbh ztZ+;^8;`eP&1usta;+WTnhydO5K`h;4^kUB3-?`4sT#>Gq{r+QYR7Gsei0CR@_+^WM;NttdojJdDMd(< zFuD*$x(z{#ei%*!tiYuNa%oWJ&C}quxHPoHM-D$AJ#6{1zXlFJRn}ZD8&0%RM6!aH zmpoCWt0Dr&?^URk(1_$<2j2X$ya3(!{j#>z1AGgeT$uT7pxR+5X>?nuqGFzO;JGf| z;52uc*^_trBkSQk>g?BzVRyjnE!65a#v%_-MVwhx^etLRP-cZrGRH)s{gBH4O9?A4GKg}0^OMnW+)#G11P`cVF1E>+GEw32 z(3Ibf#XEM4JYwIO!H2_Ky;qxIBu4pj65UVbURL~cWxj%CF}>0U3m<=4bXBHpIQ@ve zzu1-7vs}F))6Vd5@WZ_RO>f$Aq1sx4zT;3=M}kvdDdNVg77hv{To|V~M9T$xW0w}A zyfHhr-Tw(6^W=4YtKJ@xwlOm!+;?S2oR9p+Acbg`*BlAJ+j>RxXP> zGqo}wmMRG3Y`MR2Ovs)aFU>I7iU4ns*1og@h)tD_-IJ^=0`P-EJp{J8dO+nJltJ$e zejCJq_~JqG?ZS;6Ub-_sy{L>09>EmemclKzh!9kL@nU!$_MNRgGtXwd`^<9ce5v>f z5jzzr{B2FqT=(P178Du%d?c0q#BfA%0FaXaDL{jt9aMiwN!WHHiDq*uT6SNHz#QbfM@ zufA3rn9S*gO8Di;*@;(^dDT+#qzy7r$bQJ~a(mkLGFRwQHw9|ud7v*mME~6pqBex^ zE1i)r7hLZVJdIzr->buNdb2b}7=JJY9oW?ofzByvN+j4^OHFH4`t6Gpsk)!4sM+4( zX4+Wrujan>q9zcvoQNwwyLJO^8UnA(BtGbv;47RSk+BwEpR!*JTlUZ@q}^B8hQuhK zmK}zieLNm7E;~L+WXjJI2ljgl_pb52rgl2TmYS$aTaAHATU+CuU6r>3AZrKU2=nXi z@sXlsW1rH)JO%SUVAGFoZuzDzT+n*A;$;-vkuwKE%Zp6O&<*KG7Vh9wmcM?;o-&*= zBPhDKVP>~|6KK~iiG1Y%)H_=Q1R*+vT2rI8)`06#TTfVdM1QB z?PdV7)&pCT(LG8kOPTcAmf2Qep?5>XrW@-~&S<^oy+eC+B0~@~@^RZmmv@qQ2ORK4WFwc8kf#;Pt&J&{lD&`w!jTrt6DahGYt z`$&!up0wtW0T#g!G_n+FWfhiietV_n$pp?85s0tzz}Aed?KqqQQ_Be|yU-9Jry`cZ zxI3aAqJdhq?f&d~SIfKi#>w*Mb08(E;-aurh{QGAXi)L;?9pPb^W;h!>Nm3nS$t7r zwR~d*FTM5BI5RREX{yKYK@FUQbb#C?Gs|35J5pmnEWhJxWUc=7XJ@KWZ#WBquDi$V z`r*~;v4OyFMjIOu^qo_3}oTr^L&)MGBkc`Kq7_4Bv%O6E%8D@BIe!oIQ*(7L`|g`R6) z+ElmC^m$VRDbw2M6I+t$*9KR0AavA@`d{FTZ0^M|Ajz%b%Ft>pd=(_I0@*=;UFO*L zZq#Xx;$mTl+^HD785 zDDb5Si!{gd1bPnww678Rj+3wp@!CVKJmnw6!mjRWo@8}W=n+?Io>I#$E=2+Nmsf@` zy&;&IsC))Ig#0vov@6^ZI3n`B+ES8wgXtvBJv0oU7o86wOdl=h4~6 zM%(5n>t|t7eRE3PjAUCgzj%w9laR>)dajS+UVTELnqC)m-ig6>IW1e2hkQ0~j4f$O zyYqVv^e7x7?H>1C*Vz%H6Hid-PGOuoibdTT8 zrj6as!f|snJ&v|@7mpRH@1j_5O9MIgoqpyqPN z#bb}Vn$7&D-ID8VnA>-nuhTGraVAo_A=91y(4oLo)Z*=>8iGSny-l4s+l`&v<2WIU zlF6Ni_p3WpYV7%jEM z2*HY@xR>9%Qk@?H`Z%xY^51`MVTSH`Aw@ajQa}L@b0uqm0uiS$lX0+=x&DHO@oA z38C6IPd1q#zSk-|WrmxzR*UU4A?nt$;&)RUf#_F5j`ud8Us^CIjwSdc7acoTiUJ4C zOgw{b%-pZ&gw{rD8f=Pc>m=u|>!!}dLrNxXOo7g$V~T(au>7UP)LF4ghB zaTNCwlM(xY>Jb!Of1qhX9VXx&65<;a)Kp6fiJ-8xXOKiz(GbJhw099@E9+Z2oRXkiM(=&sCobEUwk`$&j)&3X z(E;>kJf{CD)Xf$W{l4m5?KTk*6p*=rWqPtyrTmssSvWztEpNHx=eoVcm4kz$8%TkQ znqGpp>C!J1fuek~pUZSx6L0N-Xw|NDe5oJ_sHbHvOicr4r3;h$V3rX| zAM!1N4|?$M5(kOfAzOnP7_L|`B@{olEcCD7@=}+tP}LybNX@GxaNIN8^Drb~oQ_k{ zAkODTohwm&PrPzsK~#Tw^R$9T;^Qfp`u&NDJJ;W)G78)#)KIE7N}-Rf#4}ix#fpZ* z?It=BLoeoD?zuUT6wbt|=u~`kpTxtHbU9f=zgqe66c9itk2!KnoJ7`K5m&2o{6W1) zi(V!azc@|T8kq}Dk1JTgD0o!OI3roNXG;)z)hBiXH^u`b8t+u*4}>gdwj}Ge@|l?H z-CsGz#i@)D)fGIlu5QzG7y8>Z6ovqy4S^?6rHR(uH&3;Vf~T5CX+r91tGfXlsai|0E3zML<{-v!fB-4vM;bdD{KI2GwipL&nXkOkRSXqiVm;= zypyqB@JNjrP5oO%d0A7B?f3c44;ckZZ8TMv7=L?g(%&&8|5@v?q|sd)6JG6CWz>Y! zguyB*gd16{)(cD9YTM(m@i1-AU-G$KYa;;dysZn$aIGXx2f@mSoUb(R>HK z2@u0AHM+Kv?ayS=0>mXF8_&WAsD&|B*Tg&h#r-;-(Exsx$@E;n(7^s%W+t7{!*%80{(dX*;#QxSO<}k2w=|*k56YkX4ovUYLs76Y3mgx`J&_Z3-pAi5|HKc6D862{SE2wK6weTUw2?ie*@? zFm<-i1Hulef{ft&7O|-%b-$|e4b^7TLhHOXDjFK)_wQfymj5G)0E6WKNrmxmOTnrO z+Q)*~EWgHKsy$;Md+rPG*%h1I)oiS%VO*V43OiF3C$Vy~LMfEddgtKqrG5|Xk;8jH zQuOTOOvy`nK7SkC1{B?3#@_8@&88l0b!rm=J0jEbn(KN(d`lyZO#MT->#xd zPFPI%iTku=Zzj25o4(N^Vs4cCLE}lW_DpKyRf7BHf0&VbP(JM+$Q;eO3It=AF44tx zB0ydbLeq9H8eXcH=l(PQ;~)+n)oZ(G)_+2n%)e_J{*%1TpQis$l8Jw7_8;K_iUGhL zzK;J#8UZX1i{**K^Tl-8-(mq&yP*4j`u3OI`Y)4n{9E7tb0UZTSS9k`%>pXF|2D$^ zH%7?5we1NL}+6gDH=Qg-nL1M-a~#Q_uv)s*MI-{f3pVF0qwMDt@?{?q^V>i L6(mZ;K79Tki5QRz literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-8.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-8.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca81b6514c5ddae6ce83908d66fa0f48ef0a338 GIT binary patch literal 315597 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

o;`JD*I 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�DqyPP%#fb{*1)N-&C;~q>-Tag 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�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%0D(Wd3xVWwbi82jcUhkk?gcG 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�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

t<=%iQv{+8~ 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%0D}3WlB^et6TcMjcN%>d*VHt^Axu|BA3z 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 z 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 V-q4!2ZzmkA$xEw9RY@2J{U6BGGr#}< literal 0 HcmV?d00001 diff --git a/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-3.png b/docs/server/ongoing-tasks/cdc-sink/manage-cdc-sink-tasks/assets/create-task-3.png new file mode 100644 index 0000000000000000000000000000000000000000..80edcaba1d996bf05e5c6c6f6842f39fe2760080 GIT binary patch literal 131971 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