Ejemplo n.º 1
0
static void _mapcache_cache_bdb_set(mapcache_context *ctx, mapcache_tile *tile) {
   DBT key,data;
   int ret;
   mapcache_cache_bdb *cache = (mapcache_cache_bdb*)tile->tileset->cache;
   char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
   struct bdb_env *benv = _bdb_get_conn(ctx,tile,0);
   GC_CHECK_ERROR(ctx);
   apr_time_t now = apr_time_now();
   memset(&key, 0, sizeof(DBT));
   memset(&data, 0, sizeof(DBT));
   if(!tile->encoded_data) {
      tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format);
      GC_CHECK_ERROR(ctx);
   }
   mapcache_buffer_append(tile->encoded_data,sizeof(apr_time_t),&now);
   key.data = skey;
   key.size = strlen(skey)+1;
   data.data = tile->encoded_data->buf;
   data.size = tile->encoded_data->size;

   ret = benv->db->put(benv->db,NULL,&key,&data,0);
   tile->encoded_data->size -= sizeof(apr_time_t);
   if(ret != 0) {
      ctx->set_error(ctx,500,"dbd backend failed on tile_set: %s", db_strerror(ret));
   } else {
      ret = benv->db->sync(benv->db,0);
      if(ret)
         ctx->set_error(ctx,500,"bdb backend sync failure on tile_set: %s",db_strerror(ret));
   }
   _bdb_release_conn(ctx,tile,benv);
}
Ejemplo n.º 2
0
static int _mapcache_cache_bdb_get(mapcache_context *ctx, mapcache_tile *tile) {
   DBT key,data;
   struct bdb_env *benv = _bdb_get_conn(ctx,tile,1);
   mapcache_cache_bdb *cache = (mapcache_cache_bdb*)tile->tileset->cache;
   char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
   if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE;
   memset(&key, 0, sizeof(DBT));
   memset(&data, 0, sizeof(DBT));
   data.flags = DB_DBT_MALLOC;
   key.data = skey;
   key.size = strlen(skey)+1;

   int ret = benv->db->get(benv->db, NULL, &key, &data, 0);


   if(ret == 0) {
      tile->encoded_data = mapcache_buffer_create(0,ctx->pool);
      tile->encoded_data->buf = data.data;
      tile->encoded_data->size = data.size-sizeof(apr_time_t);
      tile->encoded_data->avail = data.size;
      apr_pool_cleanup_register(ctx->pool, tile->encoded_data->buf,(void*)free, apr_pool_cleanup_null);
      tile->mtime = *((apr_time_t*)(&tile->encoded_data->buf[tile->encoded_data->size]));
      ret = MAPCACHE_SUCCESS;
   } else if(ret == DB_NOTFOUND) {
      ret = MAPCACHE_CACHE_MISS;
   } else {
      ctx->set_error(ctx,500,"bdb backend failure on tile_get: %s",db_strerror(ret));
      ret = MAPCACHE_FAILURE;
   }
   _bdb_release_conn(ctx,tile,benv);
   return ret;
}
Ejemplo n.º 3
0
static void _mapcache_cache_tc_delete(mapcache_context *ctx, mapcache_tile *tile)
{
  struct tc_conn conn;
  mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache;
  char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
  conn = _tc_get_conn(ctx,tile,0);
  GC_CHECK_ERROR(ctx);
  tcbdbout2(conn.bdb, skey);
  _tc_release_conn(ctx,tile,conn);
}
Ejemplo n.º 4
0
static int _mapcache_cache_tc_has_tile(mapcache_context *ctx, mapcache_tile *tile)
{
  int ret;
  struct tc_conn conn;
  int nrecords = 0;
  mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache;
  char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
  conn = _tc_get_conn(ctx,tile,1);
  if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE;
  nrecords = tcbdbvnum2(conn.bdb, skey);
  if(nrecords == 0)
    ret = MAPCACHE_FALSE;
  else
    ret = MAPCACHE_TRUE;
  _tc_release_conn(ctx,tile,conn);
  return ret;
}
Ejemplo n.º 5
0
static void _mapcache_cache_tc_set(mapcache_context *ctx, mapcache_tile *tile)
{
  struct tc_conn conn;
  mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache;
  char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
  apr_time_t now = apr_time_now();
  conn = _tc_get_conn(ctx,tile,0);
  GC_CHECK_ERROR(ctx);

  if(!tile->encoded_data) {
    tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format);
    GC_CHECK_ERROR(ctx);
  }
  mapcache_buffer_append(tile->encoded_data,sizeof(apr_time_t),&now);
  if(!tcbdbput(conn.bdb, skey, strlen(skey), tile->encoded_data->buf, tile->encoded_data->size)) {
    int ecode = tcbdbecode(conn.bdb);
    ctx->set_error(ctx,500, "tokyocabinet put error: %s\n",tcbdberrmsg(ecode));
  }
  _tc_release_conn(ctx,tile,conn);
}
Ejemplo n.º 6
0
static void _mapcache_cache_bdb_delete(mapcache_context *ctx, mapcache_tile *tile) {
   DBT key;
   int ret;
   mapcache_cache_bdb *cache = (mapcache_cache_bdb*)tile->tileset->cache;
   char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
   struct bdb_env *benv = _bdb_get_conn(ctx,tile,0);
   GC_CHECK_ERROR(ctx);
   memset(&key, 0, sizeof(DBT));
   key.data = skey;
   key.size = strlen(skey)+1;
   ret = benv->db->del(benv->db, NULL, &key, 0);
   if(ret && ret != DB_NOTFOUND) {
      ctx->set_error(ctx,500,"bdb backend failure on tile_delete: %s",db_strerror(ret));
   } else {
      ret = benv->db->sync(benv->db,0);
      if(ret)
         ctx->set_error(ctx,500,"bdb backend sync failure on tile_delete: %s",db_strerror(ret));
   }
   _bdb_release_conn(ctx,tile,benv);
}
Ejemplo n.º 7
0
static int _mapcache_cache_tc_get(mapcache_context *ctx, mapcache_tile *tile)
{
  int ret;
  struct tc_conn conn;
  mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache;
  char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
  conn = _tc_get_conn(ctx,tile,1);
  int size;
  if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE;
  tile->encoded_data = mapcache_buffer_create(0,ctx->pool);
  tile->encoded_data->buf = tcbdbget(conn.bdb, skey, strlen(skey), &size);
  if(tile->encoded_data->buf) {
    tile->encoded_data->avail = size;
    tile->encoded_data->size = size - sizeof(apr_time_t);
    apr_pool_cleanup_register(ctx->pool, tile->encoded_data->buf,(void*)free, apr_pool_cleanup_null);
    tile->mtime = *((apr_time_t*)(&tile->encoded_data->buf[tile->encoded_data->size]));
    ret = MAPCACHE_SUCCESS;
  } else {
    ret = MAPCACHE_CACHE_MISS;
  }
  _tc_release_conn(ctx,tile,conn);
  return ret;
}
Ejemplo n.º 8
0
static int _mapcache_cache_bdb_has_tile(mapcache_context *ctx, mapcache_tile *tile) {
   int ret;
   DBT key;
   mapcache_cache_bdb *cache = (mapcache_cache_bdb*)tile->tileset->cache;
   char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
   struct bdb_env *benv = _bdb_get_conn(ctx,tile,1);
   if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE;
   memset(&key, 0, sizeof(DBT));
   key.data = skey;
   key.size = strlen(skey)+1;

   ret = benv->db->exists(benv->db, NULL, &key, 0);

   if(ret == 0) {
      ret = MAPCACHE_TRUE;
   } else if(ret == DB_NOTFOUND) {
      ret = MAPCACHE_FALSE;
   } else {
      ctx->set_error(ctx,500,"bdb backend failure on tile_exists: %s",db_strerror(ret));
      ret= MAPCACHE_FALSE;
   }
   _bdb_release_conn(ctx,tile,benv);
   return ret;
}