Пример #1
0
static int prefetch(mailmessage * msg_info)
{
  struct generic_message_t * msg;
  int res;
  struct db_msg_data * data;
  struct db_session_state_data * sess_data;
  MMAPString * msg_content;
  struct mail_cache_db * maildb;
  int r;
  char key[PATH_MAX];
  void * msg_data;
  size_t msg_data_len;
  
  sess_data = get_session_data(msg_info);
  
  r = mail_cache_db_open_lock(sess_data->db_filename, &maildb);
  if (r < 0) {
    res = MAIL_ERROR_FILE;
    goto err;
  }
  
  snprintf(key, sizeof(key), "%lu", (unsigned long) msg_info->msg_index);
  r = mail_cache_db_get(maildb, key, strlen(key), &msg_data, &msg_data_len);
  if (r < 0) {
    res = MAIL_ERROR_MSG_NOT_FOUND;
    goto close_db;
  }
  
  msg_content = mmap_string_new_len(msg_data, msg_data_len);
  if (msg_content == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto close_db;
  }
  
  data = malloc(sizeof(* data));
  if (data == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free_mmapstr;
  }
  
  data->msg_content = msg_content;
  
  msg = msg_info->msg_data;
  
  msg->msg_data = data;
  msg->msg_message = msg_content->str;
  msg->msg_length = msg_content->len;
  
  mail_cache_db_close_unlock(sess_data->db_filename, maildb);
  
  return MAIL_NO_ERROR;
  
 free_mmapstr:
  mmap_string_free(msg_content);
 close_db:
  mail_cache_db_close_unlock(sess_data->db_filename, maildb);
 err:
  return res;
}
Пример #2
0
int generic_cache_flags_read(struct mail_cache_db * cache_db,
    MMAPString * mmapstr,
    char * keyname, struct mail_flags ** result)
{
  int r;
  int res;
  size_t cur_token;
  struct mail_flags * flags;
  void * data;
  size_t data_len;

  data = NULL;
  data_len = 0;
  r = mail_cache_db_get(cache_db, keyname, strlen(keyname), &data, &data_len);
  if (r != 0) {
    res = MAIL_ERROR_CACHE_MISS;
    goto err;
  }
  
  r = mail_serialize_clear(mmapstr, &cur_token);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto err;
  }

  if (mmap_string_append_len(mmapstr, data, data_len) == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }

  flags = NULL;
  r = generic_flags_read(mmapstr, &cur_token, &flags);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto err;
  }

  * result = flags;

  return MAIL_NO_ERROR;

 err:
  return res;
}
Пример #3
0
static int db_get_message_list(struct mail_cache_db * maildb,
    carray ** p_msglist)
{
  carray * msglist;
  void * serialized;
  size_t serialized_len;
  int r;
  char key_value[PATH_MAX];
  int res;
  unsigned int i;

  msglist = carray_new(16);
  if (msglist == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  
  snprintf(key_value, sizeof(key_value), "message-list");
  r = mail_cache_db_get(maildb, key_value, strlen(key_value),
      &serialized, &serialized_len);
  if (r >= 0) {
    MMAPString * mmapstr;
    size_t cur_token;
    
    /* collect message list */
    
    mmapstr = mmap_string_new_len(serialized, serialized_len);
    if (mmapstr == NULL) {
      res = MAIL_ERROR_MEMORY;
      goto free_msglist;
    }
    
    cur_token = 0;
    do {
      uint32_t num;
      uint32_t * msg;
      
      r = mailimf_cache_int_read(mmapstr, &cur_token, &num);
      if (r != MAIL_NO_ERROR)
        break;
      
      msg = malloc(sizeof(* msg));
      if (msg == NULL) {
        res = MAIL_ERROR_MEMORY;
        mmap_string_free(mmapstr);
        goto free_msglist;
      }
      * msg = num;
      
      r = carray_add(msglist, msg, NULL);
      if (r < 0) {
        res = MAIL_ERROR_MEMORY;
        free(msg);
        mmap_string_free(mmapstr);
        goto free_msglist;
      }
    } while (1);
    
    mmap_string_free(mmapstr);
  }
  
  * p_msglist = msglist;
  
  return MAIL_NO_ERROR;
  
 free_msglist:
  for(i = 0 ; i < carray_count(msglist) ; i ++) {
    uint32_t * msg;
    
    msg = carray_get(msglist, i);
    free(msg);
  }
  carray_free(msglist);
 err:
  return res;
}
Пример #4
0
static int db_get_next_msg_number(struct mail_cache_db * maildb,
    uint32_t * p_num)
{
  int r;
  char key_value[PATH_MAX];
  uint32_t num;
  void * serialized;
  size_t serialized_len;
  int res;
  MMAPString * mmapstr;
  size_t cur_token;
  
  mmapstr = mmap_string_new("");
  if (mmapstr == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  
  snprintf(key_value, sizeof(key_value), "next-msg");
  
  r = mail_cache_db_get(maildb, key_value, strlen(key_value),
      &serialized, &serialized_len);
  
  if (r >= 0) {
    if (mmap_string_append_len(mmapstr, serialized, serialized_len) == NULL) {
      res = MAIL_ERROR_MEMORY;
      goto err;
    }
    
    cur_token = 0;
    r = mailimf_cache_int_read(mmapstr, &cur_token, &num);
    if (r < 0)
      num = 1;
  }
  else {
    num = 1;
  }
  
  mmap_string_set_size(mmapstr, 0);
  cur_token = 0;
  r = mailimf_cache_int_write(mmapstr, &cur_token, num + 1);
  if (r < 0) {
    res = MAIL_ERROR_MEMORY;
    goto free_mmapstr;
  }
  
  r = mail_cache_db_put(maildb, key_value, strlen(key_value),
      mmapstr->str, mmapstr->len);
  if (r < 0) {
    res = MAIL_ERROR_FILE;
    goto free_mmapstr;
  }
  
  mmap_string_free(mmapstr);
  
  * p_num = num;
  
  return MAIL_NO_ERROR;
  
 free_mmapstr:
  mmap_string_free(mmapstr);
 err:
  return res;
}