void val_gen_setup(WT_RAND_STATE *rnd, WT_ITEM *value) { size_t i, len; char *p; memset(value, 0, sizeof(WT_ITEM)); /* * Set initial buffer contents to recognizable text. * * Add a few extra bytes in order to guarantee we can always offset * into the buffer by a few extra bytes, used to generate different * data for column-store run-length encoded files. */ len = MAX(KILOBYTE(100), g.c_value_max) + 20; p = dmalloc(len); for (i = 0; i < len; ++i) p[i] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % 26]; value->mem = p; value->memsize = len; value->data = value->mem; value->size = 0; val_dup_data_len = value_len(rnd, (uint64_t)mmrand(rnd, 1, 20), g.c_value_min, g.c_value_max); }
void val_gen(WT_RAND_STATE *rnd, WT_ITEM *value, uint64_t keyno) { char *p; p = value->mem; value->data = value->mem; /* * Fixed-length records: take the low N bits from the last digit of * the record number. */ if (g.type == FIX) { switch (g.c_bitcnt) { case 8: p[0] = (char)mmrand(rnd, 1, 0xff); break; case 7: p[0] = (char)mmrand(rnd, 1, 0x7f); break; case 6: p[0] = (char)mmrand(rnd, 1, 0x3f); break; case 5: p[0] = (char)mmrand(rnd, 1, 0x1f); break; case 4: p[0] = (char)mmrand(rnd, 1, 0x0f); break; case 3: p[0] = (char)mmrand(rnd, 1, 0x07); break; case 2: p[0] = (char)mmrand(rnd, 1, 0x03); break; case 1: p[0] = 1; break; } value->size = 1; return; } /* * WiredTiger doesn't store zero-length data items in row-store files, * test that by inserting a zero-length data item every so often. */ if (keyno % 63 == 0) { p[0] = '\0'; value->size = 0; return; } /* * Start the data with a 10-digit number. * * For row and non-repeated variable-length column-stores, change the * leading number to ensure every data item is unique. For repeated * variable-length column-stores (that is, to test run-length encoding), * use the same data value all the time. */ if ((g.type == ROW || g.type == VAR) && g.c_repeat_data_pct != 0 && mmrand(rnd, 1, 100) < g.c_repeat_data_pct) { (void)strcpy(p, "DUPLICATEV"); p[10] = '/'; value->size = val_dup_data_len; } else { (void)sprintf(p, "%010" PRIu64, keyno); p[10] = '/'; value->size = value_len(rnd, keyno, g.c_value_min, g.c_value_max); } }
void val_gen(WT_RAND_STATE *rnd, WT_ITEM *value, uint64_t keyno) { char *p; p = value->mem; value->data = value->mem; /* * Fixed-length records: take the low N bits from the last digit of * the record number. */ if (g.type == FIX) { switch (g.c_bitcnt) { case 8: p[0] = (char)mmrand(rnd, 1, 0xff); break; case 7: p[0] = (char)mmrand(rnd, 1, 0x7f); break; case 6: p[0] = (char)mmrand(rnd, 1, 0x3f); break; case 5: p[0] = (char)mmrand(rnd, 1, 0x1f); break; case 4: p[0] = (char)mmrand(rnd, 1, 0x0f); break; case 3: p[0] = (char)mmrand(rnd, 1, 0x07); break; case 2: p[0] = (char)mmrand(rnd, 1, 0x03); break; case 1: p[0] = 1; break; } value->size = 1; return; } /* * WiredTiger doesn't store zero-length data items in row-store files, * test that by inserting a zero-length data item every so often. */ if (keyno % 63 == 0) { p[0] = '\0'; value->size = 0; return; } /* * Data items have unique leading numbers by default and random lengths; * variable-length column-stores use a duplicate data value to test RLE. */ if (g.type == VAR && mmrand(rnd, 1, 100) < g.c_repeat_data_pct) { (void)strcpy(p, "DUPLICATEV"); p[10] = '/'; value->size = val_dup_data_len; } else { u64_to_string_zf(keyno, p, 11); p[10] = '/'; value->size = value_len(rnd, keyno, g.c_value_min, g.c_value_max); } }
int parse_value(char *buf, size_t buflen, int *pos, value_descriptor *desc, void **value, size_t *_value_len) { if (*pos+3 > buflen) return 0; char *b=buf+*pos; if (!check_tag(&b[0],sizeof(key),keys,sizeof(keys)/sizeof(keys[0]))) return 0; if (!check_tag(&b[1],sizeof(field),fields,sizeof(fields)/sizeof(fields[0]))) return 0; if (b[1]!=LP_RECORD && !check_tag(&b[2],sizeof(datatype),datatypes,sizeof(datatypes)/sizeof(datatypes[0]))) return 0; memcpy(desc, b, sizeof (*desc)); b+=3; struct hash_item i={desc->f, desc->t, b}; *_value_len=value_len(i); if (*pos+3+*_value_len>buflen) return 0; *value=(void*)b; *pos+=3+*_value_len; return 1; }
void print_hash(hash *h) { int k; struct hash_item i; size_t l; int b; for (i=(*h)[k=0];k<LP_LAST;i=(*h)[++k]) if (i.v) switch (k) { case LP_SAMPLE_RATE: printf("sample rate %d\n",*(int*)i.v); break; case LP_SOURCE_MAC: printf("source mac address %02x:%02x:%02x:%02x:%02x:%02x\n",*(unsigned char*)i.v,*(unsigned char*)(i.v+1),*(unsigned char*)(i.v+2),*(unsigned char*)(i.v+3),*(unsigned char*)(i.v+4),*(unsigned char*)(i.v+5)); break; case LP_DEVICE_NAME: printf("device name %s\n",(char*)i.v); break; case LP_SAMPLES_COUNT: printf("samples count %d\n",*(short int*)i.v); break; case LP_TIME_OFFSET: printf("time offset %d\n",*(long int*)i.v); break; case LP_DEVICE_TIME: printf("device time %d\n",*(long int*)i.v); break; default: l=value_len(i); printf("unprintable value 0x%x (%d bytes)",k,l); for (b=0;b<l;b++) printf(" %02x",*(unsigned char*)(i.v+b)); printf("\n"); }; }