summaryrefslogtreecommitdiffstats
path: root/xlators/features/changelog/src/changelog-encoders.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/features/changelog/src/changelog-encoders.c')
-rw-r--r--xlators/features/changelog/src/changelog-encoders.c118
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];
}