diff options
Diffstat (limited to 'xlators/features/changelog/src/changelog-encoders.c')
-rw-r--r-- | xlators/features/changelog/src/changelog-encoders.c | 118 |
1 files changed, 71 insertions, 47 deletions
diff --git a/xlators/features/changelog/src/changelog-encoders.c b/xlators/features/changelog/src/changelog-encoders.c index 8d45ee1ff..08626ee2f 100644 --- a/xlators/features/changelog/src/changelog-encoders.c +++ b/xlators/features/changelog/src/changelog-encoders.c @@ -56,6 +56,24 @@ fop_fn (void *data, char *buffer, gf_boolean_t encode) return bufsz; } +size_t +number_fn (void *data, char *buffer, gf_boolean_t encode) +{ + size_t bufsz = 0; + unsigned int nr = 0; + char buf[20] = {0,}; + + nr = *(unsigned int *) data; + + if (encode) { + (void) snprintf (buf, sizeof (buf), "%u", nr); + CHANGELOG_FILL_BUFFER (buffer, bufsz, buf, strlen (buf)); + } else + CHANGELOG_FILL_BUFFER (buffer, bufsz, &nr, sizeof (unsigned int)); + + return bufsz; +} + void entry_free_fn (void *data) { @@ -72,7 +90,7 @@ entry_free_fn (void *data) */ static inline void -changelog_encode_write_xtra (changelog_write_data_t *cwd, +changelog_encode_write_xtra (changelog_log_data_t *cld, char *buffer, size_t *off, gf_boolean_t encode) { int i = 0; @@ -82,11 +100,10 @@ changelog_encode_write_xtra (changelog_write_data_t *cwd, offset = *off; - co = (changelog_opt_t *) cwd->cwd_ptr; + co = (changelog_opt_t *) cld->cld_ptr; - for (; i < cwd->cwd_xtra_records; i++, co++) { - if (i) - CHANGELOG_FILL_BUFFER (buffer, offset, "\0", 1); + for (; i < cld->cld_xtra_records; i++, co++) { + CHANGELOG_FILL_BUFFER (buffer, offset, "\0", 1); switch (co->co_type) { case CHANGELOG_OPT_REC_FOP: @@ -95,11 +112,8 @@ changelog_encode_write_xtra (changelog_write_data_t *cwd, case CHANGELOG_OPT_REC_ENTRY: data = &co->co_entry; break; - case CHANGELOG_OPT_REC_ULL: - data = &co->co_number; - break; - case CHANGELOG_OPT_REC_UUID: - data = &co->co_uuid; + case CHANGELOG_OPT_REC_UINT32: + data = &co->co_uint32; break; } @@ -115,59 +129,69 @@ changelog_encode_write_xtra (changelog_write_data_t *cwd, } int -changelog_encode_ascii (xlator_t *this, - changelog_local_t *local, changelog_log_data_t *cld) +changelog_encode_ascii (xlator_t *this, changelog_log_data_t *cld) { - size_t off = 0; - size_t gfid_len = 0; - char *gfid_str = NULL; - char *buffer = NULL; - changelog_priv_t *priv = NULL; - changelog_write_data_t *cwd = NULL; + size_t off = 0; + size_t gfid_len = 0; + char *gfid_str = NULL; + char *buffer = NULL; + changelog_priv_t *priv = NULL; priv = this->private; - cwd = &cld->cld_wdata; - gfid_str = uuid_utoa (cwd->cwd_gfid); + gfid_str = uuid_utoa (cld->cld_gfid); gfid_len = strlen (gfid_str); /* extra bytes for decorations */ - buffer = alloca (gfid_len + cwd->cwd_ptr_len + 100); - if (!priv->no_gfid_hdr) - CHANGELOG_STORE_ASCII (priv, buffer, - off, gfid_str, gfid_len, cld); - - if (cwd->cwd_xtra_records) { - changelog_encode_write_xtra (cwd, buffer, &off, _gf_true); - CHANGELOG_FILL_BUFFER (buffer, off, "\0", 1); - } + buffer = alloca (gfid_len + cld->cld_ptr_len + 10); + CHANGELOG_STORE_ASCII (priv, buffer, + off, gfid_str, gfid_len, cld); + + if (cld->cld_xtra_records) + changelog_encode_write_xtra (cld, buffer, &off, _gf_true); - return changelog_write_change (this, priv, - local, buffer, off); + CHANGELOG_FILL_BUFFER (buffer, off, "\0", 1); + + return changelog_write_change (priv, buffer, off); } int -changelog_encode_binary (xlator_t *this, - changelog_local_t *local, changelog_log_data_t *cld) +changelog_encode_binary (xlator_t *this, changelog_log_data_t *cld) { - size_t off = 0; - char *buffer = NULL; - changelog_priv_t *priv = NULL; - changelog_write_data_t *cwd = NULL; + size_t off = 0; + char *buffer = NULL; + changelog_priv_t *priv = NULL; priv = this->private; - cwd = &cld->cld_wdata; /* extra bytes for decorations */ - buffer = alloca (sizeof (uuid_t) + cwd->cwd_ptr_len + 100); - if (!priv->no_gfid_hdr) - CHANGELOG_STORE_BINARY (priv, buffer, off, cwd->cwd_gfid, cld); + buffer = alloca (sizeof (uuid_t) + cld->cld_ptr_len + 10); + CHANGELOG_STORE_BINARY (priv, buffer, off, cld->cld_gfid, cld); - if (cwd->cwd_xtra_records) { - changelog_encode_write_xtra (cwd, buffer, &off, _gf_false); - CHANGELOG_FILL_BUFFER (buffer, off, "\0", 1); - } + if (cld->cld_xtra_records) + changelog_encode_write_xtra (cld, buffer, &off, _gf_false); + + CHANGELOG_FILL_BUFFER (buffer, off, "\0", 1); - return changelog_write_change (this, priv, - local, buffer, off); + return changelog_write_change (priv, buffer, off); +} + +static struct changelog_encoder +cb_encoder[] = { + [CHANGELOG_ENCODE_BINARY] = + { + .encoder = CHANGELOG_ENCODE_BINARY, + .encode = changelog_encode_binary, + }, + [CHANGELOG_ENCODE_ASCII] = + { + .encoder = CHANGELOG_ENCODE_ASCII, + .encode = changelog_encode_ascii, + }, +}; + +void +changelog_encode_change( changelog_priv_t * priv) +{ + priv->ce = &cb_encoder[priv->encode_mode]; } |