---
sidebar_position: 2
---
# API Reference

Complete API reference for the Fluss C++ client.

## `Result`

| Field / Method  | Type          | Description                                                    |
|-----------------|---------------|----------------------------------------------------------------|
| `error_code`    | `int32_t`     | 0 for success, non-zero for errors                             |
| `error_message` | `std::string` | Human-readable error description                               |
| `Ok()`          | `bool`        | Returns `true` if operation succeeded (`error_code == 0`)      |

## `Configuration`

| Field                                 | Type          | Default              | Description                                                                              |
|---------------------------------------|---------------|----------------------|------------------------------------------------------------------------------------------|
| `bootstrap_servers`                   | `std::string` | `"127.0.0.1:9123"`   | Coordinator server address                                                               |
| `writer_request_max_size`             | `int32_t`     | `10485760` (10 MB)   | Maximum request size in bytes                                                            |
| `writer_acks`                         | `std::string` | `"all"`              | Acknowledgment setting (`"all"`, `"0"`, `"1"`, or `"-1"`)                                |
| `writer_retries`                      | `int32_t`     | `INT32_MAX`          | Number of retries on failure                                                             |
| `writer_batch_size`                   | `int32_t`     | `2097152` (2 MB)     | Batch size for writes in bytes                                                           |
| `writer_batch_timeout_ms`             | `int64_t`     | `100`                | Maximum time in ms to wait for a writer batch to fill up before sending                  |
| `writer_bucket_no_key_assigner`       | `std::string` | `"sticky"`           | Bucket assignment strategy for tables without bucket keys: `"sticky"` or `"round_robin"` |
| `scanner_remote_log_prefetch_num`     | `size_t`      | `4`                  | Number of remote log segments to prefetch                                                |
| `remote_file_download_thread_num`     | `size_t`      | `3`                  | Number of threads for remote log downloads                                               |
| `scanner_remote_log_read_concurrency` | `size_t`      | `4`                  | Streaming read concurrency within a remote log file                                      |
| `scanner_log_max_poll_records`        | `size_t`      | `500`                | Maximum number of records returned in a single Poll()                                    |
| `connect_timeout_ms`                  | `uint64_t`    | `120000`             | TCP connect timeout in milliseconds                                                      |
| `security_protocol`                   | `std::string` | `"PLAINTEXT"`        | `"PLAINTEXT"` (default) or `"sasl"` for SASL auth                                        |
| `security_sasl_mechanism`             | `std::string` | `"PLAIN"`            | SASL mechanism (only `"PLAIN"` is supported)                                             |
| `security_sasl_username`              | `std::string` | (empty)              | SASL username (required when protocol is `"sasl"`)                                       |
| `security_sasl_password`              | `std::string` | (empty)              | SASL password (required when protocol is `"sasl"`)                                       |

## `Connection`

| Method                                                                  | Description                                       |
|-------------------------------------------------------------------------|---------------------------------------------------|
| `static Create(const Configuration& config, Connection& out) -> Result` | Create a connection to a Fluss cluster            |
| `GetAdmin(Admin& out) -> Result`                                        | Get the admin interface                           |
| `GetTable(const TablePath& table_path, Table& out) -> Result`           | Get a table for read/write operations             |
| `Available() -> bool`                                                   | Check if the connection is valid and initialized  |

## `Admin`

### Database Operations

| Method                                                                                                                    | Description              |
|---------------------------------------------------------------------------------------------------------------------------|--------------------------|
| `CreateDatabase(const std::string& database_name, const DatabaseDescriptor& descriptor, bool ignore_if_exists) -> Result` | Create a database        |
| `DropDatabase(const std::string& name, bool ignore_if_not_exists, bool cascade) -> Result`                                | Drop a database          |
| `ListDatabases(std::vector<std::string>& out) -> Result`                                                                  | List all databases       |
| `DatabaseExists(const std::string& name, bool& out) -> Result`                                                            | Check if a database exists |
| `GetDatabaseInfo(const std::string& name, DatabaseInfo& out) -> Result`                                                   | Get database metadata    |

### Table Operations

| Method                                                                                                     | Description                 |
|------------------------------------------------------------------------------------------------------------|-----------------------------|
| `CreateTable(const TablePath& path, const TableDescriptor& descriptor, bool ignore_if_exists) -> Result`   | Create a table              |
| `DropTable(const TablePath& path, bool ignore_if_not_exists) -> Result`                                    | Drop a table                |
| `GetTableInfo(const TablePath& path, TableInfo& out) -> Result`                                            | Get table metadata          |
| `ListTables(const std::string& database_name, std::vector<std::string>& out) -> Result`                    | List tables in a database   |
| `TableExists(const TablePath& path, bool& out) -> Result`                                                  | Check if a table exists     |

### Partition Operations

| Method                                                                                                                                          | Description              |
|-------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------|
| `CreatePartition(const TablePath& path, const std::unordered_map<std::string, std::string>& partition_spec, bool ignore_if_exists) -> Result`   | Create a partition       |
| `DropPartition(const TablePath& path, const std::unordered_map<std::string, std::string>& partition_spec, bool ignore_if_not_exists) -> Result` | Drop a partition         |
| `ListPartitionInfos(const TablePath& path, std::vector<PartitionInfo>& out) -> Result`                                                          | List partition metadata  |

### Offset Operations

| Method                                                                                                                                                                                                  | Description                             |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------|
| `ListOffsets(const TablePath& path, const std::vector<int32_t>& bucket_ids, const OffsetSpec& query, std::unordered_map<int32_t, int64_t>& out) -> Result`                                             | Get offsets for buckets                 |
| `ListPartitionOffsets(const TablePath& path, const std::string& partition_name, const std::vector<int32_t>& bucket_ids, const OffsetSpec& query, std::unordered_map<int32_t, int64_t>& out) -> Result` | Get offsets for a partition's buckets   |

### Lake Operations

| Method                                                                      | Description                  |
|-----------------------------------------------------------------------------|------------------------------|
| `GetLatestLakeSnapshot(const TablePath& path, LakeSnapshot& out) -> Result` | Get the latest lake snapshot |

### Cluster Operations

| Method                                                    | Description                                        |
|-----------------------------------------------------------|----------------------------------------------------|
| `GetServerNodes(std::vector<ServerNode>& out) -> Result`  | Get all alive server nodes (coordinator + tablets) |

## `ServerNode`

| Field         | Type          | Description                                              |
|---------------|---------------|----------------------------------------------------------|
| `id`          | `int32_t`     | Server node ID                                           |
| `host`        | `std::string` | Hostname of the server                                   |
| `port`        | `uint32_t`    | Port number                                              |
| `server_type` | `std::string` | Server type (`"CoordinatorServer"` or `"TabletServer"`)  |
| `uid`         | `std::string` | Unique identifier (e.g. `"cs-0"`, `"ts-1"`)             |

## `Table`

| Method                        | Description                              |
|-------------------------------|------------------------------------------|
| `NewRow() -> GenericRow`      | Create a schema-aware row for this table |
| `NewAppend() -> TableAppend`  | Create an append builder for log tables  |
| `NewUpsert() -> TableUpsert`  | Create an upsert builder for PK tables   |
| `NewLookup() -> TableLookup`  | Create a lookup builder for PK tables    |
| `NewScan() -> TableScan`      | Create a scan builder                    |
| `GetTableInfo() -> TableInfo` | Get table metadata                       |
| `GetTablePath() -> TablePath` | Get the table path                       |
| `HasPrimaryKey() -> bool`     | Check if the table has a primary key     |

## `TableAppend`

| Method                                       | Description             |
|----------------------------------------------|-------------------------|
| `CreateWriter(AppendWriter& out) -> Result`  | Create an append writer |

## `TableUpsert`

| Method                                                                       | Description                                |
|------------------------------------------------------------------------------|--------------------------------------------|
| `PartialUpdateByIndex(std::vector<size_t> column_indices) -> TableUpsert&`   | Configure partial update by column indices |
| `PartialUpdateByName(std::vector<std::string> column_names) -> TableUpsert&` | Configure partial update by column names   |
| `CreateWriter(UpsertWriter& out) -> Result`                                  | Create an upsert writer                    |

## `TableLookup`

| Method                                    | Description                         |
|-------------------------------------------|-------------------------------------|
| `CreateLookuper(Lookuper& out) -> Result` | Create a lookuper for point lookups |

## `TableScan`

| Method                                                               | Description                                   |
|----------------------------------------------------------------------|-----------------------------------------------|
| `ProjectByIndex(std::vector<size_t> column_indices) -> TableScan&`   | Project columns by index                      |
| `ProjectByName(std::vector<std::string> column_names) -> TableScan&` | Project columns by name                       |
| `CreateLogScanner(LogScanner& out) -> Result`                        | Create a record-based log scanner             |
| `CreateRecordBatchLogScanner(LogScanner& out) -> Result`             | Create an Arrow RecordBatch-based log scanner |

## `AppendWriter`

| Method                                                      | Description                            |
|-------------------------------------------------------------|----------------------------------------|
| `Append(const GenericRow& row) -> Result`                   | Append a row (fire-and-forget)         |
| `Append(const GenericRow& row, WriteResult& out) -> Result` | Append a row with write acknowledgment |
| `Flush() -> Result`                                         | Flush all pending writes               |

## `UpsertWriter`

| Method                                                      | Description                                   |
|-------------------------------------------------------------|-----------------------------------------------|
| `Upsert(const GenericRow& row) -> Result`                   | Upsert a row (fire-and-forget)                |
| `Upsert(const GenericRow& row, WriteResult& out) -> Result` | Upsert a row with write acknowledgment        |
| `Delete(const GenericRow& row) -> Result`                   | Delete a row by primary key (fire-and-forget) |
| `Delete(const GenericRow& row, WriteResult& out) -> Result` | Delete a row with write acknowledgment        |
| `Flush() -> Result`                                         | Flush all pending operations                  |

## `WriteResult`

| Method             | Description                                 |
|--------------------|---------------------------------------------|
| `Wait() -> Result` | Wait for server acknowledgment of the write |

## `Lookuper`

| Method                                                        |  Description                |
|---------------------------------------------------------------|-----------------------------|
| `Lookup(const GenericRow& pk_row, LookupResult& out) -> Result` | Lookup a row by primary key |

## `LogScanner`

| Method                                                                                               |  Description                              |
|------------------------------------------------------------------------------------------------------|-------------------------------------------|
| `Subscribe(int32_t bucket_id, int64_t offset) -> Result`                                             | Subscribe to a single bucket at an offset |
| `Subscribe(const std::vector<BucketSubscription>& bucket_offsets) -> Result`                         | Subscribe to multiple buckets             |
| `SubscribePartitionBuckets(int64_t partition_id, int32_t bucket_id, int64_t start_offset) -> Result` | Subscribe to a single partition bucket    |
| `SubscribePartitionBuckets(const std::vector<PartitionBucketSubscription>& subscriptions) -> Result` | Subscribe to multiple partition buckets   |
| `Unsubscribe(int32_t bucket_id) -> Result`                                                           | Unsubscribe from a non-partitioned bucket |
| `UnsubscribePartition(int64_t partition_id, int32_t bucket_id) -> Result`                            | Unsubscribe from a partition bucket       |
| `Poll(int64_t timeout_ms, ScanRecords& out) -> Result`                                               | Poll individual records                   |
| `PollRecordBatch(int64_t timeout_ms, ArrowRecordBatches& out) -> Result`                             | Poll Arrow RecordBatches                  |

## `GenericRow`

`GenericRow` is a **write-only** row used for append, upsert, delete, and lookup key construction. For reading field values from scan or lookup results, see [`RowView`](#rowview) and [`LookupResult`](#lookupresult).

### Index-Based Setters

| Method                                                    |  Description                   |
|-----------------------------------------------------------|--------------------------------|
| `SetNull(size_t idx)`                                     | Set field to null              |
| `SetBool(size_t idx, bool value)`                         | Set boolean value              |
| `SetInt32(size_t idx, int32_t value)`                     | Set 32-bit integer             |
| `SetInt64(size_t idx, int64_t value)`                     | Set 64-bit integer             |
| `SetFloat32(size_t idx, float value)`                     | Set 32-bit float               |
| `SetFloat64(size_t idx, double value)`                    | Set 64-bit float               |
| `SetString(size_t idx, const std::string& value)`         | Set string value               |
| `SetBytes(size_t idx, const std::vector<uint8_t>& value)` | Set binary data                |
| `SetDate(size_t idx, const Date& value)`                  | Set date value                 |
| `SetTime(size_t idx, const Time& value)`                  | Set time value                 |
| `SetTimestampNtz(size_t idx, const Timestamp& value)`     | Set timestamp without timezone |
| `SetTimestampLtz(size_t idx, const Timestamp& value)`     | Set timestamp with timezone    |
| `SetDecimal(size_t idx, const std::string& value)`        | Set decimal from string        |

### Name-Based Setters

When using `table.NewRow()`, the `Set()` method auto-routes to the correct type based on the schema:

| Method                                                   | Description                       |
|----------------------------------------------------------|-----------------------------------|
| `Set(const std::string& name, std::nullptr_t)`           | Set field to null by column name  |
| `Set(const std::string& name, bool value)`               | Set boolean by column name        |
| `Set(const std::string& name, int32_t value)`            | Set integer by column name        |
| `Set(const std::string& name, int64_t value)`            | Set big integer by column name    |
| `Set(const std::string& name, float value)`              | Set float by column name          |
| `Set(const std::string& name, double value)`             | Set double by column name         |
| `Set(const std::string& name, const std::string& value)` | Set string/decimal by column name |
| `Set(const std::string& name, const Date& value)`        | Set date by column name           |
| `Set(const std::string& name, const Time& value)`        | Set time by column name           |
| `Set(const std::string& name, const Timestamp& value)`   | Set timestamp by column name      |

## `RowView`

Read-only row view for scan results. Provides zero-copy access to string and bytes data. `RowView` shares ownership of the underlying scan data via reference counting, so it can safely outlive the `ScanRecords` that produced it.

:::note string_view Lifetime
`GetString()` returns `std::string_view` that borrows from the underlying data. The `string_view` is valid as long as any `RowView` (or `ScanRecord`) referencing the same poll result is alive. Copy to `std::string` if you need the value after all references are gone.
:::

### Index-Based Getters

| Method                                                     |  Description                   |
|------------------------------------------------------------|--------------------------------|
| `FieldCount() -> size_t`                                   | Get the number of fields       |
| `GetType(size_t idx) -> TypeId`                            | Get the type at index          |
| `IsNull(size_t idx) -> bool`                               | Check if field is null         |
| `GetBool(size_t idx) -> bool`                              | Get boolean value at index     |
| `GetInt32(size_t idx) -> int32_t`                          | Get 32-bit integer at index    |
| `GetInt64(size_t idx) -> int64_t`                          | Get 64-bit integer at index    |
| `GetFloat32(size_t idx) -> float`                          | Get 32-bit float at index      |
| `GetFloat64(size_t idx) -> double`                         | Get 64-bit float at index      |
| `GetString(size_t idx) -> std::string_view`                | Get string at index (zero-copy)|
| `GetBytes(size_t idx) -> std::pair<const uint8_t*, size_t>`| Get binary data at index (zero-copy)|
| `GetDate(size_t idx) -> Date`                              | Get date at index              |
| `GetTime(size_t idx) -> Time`                              | Get time at index              |
| `GetTimestamp(size_t idx) -> Timestamp`                    | Get timestamp at index         |
| `IsDecimal(size_t idx) -> bool`                            | Check if field is a decimal type|
| `GetDecimalString(size_t idx) -> std::string`              | Get decimal as string at index |

### Name-Based Getters

| Method                                                  |  Description                       |
|---------------------------------------------------------|------------------------------------|
| `IsNull(const std::string& name) -> bool`               | Check if field is null by name     |
| `GetBool(const std::string& name) -> bool`              | Get boolean by column name         |
| `GetInt32(const std::string& name) -> int32_t`          | Get 32-bit integer by column name  |
| `GetInt64(const std::string& name) -> int64_t`          | Get 64-bit integer by column name  |
| `GetFloat32(const std::string& name) -> float`          | Get 32-bit float by column name    |
| `GetFloat64(const std::string& name) -> double`         | Get 64-bit float by column name    |
| `GetString(const std::string& name) -> std::string_view`| Get string by column name          |
| `GetBytes(const std::string& name) -> std::pair<const uint8_t*, size_t>` | Get binary data by column name |
| `GetDate(const std::string& name) -> Date`              | Get date by column name            |
| `GetTime(const std::string& name) -> Time`              | Get time by column name            |
| `GetTimestamp(const std::string& name) -> Timestamp`    | Get timestamp by column name       |
| `GetDecimalString(const std::string& name) -> std::string` | Get decimal as string by column name |

## `ScanRecord`

`ScanRecord` is a value type that can be freely copied, stored, and accumulated across multiple `Poll()` calls. It shares ownership of the underlying scan data via reference counting.

| Field         | Type         |  Description                                                        |
|---------------|--------------|---------------------------------------------------------------------|
| `offset`      | `int64_t`    | Record offset in the log                                            |
| `timestamp`   | `int64_t`    | Record timestamp                                                    |
| `change_type` | `ChangeType` | Change type (AppendOnly, Insert, UpdateBefore, UpdateAfter, Delete) |
| `row`         | `RowView`    | Row data (value type, shares ownership via reference counting)      |

## `ScanRecords`

### Flat Access

| Method                                  |  Description                               |
|-----------------------------------------|--------------------------------------------|
| `Count() -> size_t`                     | Total number of records across all buckets |
| `IsEmpty() -> bool`                     | Check if empty                             |
| `begin() / end()`                       | Iterator support for range-based for loops |

Flat iteration over all records (regardless of bucket):

```cpp
for (const auto& rec : records) {
    std::cout << "offset=" << rec.offset << std::endl;
}
```

### Per-Bucket Access

| Method                                                          |  Description                                                          |
|-----------------------------------------------------------------|-----------------------------------------------------------------------|
| `BucketCount() -> size_t`                                       | Number of distinct buckets                                            |
| `Buckets() -> std::vector<TableBucket>`                         | List of distinct buckets                                              |
| `Records(const TableBucket& bucket) -> BucketRecords`              | Records for a specific bucket (empty if bucket not present)           |
| `BucketAt(size_t idx) -> BucketRecords`                            | Records by bucket index (0-based, O(1))                               |

## `BucketRecords`

A bundle of scan records belonging to a single bucket. Obtained from `ScanRecords::Records()` or `ScanRecords::BucketAt()`. `BucketRecords` is a value type — it shares ownership of the underlying scan data via reference counting, so it can safely outlive the `ScanRecords` that produced it.

| Method                                         |  Description                               |
|------------------------------------------------|--------------------------------------------|
| `Size() -> size_t`                         | Number of records in this bucket           |
| `Empty() -> bool`                          | Check if empty                             |
| `Bucket() -> const TableBucket&`           | Get the bucket                             |
| `operator[](size_t idx) -> ScanRecord`     | Access record by index within this bucket  |
| `begin() / end()`                          | Iterator support for range-based for loops |

## `TableBucket`

| Field / Method                        |  Description                                    |
|---------------------------------------|-------------------------------------------------|
| `table_id -> int64_t`                    | Table ID                                        |
| `bucket_id -> int32_t`                   | Bucket ID                                       |
| `partition_id -> std::optional<int64_t>` | Partition ID (empty if non-partitioned)         |
| `operator==(const TableBucket&) -> bool` | Equality comparison                             |

## `LookupResult`

Read-only result for lookup operations. Provides zero-copy access to field values.

### Metadata

| Method                      |  Description                   |
|-----------------------------|--------------------------------|
| `Found() -> bool`           | Whether a matching row was found |
| `FieldCount() -> size_t`    | Get the number of fields       |

### Index-Based Getters

| Method                                                     |  Description                   |
|------------------------------------------------------------|--------------------------------|
| `GetType(size_t idx) -> TypeId`                            | Get the type at index          |
| `IsNull(size_t idx) -> bool`                               | Check if field is null         |
| `GetBool(size_t idx) -> bool`                              | Get boolean value at index     |
| `GetInt32(size_t idx) -> int32_t`                          | Get 32-bit integer at index    |
| `GetInt64(size_t idx) -> int64_t`                          | Get 64-bit integer at index    |
| `GetFloat32(size_t idx) -> float`                          | Get 32-bit float at index      |
| `GetFloat64(size_t idx) -> double`                         | Get 64-bit float at index      |
| `GetString(size_t idx) -> std::string_view`                | Get string at index (zero-copy)|
| `GetBytes(size_t idx) -> std::pair<const uint8_t*, size_t>`| Get binary data at index (zero-copy)|
| `GetDate(size_t idx) -> Date`                              | Get date at index              |
| `GetTime(size_t idx) -> Time`                              | Get time at index              |
| `GetTimestamp(size_t idx) -> Timestamp`                    | Get timestamp at index         |
| `IsDecimal(size_t idx) -> bool`                            | Check if field is a decimal type|
| `GetDecimalString(size_t idx) -> std::string`              | Get decimal as string at index |

### Name-Based Getters

| Method                                                  |  Description                       |
|---------------------------------------------------------|------------------------------------|
| `IsNull(const std::string& name) -> bool`               | Check if field is null by name     |
| `GetBool(const std::string& name) -> bool`              | Get boolean by column name         |
| `GetInt32(const std::string& name) -> int32_t`          | Get 32-bit integer by column name  |
| `GetInt64(const std::string& name) -> int64_t`          | Get 64-bit integer by column name  |
| `GetFloat32(const std::string& name) -> float`          | Get 32-bit float by column name    |
| `GetFloat64(const std::string& name) -> double`         | Get 64-bit float by column name    |
| `GetString(const std::string& name) -> std::string_view`| Get string by column name          |
| `GetBytes(const std::string& name) -> std::pair<const uint8_t*, size_t>` | Get binary data by column name |
| `GetDate(const std::string& name) -> Date`              | Get date by column name            |
| `GetTime(const std::string& name) -> Time`              | Get time by column name            |
| `GetTimestamp(const std::string& name) -> Timestamp`    | Get timestamp by column name       |
| `GetDecimalString(const std::string& name) -> std::string` | Get decimal as string by column name |

## `ArrowRecordBatch`

| Method                                                         | Description                          |
|----------------------------------------------------------------|--------------------------------------|
| `GetArrowRecordBatch() -> std::shared_ptr<arrow::RecordBatch>` | Get the underlying Arrow RecordBatch |
| `Available() -> bool`                                          | Check if the batch is valid          |
| `NumRows() -> int64_t`                                         | Number of rows in the batch          |
| `GetTableId() -> int64_t`                                      | Table ID                             |
| `GetPartitionId() -> int64_t`                                  | Partition ID                         |
| `GetBucketId() -> int32_t`                                     | Bucket ID                            |
| `GetBaseOffset() -> int64_t`                                   | First record offset                  |
| `GetLastOffset() -> int64_t`                                   | Last record offset                   |

## `ArrowRecordBatches`

| Method                   |  Description                               |
|--------------------------|--------------------------------------------|
| `Size() -> size_t`       | Number of batches                          |
| `Empty() -> bool`        | Check if empty                             |
| `operator[](size_t idx)` | Access batch by index                      |
| `begin() / end()`        | Iterator support for range-based for loops |

## `Schema`

| Method                            |  Description                |
|-----------------------------------|-----------------------------|
| `NewBuilder() -> Schema::Builder` | Create a new schema builder |

## `Schema::Builder`

| Method                                                                 |  Description            |
|------------------------------------------------------------------------|-------------------------|
| `AddColumn(const std::string& name, const DataType& type) -> Builder&` | Add a column            |
| `SetPrimaryKeys(const std::vector<std::string>& keys) -> Builder&`     | Set primary key columns |
| `Build() -> Schema`                                                    | Build the schema        |

## `TableDescriptor`

| Method                                     |  Description                          |
|--------------------------------------------|---------------------------------------|
| `NewBuilder() -> TableDescriptor::Builder` | Create a new table descriptor builder |

## `TableDescriptor::Builder`

| Method                                                                            | Description                |
|-----------------------------------------------------------------------------------|----------------------------|
| `SetSchema(const Schema& schema) -> Builder&`                                     | Set the table schema       |
| `SetPartitionKeys(const std::vector<std::string>& keys) -> Builder&`              | Set partition key columns  |
| `SetBucketCount(int32_t count) -> Builder&`                                       | Set the number of buckets  |
| `SetBucketKeys(const std::vector<std::string>& keys) -> Builder&`                 | Set bucket key columns     |
| `SetProperty(const std::string& key, const std::string& value) -> Builder&`       | Set a table property       |
| `SetCustomProperty(const std::string& key, const std::string& value) -> Builder&` | Set a custom property      |
| `SetComment(const std::string& comment) -> Builder&`                              | Set a table comment        |
| `Build() -> TableDescriptor`                                                      | Build the table descriptor |

## `DataType`

### Factory Methods

| Method                                        |  Description                       |
|-----------------------------------------------|------------------------------------|
| `DataType::Boolean()`                         | Boolean type                       |
| `DataType::TinyInt()`                         | 8-bit signed integer               |
| `DataType::SmallInt()`                        | 16-bit signed integer              |
| `DataType::Int()`                             | 32-bit signed integer              |
| `DataType::BigInt()`                          | 64-bit signed integer              |
| `DataType::Float()`                           | 32-bit floating point              |
| `DataType::Double()`                          | 64-bit floating point              |
| `DataType::String()`                          | UTF-8 string                       |
| `DataType::Bytes()`                           | Binary data                        |
| `DataType::Date()`                            | Date (days since epoch)            |
| `DataType::Time()`                            | Time (milliseconds since midnight) |
| `DataType::Timestamp(int precision)`          | Timestamp without timezone         |
| `DataType::TimestampLtz(int precision)`       | Timestamp with timezone            |
| `DataType::Decimal(int precision, int scale)` | Decimal with precision and scale   |

### Accessors

| Method               |  Description                                |
|----------------------|---------------------------------------------|
| `id() -> TypeId`     | Get the type ID                             |
| `precision() -> int` | Get precision (for Decimal/Timestamp types) |
| `scale() -> int`     | Get scale (for Decimal type)                |

## `TablePath`

| Method / Field                                                     |  Description          |
|--------------------------------------------------------------------|-----------------------|
| `TablePath(const std::string& database, const std::string& table)` | Create a table path   |
| `database_name -> std::string`                                     | Database name         |
| `table_name -> std::string`                                        | Table name            |
| `ToString() -> std::string`                                        | String representation |

## `TableInfo`

| Field               | Type                                           | Description                         |
|---------------------|------------------------------------------------|-------------------------------------|
| `table_id`          | `int64_t`                                      | Table ID                            |
| `schema_id`         | `int32_t`                                      | Schema ID                           |
| `table_path`        | `TablePath`                                    | Table path                          |
| `created_time`      | `int64_t`                                      | Creation timestamp                  |
| `modified_time`     | `int64_t`                                      | Last modification timestamp         |
| `primary_keys`      | `std::vector<std::string>`                     | Primary key columns                 |
| `bucket_keys`       | `std::vector<std::string>`                     | Bucket key columns                  |
| `partition_keys`    | `std::vector<std::string>`                     | Partition key columns               |
| `num_buckets`       | `int32_t`                                      | Number of buckets                   |
| `has_primary_key`   | `bool`                                         | Whether the table has a primary key |
| `is_partitioned`    | `bool`                                         | Whether the table is partitioned    |
| `properties`        | `std::unordered_map<std::string, std::string>` | Table properties                    |
| `custom_properties` | `std::unordered_map<std::string, std::string>` | Custom properties                   |
| `comment`           | `std::string`                                  | Table comment                       |
| `schema`            | `Schema`                                       | Table schema                        |

## Temporal Types

### `Date`

| Method                                        |  Description                 |
|-----------------------------------------------|------------------------------|
| `Date::FromDays(int32_t days)`                | Create from days since epoch |
| `Date::FromYMD(int year, int month, int day)` | Create from year, month, day |
| `Year() -> int`                               | Get year                     |
| `Month() -> int`                              | Get month                    |
| `Day() -> int`                                | Get day                      |

### `Time`

| Method                                            |  Description                                 |
|---------------------------------------------------|----------------------------------------------|
| `Time::FromMillis(int32_t millis)`                | Create from milliseconds since midnight      |
| `Time::FromHMS(int hour, int minute, int second)` | Create from hour, minute, second             |
| `Hour() -> int`                                   | Get hour                                     |
| `Minute() -> int`                                 | Get minute                                   |
| `Second() -> int`                                 | Get second                                   |
| `Millis() -> int64_t`                             | Get sub-second millisecond component (0-999) |

### `Timestamp`

| Method                                                               |  Description                             |
|----------------------------------------------------------------------|------------------------------------------|
| `Timestamp::FromMillis(int64_t millis)`                              | Create from milliseconds since epoch     |
| `Timestamp::FromMillisNanos(int64_t millis, int32_t nanos)`          | Create from milliseconds and nanoseconds |
| `Timestamp::FromTimePoint(std::chrono::system_clock::time_point tp)` | Create from a time point                 |

## `PartitionInfo`

| Field            | Type          |  Description   |
|------------------|---------------|----------------|
| `partition_id`   | `int64_t`     | Partition ID   |
| `partition_name` | `std::string` | Partition name |

## `DatabaseDescriptor`

| Field        | Type                                           | Description       |
|--------------|------------------------------------------------|-------------------|
| `comment`    | `std::string`                                  | Database comment  |
| `properties` | `std::unordered_map<std::string, std::string>` | Custom properties |

## `DatabaseInfo`

| Field           | Type                                           |  Description                |
|-----------------|------------------------------------------------|-----------------------------|
| `database_name` | `std::string`                                  | Database name               |
| `comment`       | `std::string`                                  | Database comment            |
| `properties`    | `std::unordered_map<std::string, std::string>` | Custom properties           |
| `created_time`  | `int64_t`                                      | Creation timestamp          |
| `modified_time` | `int64_t`                                      | Last modification timestamp |

## `LakeSnapshot`

| Field            | Type                        |  Description       |
|------------------|-----------------------------|--------------------|
| `snapshot_id`    | `int64_t`                   | Snapshot ID        |
| `bucket_offsets` | `std::vector<BucketOffset>` | All bucket offsets |

## `BucketOffset`

| Field          | Type      | Description  |
|----------------|-----------|--------------|
| `table_id`     | `int64_t` | Table ID     |
| `partition_id` | `int64_t` | Partition ID |
| `bucket_id`    | `int32_t` | Bucket ID    |
| `offset`       | `int64_t` | Offset value |

## `OffsetSpec`

| Method                                             | Description                             |
|----------------------------------------------------|-----------------------------------------|
| `OffsetSpec::Earliest()`                          | Query for the earliest available offset |
| `OffsetSpec::Latest()`                            | Query for the latest offset             |
| `OffsetSpec::Timestamp(int64_t timestamp_ms)`     | Query offset at a specific timestamp    |

## Constants

| Constant                 |  Value |  Description                                            |
|--------------------------|--------|---------------------------------------------------------|
| `fluss::EARLIEST_OFFSET` | `-2`   | Start reading from the earliest available offset        |

To start reading from the latest offset (only new records), resolve the current offset via `ListOffsets` before subscribing:

```cpp
std::unordered_map<int32_t, int64_t> offsets;
admin.ListOffsets(table_path, {0}, fluss::OffsetSpec::Latest(), offsets);
scanner.Subscribe(0, offsets[0]);
```

## Enums

### `ChangeType`

| Value          | Short String | Description                      |
|----------------|--------------|----------------------------------|
| `AppendOnly`   | `+A`         | Append-only record               |
| `Insert`       | `+I`         | Inserted row                     |
| `UpdateBefore` | `-U`         | Previous value of an updated row |
| `UpdateAfter`  | `+U`         | New value of an updated row      |
| `Delete`       | `-D`         | Deleted row                      |

You may refer to the following example to convert ChangeType enum to its short string representation.

```cpp
inline const char* ChangeTypeShortString(ChangeType ct) {
    switch (ct) {
        case ChangeType::AppendOnly: return "+A";
        case ChangeType::Insert: return "+I";
        case ChangeType::UpdateBefore: return "-U";
        case ChangeType::UpdateAfter: return "+U";
        case ChangeType::Delete: return "-D";
    }
    throw std::invalid_argument("Unknown ChangeType");
}
```

### `TypeId`

| Value          |  Description               |
|----------------|----------------------------|
| `Boolean`      | Boolean type               |
| `TinyInt`      | 8-bit signed integer       |
| `SmallInt`     | 16-bit signed integer      |
| `Int`          | 32-bit signed integer      |
| `BigInt`       | 64-bit signed integer      |
| `Float`        | 32-bit floating point      |
| `Double`       | 64-bit floating point      |
| `String`       | UTF-8 string               |
| `Bytes`        | Binary data                |
| `Date`         | Date                       |
| `Time`         | Time                       |
| `Timestamp`    | Timestamp without timezone |
| `TimestampLtz` | Timestamp with timezone    |
| `Decimal`      | Decimal                    |

### `ChangeType`

| Value          |  Description                                |
|----------------|---------------------------------------------|
| `AppendOnly`   | Append-only record (log tables)             |
| `Insert`       | Inserted row (PK tables)                    |
| `UpdateBefore` | Row value before an update (PK tables)      |
| `UpdateAfter`  | Row value after an update (PK tables)       |
| `Delete`       | Deleted row (PK tables)                     |

### `OffsetSpec`

| Value       |  Description                   |
|-------------|--------------------------------|
| `Earliest`  | Earliest available offset      |
| `Latest`    | Latest offset                  |
| `Timestamp` | Offset at a specific timestamp |
