@naturalcycles/datastore-lib
Version:
Opinionated library to work with Google Datastore, implements CommonDB
64 lines (63 loc) • 2.04 kB
JavaScript
import { DBQuery } from '@naturalcycles/db-lib';
import { commonKeyValueDBFullSupport } from '@naturalcycles/db-lib/kv';
import { AppError } from '@naturalcycles/js-lib/error/error.util.js';
import { DatastoreDB } from './datastore.db.js';
const excludeFromIndexes = ['v'];
export class DatastoreKeyValueDB {
cfg;
constructor(cfg) {
this.cfg = cfg;
this.db = new DatastoreDB(cfg);
}
db;
support = {
...commonKeyValueDBFullSupport,
increment: false,
};
async ping() {
await this.db.ping();
}
async createTable() { }
async getByIds(table, ids) {
return (await this.db.getByIds(table, ids)).map(r => [r.id, r.v]);
}
async deleteByIds(table, ids) {
await this.db.deleteByIds(table, ids);
}
async saveBatch(table, entries) {
await this.db.saveBatch(table, entries.map(([id, v]) => ({ id, v })), {
excludeFromIndexes,
});
}
streamIds(table, limit) {
const q = DBQuery.create(table)
.select(['id'])
.limit(limit || 0);
return (this.db
.streamQuery(q)
// .on('error', err => stream.emit('error', err))
.map(r => r.id));
}
streamValues(table, limit) {
// `select v` doesn't work for some reason
const q = DBQuery.create(table).limit(limit || 0);
return (this.db
.streamQuery(q)
// .on('error', err => stream.emit('error', err))
.map(r => r.v));
}
streamEntries(table, limit) {
const q = DBQuery.create(table).limit(limit || 0);
return (this.db
.streamQuery(q)
// .on('error', err => stream.emit('error', err))
.map(r => [r.id, r.v]));
}
async count(table) {
const q = DBQuery.create(table);
return await this.db.runQueryCount(q);
}
async incrementBatch(_table, _entries) {
throw new AppError('DatastoreKeyValueDB.incrementBatch() is not implemented');
}
}