text:
#ifndef ROCKSDB_LITE  // Lite does not support C API

#include "rocksdb/c.h"

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#ifndef OS_WIN
#  include <unistd.h>
#endif
#include <inttypes.h>

// Can not use port/port.h macros as this is a c file
#ifdef OS_WIN

#include <Windows.h>

# define snprintf _snprintf

// Ok for uniqueness
int geteuid() {

  int result = 0;

  result = ((int)GetCurrentProcessId() << 16);
  result |= (int)GetCurrentThreadId();

  return result;
}

#endif

const char* phase = "";
static char dbname[200];
static char dbbackupname[200];

static void StartPhase(const char* name) {
  fprintf(stderr, "=== Test %s\n", name);
  phase = name;
}

static const char* GetTempDir(void) {
    const char* ret = getenv("TEST_TMPDIR");
    if (ret == NULL || ret[0] == '\0')
        ret = "/tmp";
    return ret;
}

#define CheckNoError(err)                                               \
  if ((err) != NULL) {                                                  \
    fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, (err)); \
    abort();                                                            \
  }

#define CheckCondition(cond)                                            \
  if (!(cond)) {                                                        \
    fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, #cond); \
    abort();                                                            \
  }

static void CheckEqual(const char* expected, const char* v, size_t n) {
  if (expected == NULL && v == NULL) {
    // ok
  } else if (expected != NULL && v != NULL && n == strlen(expected) &&
             memcmp(expected, v, n) == 0) {
    // ok
    return;
  } else {
    fprintf(stderr, "%s: expected '%s', got '%s'\n",
            phase,
            (expected ? expected : "(null)"),
            (v ? v : "(null"));
    abort();
  }
}

static void Free(char** ptr) {
  if (*ptr) {
    free(*ptr);
    *ptr = NULL;
  }
}

static void CheckGet(
    rocksdb_t* db,
    const rocksdb_readoptions_t* options,
    const char* key,
    const char* expected) {
  char* err = NULL;
  size_t val_len;
  char* val;
  val = rocksdb_get(db, options, key, strlen(key), &val_len, &err);
  CheckNoError(err);
  CheckEqual(expected, val, val_len);
  Free(&val);
}

static void CheckGetCF(
    rocksdb_t* db,
    const rocksdb_readoptions_t* options,
    rocksdb_column_family_handle_t* handle,
    const char* key,
    const char* expected) {
  char* err = NULL;
  size_t val_len;
  char* val;
  val = rocksdb_get_cf(db, options, handle, key, strlen(key), &val_len, &err);
  CheckNoError(err);
  CheckEqual(expected, val, val_len);
  Free(&val);
}

static void CheckIter(rocksdb_iterator_t* iter,
                      const char* key, const char* val) {
  size_t len;
  const char* str;
  str = rocksdb_iter_key(iter, &len);
  CheckEqual(key, str, len);
  str = rocksdb_iter_value(iter, &len);
  CheckEqual(val, str, len);
}

// Callback from rocksdb_writebatch_iterate()
static void CheckPut(void* ptr,
                     const char* k, size_t klen,
                     const char* v, size_t vlen) {
  int* state = (int*) ptr;
  CheckCondition(*state < 2);
  switch (*state) {
    case 0:
      CheckEqual("bar", k, klen);
      CheckEqual("b", v, vlen);
      break;
    case 1:
      CheckEqual("box", k, klen);
      CheckEqual("c", v, vlen);
      break;
  }
  (*state)++;
}

// Callback from rocksdb_writebatch_iterate()
static void CheckDel(void* ptr, const char* k, size_t klen) {
  int* state = (int*) ptr;
  CheckCondition(*state == 2);
  CheckEqual("bar", k, klen);
  (*state)++;
}

static void CmpDestroy(void* arg) { }

static int CmpCompare(void* arg, const char* a, size_t alen,
                      const char* b, size_t blen) {
  size_t n = (alen < blen) ? alen : blen;
  int r = memcmp(a, b, n);
  if (r == 0) {
    if (alen < blen) r = -1;
    else if (alen > blen) r = +1;
  }
  return r;
}

static const char* CmpName(void* arg) {
  return "foo";
}

// Custom filter policy
static unsigned char fake_filter_result = 1;
static void FilterDestroy(void* arg) { }
static const char* FilterName(void* arg) {
  return "TestFilter";
}
static char* FilterCreate(
    void* arg,
    const char* const* key_array, const size_t* key_length_array,
    int num_keys,
    size_t* filter_length) {
  *filter_length = 4;
  char* result = malloc(4);
  memcpy(result, "fake", 4);
  return result;
}
static unsigned char FilterKeyMatch(
    void* arg,
    const char* key, size_t length,
    const char* filter, size_t filter_length) {
  CheckCondition(filter_length == 4);
  CheckCondition(memcmp(filter, "fake", 4) == 0);
  return fake_filter_result;
}

// Custom compaction filter
static void CFilterDestroy(void* arg) {}
static const char* CFilterName(void* arg) { return "foo"; }
static unsigned char CFilterFilter(void* arg, int level, const char* key,
                                   size_t key_length,
                                   const char* existing_value,
                                   size_t value_length, char** new_value,
                                   size_t* new_value_length,
                                   unsigned char* value_changed) {
  if (key_length == 3) {
    if (memcmp(key, "bar", key_length) == 0) {
      return 1;
    } else if (memcmp(key, "baz", key_length) == 0) {
      *value_changed = 1;
      *new_value = "newbazvalue";
      *new_value_length = 11;
      return 0;
    }
  }
  return 0;
}

static void CFilterFactoryDestroy(void* arg) {}
static const char* CFilterFactoryName(void* arg) { return "foo"; }
static rocksdb_compactionfilter_t* CFilterCreate(
    void* arg, rocksdb_compactionfiltercontext_t* context) {
  return rocksdb_compactionfilter_create(NULL, CFilterDestroy, CFilterFilter,
                                         CFilterName);
}

static rocksdb_t* CheckCompaction(rocksdb_t* db, rocksdb_options_t* options,
                                  rocksdb_readoptions_t* roptions,
                                  rocksdb_writeoptions_t* woptions) {
  char* err = NULL;
  db = rocksdb_open(options, dbname, &err);
  CheckNoError(err);
  rocksdb_put(db, woptions, "foo", 3, "foovalue", 8, &err);
  CheckNoError(err);
  CheckGet(db, roptions, "foo", "foovalue");
  rocksdb_put(db, woptions, "bar", 3, "barvalue", 8, &err);
  CheckNoError(err);
  CheckGet(db, roptions, "bar", "barvalue");
  rocksdb_put(db, woptions, "baz", 3, "bazvalue", 8, &err);
  CheckNoError(err);
  CheckGet(db, roptions, "baz", "bazvalue");

  // Force compaction
  rocksdb_compact_range(db, NULL, 0, NULL, 0);
  // should have filtered bar, but not foo
  CheckGet(db, roptions, "foo", "foovalue");
  CheckGet(db, roptions, "bar", NULL);
  CheckGet(db, roptions, "baz", "newbazvalue");
  return db;
}

// Custom compaction filter V2.
static void CompactionFilterV2Destroy(void* arg) { }
static const char* CompactionFilterV2Name(void* arg) {
  return "TestCompactionFilterV2";
}
static void CompactionFilterV2Filter(
    void* arg, int level, size_t num_keys,
    const char* const* keys_list, const size_t* keys_list_sizes,
    const char* const* existing_values_list, const size_t* existing_values_list_sizes,
    char** new_values_list, size_t* new_values_list_sizes,
    unsigned char* to_delete_list) {
  size_t i;
  for (i = 0; i < num_keys; i++) {
    // If any value is "gc", it's removed.
    if (existing_values_list_sizes[i] == 2 && memcmp(existing_values_list[i], "gc", 2) == 0) {
      to_delete_list[i] = 1;
    } else if (existing_values_list_sizes[i] == 6 && memcmp(existing_values_list[i], "gc all", 6) == 0) {
      // If any value is "gc all", all keys are removed.
      size_t j;
      for (j = 0; j < num_keys; j++) {
        to_delete_list[j] = 1;
      }
      return;
    } else if (existing_values_list_sizes[i] == 6 && memcmp(existing_values_list[i], "change", 6) == 0) {
      // If value is "change", set changed value to "changed".
      size_t len;
      len = strlen("changed");
      new_values_list[i] = malloc(len);
      memcpy(new_values_list[i], "changed", len);
      new_values_list_sizes[i] = len;
    } else {
      // Otherwise, no keys are removed.
    }
  }
}

// Custom prefix extractor for compaction filter V2 which extracts first 3 characters.
static void CFV2PrefixExtractorDestroy(void* arg) { }
static char* CFV2PrefixExtractorTransform(void* arg, const char* key, size_t length, size_t* dst_length) {
  // Verify keys are maximum length 4; this verifies fix for a
  // prior bug which was passing the RocksDB-encoded key with
  // logical timestamp suffix instead of parsed user key.
  if (length > 4) {
    fprintf(stderr, "%s:%d: %s: key %s is not user key\n", __FILE__, __LINE__, phase, key);
    abort();
  }
  *dst_length = length < 3 ? length : 3;
  return (char*)key;
}
static unsigned char CFV2PrefixExtractorInDomain(void* state, const char* key, size_t length) {
  return 1;
}
static unsigned char CFV2PrefixExtractorInRange(void* state, const char* key, size_t length) {
  return 1;
}
static const char* CFV2PrefixExtractorName(void* state) {
  return "TestCFV2PrefixExtractor";
}

// Custom compaction filter factory V2.
static void CompactionFilterFactoryV2Destroy(void* arg) {
  rocksdb_slicetransform_destroy((rocksdb_slicetransform_t*)arg);
}
static const char* CompactionFilterFactoryV2Name(void* arg) {
  return "TestCompactionFilterFactoryV2";
}
static rocksdb_compactionfilterv2_t* CompactionFilterFactoryV2Create(
    void* state, const rocksdb_compactionfiltercontext_t* context) {
  return rocksdb_compactionfilterv2_create(state, CompactionFilterV2Destroy,
                                           CompactionFilterV2Filter,
                                           CompactionFilterV2Name);
}

// Custom merge operator
static void MergeOperatorDestroy(void* arg) { }
static const char* MergeOperatorName(void* arg) {
  return "TestMergeOperator";
}
static char* MergeOperatorFullMerge(
    void* arg,
    const char* key, size_t key_length,
    const char* existing_value, size_t existing_value_length,
    const char* const* operands_list, const size_t* operands_list_length,
    int num_operands,
    unsigned char* success, size_t* new_value_length) {
  *new_value_length = 4;
  *success = 1;
  char* result = malloc(4);
  memcpy(result, "fake", 4);
  return result;
}
static char* MergeOperatorPartialMerge(
    void* arg,
    const char* key, size_t key_length,
    const char* const* operands_list, const size_t* operands_list_length,
    int num_operands,
    unsigned char* success, size_t* new_value_length) {
  *new_value_length = 4;
  *success = 1;
  char* result = malloc(4);
  memcpy(result, "fake", 4);
  return result;
}

int main(int argc, char** argv) {
  rocksdb_t* db;
  rocksdb_comparator_t* cmp;
  rocksdb_cache_t* cache;
  rocksdb_env_t* env;
  rocksdb_options_t* options;
  rocksdb_block_based_table_options_t* table_options;
  rocksdb_readoptions_t* roptions;
  rocksdb_writeoptions_t* woptions;
  char* err = NULL;
  int run = -1;

  snprintf(dbname, sizeof(dbname),
           "%s/rocksdb_c_test-%d",
           GetTempDir(),
           ((int) geteuid()));

  snprintf(dbbackupname, sizeof(dbbackupname),
           "%s/rocksdb_c_test-%d-backup",
           GetTempDir(),
           ((int) geteuid()));

  StartPhase("create_objects");
  cmp = rocksdb_comparator_create(NULL, CmpDestroy, CmpCompare, CmpName);
  env = rocksdb_create_default_env();
  cache = rocksdb_cache_create_lru(100000);

  options = rocksdb_options_create();
  rocksdb_options_set_comparator(options, cmp);
  rocksdb_options_set_error_if_exists(options, 1);
  rocksdb_options_set_env(options, env);
  rocksdb_options_set_info_log(options, NULL);
  rocksdb_options_set_write_buffer_size(options, 100000);
  rocksdb_options_set_paranoid_checks(options, 1);
  rocksdb_options_set_max_open_files(options, 10);
  table_options = rocksdb_block_based_options_create();
  rocksdb_block_based_options_set_block_cache(table_options, cache);
  rocksdb_options_set_block_based_table_factory(options, table_options);

  rocksdb_options_set_compression(options, rocksdb_no_compression);
  rocksdb_options_set_compression_options(options, -14, -1, 0);
  int compression_levels[] = {rocksdb_no_compression, rocksdb_no_compression,
                              rocksdb_no_compression, rocksdb_no_compression};
  rocksdb_options_set_compression_per_level(options, compression_levels, 4);

  roptions = rocksdb_readoptions_create();
  rocksdb_readoptions_set_verify_checksums(roptions, 1);
  rocksdb_readoptions_set_fill_cache(roptions, 0);

  woptions = rocksdb_writeoptions_create();
  rocksdb_writeoptions_set_sync(woptions, 1);

  StartPhase("destroy");
  rocksdb_destroy_db(options, dbname, &err);
  Free(&err);

  StartPhase("open_error");
  rocksdb_open(options, dbname, &err);
  CheckCondition(err != NULL);
  Free(&err);

  StartPhase("open");
  rocksdb_options_set_create_if_missing(options, 1);
  db = rocksdb_open(options, dbname, &err);
  CheckNoError(err);
  CheckGet(db, roptions, "foo", NULL);

  StartPhase("put");
  rocksdb_put(db, woptions, "foo", 3, "hello", 5, &err);
  CheckNoError(err);
  CheckGet(db, roptions, "foo", "hello");

  StartPhase("backup_and_restore");
  {
    rocksdb_destroy_db(options, dbbackupname, &err);
    CheckNoError(err);

    rocksdb_backup_engine_t *be = rocksdb_backup_engine_open(options, dbbackupname, &err);
    CheckNoError(err);

    rocksdb_backup_engine_create_new_backup(be, db, &err);
    CheckNoError(err);

    rocksdb_delete(db, woptions, "foo", 3, &err);
    CheckNoError(err);

    rocksdb_close(db);

    rocksdb_destroy_db(options, dbname, &err);
    CheckNoError(err);

    rocksdb_restore_options_t *restore_options = rocksdb_restore_options_create();
    rocksdb_restore_options_set_keep_log_files(restore_options, 0);
    rocksdb_backup_engine_restore_db_from_latest_backup(be, dbname, dbname, restore_options, &err);
    CheckNoError(err);
    rocksdb_restore_options_destroy(restore_options);

    rocksdb_options_set_error_if_exists(options, 0);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);
    rocksdb_options_set_error_if_exists(options, 1);

    CheckGet(db, roptions, "foo", "hello");

    rocksdb_backup_engine_close(be);
  }

  StartPhase("compactall");
  rocksdb_compact_range(db, NULL, 0, NULL, 0);
  CheckGet(db, roptions, "foo", "hello");

  StartPhase("compactrange");
  rocksdb_compact_range(db, "a", 1, "z", 1);
  CheckGet(db, roptions, "foo", "hello");

  StartPhase("writebatch");
  {
    rocksdb_writebatch_t* wb = rocksdb_writebatch_create();
    rocksdb_writebatch_put(wb, "foo", 3, "a", 1);
    rocksdb_writebatch_clear(wb);
    rocksdb_writebatch_put(wb, "bar", 3, "b", 1);
    rocksdb_writebatch_put(wb, "box", 3, "c", 1);
    rocksdb_writebatch_delete(wb, "bar", 3);
    rocksdb_write(db, woptions, wb, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "foo", "hello");
    CheckGet(db, roptions, "bar", NULL);
    CheckGet(db, roptions, "box", "c");
    int pos = 0;
    rocksdb_writebatch_iterate(wb, &pos, CheckPut, CheckDel);
    CheckCondition(pos == 3);
    rocksdb_writebatch_destroy(wb);
  }

  StartPhase("writebatch_vectors");
  {
    rocksdb_writebatch_t* wb = rocksdb_writebatch_create();
    const char* k_list[2] = { "z", "ap" };
    const size_t k_sizes[2] = { 1, 2 };
    const char* v_list[3] = { "x", "y", "z" };
    const size_t v_sizes[3] = { 1, 1, 1 };
    rocksdb_writebatch_putv(wb, 2, k_list, k_sizes, 3, v_list, v_sizes);
    rocksdb_write(db, woptions, wb, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "zap", "xyz");
    rocksdb_writebatch_delete(wb, "zap", 3);
    rocksdb_write(db, woptions, wb, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "zap", NULL);
    rocksdb_writebatch_destroy(wb);
  }

  StartPhase("writebatch_rep");
  {
    rocksdb_writebatch_t* wb1 = rocksdb_writebatch_create();
    rocksdb_writebatch_put(wb1, "baz", 3, "d", 1);
    rocksdb_writebatch_put(wb1, "quux", 4, "e", 1);
    rocksdb_writebatch_delete(wb1, "quux", 4);
    size_t repsize1 = 0;
    const char* rep = rocksdb_writebatch_data(wb1, &repsize1);
    rocksdb_writebatch_t* wb2 = rocksdb_writebatch_create_from(rep, repsize1);
    CheckCondition(rocksdb_writebatch_count(wb1) ==
                   rocksdb_writebatch_count(wb2));
    size_t repsize2 = 0;
    CheckCondition(
        memcmp(rep, rocksdb_writebatch_data(wb2, &repsize2), repsize1) == 0);
    rocksdb_writebatch_destroy(wb1);
    rocksdb_writebatch_destroy(wb2);
  }

  StartPhase("iter");
  {
    rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
    CheckCondition(!rocksdb_iter_valid(iter));
    rocksdb_iter_seek_to_first(iter);
    CheckCondition(rocksdb_iter_valid(iter));
    CheckIter(iter, "box", "c");
    rocksdb_iter_next(iter);
    CheckIter(iter, "foo", "hello");
    rocksdb_iter_prev(iter);
    CheckIter(iter, "box", "c");
    rocksdb_iter_prev(iter);
    CheckCondition(!rocksdb_iter_valid(iter));
    rocksdb_iter_seek_to_last(iter);
    CheckIter(iter, "foo", "hello");
    rocksdb_iter_seek(iter, "b", 1);
    CheckIter(iter, "box", "c");
    rocksdb_iter_get_error(iter, &err);
    CheckNoError(err);
    rocksdb_iter_destroy(iter);
  }

  StartPhase("multiget");
  {
    const char* keys[3] = { "box", "foo", "notfound" };
    const size_t keys_sizes[3] = { 3, 3, 8 };
    char* vals[3];
    size_t vals_sizes[3];
    char* errs[3];
    rocksdb_multi_get(db, roptions, 3, keys, keys_sizes, vals, vals_sizes, errs);

    int i;
    for (i = 0; i < 3; i++) {
      CheckEqual(NULL, errs[i], 0);
      switch (i) {
      case 0:
        CheckEqual("c", vals[i], vals_sizes[i]);
        break;
      case 1:
        CheckEqual("hello", vals[i], vals_sizes[i]);
        break;
      case 2:
        CheckEqual(NULL, vals[i], vals_sizes[i]);
        break;
      }
      Free(&vals[i]);
    }
  }

  StartPhase("approximate_sizes");
  {
    int i;
    int n = 20000;
    char keybuf[100];
    char valbuf[100];
    uint64_t sizes[2];
    const char* start[2] = { "a", "k00000000000000010000" };
    size_t start_len[2] = { 1, 21 };
    const char* limit[2] = { "k00000000000000010000", "z" };
    size_t limit_len[2] = { 21, 1 };
    rocksdb_writeoptions_set_sync(woptions, 0);
    for (i = 0; i < n; i++) {
      snprintf(keybuf, sizeof(keybuf), "k%020d", i);
      snprintf(valbuf, sizeof(valbuf), "v%020d", i);
      rocksdb_put(db, woptions, keybuf, strlen(keybuf), valbuf, strlen(valbuf),
                  &err);
      CheckNoError(err);
    }
    rocksdb_approximate_sizes(db, 2, start, start_len, limit, limit_len, sizes);
    CheckCondition(sizes[0] > 0);
    CheckCondition(sizes[1] > 0);
  }

  StartPhase("property");
  {
    char* prop = rocksdb_property_value(db, "nosuchprop");
    CheckCondition(prop == NULL);
    prop = rocksdb_property_value(db, "rocksdb.stats");
    CheckCondition(prop != NULL);
    Free(&prop);
  }

  StartPhase("snapshot");
  {
    const rocksdb_snapshot_t* snap;
    snap = rocksdb_create_snapshot(db);
    rocksdb_delete(db, woptions, "foo", 3, &err);
    CheckNoError(err);
    rocksdb_readoptions_set_snapshot(roptions, snap);
    CheckGet(db, roptions, "foo", "hello");
    rocksdb_readoptions_set_snapshot(roptions, NULL);
    CheckGet(db, roptions, "foo", NULL);
    rocksdb_release_snapshot(db, snap);
  }

  StartPhase("repair");
  {
    // If we do not compact here, then the lazy deletion of
    // files (https://reviews.facebook.net/D6123) would leave
    // around deleted files and the repair process will find
    // those files and put them back into the database.
    rocksdb_compact_range(db, NULL, 0, NULL, 0);
    rocksdb_close(db);
    rocksdb_options_set_create_if_missing(options, 0);
    rocksdb_options_set_error_if_exists(options, 0);
    rocksdb_repair_db(options, dbname, &err);
    CheckNoError(err);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "foo", NULL);
    CheckGet(db, roptions, "bar", NULL);
    CheckGet(db, roptions, "box", "c");
    rocksdb_options_set_create_if_missing(options, 1);
    rocksdb_options_set_error_if_exists(options, 1);
  }

  StartPhase("filter");
  for (run = 0; run < 2; run++) {
    // First run uses custom filter, second run uses bloom filter
    CheckNoError(err);
    rocksdb_filterpolicy_t* policy;
    if (run == 0) {
      policy = rocksdb_filterpolicy_create(
          NULL, FilterDestroy, FilterCreate, FilterKeyMatch, NULL, FilterName);
    } else {
      policy = rocksdb_filterpolicy_create_bloom(10);
    }

    rocksdb_block_based_options_set_filter_policy(table_options, policy);

    // Create new database
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    rocksdb_options_set_block_based_table_factory(options, table_options);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo", 3, "foovalue", 8, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar", 3, "barvalue", 8, &err);
    CheckNoError(err);
    rocksdb_compact_range(db, NULL, 0, NULL, 0);

    fake_filter_result = 1;
    CheckGet(db, roptions, "foo", "foovalue");
    CheckGet(db, roptions, "bar", "barvalue");
    if (phase == 0) {
      // Must not find value when custom filter returns false
      fake_filter_result = 0;
      CheckGet(db, roptions, "foo", NULL);
      CheckGet(db, roptions, "bar", NULL);
      fake_filter_result = 1;

      CheckGet(db, roptions, "foo", "foovalue");
      CheckGet(db, roptions, "bar", "barvalue");
    }
    // Reset the policy
    rocksdb_block_based_options_set_filter_policy(table_options, NULL);
    rocksdb_options_set_block_based_table_factory(options, table_options);
  }

  StartPhase("compaction_filter");
  {
    rocksdb_options_t* options_with_filter = rocksdb_options_create();
    rocksdb_options_set_create_if_missing(options_with_filter, 1);
    rocksdb_compactionfilter_t* cfilter;
    cfilter = rocksdb_compactionfilter_create(NULL, CFilterDestroy,
                                              CFilterFilter, CFilterName);
    // Create new database
    rocksdb_close(db);
    rocksdb_destroy_db(options_with_filter, dbname, &err);
    rocksdb_options_set_compaction_filter(options_with_filter, cfilter);
    db = CheckCompaction(db, options_with_filter, roptions, woptions);

    rocksdb_options_set_compaction_filter(options_with_filter, NULL);
    rocksdb_compactionfilter_destroy(cfilter);
    rocksdb_options_destroy(options_with_filter);
  }

  StartPhase("compaction_filter_factory");
  {
    rocksdb_options_t* options_with_filter_factory = rocksdb_options_create();
    rocksdb_options_set_create_if_missing(options_with_filter_factory, 1);
    rocksdb_compactionfilterfactory_t* factory;
    factory = rocksdb_compactionfilterfactory_create(
        NULL, CFilterFactoryDestroy, CFilterCreate, CFilterFactoryName);
    // Create new database
    rocksdb_close(db);
    rocksdb_destroy_db(options_with_filter_factory, dbname, &err);
    rocksdb_options_set_compaction_filter_factory(options_with_filter_factory,
                                                  factory);
    db = CheckCompaction(db, options_with_filter_factory, roptions, woptions);

    rocksdb_options_set_compaction_filter_factory(
        options_with_filter_factory, NULL);
    rocksdb_options_destroy(options_with_filter_factory);
  }

  StartPhase("compaction_filter_v2");
  {
    rocksdb_compactionfilterfactoryv2_t* factory;
    rocksdb_slicetransform_t* prefix_extractor;
    prefix_extractor = rocksdb_slicetransform_create(
        NULL, CFV2PrefixExtractorDestroy, CFV2PrefixExtractorTransform,
        CFV2PrefixExtractorInDomain, CFV2PrefixExtractorInRange,
        CFV2PrefixExtractorName);
    factory = rocksdb_compactionfilterfactoryv2_create(
        prefix_extractor, prefix_extractor, CompactionFilterFactoryV2Destroy,
        CompactionFilterFactoryV2Create, CompactionFilterFactoryV2Name);
    // Create new database
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    rocksdb_options_set_compaction_filter_factory_v2(options, factory);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);
    // Only foo2 is GC'd, foo3 is changed.
    rocksdb_put(db, woptions, "foo1", 4, "no gc", 5, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo2", 4, "gc", 2, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo3", 4, "change", 6, &err);
    CheckNoError(err);
    // All bars are GC'd.
    rocksdb_put(db, woptions, "bar1", 4, "no gc", 5, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar2", 4, "gc all", 6, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar3", 4, "no gc", 5, &err);
    CheckNoError(err);
    // Compact the DB to garbage collect.
    rocksdb_compact_range(db, NULL, 0, NULL, 0);

    // Verify foo entries.
    CheckGet(db, roptions, "foo1", "no gc");
    CheckGet(db, roptions, "foo2", NULL);
    CheckGet(db, roptions, "foo3", "changed");
    // Verify bar entries were all deleted.
    CheckGet(db, roptions, "bar1", NULL);
    CheckGet(db, roptions, "bar2", NULL);
    CheckGet(db, roptions, "bar3", NULL);
  }

  StartPhase("merge_operator");
  {
    rocksdb_mergeoperator_t* merge_operator;
    merge_operator = rocksdb_mergeoperator_create(
        NULL, MergeOperatorDestroy, MergeOperatorFullMerge,
        MergeOperatorPartialMerge, NULL, MergeOperatorName);
    // Create new database
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    rocksdb_options_set_merge_operator(options, merge_operator);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo", 3, "foovalue", 8, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "foo", "foovalue");
    rocksdb_merge(db, woptions, "foo", 3, "barvalue", 8, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "foo", "fake");

    // Merge of a non-existing value
    rocksdb_merge(db, woptions, "bar", 3, "barvalue", 8, &err);
    CheckNoError(err);
    CheckGet(db, roptions, "bar", "fake");

  }

  StartPhase("columnfamilies");
  {
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    CheckNoError(err)

    rocksdb_options_t* db_options = rocksdb_options_create();
    rocksdb_options_set_create_if_missing(db_options, 1);
    db = rocksdb_open(db_options, dbname, &err);
    CheckNoError(err)
    rocksdb_column_family_handle_t* cfh;
    cfh = rocksdb_create_column_family(db, db_options, "cf1", &err);
    rocksdb_column_family_handle_destroy(cfh);
    CheckNoError(err);
    rocksdb_close(db);

    size_t cflen;
    char** column_fams = rocksdb_list_column_families(db_options, dbname, &cflen, &err);
    CheckNoError(err);
    CheckEqual("default", column_fams[0], 7);
    CheckEqual("cf1", column_fams[1], 3);
    CheckCondition(cflen == 2);
    rocksdb_list_column_families_destroy(column_fams, cflen);

    rocksdb_options_t* cf_options = rocksdb_options_create();

    const char* cf_names[2] = {"default", "cf1"};
    const rocksdb_options_t* cf_opts[2] = {cf_options, cf_options};
    rocksdb_column_family_handle_t* handles[2];
    db = rocksdb_open_column_families(db_options, dbname, 2, cf_names, cf_opts, handles, &err);
    CheckNoError(err);

    rocksdb_put_cf(db, woptions, handles[1], "foo", 3, "hello", 5, &err);
    CheckNoError(err);

    CheckGetCF(db, roptions, handles[1], "foo", "hello");

    rocksdb_delete_cf(db, woptions, handles[1], "foo", 3, &err);
    CheckNoError(err);

    CheckGetCF(db, roptions, handles[1], "foo", NULL);

    rocksdb_writebatch_t* wb = rocksdb_writebatch_create();
    rocksdb_writebatch_put_cf(wb, handles[1], "baz", 3, "a", 1);
    rocksdb_writebatch_clear(wb);
    rocksdb_writebatch_put_cf(wb, handles[1], "bar", 3, "b", 1);
    rocksdb_writebatch_put_cf(wb, handles[1], "box", 3, "c", 1);
    rocksdb_writebatch_delete_cf(wb, handles[1], "bar", 3);
    rocksdb_write(db, woptions, wb, &err);
    CheckNoError(err);
    CheckGetCF(db, roptions, handles[1], "baz", NULL);
    CheckGetCF(db, roptions, handles[1], "bar", NULL);
    CheckGetCF(db, roptions, handles[1], "box", "c");
    rocksdb_writebatch_destroy(wb);

    const char* keys[3] = { "box", "box", "barfooxx" };
    const rocksdb_column_family_handle_t* get_handles[3] = { handles[0], handles[1], handles[1] };
    const size_t keys_sizes[3] = { 3, 3, 8 };
    char* vals[3];
    size_t vals_sizes[3];
    char* errs[3];
    rocksdb_multi_get_cf(db, roptions, get_handles, 3, keys, keys_sizes, vals, vals_sizes, errs);

    int i;
    for (i = 0; i < 3; i++) {
      CheckEqual(NULL, errs[i], 0);
      switch (i) {
      case 0:
        CheckEqual(NULL, vals[i], vals_sizes[i]); // wrong cf
        break;
      case 1:
        CheckEqual("c", vals[i], vals_sizes[i]); // bingo
        break;
      case 2:
        CheckEqual(NULL, vals[i], vals_sizes[i]); // normal not found
        break;
      }
      Free(&vals[i]);
    }

    rocksdb_iterator_t* iter = rocksdb_create_iterator_cf(db, roptions, handles[1]);
    CheckCondition(!rocksdb_iter_valid(iter));
    rocksdb_iter_seek_to_first(iter);
    CheckCondition(rocksdb_iter_valid(iter));

    for (i = 0; rocksdb_iter_valid(iter) != 0; rocksdb_iter_next(iter)) {
      i++;
    }
    CheckCondition(i == 1);
    rocksdb_iter_get_error(iter, &err);
    CheckNoError(err);
    rocksdb_iter_destroy(iter);

    rocksdb_drop_column_family(db, handles[1], &err);
    CheckNoError(err);
    for (i = 0; i < 2; i++) {
      rocksdb_column_family_handle_destroy(handles[i]);
    }
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    rocksdb_options_destroy(db_options);
    rocksdb_options_destroy(cf_options);
  }

  StartPhase("prefix");
  {
    // Create new database
    rocksdb_options_set_allow_mmap_reads(options, 1);
    rocksdb_options_set_prefix_extractor(options, rocksdb_slicetransform_create_fixed_prefix(3));
    rocksdb_options_set_hash_skip_list_rep(options, 5000, 4, 4);
    rocksdb_options_set_plain_table_factory(options, 4, 10, 0.75, 16);

    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);

    rocksdb_put(db, woptions, "foo1", 4, "foo", 3, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo2", 4, "foo", 3, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "foo3", 4, "foo", 3, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar1", 4, "bar", 3, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar2", 4, "bar", 3, &err);
    CheckNoError(err);
    rocksdb_put(db, woptions, "bar3", 4, "bar", 3, &err);
    CheckNoError(err);

    rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
    CheckCondition(!rocksdb_iter_valid(iter));

    rocksdb_iter_seek(iter, "bar", 3);
    rocksdb_iter_get_error(iter, &err);
    CheckNoError(err);
    CheckCondition(rocksdb_iter_valid(iter));

    CheckIter(iter, "bar1", "bar");
    rocksdb_iter_next(iter);
    CheckIter(iter, "bar2", "bar");
    rocksdb_iter_next(iter);
    CheckIter(iter, "bar3", "bar");
    rocksdb_iter_get_error(iter, &err);
    CheckNoError(err);
    rocksdb_iter_destroy(iter);

    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
  }

  StartPhase("cuckoo_options");
  {
    rocksdb_cuckoo_table_options_t* cuckoo_options;
    cuckoo_options = rocksdb_cuckoo_options_create();
    rocksdb_cuckoo_options_set_hash_ratio(cuckoo_options, 0.5);
    rocksdb_cuckoo_options_set_max_search_depth(cuckoo_options, 200);
    rocksdb_cuckoo_options_set_cuckoo_block_size(cuckoo_options, 10);
    rocksdb_cuckoo_options_set_identity_as_first_hash(cuckoo_options, 1);
    rocksdb_cuckoo_options_set_use_module_hash(cuckoo_options, 0);
    rocksdb_options_set_cuckoo_table_factory(options, cuckoo_options);

    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);

    rocksdb_cuckoo_options_destroy(cuckoo_options);
  }

  StartPhase("iterate_upper_bound");
  {
    // Create new empty database
    rocksdb_close(db);
    rocksdb_destroy_db(options, dbname, &err);
    CheckNoError(err);

    rocksdb_options_set_prefix_extractor(options, NULL);
    db = rocksdb_open(options, dbname, &err);
    CheckNoError(err);

    rocksdb_put(db, woptions, "a",    1, "0",    1, &err); CheckNoError(err);
    rocksdb_put(db, woptions, "foo",  3, "bar",  3, &err); CheckNoError(err);
    rocksdb_put(db, woptions, "foo1", 4, "bar1", 4, &err); CheckNoError(err);
    rocksdb_put(db, woptions, "g1",   2, "0",    1, &err); CheckNoError(err);

    // testing basic case with no iterate_upper_bound and no prefix_extractor
    {
       rocksdb_readoptions_set_iterate_upper_bound(roptions, NULL, 0);
       rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);

       rocksdb_iter_seek(iter, "foo", 3);
       CheckCondition(rocksdb_iter_valid(iter));
       CheckIter(iter, "foo", "bar");

       rocksdb_iter_next(iter);
       CheckCondition(rocksdb_iter_valid(iter));
       CheckIter(iter, "foo1", "bar1");

       rocksdb_iter_next(iter);
       CheckCondition(rocksdb_iter_valid(iter));
       CheckIter(iter, "g1", "0");

       rocksdb_iter_destroy(iter);
    }

    // testing iterate_upper_bound and forward iterator
    // to make sure it stops at bound
    {
       // iterate_upper_bound points beyond the last expected entry
       rocksdb_readoptions_set_iterate_upper_bound(roptions, "foo2", 4);

       rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);

       rocksdb_iter_seek(iter, "foo", 3);
       CheckCondition(rocksdb_iter_valid(iter));
       CheckIter(iter, "foo", "bar");

       rocksdb_iter_next(iter);
       CheckCondition(rocksdb_iter_valid(iter));
       CheckIter(iter, "foo1", "bar1");

       rocksdb_iter_next(iter);
       // should stop here...
       CheckCondition(!rocksdb_iter_valid(iter));

       rocksdb_iter_destroy(iter);
    }
  }

  StartPhase("cleanup");
  rocksdb_close(db);
  rocksdb_options_destroy(options);
  rocksdb_block_based_options_destroy(table_options);
  rocksdb_readoptions_destroy(roptions);
  rocksdb_writeoptions_destroy(woptions);
  rocksdb_cache_destroy(cache);
  rocksdb_comparator_destroy(cmp);
  rocksdb_env_destroy(env);

  fprintf(stderr, "PASS\n");
  return 0;
}

#else
#include <stdio.h>

int main() {
  fprintf(stderr, "SKIPPED\n");
  return 0;
}

#endif  // !ROCKSDB_LITE


text:
import os, sys, time

from . import client, root, CassandraTester

from thrift.Thrift import TApplicationException
from ttypes import batch_mutation_t, batch_mutation_super_t, superColumn_t, column_t, NotFoundException

_SIMPLE_COLUMNS = [column_t(columnName='c1', value='value1', timestamp=0),
                   column_t(columnName='c2', value='value2', timestamp=0)]
_SUPER_COLUMNS = [superColumn_t(name='sc1',
                                columns=[column_t(columnName='c4', value='value4', timestamp=0)]),
                  superColumn_t(name='sc2',
                                columns=[column_t(columnName='c5', value='value5', timestamp=0),
                                         column_t(columnName='c6', value='value6', timestamp=0)])]

def _insert_simple(method=client.insert_blocking):
    method('Table1', 'key1', 'Standard1:c1', 'value1', 0)
    method('Table1', 'key1', 'Standard1:c2', 'value2', 0)

def _insert_batch(method):
    cfmap = {'Standard1': _SIMPLE_COLUMNS,
             'Standard2': _SIMPLE_COLUMNS}
    method(batch_mutation_t(table='Table1', key='key1', cfmap=cfmap))

def _verify_batch():
    _verify_simple()
    assert client.get_slice('Table1', 'key1', 'Standard2', -1, -1) == _SIMPLE_COLUMNS

def _verify_simple():
    assert client.get_column('Table1', 'key1', 'Standard1:c1') == \
        column_t(columnName='c1', value='value1', timestamp=0)
    assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == _SIMPLE_COLUMNS

def _insert_super():
    client.insert('Table1', 'key1', 'Super1:sc1:c4', 'value4', 0)
    client.insert('Table1', 'key1', 'Super1:sc2:c5', 'value5', 0)
    client.insert('Table1', 'key1', 'Super1:sc2:c6', 'value6', 0)
    time.sleep(0.1)

def _verify_super():
    assert client.get_column('Table1', 'key1', 'Super1:sc1:c4') == \
        column_t(columnName='c4', value='value4', timestamp=0)
    slice = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
    assert slice == _SUPER_COLUMNS, slice

def _expect_missing(fn):
    try:
        r = fn()
    except NotFoundException:
        pass
    else:
        raise Exception('expected missing result; got %s' % r)

class TestMutations(CassandraTester):
    def test_empty_slice(self):
        assert client.get_slice('Mytable', 'key1', 'Standard2', -1, -1) == []

    def test_empty_slice_super(self):
        assert client.get_slice('Mytable', 'key1', 'Super1', -1, -1) == []

    def test_missing_super(self):
        _expect_missing(lambda: client.get_column('Mytable', 'key1', 'Super1:sc1'))

    def test_count(self):
        assert client.get_column_count('Mytable', 'key1', 'Standard2') == 0

    def test_insert(self):
        _insert_simple(client.insert)
        time.sleep(0.1)
        _verify_simple()

    def test_insert_blocking(self):
        _insert_simple(client.insert_blocking)
        _verify_simple()

    def test_super_insert(self):
        _insert_super()
        _verify_super()

    def test_batch_insert(self):
        _insert_batch(client.batch_insert)
        time.sleep(0.1)
        _verify_batch()

    def test_batch_insert_blocking(self):
        _insert_batch(client.batch_insert_blocking)
        _verify_batch()

# does not pass
#     def test_batch_insert_super(self):
#         cfmap = {'Super1': _SUPER_COLUMNS,
#                  'Standard2': _SUPER_COLUMNS}
#         client.batch_insert_superColumn(batch_mutation_t(table='Table1', key='key1', cfmap=cfmap))
#         time.sleep(0.5)
#         _verify_super()
#         assert client.get_slice_super('Table1', 'key1', 'Super2', -1, -1) == _SUPER_COLUMNS

    def test_cf_remove_column(self):
        _insert_simple()
        client.remove('Table1', 'key1', 'Standard1:c1', 1)
        time.sleep(0.1)
        _expect_missing(lambda: client.get_column('Table1', 'key1', 'Standard1:c1'))
        assert client.get_column('Table1', 'key1', 'Standard1:c2') == \
            column_t(columnName='c2', value='value2', timestamp=0)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == \
            [column_t(columnName='c2', value='value2', timestamp=0)]

        # New insert, make sure it shows up post-remove:
        client.insert('Table1', 'key1', 'Standard1:c3', 'value3', 0)
        time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == \
            [column_t(columnName='c2', value='value2', timestamp=0),
             column_t(columnName='c3', value='value3', timestamp=0)]

        # Test resurrection.  First, re-insert the value w/ older timestamp,
        # and make sure it stays removed:
        client.insert('Table1', 'key1', 'Standard1:c1', 'value1', 0)
        time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == \
            [column_t(columnName='c2', value='value2', timestamp=0),
             column_t(columnName='c3', value='value3', timestamp=0)]
        # Next, w/ a newer timestamp; it should come back:
        client.insert('Table1', 'key1', 'Standard1:c1', 'value1', 2)
        time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == \
            [column_t(columnName='c1', value='value1', timestamp=2),
             column_t(columnName='c2', value='value2', timestamp=0),
             column_t(columnName='c3', value='value3', timestamp=0)]

    def test_cf_remove(self):
        _insert_simple()
        _insert_super()

        # Remove the key1:Standard1 cf:
        client.remove('Table1', 'key1', 'Standard1', 3)
        time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == []
        _verify_super()

        # Test resurrection.  First, re-insert a value w/ older timestamp,
        # and make sure it stays removed:
        client.insert('Table1', 'key1', 'Standard1:c1', 'value1', 0)
        time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == []
        # Next, w/ a newer timestamp; it should come back:
        client.insert('Table1', 'key1', 'Standard1:c1', 'value1', 4)
        # time.sleep(0.1)
        assert client.get_slice('Table1', 'key1', 'Standard1', -1, -1) == \
            [column_t(columnName='c1', value='value1', timestamp=4)]

    def test_super_cf_remove_column(self):
        _insert_simple()
        _insert_super()

        # Make sure remove clears out what it's supposed to, and _only_ that:
        client.remove('Table1', 'key1', 'Super1:sc2:c5', 5)
        time.sleep(0.1)
        _expect_missing(lambda: client.get_column('Table1', 'key1', 'Super1:sc2:c5'))
        assert client.get_slice_super('Table1', 'key1', 'Super1', -1, -1) == \
            [superColumn_t(name='sc1',
                           columns=[column_t(columnName='c4', value='value4', timestamp=0)]),
             superColumn_t(name='sc2',
                           columns=[column_t(columnName='c6', value='value6', timestamp=0)])]
        _verify_simple()

        # New insert, make sure it shows up post-remove:
        client.insert('Table1', 'key1', 'Super1:sc2:c7', 'value7', 0)
        time.sleep(0.1)
        scs = [superColumn_t(name='sc1',
                             columns=[column_t(columnName='c4', value='value4', timestamp=0)]),
               superColumn_t(name='sc2',
                             columns=[column_t(columnName='c6', value='value6', timestamp=0),
                                      column_t(columnName='c7', value='value7', timestamp=0)])]

        assert client.get_slice_super('Table1', 'key1', 'Super1', -1, -1) == scs

        # Test resurrection.  First, re-insert the value w/ older timestamp,
        # and make sure it stays removed:
        client.insert('Table1', 'key1', 'Super1:sc2:c5', 'value5', 0)
        time.sleep(0.1)
        actual = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
        assert actual == scs, actual

        # Next, w/ a newer timestamp; it should come back
        client.insert('Table1', 'key1', 'Super1:sc2:c5', 'value5', 6)
        time.sleep(0.1)
        actual = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
        assert actual == \
            [superColumn_t(name='sc1',
                           columns=[column_t(columnName='c4', value='value4', timestamp=0)]),
             superColumn_t(name='sc2',
                           columns=[column_t(columnName='c5', value='value5', timestamp=6),
                                    column_t(columnName='c6', value='value6', timestamp=0),
                                    column_t(columnName='c7', value='value7', timestamp=0)])], actual

    def test_super_cf_remove_supercolumn(self):
        _insert_simple()
        _insert_super()

        # Make sure remove clears out what it's supposed to, and _only_ that:
        client.remove('Table1', 'key1', 'Super1:sc2', 5)
        time.sleep(0.1)
        _expect_missing(lambda: client.get_column('Table1', 'key1', 'Super1:sc2:c5'))
        actual = client.get_slice_super('Table1', 'key1', 'Super1:sc2', -1, -1)
        assert actual == [], actual
        scs = [superColumn_t(name='sc1',
                             columns=[column_t(columnName='c4', value='value4', timestamp=0)])]
        actual = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
        assert actual == scs, actual
        _verify_simple()

        # Test resurrection.  First, re-insert the value w/ older timestamp,
        # and make sure it stays removed:
        client.insert('Table1', 'key1', 'Super1:sc2:c5', 'value5', 0)
        time.sleep(0.1)
        actual = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
        assert actual == scs, actual

        # Next, w/ a newer timestamp; it should come back
        client.insert('Table1', 'key1', 'Super1:sc2:c5', 'value5', 6)
        time.sleep(0.1)
        actual = client.get_slice_super('Table1', 'key1', 'Super1', -1, -1)
        assert actual == \
            [superColumn_t(name='sc1',
                           columns=[column_t(columnName='c4', value='value4', timestamp=0)]),
             superColumn_t(name='sc2',
                           columns=[column_t(columnName='c5', value='value5', timestamp=6)])], actual

    def test_empty_range(self):
        assert client.get_range('Table1', '') == []

    def test_range(self):
        _insert_simple()
        assert client.get_range('Table1', 'key1') == ['key1']

        client.remove('Table1', 'key1', 'Standard1:c1', 1)
        client.remove('Table1', 'key1', 'Standard1:c2', 1)
        assert client.get_range('Table1', 'key1') == []

redpajama_set_name: RedPajamaGithub


Need a new copywriting website project, or a custom package? Click here to complete my contact form.
*Packages don't include building a new website from scratch, or creating original copy from inception. Please complete the Contact Form for a custom quote.


text:
Anarrhinum bellidifolium är en grobladsväxtart. Anarrhinum bellidifolium ingår i släktet gapmunnar, och familjen grobladsväxter.

Underarter

Arten delas in i följande underarter:

 A. b. bellidifolium
 A. b. laxiflorum

Bildgalleri

Källor

Externa länkar

Gapmunnar
bellidifolium

redpajama_set_name: RedPajamaWikipedia


text:
Mueller Cannot Seek an Indictment. And He Must Remain Silent.
The unusual situation facing Robert Mueller does not justify a repeal of well-established traditions of confidentiality.
Served as independent counsel during the Clinton presidency
Yuri Gripas / Reuters
As the nation awaits the Mueller report, a return to first principles is in order. One relevant first principle was dramatically illustrated in the breach during the waning weeks of the 2016 presidential campaign. Then–FBI Director James Comey announced at a press conference that no criminal charges would be brought against Hillary Clinton. Comey didn't stop there, however. In that press conference, which will continue to live in infamy, Comey sharply criticized the former secretary of state for her ill-considered conduct in housing a server in her private residence, only to receive official and—not infrequently—classified information.
The nation should have risen, as one, in righteous indignation in the aftermath of the Comey press conference. In a single misadventure, Comey both seized power that was not his—the power to seek an indictment, a prerogative that was entrusted to the attorney general—and then violated one of the fundamental principles of public prosecution: Thou shalt not drag a subject or target of the investigation through the mud via public criticism. Prosecutors either seek an indictment, or remain quiet.
Robert Mueller is not your everyday prosecutor, however. Under Department of Justice policy, a sitting president cannot be indicted. This prosecutor, unlike other prosecutors, cannot indict if he finds an indictable offense. And in contrast to the practices and policies that govern thousands of federal prosecutors around the country, this former FBI director—now a special counsel—has a specific reporting obligation. That solemn obligation is not to produce a public report. He cannot seek an indictment. And he must remain quiet.
Read: What Mueller leaves behind
Little attention has been paid, at least in public discussion, to the parsimonious provisions of the regulations governing special counsels. Yet those regulations have been on the books for two decades, without any material change. They should have been carefully analyzed long before now, because they were triggered to much public fanfare in May 2017 by Acting Attorney General Rod Rosenstein's appointment of Mueller to serve—and this is crucial—as a special counsel within the Department of Justice.
Under the regulations that governed his appointment and now guide his final acts, Mueller is to provide a confidential report to one person only: the attorney general. The regulations, which were promulgated during the final months of the Clinton administration, do not contemplate any sort of report sent directly from the special counsel to Congress or the general public. To the contrary, the regulations call upon the attorney general, William Barr, to receive the confidential report and then do two things: First, to notify Congress of the investigation's completion and, second, to provide an explanation for certain specifically enumerated actions. There is no requirement for a Barr-edited version of the Mueller report.
In short, there may be no Mueller report at all, save for the confidential document that lands on Barr's desk. And these same regulations do not require the attorney general to simply pass along a confidential report that may very well contain unflattering information about one or more individuals. Including the president.
The fact that this prosecutor, unlike other prosecutors, cannot indict if he finds an indictable offense may seem to put pressure on the attorney general to share the report with Congress, which can remedy presidential misconduct through impeachment.
Read: The attorney general's letter confirming that Mueller's investigation is over
But this unusual situation does not somehow work a repeal of well-established traditions of confidentiality. If the House wants to consider impeachment, it needs to do its own work. It would be odd in the extreme to ask, in effect, the executive branch to become a tool of the legislative branch in a death-struggle with the only individual identified in the Constitution as the possessor and wielder of executive power: the president. That was the old way, under the old statute. Congress did away with that approach, and wisely so.
The regulations now governing Mueller were meant to restore the traditions of the Department of Justice, which were broken when Congress enacted the special-prosecutor (or, later, independent-counsel) provisions of the Ethics in Government Act of 1978. Under that regime, reports became the warp and woof of the independent counsel's work. Most provocatively, the statute required an independent counsel to refer matters to the House of Representatives for possible impeachment when a surprisingly low threshold of evidence was in hand—"substantial and credible information that an impeachable offense may have been committed." I followed that requirement when I produced the so-called Starr Report, which then took on a controversial life of its own in the House in the dramatic months of 1998.
The architects of the current regulations saw all this unfold. Not surprisingly, the drafters of the new regime—the one under which Mueller operates—set themselves firmly against the revolutionary principle of factually rich prosecutorial reports. It might seem strange for me to say, but they were right to do so. The message emanating from the new regulations, issued by then–Attorney General Janet Reno, was this: Special counsel, do your job, and then inform the attorney general—in confidence—of the reasons underlying your decisions to prosecute and your determinations not to seek a prosecution ("declinations").
Read: The ongoing investigations still surrounding Trump
This is not to say that Barr's hands are tied. Mueller is in regulatory handcuffs, but Barr—as the attorney general—still maintains a goodly amount of discretion as to what he will choose to report to Congress. In his exercise of discretion, Barr may well opt in favor of transparency, while complying with statutory obligations not to reveal grand-jury information. (His letter to Congress said that he is "committed to as much transparency as possible," and that he would consult with Mueller and Rosenstein to "determine what other information from the report can be released to Congress and the public consistent with the law, including the Special Counsel regulations, and the Department's long-standing practices and policies.")
Barr also has inherent discretion, as an officer of the Justice Department, to share whatever he intends to report to Congress with the president and the president's lawyers. Why would he do that? To ensure that the president's constitutionally recognized privilege—executive privilege—is dutifully safeguarded.
The attorney general also has the raw power to jettison the regulations entirely. Unlike a statute, the regulations may be dispatched by the stroke of a pen, and new ones put in place. He may determine that the public interest requires maximum transparency, as long as grand-jury secrecy is scrupulously maintained. But unless and until the attorney general takes that bold action, the current regulations stand and have the force of law.
That is perhaps the most fundamental of governing principles—the regulations are the law of the land, and must be obeyed.
So what might the underlying confidential report from the special counsel to the attorney general look like? In keeping with the regulations, it could be a short executive summary, with lots of attachments—namely, the indictments that the Mueller probe has successfully presented to grand juries in the District of Columbia and the Eastern District of Virginia.
Then again, as my friend Jonathan Turley, an astute observer of the Washington legal scene, colorfully put it not long ago, the Mueller report might "read more like War and Peace."
But as we all peer into our respective crystal balls, and speculation abounds, we will do well to return to first principles. That means, in this case, accepting that the special counsel cannot seek an indictment, and must remain quiet.
Ken Starr is a former federal judge and U.S. solicitor general. He served as independent counsel in the Whitewater and Monica Lewinsky investigations during the presidency of Bill Clinton.

redpajama_set_name: RedPajamaCommonCrawl


text:
Dance Party with Curley Taylor and Zydeco Trouble
District N9NE, 460 North 9th Street, Philadelphia
wxpn-zydeco-crossroads-2014-03.png
Ruben Moreno. Photo courtesy of the artist.
WXPN's yearlong project explores the origins and evolution of zydeco, a form of African-American roots music that blends Cajun traditions, blues, and R&B. On Saturday, December 6, Zydeco Crossroads welcomes Curley Taylor & Zydeco Trouble to District N9NE for a free dance party, complete with pre-show dance lessons from Louisiana's Harold Guillory.
Supported by The Pew Center for Arts & Heritage, Zydeco Crossroads captures the vitality of contemporary zydeco music, with project highlights that include free concerts at World Cafe Live; Philadelphia Folk Festival performances; community events with local music and dance group Allons Danser; and the premiere of a newly commissioned zydeco documentary by filmmaker Robert Mugge. Visit the Zydeco Crossroads website, an "interactive history" and ongoing archive.
7:00 p.m. – Doors
7:30 p.m. – Zydeco dance lesson with Harold Guillory from Lake Charles, Louisiana
8:30 p.m. – Curley Taylor and Zydeco Trouble: First Set
10:30 p.m. – Curley Taylor and Zydeco Trouble: Second Set
Standing-Room, 21+ Only
Event listing at the Zydeco Crossroads website
Zydeco Crossroads
WXPN, University of Pennsylvania
Related Questions of Practice
Inside WXPN: Q&A with Roger LaMay
Now Available: Zydeco Crossroads Documentary, a Musical Journey from Philadelphia to Lafayette, Louisiana
The Pew Center for Arts & Heritage Announces 2014 Grants for Philadelphia Artists and Organizations
Zydeco Crossroads Dance Party with Chubby Carrier and the Bayou Swamp Band
Zydeco Crossroads Radio Hour and Live Broadcast with Creole United
Potluck and Dance Party with Rosie Ledet & the Zydeco Playboys
Questions of Practice: Artist Mariam Ghani on Collaboration in Socially Engaged Art
Multimedia artist Mariam Ghani discusses the importance of community collaborations for artists seeking to effect social change.
questions-of-practice-artist-mariam-ghani-on-collaboration-in-socially-engaged-art
Red-Eye to Havre de Grace at New York Theatre Workshop
Thaddeus Phillips teams up with the Minneapolis-based musical duo Wilhelm Bros. & Co. to create this action-opera about Edgar Allan Poe's mysterious last days.
red-eye-to-havre-de-grace-at-new-york-theatre-workshop
Gospel Roots of Rock and Soul: Radio Documentary
A year of live performances, interviews, and a multimedia website culminates with the launch of the WXPN's Gospel Roots of Rock and Soul radio documentary, broadcast to national audiences
gospel-roots-of-rock-and-soul-radio-documentary
New Paradise Laboratories Presents The Adults
Influenced by Chekhov and the paintings of Eric Fischl, and set to experimental music by Bhob Rainey, the highly physical and choreographed New Paradise ensemble offers The Adults.
new-paradise-laboratories-presents-the-adults
22nd New Edge Residency
Theater artist Justin Jain, theater artist Adrienne Mackey, and choreographer Olive Prince developed new work in the CEC's New Edge Residency program.
22nd-new-edge-residency
Music critic Tom Moon has written about pop, rock, jazz, blues, hip-hop and world music for more than three decades.
tom-moon
Lie to Me and Shorter Stories
Miller Rothlein commissioned choreographer Antony Rizzi to create a multidisciplinary work inspired by the writings of Franz Kafka.
lie-to-me-and-shorter-stories
Maryanne Amacher: Perceptual Geographies
The multimedia compositions and visceral, large-scale installations of pioneering sound artist Maryanne Amacher are illuminated through concerts, workshops, and a performance installation.
maryanne-amacher-perceptual-geographies
Brindabani Jatra: Weaving Dance and Divinity
In conjunction with Threads of History: Resurrection of a Textile, dance artist Madhusmita Bora presents a classical Indian dance performance in collaboration with the Dancing Monks of Assam on their first US tour.
brindabani-jatra-weaving-dance-and-divinity
Algorithmic Theater
Theater artist Annie Dorsen will interrogate the consequences of digital communication and confusion about appearances, illusions, fakes, and copies in a new piece developed during a multi-year residency at Bryn Mawr College.
algorithmic-theater
Taylor Mac
Taylor Mac is an award-winning playwright, actor, singer-songwriter, performance artist, director, and producer.
taylor-mac
Taylor Mac: A 24-Decade History of Popular Music
In its Philadelphia premiere, Taylor Mac's Pulitzer Prize-nominated performance work journeys through 240 years of US history and popular songs, staged in two 12-hour installments.
taylor-mac-a-24-decade-history-of-popular-music
Adapt!
This world premiere play, written by the Wilma's artistic director Blanka Zizka, invites audiences to consider the immigrant experience and questions surrounding identity, homeland and exile, the idealism of youth, and the compromises of adulthood.
adapt-
Representing the Veteran Experience
Following Tuesday's performance of Don Juan Comes Home from Iraq, veterans will speak about the challenges of representing their experiences artistically.
-quot-representing-the-veteran-experience-quot-
Patricia Lent
After dancing as a member of the Merce Cunningham Dance Company from 1984 to 1993, and the White Oak Dance Project from 1994 to 1996, Patricia Lent teaches, stages, and conducts workshops at the Merce Cunningham Trust, where she is a Trustee and Director of Licensing.
patricia-lent
Stories of Refuge from ear-whispered: works by Tania El Khoury
Bryn Mawr College presents Stories of Refuge at Twelve Gates Arts, part of ear-whispered: works by Tania El Khoury.
stories-of-refuge-from-ear-whispered-works-by-tania-el-khoury
Matthew Dirst
Matthew Dirst is a conductor, harpsichordist, organist, and music pedagogue. He is founder and artistic director of Ars Lyrica Houston.
matthew-dirst
PRISM Quartet Master Class and Panel Discussion with Dave Liebman, Greg Osby, and John Schaefer
This event features saxophonists/composers Liebman and Osby, and WNYC's John Schaefer, as they address the unique challenges of collaborating across genres.
prism-quartet-master-class-and-panel-discussion-with-dave-liebman-greg-osby-and-john-schaefer
Philadelphia Real Book Concerts - New Music in Jazz and Blues
Legendary Philadelphia jazz musicians—including guitarists Pat Martino and Monnette Sudler, pianist Dave Burrell, and saxophonist Jimmy Heath—will headline a four-part concert series inspired by the first published collection of compositions by the city's jazz artists.
philadelphia-real-book-concerts-new-music-in-jazz-and-blues


Today's Answers From Leadership podcast guest is Ralph Mayhew. Ralph lives in what must be the best place on the planet, the Gold Coast.
He's an Associate Pastor in one of the largest Uniting Churches in Australia, Newlife. He's been there for eight years and works with a great team of leaders. Prior to this life, he was the Pastor of a group of three wonderful churches in rural Victoria, and before that a Youth Pastor in a regional church.
Ralph's also just finished authoring his first book titled, The Anonymous Leader.
Ralph, what else do you want listeners to know about you?
Before the interview, I intended to go out shark fishing but couldn't. I'd hurt my ankle training for a marathon the other day.
I've been married for over 15 years. That's really exciting! We've got a daughter who's a firecracker.
I'm also a pastor and work in the church. Authored a book, do a bunch of blogging, and just love people.
Basically, I think I fell into it. When I was 17, I had a significant moment when my mother told me I was a leader. I think the thing that gave it away was that people followed me.
This caught me off-guard. I never thought of myself as a leader. Then I got to thinking about it.
I think there's a lot of technical answers. But I think leadership looks like serving people to help people become who God wants them to become.
We facilitate the pathways and environments where people can encounter God.
Could you share a leadership difficulty that you've faced?
There's been a few difficult leadership situations I've faced.
About 10 years ago, maybe 12… I was diagnosed with clinical depression. Basically, what happened was that I got really sick. And everything that I put value and security in, I couldn't do. And I became depressed.
How can we reconcile being a leader and a follower of God?
This is such a good question. It's one I've wrestled with for ages.
Leadership is about death. It's about leading us to the death. It's about leading so that leadership is no longer about ourselves. I think that's how those two things are reconciled.
What is your book The Anonymous Leader about?
I wanted to put a book in the hands of leaders to help them grab ahold of the Christian or Biblical understanding of leadership. I hope it's done that.
It comes from the premise that as a Christian leader, you can't lead another person unless you're being led by Christ.
As leaders, we're to become anonymous. Leadership isn't about us. We're the signposts that are forgotten as they reach the destination.
Why is it important for a leader to have good character?
Character is everything in leadership. EVERYTHING.
People will gradually stop following you if you don't have character. They'll follow you to begin with because they trust the space you occupy.
They don't trust you. They don't know you. They trust in the hope you represent.
Your role as a leader is to either build trust or you can bankrupt trust.
What can leaders do to improve their character if they struggle with character flaws?
There's probably a bunch of things you can do. I think a great thing to do is to get a mirror.
This is finding someone who can reflect back who you truly are. You can ask them what they see in your life and what needs to be improved.
The other is finding a chair time. Time every day where we spend praying and being with Jesus.
Do you have any suggestions on helping us find someone who could be our mirror?
Everybody has those people they admire or respect. I think it's worth the ask. Even if it's someone you just rub shoulders with through podcasts or a book or blog posts.
There's a lot of talk about leaders needing to create a platform. Do you think every leader should have one?
I think every leader is GIVEN a platform by God. Every leader.
The role of a leader isn't to grow your platform or expand your platform. Your role is to steward the platform God has given you.
God can take back the platform any time He wants.
I think the leader who jumps on the platform God gives and says Hey, look at what I can achieve. Look at how amazing I am. Look at the difference I'm making.
It's only a matter of time before they fall off the platform. And it's a long fall to take.
How do you stop your ego from getting in the way?
Having markers along the way. For example, in the book I talk about tensions between 5 components that every leader has. The first one is passion.
If my passion is about growing the Kingdom and building God's platform, it moves towards wisdom. But if I'm doing it just for my sake, I'm being reckless.
In my head, I've always got this constant thing of when a decision comes up or I react to something, I go: Is this a reckless decision or response or is this a wise response or decision?
Can you recommend one or two books a leader should read?
There's 3 at the moment that I'm recommending to everyone.
Do you have anything else you'd like to share with listeners today?
I think serving Jesus is the most beautiful thing you can do with your life. And stewarding your life so that it moves to that place is the most beneficial thing that when you look back on your years, I'd love it to say that I got to walk with Christ and at His pace.
Leaders tend to run ahead instead of keeping pace with Christ.
Ralph was gracious enough to give me 2 copies of The Anonymous Leader to give away to 2 lucky readers/listeners. If you want to press your luck and try to win a copy, head over to the giveaway page.
Question: What are you doing to become an Anonymous Leader? Share your thoughts in the comment section below.


I am a PhD student working with Prof. Mayur Naik at the University of Pennsylvania. I received my B.S. and M.S. in computer science from Nankai University and Vanderbilt University, respectively.
My research interests span programming languages, program synthesis and verification, constraint solving, and machine learning.
My recent research focuses on the interplay between deep reinforcement learning and symbolic reasoning. On one hand, I have applied deep reinforcement learning to synthesize proofs (e.g. loop invariants) with only weak supervision from a theorem prover, as well as programs with respect to a specification (either logical formula or input/output examples). On the other hand, I am investigating symbolic reasoning techniques to make deep learning more data efficient and reinforcement learning more sample efficient.
In the past, I have worked on: 1) using statistical approaches for program reasoning (e.g. mining API specifications); 2) constraint solving (e.g. MaxSAT, Markov Logic Network) and their applications in program analysis; and 3) scalable synthesis of Datalog programs using active learning.
Kihong Heo, Mukund Raghothaman, Xujie Si, Mayur Naik. Continuous program reasoning via differential Bayesian inference. In PLDI, 2019.
Xujie Si*, Yuan Yang*, Hanjun Dai, Mayur Naik, Le Song. Learning a Meta-Solver for Syntax-Guided Program Synthesis. In ICLR, 2019.
Xujie Si*, Hanjun Dai*, Mukund Raghothaman, Mayur Naik, Le Song. Learning Loop Invariants for Program Verification. In NeurIPS (spotlight), 2018.
Xujie Si, Woosuk Lee, Richard Zhang, Aws Albarghouthi, Paris Koutris, Mayur Naik. Syntax-Guided Synthesis of Datalog Programs. In FSE, 2018.
Mukund Raghothaman, Sulekha Kulkarni, Richard Zhang, Xujie Si, Kihong Heo, Woosuk Lee, Mayur Naik. Difflog: Beyond Deductive Methods in Program Analysis. In Machine Learning for Programming, 2018.
Mayur Naik, Xujie Si, Xin Zhang, Radu Grigore. Maximum Satisfiability in Software Analysis: Applications and Techniques. In VMCAI Invited Tutorial, 2018.
Xin Zhang, Radu Grigore, Xujie Si, Mayur Naik. Effective Interactive Resolution of Static Analysis Alarms. In OOPSLA, 2017.
Xujie Si, Xin Zhang, Radu Grigore, Mayur Naik. Maximum Satisfiability in Software Analysis: Applications and Techniques. In CAV Invited Tutorial, 2017.
Xin Zhang, Xujie Si, Mayur Naik. Combining the Logical and the Probabilistic in Program Analysis. In MAPL, 2017.
Xujie Si, Xin Zhang, Vasco Manquinho, Mikolas Janota, Alexey Ignatiev, Mayur Naik. On Incremental Core-Guided MaxSAT Solving. In CP, 2016.
Insu Yun, Changwoo Min, Xujie Si, Yeongjin Jang, Taesoo Kim, Mayur Naik. APISan: Sanitizing API Usages through Semantic Cross-checking. In USENIX Security (Nominated as a finalist in CSAW Best Applied Research Paper), 2016.


This is a placeholder page for Robin Carson, which means this person is not currently on this site. We do suggest using the tools below to find Robin Carson.
You are visiting the placeholder page for Robin Carson. This page is here because someone used our placeholder utility to look for Robin Carson. We created this page automatically in hopes Robin Carson would find it. If you are not Robin Carson, but are an alumni of Stroudsburg High School, register on this site for free now.


Don't put up with that crack on the front of your windshield any longer. That chip, "stone bruise," or spider is only going to get worse. In most cases we can do a job costing less than your insurance deductible. Save money, save premium, and drive safely without the distraction of that broken windshield.


text:
CBSE Class 9 Science Worksheet - Work and Energy. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding of…
CBSE Class 9 Science Worksheet - Why do we fall Ill. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding…
CBSE Class 9 Science Worksheet - Tissues Plants. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding of…
CBSE Class 9 Science Worksheet - Tissues Animals. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding of…
Question. Name the scientist who discovered neutrons.Ans : J. Chadwick. Question. What was Chadwick's experiment?Ans : In Chadwick's experiment, he bombarded beryllium atoms with high speed particles.(i) The rays emitted from beryllium during bombardment had speeded about one-…
1 Mark Questions: 1.On the basis of Thomson's model of an atom, explain how the atom is neutral as a whole? 2.Where are electrons found in the atom? 3. What are canal rays? 3.Why is the nucleus of an atom positively charged? 4.Why did Rutherford select a gold foil in his α-ray…
CBSE Class 9 Science Worksheet - Seperation of Components of Mixture. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for…
CBSE Class 9 Science Worksheet - Revision. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding of the…
CBSE Class 9 Science Worksheet - Propery of True Solutions. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better…
CBSE Class 9 Science Worksheet - Preparation of Mixture and Compound. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for…
CBSE Class 9 Science Worksheet - Physical and Chemical Changes. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better…
CBSE Class 9 Science Worksheet - Motion. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding of the…
CBSE Class 9 Science Worksheet - Melting and Boiling Point. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better…
CBSE Class 9 Science Worksheet - Matter in Our Surroundings. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better…
CBSE Class 9 Science Worksheet - Matter around Us. Students can download these worksheets and practice them. This will help them to get better marks in examinations. Also refer to other worksheets for the same chapter and other subjects too. Use them for better understanding…
Unity Run on Rashtriya Ekta Divas National Unity Day
The Rashtriya Ekta Divas (National Unity Day) is observed on 31st October every year to commemorate the birth anniversary of Sardar Vallabh Bhai Patel. It not only commemorates the birth anniversary of Sardar Vallabh Bhai Patel, but also reaffirms the…


You most likely were not born with bunions. They typically developed over time. Bunions develop from what is thought to be abnormal forces upon the big toe joint. Yes, stilettos and tight shoes can enhance them, but are the shoes the real cause?
Most believe bunions (hallux abducto valgus-hav) develop from abnormal biomechanics, yet some claim it is not a biomechanical problem. If not, then why are most bunions worse on one foot than the other? Both feet are used the same. If it really were the shoes (that are symmetrical), wouldn't the bunions be identical? Both clinically and on x-ray, many bunions are not alike left to right.
Could it be the shoes? Of course, a less than ideal fit shoe can lead to excessive pressure in and around the joint. This is especially the case with runners if the foot slides forward jamming the big toe. This can lead to inflammation and pain. It is important to look for the ideal fit – not too much tapering in the toe box, with appropriate width and length.
This is not necessarily the case. Consider the hormones. Research has shown hormones do affect our ligaments, etc. Shoes can enhance or aggravate the bunion. However, not all women wearing these so called "bad" shoes develop bunions.
Do high heels cause bunions? Long term use of high heels may cause tightening of the Achilles tendon which can cause abnormal foot adaptions, such as flattening of the arches leading to bunion formation. Is this evidence a bunion is caused by abnormal biomechanics instead of shoes??
Should I wear Minimalist Shoes?
Some runners avoid shoes that have a little tilt forward or "lift" to avoid tightening the Achilles tendon. They claim you can train to a zero drop to prevent this. Some can accomplish this, but short of surgery, many of us have tight achilles that will not stretch out no matter what you do. Therefore, training everyone to wear zero drop shoes can lead to failure. In fact, it can lead to other problems. As a result, the barefoot "fad" did not turn out like some had claimed it would. If you are considering a minimalist shoe, it is best to consult a specialist first because there are not only functional considerations, but also structural as feet are different.
In most cases, the answer is no, not directly. What is hereditary is the structure of ALL the joints and muscles in the feet. Any "abnormal" alignment can cause the big toe joint to function abnormally leading to the development of the bunion (hallux abducto valgus). It is not just because mom and grandma had them.
Can I develop bunions because my muscles are weak?
Indirectly, yes. Abnormal pull (tension) and compression may cause an imbalance of all the muscle tendon units about the big toe joint. So, over time, some may be weak and loose, some may be over strong and tight. So, strengthening and stretching may help, but it does not really address the main cause.
Some will say that shoes weaken our muscles, leading to the bunion. Well, some may weaken with shoes, but as we all must wear them, there's little mention about how shoes can strengthen feet. Shoes may also realign the muscles to provide a more ideal performance. Furthermore, as we all wear shoes then why do we not all get bunions?
Of course, a narrow-pointed toe can prevent normal muscle function. However, the shoe is not the primary reason. Some will say it is. Some claim our toes are spread out as a baby and the shoes start deforming the foot early on when we put them in "adult" shoes. However, many infant toes are not spread out at birth. If my baby were born with toes appearing like some of the drawings of toes spread out claiming such, I'd be a little concerned about neurological issues.
So, as a shoe can enhance a bunion, little is said about the other main aggravating factor – the flat floor or flat inside of the shoe. The flat floor deforms our feet. Our feet are of all different shapes and positions (high, low, etc.). Yet, they are all going to try and deform to the same flat surface? This flat "surface" adaption will cause significant problems for some.
Some researchers, who typically mainly study runners, will say alignment doesn't matter. This is said because they cannot prove or present evidence that proper alignment prevents injury. They speak very little about other factors such as long-term osteoarthritic damage to joints. Even though the arthritis is developing, it may take some time to start hurting. Therefore, just because it is not proven, does not prove it does not occur. Overall, if a shoe is too tight then it may aggravate or enhance a bunion formation and weaken muscles, yet again, the shoe is not the primary cause.
What about the shoeless societies?
Some will also say feet are adaptable. Therefore, you can retrain your feet to go barefoot avoiding all the bunions, etc. Okay…but not so for all on a hard-flat surface. For example, can any lineman in football train to be a wide receiver with training? No, because we are all different sizes and shapes with different alignments affecting not only function but also structure.
So, should treatment for bunions start with changing your shoes?
If they are too tapered, too short or too narrow, then yes. However, it is important to remember that faulty biomechanics are usually the cause of bunion development. Addressing the footwear and the faulty biomechanics will lead to an increased probability of eliminating pain.
David J. Sables, D.P.M., C. Ped.


"I arrived at this place not knowing if their prices would match their quality of work, so I decided to get a UV Gel Manicure. I came in ..."
"They have nice work , BUT THEY ARE OVER PRICED! I FELT THE CUSTOMER SERVICE WAS LACKING. ARTIST A LITTLE UP TIGHT"
"Hello, Do Yeww KNoe How Much Snake Bites Cost There? If Yeww KNoe Tell Me PLease Im Ver Very Intrested In Gettiing some...tehe...Wat Kinds Of Piercings Did You ..."
"This is a nail shop that I highly recommend it has been around forever, when I moved out of Pomona about a year ago, I hated leaving this ..."
"This is a good nail and pedicure place thats cheap!"


Let your customers take control of their own buying experience. Customers are empowered by ticket kiosks and love the ease of transaction.
Alleviate the strain on resource. Don't waste staff on manual ticket printing and payments. Let ticket kiosks enable your staff to focus on mission critical tasks and keep customer satisfaction as number one priority.
Chip-and-pin, note and coin and contactless card technology are all available compontents of self-service kiosks. QR code and barcode scanning is another handy tool to let customers collect pre-paid tickets.
Ticketing kiosks can be the perfect channel to drive add-on sales and promotions. Think of them as digital signage platforms to engage your audience with content.


Drive south on Hwy 93. Turn Left (east) at the light onto Stevensville Cutoff Rd.
Super 1 will be on your right. Travel east for about 1.5 miles. This will turn south on Main St. in Stevensville.
Turn Right onto 4th Street. Drive west for 3 blocks.
Drive North on Hwy 93. Turn Right (east) at the light onto Stevensville Cutoff Rd.


Golf, the game that some don't even consider to be a sport, is within a group of recreational sports that see a higher incidence of injuries than team sports such as hockey and rugby, according to a National Health Statistics Report (NHSR) published in November 2016.
In a press release, Golfsupport.com presented golf injury data from the NHSR that may surprise you. The site also mined information from additional studies by the British Journal of Sports Medicine, the Norwegian School of Sport Sciences, Golf Digest and the American Journal of Preventive Medicine.
The numbers are revealing and suggest what you might not know: playing golf poses many physical risks, resulting in lots of injuries to amateur and professional golfers each year. Judging from the data, it's reasonable to conclude that golf is pretty risky and somewhat dangerous as compared to other sports.
Tiger Woods has suffered 17 golf related injuries in his career.
"Results of the research analyzing the risk of injuries per sport, and in particular golf, reveal that the risk [in golf]is much higher than commonly thought," said Dr. Gary Swift of Golfsupport.com.
NHSR examined 8.6 million sports injuries from 2011 to 2014. Recreational sports (golf, tennis, badminton, bowling, fishing and hiking) had an injury rate of 1.8 per 1,000 persons. Conversely, rough-and-tumble team sports such as hockey, rugby and lacrosse were lumped in a category that had an injury incidence of only 1.5 per 1,000 persons.
Other so-called rugged sports that also had less injury risk than golf (1.2 or 1.1 per 1,000 persons) included combative sports and snow sports.
A study by the British Journal of Sports Medicine provided additional insights about golf injuries. The study said 15.8 to 40.9 percent of amateur golfers suffer injuries each year, and 25.2 to 67.7 percent over a lifetime. Professional golfers can expect a higher incidence of injury, from about 30 to 90 percent, both annually and during their lifetime.
Most golf-related injuries are to the lower back (15.2 to 34 percent), elbow (7 to 27 percent) and shoulder (4 to 19 percent). There are also wrist injuries.
Some golf injuries can be extreme or even deadly, like those involving the head. Many are due to airborne golf balls and flying club heads. Each year an estimated 40,000 people make a trip to the emergency room after being struck by a golf ball or club head!
If this wasn't enough, 15,000 injuries per year are blamed on golf carts.
15,000 injuries each year are due to golf carts crashes.
Danger lurks on the golf course—and it's not just slick greens, deep bunkers, OB right and all manner of water hazards. Physical injury is a real possibility, even likely.
But don't let the injury risks stop you from playing the game. Awareness, precautions and fitness can help protect you from injury.


This s a stunning example of Canadian Labradorite. A dark base material with a Teal Blue flash. Carleton has also managed to capture the chatoyant "cats eye" effect this material can exhibit. There is a cosmetic cleave just under the surface along edge that can be seen from some angles, the price has been slightly reduced to reflect this flaw. Carleton has hand cut this cabochon to display optimum flash. Flash orientation best viewed as shown in pictures.


text:
Use this for to search the site.
Graduate Student Unionization
Commitment to Collaboration
A Collaborative Environment
Graduate students have many channels through which to partner with the University to influence policy and practice.
Update: October 9, 2019
On October 9, 2019, Vice Provost Nathan Urban sent an email to doctoral students alerting them to the filing of exceptions by both parties to the PLRB hearing officer's proposed decision, sharing the University's perspective, and summarizing activities to date.
The University of Pittsburgh has filed exceptions to the hearing examiner's proposed decision and maintains that the institution acted appropriately leading up to and throughout the April 2019 election, when a majority of graduate students voted against representation by the United Steelworkers.
The hearing examiner ruled that nine of the 12 allegations filed by the Steelworkers did not have merit. Of the remaining three allegations: Two counts were related to factual statements made on the University's website that are similar in nature to other statements found by the hearing examiner to be appropriate. The third count pertains to an email sent to a small number of eligible voters. In this email, a department chair encourages students to vote—and does not pick a side—while also linking to information from both the Steelworkers and the University.
All of the communications in question are accurate, appropriate, and factual. The University looks forward to a closer review—with full context considered—of these three counts in question.
We've got answers! Email Pitt's Office of Graduate Studies with your questions or comments.
We would like to set the record straight on a few key issues.
Familiarize yourself with discussions and opinions on graduate student unionization and related news here at Pitt as well as throughout the country.
Guidance for Faculty & Staff
gradstudent@pitt.edu
Revised 11/12/19Copyright 2020Send feedback about this site.


The colorful and controversial trainer, whose horses have won nearly $80 million in purses over his 24-year training career, has long been a polarizing figure in the so-called Sport of Kings. Few question his horsemanship, but many have been quick to conclude that he also had chemistry in his corner.
Dutrow already has appealed the suspension – levied for a drug "overage" in one of his horses and the discovery of prohibited syringes and needles in his barn at Aqueduct racetrack in Queens, N.Y. -- through horse racing's administrative process and in New York state courts, losing each round. He is now pinning his hopes on a federal lawsuit that argues he was "substantially and irreparably harmed" by the suspension –- one of the most severe penalties ever imposed in American racing -- and deprived of due process under the law. In addition to reinstatement of his trainer's license, Dutrow is seeking $20 million in damages.
Many legal experts see it as an uphill battle, but the trainer of Derby and Preakness Stakes winner Big Brown and other top-flight racehorses like Saint Liam, Benny the Bull, Silver Train and Kip Deville says he's determined to disprove the accusations against him.
Dutrow maintains he was targeted by New York racing authorities and other industry officials because of his penchant for making truthful but embarrassing comments about certain racing practices, a rowdy past that included drug abuse and his numerous successes "claiming" horses from other owners and improving them.
Speaking from his home on New York's Long Island, Dutrow's demeanor was as changeable as the weather on a spring day during the 40-minute interview on Thursday -- resolute one minute, tearful the next as he recalled the experience of getting Big Brown ready to fly from Florida to Louisville, Ky., for the Derby.
Whether that chance occurs before Dutrow's suspension runs its course will depend on the U.S. District Court for Eastern New York.
And even then, there would be no certainty that New York would be willing to relicense Dutrow, given the animosity that has built up over the years.
Those views stemmed from Dutrow's long record of violations -- more than 70 infractions at 15 racetracks in nine states -- and comments like the one that ignited a controversy during Big Brown's Triple Crown campaign, where he admitted giving the colt the anabolic steroid Winstrol, a legal but seldom acknowledged practice at the time.
Dutrow acknowledges that he gave therapeutic medications to his horses, but denies that he overused or unnecessarily administered such drugs. Instead, he said, he focused on correcting their mechanics, working on their feet and giving them vitamins.
Dutrow's defenders –- and he has many -- suggest he was a convenient scapegoat for racing officials looking to strike an aggressive pose in the face of proposed federal legislation to regulate horse racing, which is currently handled at the state level.
They also note that most of the infractions on his record were relatively minor, such as showing up late in the paddock with a horse or failing to file foaling papers, and wonder why the New York Racing and Wagering Board originally imposed a 90-day suspension before reversing itself and levying the 10-year ban.
Among those who don't think Dutrow always got a fair shake is Stephen Barker, who runs the state equine drug testing laboratory in Louisiana. He notes that the drug offenses on the trainer's record are nearly all for "overages" – higher levels of legal therapeutic substances than are allowed by racing's rules – not for illegal substances aimed at giving a horse a competitive edge.
Barker testified as an expert witness for Dutrow before New York racing authorities, saying that the overage violation for the painkiller butorphanol, detected in urine tests on a Dutrow-trained horse named Fastus Cactus on Nov. 20, 2010, was detected in minuscule quantities that could not have improved the horse's performance.
"It was a low level, scientifically meaningless," he told NBC News, adding that the positive could have resulted from accidental contamination.
But the state of New York also presented its own expert, state drug-testing lab director Dr. George Maylin, who testified that the detection of the drug in Fastus Cactus' urine indicated the drug had been administered within 96 hours of the race -- inside the window prohibited by New York racing regulations. The racing officials who decided the case -- Chairman Sabini, Daniel Hogan and Charles Diamond -- sided with Maylin and found Dutrow guilty.
Maylin told NBC News on Friday that he stands by his testimony, and noted that other racing jurisdictions subsequently adopted the lower threshold for butorphanol.
The drug positive alone would likely not have triggered a lengthy suspension, but the discovery of three hypodermic needles and syringes filled with the legal painkiller Rompun (also known as xylazine) in Dutrow's barn at Aqueduct racetrack was more problematic. Racing regulations require that all such substances on the racetrack be administered by licensed veterinarians and bar trainers or other track workers from even possessing such gear.
Dutrow subsequently took a polygraph exam that indicated he was unaware of the source of the needles or the drug.
But in his interview with NBC News, Dutrow said he believes the needles were planted in a desk drawer of a barn office by racing investigators during what they described as a "training exercise" for new security personnel while he was out of town at the Breeders' Cup.
Dutrow says that an investigation of his veterinary records would have shown that he did not use the drug, a sedative that is typically used to calm unruly horses, but that none was ever conducted. He also contends that the needles were immediately removed from the barn and never tested for fingerprints or otherwise investigated to see if their source could be determined.
While Dutrow continues to contest the facts of his case, his federal lawsuit hinges on the actions of the Kentucky-based Association of Racing Commissioners International , which took the unusual step of sending a letter and issuing a press release on Feb. 17, 2011 -- after the New York Racing and Wagering Board had suspended Dutrow for 90 days -- urging it to instead revoke his license due to his long history of violations.
The lawsuit argues that Sabini, the chairman of the state board at the time, also served on the Board of Directors, the Executive Committee and as chairperson of the board-elect of ARCI and should have recused himself from reconsidering Dutrow's punishment.
That confidence extends to the plaintiff's table as well, as Dutrow says he expects to be back in his barn soon.


Amber Lounsbery grew up picking mulberries from trees around her home. Not one to let good produce go to waste, her mother was an avid canner. Now Lounsbery harvest the dark juicy berries from trees that line the driveway and yard each summer. Her prize winning jelly recipe is canned and used to treat friends and family through the following year.
Recipe that Lounsbery bases her recipe on.
The process is consistent with any canning process. Make sure to gather all items needed including a funnel, jar grabber and magnetic lid tool. Clean and sterilize everything.
Red raspberry Kool-aid used in the original recipe is not readily availble. Lounsbery uses 2Tbsps of Lemon Juice to make sure that there is an appropriate amount of acid.
• Make certain to use a large pot that allows for expansion. The liquid volume will increase as it boils.
• When filling, leave a quarter inch head space in each jar. Wipe excess off the rim to ensure a tight seal.
• Also, pay attention to duration of time in the canning bath. Due to South Dakota's altitude, jelly jars should be boiled for an additional five minutes to get a safe seal.
This recipe makes six pints of jelly. Lounsbery points to a number of resources available for canning. It's a fun hobby that anyone can enjoy.


text:
(M-A) The Self-Driven Child: The Science and Sense of Giving Your Kids More...
by M-A Parent Education Series
Menlo-Atherton High School
M-A Performing Arts Center (PAC)
555 Middlefield Road
Atherton, CA 94027
The Self-Driven Child offers a combination of cutting-edge brain science, the latest discoveries in behavioral therapy, and case studies drawn from the thousands of kids and teens Dr. Bill Stixrud and Ned Johnson have helped over the years to teach you how to set your child on the real road to success.
"Stixrud and Johnson theorize that a sense of control is the 'antidote to stress,' touching on common stressors for American kids, such as social media, demanding homework, and lack of sleep."
In this engaging presentation, Bill and Ned provide research-based advice about how to help children and teens become more resilient, balanced, and motivated for learning.
Parents, students, educators, and community members welcome! Free admission and light refreshments. Spanish interpretation will be available.
M-A Parent Education Series events are sponsored by M-A PTA, Sequoia Healthcare District, and Sequoia Union High School District.
Questions? Contact Charlene Margot, M.A., Director, The Parent Education Series, cmargot@csmconsulting.net
United States Events California Events Things to do in Atherton, CA Atherton Classes Atherton Family & Education Classes
(M-A) The Self-Driven Child: The Science and Sense of Giving Your Kids More Control Over Their Lives at Menlo-Atherton High School
M-A Performing Arts Center (PAC) 555 Middlefield Road, Atherton, CA 94027
Browse Atherton Events


We assemble magnificent timber trusses for a vast range of commercial and residential projects including schools, health care centres, nursing homes and builders.
Whether you are a builder, owner builder or developer, we will work with you throughout the design to assure your timber trusses meet technical standards.
Trusses are manufactured using treated & untreated radiata pine or similar specie.


Norouzi, Ghasem (2006) Employment opportunities for adults with the label of 'learning difficulties' in England. PhD thesis, University of Sheffield.
This study considered employment opportunities and realities of work for adults with learning difficulties in England (post the 2001, White Paper Valuing People) with the view to developing opportunities for people in Iran. An eclectic approach, using both qualitative and quantitative methods was adopted. Thus I studied the lives of six workers with learning difficulties and considered the case files of a further 200 similar employees in the English city of Northtown in order to develop an understanding of their employment experiences and to gain insight into the perceptions of their employers in mainstream workplaces. Twenty one employers completed a survey questionnaire and 12 were interviewed. I also investigated how supported employment providers (SEPs) promote `meaningful work' opportunities for people with learning difficulties. The research findings helped me to formulate policy recommendations and applications for Iran. The social model of learning difficulties was the main stance of this research. The research showed that people with learning difficulties were excluded from many aspects of life particularly employment, due to the social, cultural, political and structural barriers within society. All the SEPs and most employers perceived employees with learning difficulties as capable, punctual, reliable, willing, hard-working very helpful and trustworthy workers. This study highlighted that the current supported employment programme, despite supporting employees with learning difficulties at work and increasing the employers' awareness of their ability was not successful in enabling people in gaining meaningful work. The Workstep programme, however, did appear to help people with learning difficulties to get paid jobs. This thesis recommends further reflexive empirical research regarding the employment of people with learning difficulties both in England and in Iran.