Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Renamed VMM*Exception classes to *Error.
No longer add the attribute 'message' to VMMError if it doesn't exist, like in
Python 2.4. It has been deprecated as of Python 2.6.
Also removed the methods code() and msg(), the values are now accessible via
the attributes 'code' and 'msg'.
SETclient_encoding='UTF8';SETclient_min_messages=warning;ALTERSEQUENCEdomains_gidRENAMETOdomain_gid;CREATETABLEdomain_data(gidbigintNOTNULLDEFAULTnextval('domain_gid'),tidbigintNOTNULLDEFAULT1,domaindirvarchar(40)NOTNULL,CONSTRAINTpkey_domain_dataPRIMARYKEY(gid),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));INSERTINTOdomain_data(gid,tid,domaindir)SELECTgid,tid,domaindirFROMdomains;INSERTINTOdomain_name(domainname,gid,is_primary)SELECTdomainname,gid,TRUEFROMdomains;ALTERTABLEusersDROPCONSTRAINTpkye_users;ALTERTABLEusersADDCONSTRAINTpkey_usersPRIMARYKEY(local_part,gid);ALTERTABLEusersDROPCONSTRAINTfkey_users_gid_domains;ALTERTABLEusersADDCONSTRAINTfkey_users_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid);ALTERTABLEaliasDROPCONSTRAINTfkey_alias_gid_domains;ALTERTABLEaliasDROPCONSTRAINTpkey_alias;ALTERTABLEaliasADDCONSTRAINTfkey_alias_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid);ALTERTABLErelocatedDROPCONSTRAINTfkey_relocated_gid_domains;ALTERTABLErelocatedADDCONSTRAINTfkey_relocated_gid_domain_dataFOREIGNKEY(gid)REFERENCESdomain_data(gid);CREATEORREPLACEVIEWdovecot_passwordASSELECTlocal_part||'@'||domain_name.domainnameAS"user",passwdAS"password",smtp,pop3,imap,managesieveFROMusersLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWdovecot_userASSELECTlocal_part||'@'||domain_name.domainnameASuserid,uid,gid,domain_data.domaindir||'/'||uidAShome,'~/'||maillocation.maillocationASmailFROMusersLEFTJOINdomain_dataUSING(gid)LEFTJOINdomain_nameUSING(gid)LEFTJOINmaillocationUSING(mid);CREATEORREPLACEVIEWpostfix_gidASSELECTgid,domainnameFROMdomain_name;CREATEORREPLACEVIEWpostfix_uidASSELECTlocal_part||'@'||domain_name.domainnameASaddress,uidFROMusersLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWpostfix_maildirASSELECTlocal_part||'@'||domain_name.domainnameASaddress,domain_data.domaindir||'/'||uid||'/'||maillocation.maillocation||'/'ASmaildirFROMusersLEFTJOINdomain_dataUSING(gid)LEFTJOINdomain_nameUSING(gid)LEFTJOINmaillocationUSING(mid);CREATEORREPLACEVIEWpostfix_relocatedASSELECTaddress||'@'||domain_name.domainnameASaddress,destinationFROMrelocatedLEFTJOINdomain_nameUSING(gid);DROPVIEWpostfix_alias;DROPVIEWvmm_domain_info;DROPVIEWvmm_alias_count;ALTERTABLEaliasALTERaddressTYPEvarchar(64);ALTERTABLEaliasADDCONSTRAINTpkey_aliasPRIMARYKEY(gid,address,destination);CREATEORREPLACEVIEWpostfix_aliasASSELECTaddress||'@'||domain_name.domainnameASaddress,destination,gidFROMaliasLEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWpostfix_transportASSELECTlocal_part||'@'||domain_name.domainnameASaddress,transport.transportFROMusersLEFTJOINtransportUSING(tid)LEFTJOINdomain_nameUSING(gid);CREATEORREPLACEVIEWvmm_domain_infoASSELECTgid,domainname,transport,domaindir,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)LEFTJOINtransportUSING(tid)LEFTJOINusersUSING(gid)WHEREdomain_name.is_primaryGROUPBYgid,domainname,transport,domaindir;DROPTABLEdomains;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;DROPTRIGGERIFEXISTSprimary_countONdomain_name;CREATETRIGGERprimary_count_insBEFOREINSERTONdomain_nameFOREACHROWEXECUTEPROCEDUREdomain_primary_trigger();CREATETRIGGERprimary_count_updAFTERUPDATEONdomain_nameFOREACHROWEXECUTEPROCEDUREdomain_primary_trigger();