SETclient_encoding='UTF8';SETclient_min_messages=warning;CREATESEQUENCEtransport_id;CREATESEQUENCEmailboxformat_id;CREATESEQUENCEquotalimit_id;CREATESEQUENCEmaillocation_id;CREATESEQUENCEservice_set_id;CREATESEQUENCEdomain_gidSTARTWITH70000INCREMENTBY1MINVALUE70000MAXVALUE4294967294NOCYCLE;CREATESEQUENCEusers_uidSTARTWITH70000INCREMENTBY1MINVALUE70000MAXVALUE4294967294NOCYCLE;CREATETABLEtransport(tidbigintNOTNULLDEFAULTnextval('transport_id'),transportvarchar(270)NOTNULL,--smtps:[255-char.host.name:50025]CONSTRAINTpkey_transportPRIMARYKEY(tid),CONSTRAINTukey_transportUNIQUE(transport));--InsertdefaulttransportINSERTINTOtransport(transport)VALUES('dovecot:');CREATETABLEmailboxformat(fidbigintNOTNULLDEFAULTnextval('mailboxformat_id'),formatvarchar(20)NOTNULL,CONSTRAINTpkey_mailboxformatPRIMARYKEY(fid),CONSTRAINTukey_mailboxformatUNIQUE(format));--InsertsupportedmailboxformatsINSERTINTOmailboxformat(format)VALUES('maildir');INSERTINTOmailboxformat(format)VALUES('mdbox');INSERTINTOmailboxformat(format)VALUES('sdbox');CREATETABLEmaillocation(midbigintNOTNULLDEFAULTnextval('maillocation_id'),fidbigintNOTNULLDEFAULT1,directoryvarchar(20)NOTNULL,extravarchar(1024),CONSTRAINTpkey_maillocationPRIMARYKEY(mid),CONSTRAINTfkey_maillocation_fid_mailboxformatFOREIGNKEY(fid)REFERENCESmailboxformat(fid));--InsertdefaultMaildir-foldernameINSERTINTOmaillocation(directory)VALUES('Maildir');CREATETABLEquotalimit(qidbigintNOTNULLDEFAULTnextval('quotalimit_id'),bytesbigintNOTNULL,messagesintegerNOTNULLDEFAULT0,CONSTRAINTpkey_quotalimitPRIMARYKEY(qid),CONSTRAINTukey_quotalimitUNIQUE(bytes,messages));--Insertdefault(non)quotalimitINSERTINTOquotalimit(bytes,messages)VALUES(0,0);CREATETABLEservice_set(ssidbigintNOTNULLDEFAULTnextval('service_set_id'),smtpbooleanNOTNULLDEFAULTTRUE,pop3booleanNOTNULLDEFAULTTRUE,imapbooleanNOTNULLDEFAULTTRUE,managesievebooleanNOTNULLDEFAULTTRUE,CONSTRAINTpkey_service_setPRIMARYKEY(ssid),CONSTRAINTukey_service_setUNIQUE(smtp,pop3,imap,managesieve));--InsertallpossibleservicecombinationsCOPYservice_set(smtp,pop3,imap,managesieve)FROMstdin;TRUETRUETRUETRUEFALSETRUETRUETRUETRUEFALSETRUETRUEFALSEFALSETRUETRUETRUETRUEFALSETRUEFALSETRUEFALSETRUETRUEFALSEFALSETRUEFALSEFALSEFALSETRUETRUETRUETRUEFALSEFALSETRUETRUEFALSETRUEFALSETRUEFALSEFALSEFALSETRUEFALSETRUETRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE\.CREATETABLEdomain_data(gidbigintNOTNULLDEFAULTnextval('domain_gid'),qidbigintNOTNULLDEFAULT1,--defaultquotalimitssidbigintNOTNULLDEFAULT1,--defaultservice_settidbigintNOTNULLDEFAULT1,--defaulttransportdomaindirvarchar(40)NOTNULL,--/srv/mail/$RAND/4294967294CONSTRAINTpkey_domain_dataPRIMARYKEY(gid),CONSTRAINTfkey_domain_data_qid_quotalimitFOREIGNKEY(qid)REFERENCESquotalimit(qid),CONSTRAINTfkey_domain_data_ssid_service_setFOREIGNKEY(ssid)REFERENCESservice_set(ssid),CONSTRAINTfkey_domain_data_tid_transportFOREIGNKEY(tid)REFERENCEStransport(tid));CREATETABLEdomain_name(domainnamevarchar(255)NOTNULL,gidbigintNOTNULL,is_primarybooleanNOTNULL,CONSTRAINTpkey_domain_namePRIMARYKEY(domainname),CONSTRAINTfkey_domain_name_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid));CREATETABLEusers(local_partvarchar(64)NOTNULL,--onlylocalpartw/o'@'passwdvarchar(270)NOTNULL,namevarchar(128)NULL,uidbigintNOTNULLDEFAULTnextval('users_uid'),gidbigintNOTNULL,midbigintNOTNULLDEFAULT1,qidbigintNOTNULLDEFAULT1,ssidbigintNOTNULLDEFAULT1,tidbigintNOTNULLDEFAULT1,CONSTRAINTpkey_usersPRIMARYKEY(local_part,gid),CONSTRAINTukey_users_uidUNIQUE(uid),CONSTRAINTfkey_users_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid),CONSTRAINTfkey_users_mid_maillocationFOREIGNKEY(mid)REFERENCESmaillocation(mid),CONSTRAINTfkey_users_qid_quotalimitFOREIGNKEY(qid)REFERENCESquotalimit(qid),CONSTRAINTfkey_users_ssid_service_setFOREIGNKEY(ssid)REFERENCESservice_set(ssid),CONSTRAINTfkey_users_tid_transportFOREIGNKEY(tid)REFERENCEStransport(tid));CREATETABLEuserquota_11(uidbigintNOTNULL,pathvarchar(16)NOTNULL,currentbigintNOTNULLDEFAULT0,CONSTRAINTpkey_userquota_11PRIMARYKEY(uid,path),CONSTRAINTfkey_userquota_11_uid_usersFOREIGNKEY(uid)REFERENCESusers(uid)ONDELETECASCADE);CREATETABLEalias(gidbigintNOTNULL,addressvarchar(64)NOTNULL,--onlylocalpartw/o'@'destinationvarchar(320)NOTNULL,CONSTRAINTpkey_aliasPRIMARYKEY(gid,address,destination),CONSTRAINTfkey_alias_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid));CREATETABLErelocated(gidbigintNOTNULL,addressvarchar(64)NOTNULL,destinationvarchar(320)NOTNULL,CONSTRAINTpkey_relocatedPRIMARYKEY(gid,address),CONSTRAINTfkey_relocated_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid));CREATEORREPLACEVIEWdovecot_passwordASSELECTlocal_part||'@'||domain_name.domainnameAS"user",passwdAS"password",smtp,pop3,imap,managesieveFROMusersLEFTJOINdomain_nameUSING(gid)LEFTJOINservice_setUSING(ssid);CREATEORREPLACEVIEWdovecot_userASSELECTlocal_part||'@'||domain_name.domainnameASuserid,uid,gid,domain_data.domaindir||'/'||uidAShome,mailboxformat.format||':~/'||maillocation.directoryASmailFROMusersLEFTJOINdomain_dataUSING(gid)LEFTJOINdomain_nameUSING(gid)LEFTJOINmaillocationUSING(mid)LEFTJOINmailboxformatUSING(fid);CREATEORREPLACEVIEWpostfix_gidASSELECTgid,domainnameFROMdomain_name;CREATEORREPLACEVIEWpostfix_uidASSELECTlocal_part||'@'||domain_name.domainnameASaddress,uidFROMusersLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWpostfix_maildirASSELECTlocal_part||'@'||domain_name.domainnameASaddress,domain_data.domaindir||'/'||uid||'/'||maillocation.directory||'/'ASmaildirFROMusersLEFTJOINdomain_dataUSING(gid)LEFTJOINdomain_nameUSING(gid)LEFTJOINmaillocationUSING(mid);CREATEORREPLACEVIEWpostfix_relocatedASSELECTaddress||'@'||domain_name.domainnameASaddress,destinationFROMrelocatedLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWpostfix_aliasASSELECTaddress||'@'||domain_name.domainnameASaddress,destination,gidFROMaliasLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWpostfix_transportASSELECTlocal_part||'@'||domain_name.domainnameASaddress,transport.transportFROMusersLEFTJOINtransportUSING(tid)LEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWvmm_domain_infoASSELECTgid,count(uid)ASaccounts,(SELECTcount(DISTINCTaddress)FROMaliasWHEREalias.gid=domain_data.gid)ASaliases,(SELECTcount(gid)FROMrelocatedWHERErelocated.gid=domain_data.gid)ASrelocated,(SELECTcount(gid)FROMdomain_nameWHEREdomain_name.gid=domain_data.gidANDNOTdomain_name.is_primary)ASaliasdomainsFROMdomain_dataLEFTJOINdomain_nameUSING(gid)LEFTJOINusersUSING(gid)WHEREdomain_name.is_primaryGROUPBYgid;CREATELANGUAGEplpgsql;CREATEORREPLACEFUNCTIONdomain_primary_trigger()RETURNSTRIGGERAS$$DECLAREprimary_countbigint;BEGINSELECTINTOprimary_countcount(gid)+NEW.is_primary::integerFROMdomain_nameWHEREdomain_name.gid=NEW.gidANDis_primary;IF(primary_count>1)THENRAISEEXCEPTION'There can only be one domain marked as primary.';ENDIF;RETURNNEW;END;$$LANGUAGEplpgsqlSTABLE;CREATETRIGGERprimary_count_insBEFOREINSERTONdomain_nameFOREACHROWEXECUTEPROCEDUREdomain_primary_trigger();CREATETRIGGERprimary_count_updAFTERUPDATEONdomain_nameFOREACHROWEXECUTEPROCEDUREdomain_primary_trigger();CREATEORREPLACEFUNCTIONmerge_userquota_11()RETURNSTRIGGERAS$$BEGINUPDATEuserquota_11SETcurrent=current+NEW.currentWHEREuid=NEW.uidANDpath=NEW.path;IFfoundTHENRETURNNULL;ELSERETURNNEW;ENDIF;END;$$LANGUAGEplpgsql;CREATETRIGGERmergeuserquota_11BEFOREINSERTONuserquota_11FOREACHROWEXECUTEPROCEDUREmerge_userquota_11();