From: Sebastian W. <wa...@ho...> - 2005-12-22 22:58:10
|
Hi! I have installed MailManager with the Windows installer. When adding =20 the MailManager instance in the ZMI, an error occured in the =20 following method: security.declarePrivate('manage_afterAdd') def manage_afterAdd(self, item, container): Folder.manage_afterAdd(self, item, container) # Optionally, create the database tables if self.create_tables: if self.schema: self.sql.createSchema() self.sql.createTables() self.sql.createIndexes() self.sql.addTextSearch() <<<-- Error on this line del self.create_tables I removed that line and I could add an instance. I have given it a =20 reasonable testrun and it seems to work fine in all respects. I can =20 both send and receive e-mail att users and accounts and handle the e-=20 mail. QUESTION: 1 What part of the application is crippled by removing the offending =20 line? 2 Can this be fixed by manually configuring something or adding =20 something? 3 What might cause this action to fail? (the SQL method is shown bellow) Error, psycopg.ProgrammingError: ERROR: RETURN cannot have a =20 parameter in function returning void at or near "NONE" at character 1293 -- Trigger =20 function up maintaining the search indicies on mm_ticket -- -- This trigger gets calle=E4Tt mvh sebastian self.sql.addTextSearch(): <dtml-comment> title:Create Text Search Indexes (Postgres) connection_id:mailmanager_db arguments: </dtml-comment> ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- -- -- Create Functionality -- ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- -- -- Aggregation function (used internally) -- -- This function combines the tsvector values of the messages in a =20 ticket,=20 -- gives back a tsvector which can be used to search all of the =20 messages at -- once. The resulting tsvector preserves the releative distances =20 between -- search terms, so the the scoring of results is not changed. -- -- Alternatively, we could use postgresql's CREATE AGGREGATE here, =20 which may -- improve both the performance and the semantics of the database. =20 For now, -- this shall suffice. -- -- Function: ts_aggregate(ticket_id integer) -- Description: Returns the aggregated message indicies from all of the -- messages under the ticket with the given id -- CREATE OR REPLACE FUNCTION <dtml-var schema>ts_aggregate(integer) =20 RETURNS tsvector AS ' DECLARE ticket_id ALIAS FOR $1; summation TSVECTOR :=3D ''''::tsvector; msg RECORD; BEGIN FOR msg IN SELECT * FROM <dtml-var schema>mm_message WHERE <dtml-var =20 schema>mm_message.ticket_id =3D ticket_id LOOP summation =3D summation || msg.idxFTI; END LOOP; RETURN summation; END; ' LANGUAGE plpgsql <dtml-var sql_delimiter> -- Trigger function up maintaining the search indicies on mm_ticket -- -- This trigger gets called whenever a new mm_message inserted, =20 updated or -- deleted. It will update the text index of the ticket which holds the -- given message. Each update involves aggregating the indicies of =20 all of -- the child messages of a ticket, which is not a particularly fast =20 operation. -- Some improvements could be made to this if really required, but in =20= practice -- if the message count is small these are not worth doing. For =20 tickets with -- large numbers of messages, it may be possible to do some kind of =20 incremental -- update on the ticket index, and incremental updates of the index =20 in the -- case of removal of messages would be problematic. -- -- The trigger function is mainly a wrapper to the standard version =20 of the -- function, to avoid code duplication. -- -- -- Function: mm_ticket_update_idxFTI(ticket_id integer) -- Description: Updates the text index on the ticket with the given =20 id by -- combining the text indices of all the messages under the ticket. -- CREATE OR REPLACE FUNCTION <dtml-var schema>mm_ticket_update_idxFTI=20 (integer) RETURNS void AS ' DECLARE ticket_id ALIAS FOR $1; BEGIN UPDATE <dtml-var schema>mm_ticket SET idxFTI =3D <dtml-var =20 schema>ts_aggregate(ticket_id) WHERE mm_ticket.id =3D ticket_id; RETURN NONE; END ' LANGUAGE plpgsql <dtml-var sql_delimiter> CREATE OR REPLACE FUNCTION <dtml-var schema>mm_ticket_update_idxFTI() =20= RETURNS trigger AS $mm_ticket_update_idxFTI$ BEGIN IF (TG_OP =3D 'DELETE') THEN PERFORM <dtml-var schema>mm_ticket_update_idxFTI(OLD.ticket_id); RETURN NULL; ELSIF (TG_OP =3D 'UPDATE') THEN PERFORM <dtml-var schema>mm_ticket_update_idxFTI(NEW.ticket_id); RETURN NULL; ELSIF (TG_OP =3D 'INSERT') THEN PERFORM <dtml-var schema>mm_ticket_update_idxFTI(NEW.ticket_id); RETURN NULL; END IF; END $mm_ticket_update_idxFTI$ LANGUAGE plpgsql <dtml-var sql_delimiter> ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- -- -- Update Existing Data -- ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- ALTER TABLE <dtml-var schema>mm_message ADD COLUMN idxFTI tsvector =20 <dtml-var sql_delimiter> ALTER TABLE <dtml-var schema>mm_ticket ADD COLUMN idxFTI tsvector =20 <dtml-var sql_delimiter> -- Update the indices on the messages UPDATE <dtml-var schema>mm_message SET idxFTI=3Dto_tsvector( 'default', coalesce(subject,'') ||' '|| coalesce(body,'') ||' '|| coalesce=20 (html_body,'') ) <dtml-var sql_delimiter> -- Update the indices on the tickets SELECT COUNT(<dtml-var schema>mm_ticket_update_idxFTI(id)) FROM <dtml-=20= var schema>mm_ticket <dtml-var sql_delimiter> CREATE INDEX mm_message_idxFTI_idx ON <dtml-var schema>mm_message USING gist(idxFTI) <dtml-var sql_delimiter> CREATE INDEX mm_ticket_idxFTI_idx ON <dtml-var schema>mm_ticket USING gist(idxFTI) <dtml-var sql_delimiter> ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- -- -- Maintain Future Data -- ------------------------------------------------------------------------=20= ----- ------------------------------------------------------------------------=20= ----- -- -- These two triggers must be ordered, which is done alphabetically -- in postgresql. -- CREATE TRIGGER mm_message_trigA_message_searchupdate BEFORE UPDATE OR INSERT ON <dtml-var schema>mm_message FOR EACH ROW EXECUTE PROCEDURE tsearch2(idxFTI, subject, body, =20 html_body) <dtml-var sql_delimiter> CREATE TRIGGER mm_message_trigB_ticket_searchupdate AFTER UPDATE OR INSERT OR DELETE ON <dtml-var schema>mm_message FOR EACH ROW EXECUTE PROCEDURE <dtml-var =20 schema>mm_ticket_update_idxFTI() <dtml-var sql_delimiter> |