diff --git a/src/box/phia.c b/src/box/phia.c index 61df9b4090799ec3d0805e84b5ee8b9b165a4f0a..f15c8d16a6bed1a8f253eba4301c0c44a45e79c6 100644 --- a/src/box/phia.c +++ b/src/box/phia.c @@ -2729,6 +2729,7 @@ struct sffield { struct sfscheme { struct sffield **fields; struct sffield **keys; + struct key_def *key_def; int fields_count; int keys_count; sfcmpf cmp; @@ -3051,40 +3052,6 @@ sf_limitset(struct sflimit *b, struct sfscheme *s, struct sfv *fields, enum phia } } -typedef int (*sfupsertf)(int count, - char **src, uint32_t *src_size, - char **upsert, uint32_t *upsert_size, - char **result, uint32_t *result_size, - void *arg); - -struct sfupsert { - sfupsertf function; - void *arg; -}; - -static inline void -sf_upsertinit(struct sfupsert *u) -{ - memset(u, 0, sizeof(*u)); -} - -static inline void -sf_upsertset(struct sfupsert *u, sfupsertf function) -{ - u->function = function; -} - -static inline void -sf_upsertset_arg(struct sfupsert *u, void *arg) -{ - u->arg = arg; -} - -static inline int -sf_upserthas(struct sfupsert *u) { - return u->function != NULL; -} - static inline int sf_cmpstring(char *a, int asz, char *b, int bsz, void *arg ssunused) { @@ -3182,6 +3149,7 @@ sf_schemeinit(struct sfscheme *s) s->var_count = 0; s->cmp = sf_schemecompare; s->cmparg = s; + s->key_def = NULL; } static void @@ -3766,7 +3734,6 @@ sr_zonemap(struct srzonemap *m, uint32_t percent) struct runtime { struct srstatus *status; - struct sfupsert *fmt_upsert; enum sfstorage fmt_storage; struct sfscheme *scheme; struct srseq *seq; @@ -3787,7 +3754,6 @@ sr_init(struct runtime *r, struct srzonemap *zonemap, struct srseq *seq, enum sfstorage fmt_storage, - struct sfupsert *fmt_upsert, struct sfscheme *scheme, struct ssinjection *i, struct srstat *stat) @@ -3800,7 +3766,6 @@ sr_init(struct runtime *r, r->seq = seq; r->scheme = scheme; r->fmt_storage = fmt_storage; - r->fmt_upsert = fmt_upsert; r->i = i; r->stat = stat; } @@ -4334,6 +4299,14 @@ sv_upsertpop(struct svupsert *u) return ss_bufat(&u->stack, sizeof(struct svupsertnode), pos); } +/* TODO: move implementation from phia_space.cc */ +extern int +phia_upsert_cb(int count, + char **src, uint32_t *src_size, + char **upsert, uint32_t *upsert_size, + char **result, uint32_t *result_size, + struct key_def *key_def); + static inline int sv_upsertdo(struct svupsert *u, struct runtime *r, struct svupsertnode *a, struct svupsertnode *b) @@ -4373,15 +4346,11 @@ sv_upsertdo(struct svupsert *u, struct runtime *r, struct svupsertnode *a, } /* execute */ - int rc; - rc = r->fmt_upsert->function(r->scheme->fields_count, - src_ptr, - src_size_ptr, - upsert, - upsert_size, - result, - result_size, - r->fmt_upsert->arg); + int rc = phia_upsert_cb(r->scheme->fields_count, + src_ptr, src_size_ptr, + upsert, upsert_size, + result, result_size, + r->scheme->key_def); if (unlikely(rc == -1)) return -1; @@ -8410,7 +8379,6 @@ struct sischeme { uint32_t lru_step; uint32_t buf_gc_wm; enum sfstorage fmt_storage; - struct sfupsert fmt_upsert; struct sfscheme scheme; struct srversion version; struct srversion version_storage; @@ -13732,14 +13700,6 @@ phia_cursor_new(struct phia_index *db) return c; } -/* TODO: move implementation from phia_space.cc */ -extern int -phia_upsert_cb(int count, - char **src, uint32_t *src_size, - char **upsert, uint32_t *upsert_size, - char **result, uint32_t *result_size, - void *arg); - static int phia_index_scheme_init(struct phia_index *db, struct key_def *key_def) { @@ -13821,10 +13781,8 @@ phia_index_scheme_init(struct phia_index *db, struct key_def *key_def) scheme->lru = 0; scheme->lru_step = 128 * 1024; scheme->buf_gc_wm = 1024 * 1024; - sf_upsertinit(&scheme->fmt_upsert); - sf_upsertset(&scheme->fmt_upsert, phia_upsert_cb); - sf_upsertset_arg(&scheme->fmt_upsert, key_def); sf_schemeinit(&scheme->scheme); + scheme->scheme.key_def = key_def; for (uint32_t i = 0; i < key_def->part_count; i++) { char name[32]; @@ -13878,7 +13836,6 @@ phia_index_scheme_init(struct phia_index *db, struct key_def *key_def) } db->r->scheme = &scheme->scheme; db->r->fmt_storage = scheme->fmt_storage; - db->r->fmt_upsert = &scheme->fmt_upsert; return 0; error: si_schemefree(scheme, &e->a); @@ -14137,12 +14094,10 @@ phia_index_read(struct phia_index *db, struct phia_document *o, arg->vlsn = 0; arg->vlsn_generate = 1; } - if (sf_upserthas(&db->scheme->fmt_upsert)) { - arg->upsert = 1; - if (arg->order == PHIA_EQ) { - arg->order = PHIA_GE; - arg->upsert_eq = 1; - } + arg->upsert = 1; + if (arg->order == PHIA_EQ) { + arg->order = PHIA_GE; + arg->upsert_eq = 1; } /* read index */ @@ -14509,9 +14464,6 @@ phia_replace(struct phia_tx *tx, struct phia_document *key) int phia_upsert(struct phia_tx *tx, struct phia_document *key) { - struct phia_index *db = key->db; - if (! sf_upserthas(&db->scheme->fmt_upsert)) - return sr_error("%s", "upsert callback is not set"); return phia_tx_write(tx, key, SVUPSERT); } @@ -14724,7 +14676,7 @@ phia_env_new(void) sf_limitinit(&e->limit, &e->a); sr_init(&e->r, &e->status, &e->a, &e->vfs, &e->quota, &e->conf.zones, &e->seq, SF_RAW, NULL, - NULL, &e->ei, &e->stat); + &e->ei, &e->stat); sx_managerinit(&e->xm, &e->r); si_cachepool_init(&e->cachepool, &e->r); sc_init(&e->scheduler, &e->r); diff --git a/src/box/phia_space.cc b/src/box/phia_space.cc index f2023c981a941dfd6868fced241edbdef49615a6..638611c71d928944f2dd67318bc44bd3a5e5053c 100644 --- a/src/box/phia_space.cc +++ b/src/box/phia_space.cc @@ -342,13 +342,11 @@ phia_upsert_do(char **result, uint32_t *result_size, int phia_upsert_cb(int count, - char **src, uint32_t *src_size, - char **upsert, uint32_t *upsert_size, - char **result, uint32_t *result_size, - void *arg) + char **src, uint32_t *src_size, + char **upsert, uint32_t *upsert_size, + char **result, uint32_t *result_size, + struct key_def *key_def) { - struct key_def *key_def = (struct key_def *)arg; - uint32_t value_field; value_field = key_def->part_count; diff --git a/src/box/phia_space.h b/src/box/phia_space.h index 619d112f9e4143c18bc6bdca56d2b193632405be..f8c2d6da121a6c579e1a71b5462871e45ab67029 100644 --- a/src/box/phia_space.h +++ b/src/box/phia_space.h @@ -49,12 +49,13 @@ struct PhiaSpace: public Handler { struct request *request); }; +struct key_def; /* TODO: move to phia.c */ extern "C" int phia_upsert_cb(int count, - char **src, uint32_t *src_size, - char **upsert, uint32_t *upsert_size, - char **result, uint32_t *result_size, - void *arg); + char **src, uint32_t *src_size, + char **upsert, uint32_t *upsert_size, + char **result, uint32_t *result_size, + struct key_def *key_def); #endif /* TARANTOOL_BOX_PHIA_SPACE_H_INCLUDED */