John Fawcett wrote:
> On 13/01/2024 14:01, Matt wrote:
> > Hi,
> > I'm trying to setup quota with the following layout
> > CREATE TABLE "domain" (
> > "id" INTEGER,
> > "name" TEXT,
> > "active" INTEGER DEFAULT 0,
> > PRIMARY KEY("id"),
> > UNIQUE("name")
> > )
> > CREATE TABLE "address" (
> > "id" INTEGER,
> > "localpart" TEXT NOT NULL,
> > "domain_id" INTEGER NOT NULL,
> > PRIMARY KEY("id"),
> > UNIQUE("localpart","domain_id")
> > )
> > CREATE TABLE "mailbox" (
> >          "id" INTEGER,
> > "address_id" INTEGER,
> > "active" INTEGER DEFAULT 0,
> > "password" TEXT,
> > "quota_bytes" INTEGER DEFAULT 0,
> > PRIMARY KEY("id")
> > )
> > As I like to update the quota and I like to use a dict/map I'm not sure if I
> > can update this following:
> > map {
> >    pattern = priv/quota/storage
> >    table = maibox
> >    value_field = dummy
> >    fields {
> >      value_field = quota_bytes
> >      id = mailbox_id
> >    }
> > mailbox_id will be queried using password_query using: "mailbox.id as
> > mailbox_id"
> > Using such map I hope to be able to use:
> > SELECT quota_bytes FROM mailbox WHERE id = '$mailbox_id'
> > INSERT INTO mailbox (quota_bytes) VALUES ('$value') ON DUPLICATE KEY UPDATE
> > quota_bytes='$value'
> > Can someone help me with this ?
> > Hi Matt

Hi John, thank you very much for reaching out to me with your clear 
explanation, I will respond below your quoted text.

> as far as I know the quota plugin with the dict backend requires you to 
> configure the name of your username field in the map. The usual way to 
> configure it is to have a quota table like in the documentation.
> https://doc.dovecot.org/configuration_manual/quota/quota_dict/
> In your case where you don't have a username field in the table that 
> stores the quotas, then depending on your database, you may be able to 
> create a view that does include the username and configure that in Dovecot.

Yes, the idea was a view from my side as well but as I try to keep things as 
clean as possible I didn't mention it yet, also because - you say later on in 
your reply - quota_dict is deprecated so I already implemented "count" but was 
not sure about quota_clone as I assumed I needed Redis because the manual said 
as "more complex example" dict in the MySQL part so I was confused and thought 
to implement Redis because of it; it seems I can put in almost any backend that 
uses dict it seems.

https://doc.dovecot.org/configuration_manual/quota_clone_plugin

> The quota plugin updates the values of two fields holding the number of 
> messages and the number of bytes used. I noticed you don't have the 
> messages field. I suggest to add it.

I know, I copied that part from the documentation when trying to find a sane 
config; messages will be added but thank for you notice when people read this 
thread later on. (I lots of them confused me all the time as this was not a 
major one for me actually - point taken!)

https://doc.dovecot.org/configuration_manual/dict/#dict-sql

> You shouldn't need to write any queries to update the quota: Dovecot 
> will generate the queries.

True and that is what I like so the question remains what to do here, a dict 
for Mysql with a view should do the trick I believe to understand ?

> On a final note, before you invest time in this, it may be worthwhile 
> keeping an eye on the future plans
> https://doc.dovecot.org/3.0/installation_guide/upgrading/from-2.3-to-3.0/

Thanks for that! As I wasn't upgrading (yet) I could not find any roadmap; this 
is what I needed!

> You could use the count backend with quota plugin (which is the 
> recommended backend for new installations) and then use the quota_clone 
> plugin to keep your database in sync.

Indeed, but this will be a map in combination with a (SQL) dict and the 
bespoken view in my DBMS ?

> John

Matt
_______________________________________________
dovecot mailing list -- dovecot@dovecot.org
To unsubscribe send an email to dovecot-le...@dovecot.org

Reply via email to