bun-sqlite-key-value
Advanced tools
Comparing version 1.10.1 to 1.10.2
@@ -43,3 +43,4 @@ import { Database } from "bun:sqlite"; | ||
private renameStatement; | ||
private setTtlStatement; | ||
private setExpiresStatement; | ||
private getExpiresStatement; | ||
constructor(filename?: string, options?: Options); | ||
@@ -97,2 +98,3 @@ deleteExpired(): void; | ||
setTtl(key: string, ttlMs?: number): boolean; | ||
getTtl(key: string): number | undefined; | ||
hSet<T = any>(key: string, field: string, value: T, ttlMs?: number): boolean; | ||
@@ -99,0 +101,0 @@ hGet<T = any>(key: string, field: string): T | undefined; |
@@ -31,3 +31,4 @@ // src/index.ts | ||
renameStatement; | ||
setTtlStatement; | ||
setExpiresStatement; | ||
getExpiresStatement; | ||
constructor(filename, options) { | ||
@@ -92,3 +93,4 @@ const { | ||
this.renameStatement = this.db.query("UPDATE items SET key = $newKey WHERE key = $oldKey"); | ||
this.setTtlStatement = this.db.query("UPDATE items SET expires = $expires WHERE key = $key"); | ||
this.setExpiresStatement = this.db.query("UPDATE items SET expires = $expires WHERE key = $key"); | ||
this.getExpiresStatement = this.db.query("SELECT expires FROM items WHERE key = $key"); | ||
this.deleteExpired(); | ||
@@ -394,4 +396,18 @@ } | ||
} | ||
return this.setTtlStatement.run({ key, expires }).changes === 1; | ||
return this.setExpiresStatement.run({ key, expires }).changes === 1; | ||
} | ||
getTtl(key) { | ||
const record = this.getExpiresStatement.get({ key }); | ||
if (!record) | ||
return; | ||
const expires = record?.expires; | ||
if (!expires) | ||
return; | ||
const now = Date.now(); | ||
if (expires < now) { | ||
this.delete(key); | ||
return; | ||
} | ||
return expires - now; | ||
} | ||
hSet(key, field, value, ttlMs) { | ||
@@ -398,0 +414,0 @@ return this.db.transaction(() => { |
{ | ||
"name": "bun-sqlite-key-value", | ||
"version": "1.10.1", | ||
"version": "1.10.2", | ||
"author": { | ||
@@ -5,0 +5,0 @@ "name": "Gerold Penz", |
@@ -16,2 +16,27 @@ # Bun SQLite Key Value | ||
## Table of Contents | ||
- [Installation](#installation) | ||
- [Usage](#usage) | ||
- [Open Database](#open-database) | ||
- [Write Value](#write-value) | ||
- [`set()`](#write-value) | ||
- [Read Value](#read-value) | ||
- [`get()`](#read-value) | ||
- [Read Random Value](#read-random-value) | ||
- [`getRandomValue()`](#read-random-value) | ||
- [Write Multiple Items](#write-multiple-items) | ||
- [`setItems()`](#write-multiple-items) | ||
- [Read Values](#read-values) | ||
- [`getValues()`](#read-values) | ||
- [Read Items](#read-items) | ||
- [`getItems()`](#read-items) | ||
- [Multiple Databases](#multiple-databases) | ||
- [Read and Write Binary Files (Images)](#read-and-write-binary-files-images) | ||
- [Cache Values with TTL](#cache-values-with-ttl) | ||
... | ||
## Installation | ||
@@ -166,3 +191,3 @@ | ||
## Random Value | ||
## Read Random Value | ||
@@ -204,3 +229,3 @@ ```typescript | ||
## Random Item | ||
## Read Random Item | ||
@@ -242,3 +267,3 @@ ```typescript | ||
## Read Values | ||
## Read Multiple Values | ||
@@ -286,3 +311,3 @@ ```typescript | ||
## Read Items | ||
## Read Multiple Items | ||
@@ -839,3 +864,3 @@ ```typescript | ||
## Renew TTL | ||
## Set TTL (renew) | ||
@@ -878,2 +903,30 @@ ```typescript | ||
## Get TTL | ||
```typescript | ||
getTtl(key: string): number | undefined | ||
``` | ||
Returns how long the data record is still valid (in milliseconds). | ||
Returns `undefined` if the `key` does not exist or no expiration date has been set. | ||
Inspired by: https://docs.keydb.dev/docs/commands/#ttl | ||
### key | ||
The key must be a string. | ||
### Example | ||
```typescript | ||
import { BunSqliteKeyValue } from "bun-sqlite-key-value" | ||
const store = new BunSqliteKeyValue() | ||
store.set("my-key", "my-value", 20000) | ||
await Bun.sleep(1) | ||
store.getTtl("my-key") // --> 19999 | ||
``` | ||
## Hash (Map Object) - Write Value | ||
@@ -880,0 +933,0 @@ ```typescript |
@@ -61,3 +61,4 @@ import { Database, type Statement } from "bun:sqlite" | ||
private renameStatement: Statement | ||
private setTtlStatement: Statement | ||
private setExpiresStatement: Statement | ||
private getExpiresStatement: Statement<{expires: number}> | ||
@@ -154,3 +155,4 @@ | ||
this.renameStatement = this.db.query("UPDATE items SET key = $newKey WHERE key = $oldKey") | ||
this.setTtlStatement = this.db.query("UPDATE items SET expires = $expires WHERE key = $key") | ||
this.setExpiresStatement = this.db.query("UPDATE items SET expires = $expires WHERE key = $key") | ||
this.getExpiresStatement = this.db.query("SELECT expires FROM items WHERE key = $key") | ||
@@ -621,9 +623,21 @@ // Delete expired items | ||
} | ||
return this.setTtlStatement.run({key, expires}).changes === 1 | ||
return this.setExpiresStatement.run({key, expires}).changes === 1 | ||
} | ||
// ToDo: ttl() milliseconds like pTtl() | ||
// Returns how long the data record is still valid (in milliseconds). | ||
// Returns `undefined` if the key does not exist. | ||
// Inspired by: https://docs.keydb.dev/docs/commands/#ttl | ||
// Inspired by: https://docs.keydb.dev/docs/commands/#pttl | ||
getTtl(key: string): number | undefined { | ||
const record = this.getExpiresStatement.get({key}) | ||
if (!record) return | ||
const expires = record?.expires | ||
if (!expires) return | ||
const now = Date.now() | ||
if (expires < now) { | ||
this.delete(key) | ||
return | ||
} | ||
return expires - now | ||
} | ||
@@ -630,0 +644,0 @@ |
73711
1159
1122
46