diff --git a/CEP/BB/BBSControl/sql/create_blackboard_functions.sql b/CEP/BB/BBSControl/sql/create_blackboard_functions.sql index 3f980fbf513c70940d0988cc7384cc6438cc76de..691c2049a3b593212bec59c38bc9ef9d1e33be9e 100644 --- a/CEP/BB/BBSControl/sql/create_blackboard_functions.sql +++ b/CEP/BB/BBSControl/sql/create_blackboard_functions.sql @@ -32,7 +32,7 @@ $$ SELECT COUNT(1) FROM ( - SELECT COUNT(1) + SELECT 1 FROM blackboard.result WHERE node = inet_client_addr() LIMIT 1 @@ -45,40 +45,51 @@ $$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION blackboard.command_queue_empty() -RETURNS BOOL AS -$$ - SELECT - ( - SELECT COUNT(1) - FROM - ( - SELECT 1 - FROM blackboard.command - LIMIT 1 - ) - AS tmp - ) = 0; -$$ -LANGUAGE SQL; +--CREATE OR REPLACE FUNCTION blackboard.command_queue_empty() +--RETURNS BOOL AS +--$$ +-- SELECT +-- ( +-- SELECT COUNT(1) +-- FROM +-- ( +-- SELECT 1 +-- FROM blackboard.command +-- LIMIT 1 +-- ) +-- AS tmp +-- ) = 0; +--$$ +--LANGUAGE SQL; -- (PRIVATE FUNCTION, DO NOT CALL FROM C++) CREATE OR REPLACE FUNCTION blackboard.get_next_command_id() RETURNS INTEGER AS $$ - SELECT id - FROM blackboard.command - WHERE id NOT IN - ( - SELECT command_id - FROM blackboard.result - WHERE node = inet_client_addr() - ) - ORDER BY id - LIMIT 1; + DECLARE + _id INTEGER; + BEGIN + SELECT id + INTO _id + FROM blackboard.command + WHERE id NOT IN + ( + SELECT command_id + FROM blackboard.result + WHERE node = inet_client_addr() + ) + ORDER BY id + LIMIT 1; + + IF FOUND THEN + RETURN _id; + END IF; + + RETURN 0; + END; $$ -LANGUAGE SQL; +LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION blackboard.get_next_command() @@ -110,7 +121,7 @@ CREATE OR REPLACE FUNCTION blackboard.set_strategy RETURNS BOOLEAN AS $$ BEGIN - IF (SELECT COUNT(*) FROM blackboard.strategy) <> 0 THEN + IF (SELECT COUNT(1) FROM blackboard.strategy) <> 0 THEN RETURN FALSE; END IF; @@ -268,13 +279,6 @@ $$ LANGUAGE SQL; -CREATE OR REPLACE FUNCTION blackboard.get_nextchunk_args(_command_id INTEGER) -RETURNS VOID AS -$$ -$$ -LANGUAGE SQL; - - CREATE OR REPLACE FUNCTION blackboard.add_nextchunk_command() RETURNS VOID AS $$ @@ -285,6 +289,13 @@ $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION blackboard.get_nextchunk_args(_command_id INTEGER) +RETURNS VOID AS +$$ +$$ +LANGUAGE SQL; + + CREATE OR REPLACE FUNCTION blackboard.add_predict_command (command_args blackboard.iface_predict_args) RETURNS VOID AS @@ -425,20 +436,19 @@ CREATE OR REPLACE FUNCTION blackboard.add_result (_command_id INTEGER, _result_code INTEGER, _message TEXT) -RETURNS VOID AS +RETURNS BOOL AS $$ - DECLARE - last_id INTEGER; BEGIN - IF blackboard.command_queue_empty() - OR _command_id != blackboard.get_next_command_id() + IF _command_id > 0 + AND _command_id = blackboard.get_next_command_id() THEN - RAISE EXCEPTION - 'Attempt to add result for a command that is not current'; + INSERT INTO blackboard.result(command_id, result_code, message) + VALUES (_command_id, _result_code, _message); + + RETURN FOUND; END IF; - - INSERT INTO blackboard.result(command_id, result_code, message) - VALUES (_command_id, _result_code, _message); + + RETURN FALSE; END; $$ LANGUAGE plpgsql; diff --git a/CEP/BB/BBSControl/sql/create_blackboard_tables.sql b/CEP/BB/BBSControl/sql/create_blackboard_tables.sql index f7a43f025e34b782719f203a5765a4bad6901863..ade881aa26ee8a2bcc1875553d977c8d138c1a4a 100644 --- a/CEP/BB/BBSControl/sql/create_blackboard_tables.sql +++ b/CEP/BB/BBSControl/sql/create_blackboard_tables.sql @@ -82,7 +82,9 @@ CREATE TABLE blackboard.result timestamp TIMESTAMP WITH TIME ZONE DEFAULT now(), node INET DEFAULT inet_client_addr(), result_code INTEGER NOT NULL, - message TEXT NOT NULL + message TEXT NOT NULL, + + UNIQUE (command_id, node) ); diff --git a/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql b/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql index cb06d623a96d2a93911b7b05df04caa56e594aab..1310e5bee5ecee911022597dbecbbfb7afa4d498 100644 --- a/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql +++ b/CEP/BB/BBSControl/sql/create_blackboard_triggers.sql @@ -1,4 +1,4 @@ -CREATE OR REPLACE FUNCTION blackboard.notify_client() RETURNS TRIGGER AS +CREATE OR REPLACE FUNCTION blackboard.notify() RETURNS TRIGGER AS $$ BEGIN EXECUTE 'NOTIFY ' || quote_ident(TG_NAME); @@ -7,10 +7,27 @@ $$ $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION blackboard.notify_result() RETURNS TRIGGER AS +$$ + DECLARE + cmd_type TEXT; + BEGIN + cmd_type := "Type" FROM blackboard.command WHERE id = NEW.command_id; + + IF cmd_type ~ 'initialize|finalize|nextchunk' THEN +-- RAISE NOTICE 'NOTIFY %', quote_ident(TG_NAME) || '_' || cmd_type; + EXECUTE 'NOTIFY ' || quote_ident(TG_NAME) || '_' || cmd_type; + END IF; + + RETURN NULL; + END; +$$ +LANGUAGE plpgsql; + CREATE TRIGGER insert_command AFTER INSERT ON blackboard.command - FOR EACH STATEMENT EXECUTE PROCEDURE blackboard.notify_client(); + FOR EACH STATEMENT EXECUTE PROCEDURE blackboard.notify(); CREATE TRIGGER insert_result AFTER INSERT ON blackboard.result - FOR EACH STATEMENT EXECUTE PROCEDURE blackboard.notify_client(); + FOR EACH ROW EXECUTE PROCEDURE blackboard.notify_result(); diff --git a/CEP/BB/BBSControl/sql/create_blackboard_types.sql b/CEP/BB/BBSControl/sql/create_blackboard_types.sql index e4712cb0f8fb64c81a3183fdf897dbfe516f1915..d6d198a070ca90fe64bc19e0afb238f9e4ef3154 100644 --- a/CEP/BB/BBSControl/sql/create_blackboard_types.sql +++ b/CEP/BB/BBSControl/sql/create_blackboard_types.sql @@ -61,11 +61,11 @@ CREATE TYPE blackboard.iface_solve_args AS "Sources" TEXT, "InstrumentModel" TEXT, "OutputData" TEXT, - "Solve.MaxIter" INTEGER, - "Solve.Epsilon" DOUBLE PRECISION, - "Solve.MinConverged" DOUBLE PRECISION, - "Solve.Parms" TEXT, - "Solve.ExclParms" TEXT, - "Solve.DomainSize.Freq" DOUBLE PRECISION, - "Solve.DomainSize.Time" DOUBLE PRECISION + "Solve.MaxIter" INTEGER, + "Solve.Epsilon" DOUBLE PRECISION, + "Solve.MinConverged" DOUBLE PRECISION, + "Solve.Parms" TEXT, + "Solve.ExclParms" TEXT, + "Solve.DomainSize.Freq" DOUBLE PRECISION, + "Solve.DomainSize.Time" DOUBLE PRECISION );