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. Upper bound when dynamic sizing is on; fixed batch size when off |
writer_dynamic_batch_size_enabled | bool | true | Enable per-table dynamic batch sizing: target grows 10% above 80% fill, shrinks 5% below 50% |
writer_dynamic_batch_size_min | int32_t | 262144 (256 KB) | Lower bound for the dynamic batch size estimator (ignored when disabled) |
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() |
scanner_log_fetch_max_bytes | int32_t | 16777216 (16 MB) | Maximum bytes per fetch response for LogScanner |
scanner_log_fetch_min_bytes | int32_t | 1 | Minimum bytes the server must accumulate before returning a fetch response |
scanner_log_fetch_wait_max_time_ms | int32_t | 500 | Maximum time (ms) the server may wait to satisfy min-bytes |
scanner_log_fetch_max_bytes_for_bucket | int32_t | 1048576 (1 MB) | Maximum bytes per fetch response per bucket for LogScanner |
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", "TabletServer", or "Unknown") |
uid | std::string | Unique identifier (e.g. "cs-0", "ts-1") |
"Unknown" is used when the client has not yet determined the endpoint type, such as bootstrap endpoints.
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 |
NewPrefixLookup(std::vector<std::string> cols, PrefixLookuper& out) -> Result | Create a prefix (bucket-key) lookuper |
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 |
Limit(int32_t row_number) -> TableScan& | Set a positive row limit (enables CreateBucketBatchScanner; rejected by log scanners) |
CreateLogScanner(LogScanner& out) -> Result | Create a record-based log scanner; on a primary-key table, subscribes to its CDC changelog (per-record change_type) |
CreateRecordBatchLogScanner(LogScanner& out) -> Result | Create an Arrow RecordBatch-based log scanner (log tables only — no per-record change types) |
CreateBucketBatchScanner(const TableBucket& bucket, BatchScanner& out) -> Result | Bounded scan of one bucket (requires Limit) |
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 |
PrefixLookuper
Performs prefix (bucket-key) lookups, returning all rows whose primary key starts with the given prefix. Obtained from Table::NewPrefixLookup(). See the Prefix Lookup example.
| Method | Description |
|---|
PrefixLookup(const GenericRow& prefix_row, PrefixLookupResult& out) -> Result | Look up all rows matching the prefix columns |
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 |
BatchScanner
One-shot bounded scan of a single bucket. Obtained from TableScan::CreateBucketBatchScanner(). The scan runs on the first call below, yields its single batch once, then is spent.
| Method | Description |
|---|
NextBatch(ArrowRecordBatches& out) -> Result | Run the scan; returns the batch once, then empty |
CollectAllBatches(ArrowRecordBatches& out) -> Result | Drain the scanner into all of its batches |
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 and 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 |
SetArray(size_t idx, ArrayWriter&& writer) | Set array value (consumes the writer) |
SetMap(size_t idx, MapWriter&& writer) | Set map value (consumes the writer) |
SetRow(size_t idx, GenericRow&& nested) | Set ROW value from a nested row (consumes it) |
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 |
Set(const std::string& name, ArrayWriter&& writer) | Set array value by column name |
Set(const std::string& name, MapWriter&& writer) | Set map value by column name |
Set(const std::string& name, GenericRow&& nested) | Set ROW value 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.
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 |
Complex Getters (ARRAY / MAP / ROW)
| Method | Description |
|---|
GetValue(size_t idx) -> Value | Get a complex column as a recursive Value handle |
GetValue(const std::string& name) -> Value | Same, by column name |
Navigate the returned Value with At / KeyAt / ValueAt / Field and read leaves with its Get*() methods.
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):
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.
| 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 |
Complex Getters (ARRAY / MAP / ROW)
GetValue(size_t idx) -> Value and GetValue(const std::string& name) -> Value, same as on RowView. Navigate the returned Value.
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 |
PrefixLookupResult
Read-only result of a prefix lookup — zero or more matched rows. Each row is a PrefixRowView exposing the same scalar getters as RowView (index- and name-based) plus GetValue(...) for complex (ARRAY / MAP / ROW) columns.
| Method | Description |
|---|
Size() -> size_t | Number of matched rows |
IsEmpty() -> bool | Whether the result has no rows |
GetRow(size_t index) -> PrefixRowView | Get the row at index (throws if out of range) |
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 |
FromArrow(std::shared_ptr<arrow::Schema> schema, std::vector<std::string> primary_keys = {}) -> Schema | Build a schema from an existing Arrow schema (escape hatch; prefer DataType::Map / DataType::Row) |
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 |
DataType::Array(DataType element) | Array of the given element type |
DataType::Map(DataType key, DataType value) | Map of key/value types (either may be complex) |
DataType::Row(std::vector<std::pair<std::string, DataType>> fields) | Row of named fields (types may be complex) |
MAP / ROW (and arrays nesting them) compose to any depth; the binding lowers them to Arrow internally when the table is created or a writer is built.
Accessors
| Method | Description |
|---|
id() -> TypeId | Get the type ID |
precision() -> int | Get precision (for Decimal/Timestamp types) |
scale() -> int | Get scale (for Decimal type) |
nullable() -> bool | Returns true if this type is nullable (default), false if NOT NULL |
element_type() -> const DataType* | Get element type (for Array type, nullptr otherwise) |
key_type() / value_type() -> const DataType* | MAP key / value types (nullptr otherwise) |
field_count() -> size_t | ROW field count (0 otherwise) |
field_name(size_t i) -> const std::string& | ROW field name at i |
field_type(size_t i) -> const DataType* | ROW field type at i |
NotNull() -> DataType | Returns a copy of this type with nullable set to false |
ArrayWriter
Write-only builder for array column values. Constructed with a fixed size and element type, then populated element-by-element. Move-only — consumed by GenericRow::SetArray() or ArrayWriter::SetArray() for nested arrays. For arrays whose element is a ROW / MAP, construct from an Arrow element type (arrow::struct_(...) / arrow::map(...)).
| Method | Description |
|---|
ArrayWriter(size_t size, DataType element_type) | Create an array writer; element may be complex (DataType::Map/Row) |
ArrayWriter(size_t size, std::shared_ptr<arrow::DataType> element_type) | Arrow escape hatch for the element type |
SetNull(size_t idx) | Set element to null |
SetBool(size_t idx, bool value) | Set boolean element |
SetInt32(size_t idx, int32_t value) | Set 32-bit integer element |
SetInt64(size_t idx, int64_t value) | Set 64-bit integer element |
SetFloat32(size_t idx, float value) | Set 32-bit float element |
SetFloat64(size_t idx, double value) | Set 64-bit float element |
SetString(size_t idx, const std::string& value) | Set string element |
SetBytes(size_t idx, const std::vector<uint8_t>& value) | Set binary element |
SetDate(size_t idx, const Date& value) | Set date element |
SetTime(size_t idx, const Time& value) | Set time element |
SetTimestampNtz(size_t idx, const Timestamp& value) | Set timestamp without timezone element |
SetTimestampLtz(size_t idx, const Timestamp& value) | Set timestamp with timezone element |
SetDecimal(size_t idx, const std::string& value) | Set decimal element from string |
SetArray(size_t idx, ArrayWriter&& nested) | Set nested array element (consumes nested) |
SetRow(size_t idx, GenericRow&& row) | Set ROW element (consumes the row) |
SetMap(size_t idx, MapWriter&& map) | Set MAP element (consumes the map) |
MapWriter
Write-only builder for map column values. Construct with the key/value types, then for each entry set the key and value and call Commit(). Keys cannot be null; an unset value defaults to null. Move-only — consumed by GenericRow::SetMap(), ArrayWriter::SetMap(), and MapWriter::SetValueMap(). For a key/value that is itself a ROW / MAP / ARRAY, construct from Arrow types and use the SetValue{Row,Map,Array} setters.
| Method | Description |
|---|
MapWriter(size_t capacity, DataType key_type, DataType value_type) | Create a map writer; key/value may be complex (DataType::Map/Row/Array) |
MapWriter(size_t capacity, std::shared_ptr<arrow::DataType> key_type, std::shared_ptr<arrow::DataType> value_type) | Arrow escape hatch for key/value types |
SetKey{Bool,Int32,Int64,Float32,Float64,String,Bytes,Date,Time,Timestamp,Decimal}(...) | Stage the entry key (NTZ vs LTZ chosen from the declared key type) |
SetValueNull() | Stage a null entry value |
SetValue{Bool,Int32,Int64,Float32,Float64,String,Bytes,Date,Time,Timestamp,Decimal}(...) | Stage the entry value (NTZ vs LTZ from the declared value type) |
SetValueRow(GenericRow&&) / SetValueMap(MapWriter&&) / SetValueArray(ArrayWriter&&) | Stage a compound entry value (consumes the writer) |
Commit() | Append the staged key/value as one map entry |
Value
Read-only handle for a complex (ARRAY / MAP / ROW) column value, obtained from RowView::GetValue(), LookupResult::GetValue(), or PrefixRowView::GetValue(). Navigate to children with At / KeyAt / ValueAt / Field (each returns a child Value); read a leaf with the Get*() methods. A typed read on a null or wrong-typed value throws. Move-only; owns a Rust handle released on destruction.
Leaf reads
| Method | Description |
|---|
Type() -> TypeId | Type of this value |
IsNull() -> bool | Whether this value is null |
GetBool() -> bool | Read a boolean leaf |
GetInt32() -> int32_t | Read a 32-bit integer leaf |
GetInt64() -> int64_t | Read a 64-bit integer leaf |
GetFloat32() -> float | Read a 32-bit float leaf |
GetFloat64() -> double | Read a 64-bit float leaf |
GetString() -> std::string | Read a string leaf |
GetBytes() -> std::vector<uint8_t> | Read a binary leaf |
GetDate() -> Date | Read a date leaf |
GetTime() -> Time | Read a time leaf |
GetTimestamp() -> Timestamp | Read a timestamp leaf |
GetDecimalString() -> std::string | Read a decimal leaf as string |
Navigation
| Method | Description |
|---|
Size() -> size_t | Element count (ARRAY) / entries (MAP) |
FieldCount() -> size_t | Field count (ROW) |
At(size_t i) -> Value | ARRAY element i |
KeyAt(size_t i) -> Value | MAP key at entry i |
ValueAt(size_t i) -> Value | MAP value at entry i |
Field(size_t i) -> Value | ROW field i |
Field(const std::string& name) -> Value | ROW field by name |
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:
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.
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 |
Array | Array of elements |
Map | Map of key/value pairs |
Row | Row (struct) of fields |
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 |