More information about - Dovecot 2.2.x quota mysql and dict

Simon semfly at gmail.com
Tue Oct 6 22:34:53 UTC 2015


I some add information about bug...


Dovecot 2.2.19 version on server FreeBSD 10.2 Release.
Config quota (dict + mysql)
Database create Postfixadmin 2.3.7

Old version Dovecot 2.2.13 use method UPDATE in MySQL base + dict
example mysql.log
-----------------
Connect   postfix at localhost on postfix
            134 Query     SELECT bytes FROM quota2 WHERE username =
'user at mydomain.lan'
            135 Query     SELECT bytes FROM quota2 WHERE username =
'user at mydomain.lan'
            135 Query     BEGIN
            135 Query     UPDATE quota2 SET
bytes=bytes+2570,messages=messages+1 WHERE username = 'user at mydomain.lan'
            136 Connect   postfix at localhost on postfix
            136 Query     BEGIN
            136 Query     UPDATE domain SET quota=quota+2570 WHERE domain =
'mydomain.lan'
            134 Query     BEGIN
            134 Query     UPDATE quota2 SET
bytes=bytes+1723,messages=messages+1 WHERE username = 'user at mydomain.lan'
            137 Connect   postfix at localhost on postfix
            137 Query     BEGIN
            137 Query     UPDATE domain SET quota=quota+1723 WHERE domain =
'mydomain.lan'
            136 Query     UPDATE quota2 SET messages=messages+1 WHERE
username = 'mydomain.lan'
            - - - 
            137 Query     COMMIT
151004  3:12:27   128 Quit
-----------------

# cat dovecot-2.2.13/src/lib-dict/dict-sql.c
=== some text delete ===

static const char *
sql_dict_update_query(const struct dict_sql_build_query *build)
{
      struct sql_dict *dict = build->dict;
      const struct dict_sql_build_query_field *fields;
      unsigned int i, field_count;
      string_t *query;

      i_assert(build->inc);

      fields = array_get(&build->fields, &field_count);
      i_assert(field_count > 0);

      query = t_str_new(64);
      str_printfa(query, "UPDATE %s SET ", fields[0].map->table); #### this
in code, work excellent 
      for (i = 0; i < field_count; i++) {
              if (i > 0)
                      str_append_c(query, ',');
              str_printfa(query, "%s=%s", fields[i].map->value_field,
                          fields[i].map->value_field);
              if (fields[i].value[0] != '-')
                      str_append_c(query, '+');
              str_append(query, fields[i].value);
      }

      sql_dict_where_build(dict, fields[0].map, build->extra_values,
                           build->key1, SQL_DICT_RECURSE_NONE, query);
      return str_c(query);
}

=== === ===


Latest version Dovecot 2.2.19 use method DELETE/INSERT in MySQL base + dict

            140 Connect   postfix at localhost on postfix
            140 Query     SELECT quota FROM domain WHERE domain =
'mydomain.lan'
            140 Query     SELECT quota FROM domain WHERE domain =
'mydomain.lan'
            140 Query     SELECT messages FROM quota2 WHERE username =
'mydomain.lan'
            140 Query     BEGIN
            140 Query     DELETE FROM domain WHERE domain = 'mydomain.lan'
            140 Query     DELETE FROM quota2 WHERE username = 'mydomain.lan'
            140 Query     INSERT INTO domain (quota,domain) VALUES
('8581','mydomain.lan') ON DUPLICATE KEY UPDATE quota='8581'
151004 15:18:45  140 Quit

# cat dovecot-2.2.19/src/lib-dict/dict-sql.c
=== some text delete ===

static void sql_dict_unset(struct dict_transaction_context *_ctx,
                         const char *key)
{
      struct sql_dict_transaction_context *ctx =
              (struct sql_dict_transaction_context *)_ctx;
      struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
      const struct dict_sql_map *map;
      ARRAY_TYPE(const_string) values;

      if (ctx->prev_inc_map != NULL)
              sql_dict_prev_inc_flush(ctx);

      map = sql_dict_find_map(dict, key, &values);
      if (map == NULL) {
              i_error("sql dict unset: Invalid/unmapped key: %s", key);
              ctx->failed = TRUE;
              return;
      }

      T_BEGIN {
              string_t *query = t_str_new(256);
              const char *error;

              str_printfa(query, "DELETE FROM %s", map->table);   #### here
deleted all information about domain, this code i think need change
              if (sql_dict_where_build(dict, map, &values, key[0],
                                       SQL_DICT_RECURSE_NONE, query, &error)
< 0) {
                      i_error("dict-sql: Failed to delete %s: %s", key,
error);
                      ctx->failed = TRUE;
              } else {
                      sql_update(ctx->sql_ctx, str_c(query));
              }
      } T_END;
}
=== === ===



Now dic + mysql doesn’t work in Dovecot 2.2.19, because first DELETE
operator delete information from base about my domain mydomain.lan  

Thanks!

Simon. 



--
View this message in context: http://dovecot.2317879.n4.nabble.com/More-information-about-Dovecot-2-2-x-quota-mysql-and-dict-tp54077.html
Sent from the Dovecot mailing list archive at Nabble.com.


More information about the dovecot mailing list