Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tidesdb",
"version": "0.5.4",
"version": "0.5.5",
"description": "TypeScript bindings for TidesDB - A high-performance embedded key-value storage engine",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
34 changes: 34 additions & 0 deletions src/column-family.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
CommitOpStruct,
commitHookPtrType,
StatsStruct,
ColumnFamilyConfigStruct,
} from './ffi';
import { checkResult } from './error';
import { Stats, ColumnFamilyConfig, CompressionAlgorithm, SyncMode, IsolationLevel, CommitOp, CommitHookCallback } from './types';
Expand Down Expand Up @@ -117,13 +118,46 @@ export class ColumnFamily {
}
}

// Decode config from the stats struct
let config: ColumnFamilyConfig | undefined;
if (decoded.config) {
try {
const cfgDecoded = koffi.decode(decoded.config, ColumnFamilyConfigStruct) as Record<string, unknown>;
config = {
writeBufferSize: cfgDecoded.write_buffer_size as number,
levelSizeRatio: cfgDecoded.level_size_ratio as number,
minLevels: cfgDecoded.min_levels as number,
dividingLevelOffset: cfgDecoded.dividing_level_offset as number,
klogValueThreshold: cfgDecoded.klog_value_threshold as number,
compressionAlgorithm: cfgDecoded.compression_algorithm as CompressionAlgorithm,
enableBloomFilter: (cfgDecoded.enable_bloom_filter as number) !== 0,
bloomFpr: cfgDecoded.bloom_fpr as number,
enableBlockIndexes: (cfgDecoded.enable_block_indexes as number) !== 0,
indexSampleRatio: cfgDecoded.index_sample_ratio as number,
blockIndexPrefixLen: cfgDecoded.block_index_prefix_len as number,
syncMode: cfgDecoded.sync_mode as SyncMode,
syncIntervalUs: cfgDecoded.sync_interval_us as number,
skipListMaxLevel: cfgDecoded.skip_list_max_level as number,
skipListProbability: cfgDecoded.skip_list_probability as number,
defaultIsolationLevel: cfgDecoded.default_isolation_level as IsolationLevel,
minDiskSpace: cfgDecoded.min_disk_space as number,
l1FileCountTrigger: cfgDecoded.l1_file_count_trigger as number,
l0QueueStallThreshold: cfgDecoded.l0_queue_stall_threshold as number,
useBtree: (cfgDecoded.use_btree as number) !== 0,
};
} catch {
// If decoding fails, config remains undefined
}
}

tidesdb_free_stats(statsPtr);

return {
numLevels,
memtableSize,
levelSizes,
levelNumSSTables,
config,
totalKeys,
totalDataSize,
avgKeySize,
Expand Down
1 change: 1 addition & 0 deletions src/ffi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const TidesDBConfigStruct = koffi.struct('tidesdb_config_t', {
log_level: 'int',
block_cache_size: 'size_t',
max_open_sstables: 'size_t',
max_memory_usage: 'size_t',
log_to_file: 'int',
log_truncation_at: 'size_t',
});
Expand Down
34 changes: 34 additions & 0 deletions src/tidesdb.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -630,6 +630,40 @@ describe('TidesDB', () => {
});
});

describe('Custom Comparators', () => {
test('getComparator returns true for built-in comparators', () => {
expect(db.getComparator('memcmp')).toBe(true);
expect(db.getComparator('reverse')).toBe(true);
expect(db.getComparator('lexicographic')).toBe(true);
expect(db.getComparator('uint64')).toBe(true);
expect(db.getComparator('int64')).toBe(true);
expect(db.getComparator('case_insensitive')).toBe(true);
});

test('getComparator returns false for non-existent comparator', () => {
expect(db.getComparator('nonexistent_comparator')).toBe(false);
});
});

describe('Stats Config', () => {
test('getStats returns config field', () => {
db.createColumnFamily('stats_cfg_cf', {
compressionAlgorithm: CompressionAlgorithm.Lz4Compression,
enableBloomFilter: true,
bloomFpr: 0.01,
});
const cf = db.getColumnFamily('stats_cfg_cf');

const stats = cf.getStats();
expect(stats.config).toBeDefined();
if (stats.config) {
expect(typeof stats.config.writeBufferSize).toBe('number');
expect(stats.config.enableBloomFilter).toBe(true);
expect(stats.config.compressionAlgorithm).toBe(CompressionAlgorithm.Lz4Compression);
}
});
});

describe('Range Cost Estimation', () => {
test('rangeCost returns a number', () => {
db.createColumnFamily('range_cf');
Expand Down
18 changes: 18 additions & 0 deletions src/tidesdb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
tidesdb_txn_begin,
tidesdb_txn_begin_with_isolation,
tidesdb_register_comparator,
tidesdb_get_comparator,
tidesdb_get_cache_stats,
tidesdb_backup,
tidesdb_checkpoint,
Expand Down Expand Up @@ -60,6 +61,7 @@ export function defaultConfig(): Partial<Config> {
logLevel: LogLevel.Info,
blockCacheSize: 64 * 1024 * 1024,
maxOpenSSTables: 256,
maxMemoryUsage: 0,
logToFile: false,
logTruncationAt: 24 * 1024 * 1024,
};
Expand Down Expand Up @@ -118,6 +120,7 @@ export class TidesDB {
log_level: mergedConfig.logLevel!,
block_cache_size: mergedConfig.blockCacheSize!,
max_open_sstables: mergedConfig.maxOpenSSTables!,
max_memory_usage: mergedConfig.maxMemoryUsage!,
log_to_file: mergedConfig.logToFile ? 1 : 0,
log_truncation_at: mergedConfig.logTruncationAt!,
};
Expand Down Expand Up @@ -324,6 +327,21 @@ export class TidesDB {
checkResult(result, 'failed to register comparator');
}

/**
* Retrieve a registered comparator by name.
* Returns true if the comparator is registered, false otherwise.
* @param name Name of the comparator to look up.
*/
getComparator(name: string): boolean {
if (!this._db) throw new Error('Database has been closed');

const fnPtrOut: unknown[] = [null];
const ctxPtrOut: unknown[] = [null];

const result = tidesdb_get_comparator(this._db, name, fnPtrOut, ctxPtrOut);
return result === 0;
}

/**
* Create an on-disk backup of the database without blocking reads/writes.
* @param dir Backup directory path (must be non-existent or empty).
Expand Down
2 changes: 2 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ export interface Config {
blockCacheSize?: number;
/** Maximum number of open SSTables. Default: 256 */
maxOpenSSTables?: number;
/** Global memory limit in bytes. Default: 0 (auto, 50% of system RAM). */
maxMemoryUsage?: number;
/** Write logs to file instead of stderr. Default: false */
logToFile?: boolean;
/** Log file truncation size in bytes. Default: 24MB, 0 = no truncation */
Expand Down
Loading