nostrdb/blocks: expose block iterator internals
so we don't need heap allocation. we will be calling this a lot in tight render loops, we don't want to be allocating on each frame. Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
committed by
Daniel D’Aquino
parent
d063362bd7
commit
c677233dcb
@@ -4,13 +4,6 @@
|
|||||||
#include "block.h"
|
#include "block.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct ndb_block_iterator {
|
|
||||||
const char *content;
|
|
||||||
struct ndb_blocks *blocks;
|
|
||||||
struct ndb_block block;
|
|
||||||
struct cursor cur;
|
|
||||||
};
|
|
||||||
|
|
||||||
int push_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block) {
|
int push_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block) {
|
||||||
return cursor_push_varint(buf, block->str - content) &&
|
return cursor_push_varint(buf, block->str - content) &&
|
||||||
cursor_push_varint(buf, block->len);
|
cursor_push_varint(buf, block->len);
|
||||||
@@ -133,32 +126,25 @@ enum ndb_block_type ndb_get_block_type(struct ndb_block *block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BLOCK ITERATORS
|
// BLOCK ITERATORS
|
||||||
struct ndb_block_iterator *ndb_blocks_iterate_start(const char *content, struct ndb_blocks *blocks) {
|
void ndb_blocks_iterate_start(const char *content, struct ndb_blocks *blocks, struct ndb_block_iterator *iter) {
|
||||||
struct ndb_block_iterator *iter = malloc(sizeof(*iter));
|
|
||||||
if (!iter)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
iter->blocks = blocks;
|
iter->blocks = blocks;
|
||||||
iter->content = content;
|
iter->content = content;
|
||||||
|
iter->p = blocks->blocks;
|
||||||
make_cursor((unsigned char *)blocks->blocks,
|
|
||||||
blocks->blocks + blocks->blocks_size, &iter->cur);
|
|
||||||
|
|
||||||
return iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ndb_blocks_iterate_free(struct ndb_block_iterator *iter)
|
|
||||||
{
|
|
||||||
if (iter)
|
|
||||||
free(iter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ndb_block *ndb_blocks_iterate_next(struct ndb_block_iterator *iter)
|
struct ndb_block *ndb_blocks_iterate_next(struct ndb_block_iterator *iter)
|
||||||
{
|
{
|
||||||
while (iter->cur.p < iter->cur.end) {
|
struct cursor cur;
|
||||||
if (!pull_block(iter->content, &iter->cur, &iter->block)) {
|
cur.start = iter->blocks->blocks;
|
||||||
|
cur.p = iter->p;
|
||||||
|
cur.end = iter->blocks->blocks + iter->blocks->blocks_size;
|
||||||
|
|
||||||
|
while (cur.p < cur.end) {
|
||||||
|
if (!pull_block(iter->content, &cur, &iter->block)) {
|
||||||
|
iter->p = cur.p;
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
|
iter->p = cur.p;
|
||||||
return &iter->block;
|
return &iter->block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,26 +29,6 @@ struct ndb_blocks {
|
|||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
struct ndb_mention_bech32_block {
|
|
||||||
struct ndb_str_block str;
|
|
||||||
struct nostr_bech32 bech32;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ndb_invoice_block {
|
|
||||||
struct ndb_str_block invstr;
|
|
||||||
struct ndb_invoice invoice;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ndb_block {
|
|
||||||
enum ndb_block_type type;
|
|
||||||
union {
|
|
||||||
struct ndb_str_block str;
|
|
||||||
struct ndb_invoice_block invoice;
|
|
||||||
struct ndb_mention_bech32_block mention_bech32;
|
|
||||||
uint32_t mention_index;
|
|
||||||
} block;
|
|
||||||
};
|
|
||||||
|
|
||||||
int push_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block);
|
int push_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block);
|
||||||
int pull_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block);
|
int pull_str_block(struct cursor *buf, const char *content, struct ndb_str_block *block);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
#include "cursor.h"
|
#include "cursor.h"
|
||||||
#include "invoice.h"
|
#include "invoice.h"
|
||||||
|
#include "nostrdb.h"
|
||||||
#include "bolt11/bolt11.h"
|
#include "bolt11/bolt11.h"
|
||||||
#include "bolt11/amount.h"
|
#include "bolt11/amount.h"
|
||||||
|
|
||||||
|
|||||||
@@ -4,18 +4,10 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "cursor.h"
|
#include "cursor.h"
|
||||||
|
#include "nostrdb.h"
|
||||||
|
|
||||||
struct bolt11;
|
struct bolt11;
|
||||||
|
|
||||||
struct ndb_invoice {
|
|
||||||
unsigned char version;
|
|
||||||
uint64_t amount;
|
|
||||||
uint64_t timestamp;
|
|
||||||
uint64_t expiry;
|
|
||||||
char *description;
|
|
||||||
unsigned char *description_hash;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ENCODING
|
// ENCODING
|
||||||
int ndb_encode_invoice(struct cursor *cur, struct bolt11 *invoice);
|
int ndb_encode_invoice(struct cursor *cur, struct bolt11 *invoice);
|
||||||
int ndb_decode_invoice(struct cursor *cur, struct ndb_invoice *invoice);
|
int ndb_decode_invoice(struct cursor *cur, struct ndb_invoice *invoice);
|
||||||
|
|||||||
@@ -360,6 +360,42 @@ struct nostr_bech32 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct ndb_mention_bech32_block {
|
||||||
|
struct ndb_str_block str;
|
||||||
|
struct nostr_bech32 bech32;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ndb_invoice {
|
||||||
|
unsigned char version;
|
||||||
|
uint64_t amount;
|
||||||
|
uint64_t timestamp;
|
||||||
|
uint64_t expiry;
|
||||||
|
char *description;
|
||||||
|
unsigned char *description_hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ndb_invoice_block {
|
||||||
|
struct ndb_str_block invstr;
|
||||||
|
struct ndb_invoice invoice;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ndb_block {
|
||||||
|
enum ndb_block_type type;
|
||||||
|
union {
|
||||||
|
struct ndb_str_block str;
|
||||||
|
struct ndb_invoice_block invoice;
|
||||||
|
struct ndb_mention_bech32_block mention_bech32;
|
||||||
|
uint32_t mention_index;
|
||||||
|
} block;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ndb_block_iterator {
|
||||||
|
const char *content;
|
||||||
|
struct ndb_blocks *blocks;
|
||||||
|
struct ndb_block block;
|
||||||
|
unsigned char *p;
|
||||||
|
};
|
||||||
|
|
||||||
// CONFIG
|
// CONFIG
|
||||||
void ndb_default_config(struct ndb_config *);
|
void ndb_default_config(struct ndb_config *);
|
||||||
void ndb_config_set_ingest_threads(struct ndb_config *config, int threads);
|
void ndb_config_set_ingest_threads(struct ndb_config *config, int threads);
|
||||||
@@ -479,8 +515,7 @@ void ndb_blocks_free(struct ndb_blocks *blocks);
|
|||||||
struct ndb_blocks *ndb_get_blocks_by_key(struct ndb *ndb, struct ndb_txn *txn, uint64_t note_key);
|
struct ndb_blocks *ndb_get_blocks_by_key(struct ndb *ndb, struct ndb_txn *txn, uint64_t note_key);
|
||||||
|
|
||||||
// BLOCK ITERATORS
|
// BLOCK ITERATORS
|
||||||
struct ndb_block_iterator *ndb_blocks_iterate_start(const char *, struct ndb_blocks *);
|
void ndb_blocks_iterate_start(const char *, struct ndb_blocks *, struct ndb_block_iterator *);
|
||||||
void ndb_blocks_iterate_free(struct ndb_block_iterator *);
|
|
||||||
struct ndb_block *ndb_blocks_iterate_next(struct ndb_block_iterator *);
|
struct ndb_block *ndb_blocks_iterate_next(struct ndb_block_iterator *);
|
||||||
|
|
||||||
// STR BLOCKS
|
// STR BLOCKS
|
||||||
|
|||||||
Reference in New Issue
Block a user