Mysql Openstack Stored Procedures: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показана 1 промежуточная версия этого же участника)
Строка 3: Строка 3:
 
=Хранимые процедуры и отсылка оповещений об изменениях на HTTP=
 
=Хранимые процедуры и отсылка оповещений об изменениях на HTTP=
   
В MySQL есть такая возможность - использовать внешние пользовательские процедуры написанные на языке C <BR>
+
В MySQL есть такая возможность - использовать внешние пользовательские процедуры написанные на языке C <BR>
 
Это дает возможность сделать триггер который при апдейте таблицы будет форматировать JSON и отправлять на удаленный сервер (или сервера)
 
Это дает возможность сделать триггер который при апдейте таблицы будет форматировать JSON и отправлять на удаленный сервер (или сервера)
 
<BR>
 
<BR>
 
Идея на самом деле сомнительная потому что на время исполнения триггера таблица блокируется но как POC сойдет
 
Идея на самом деле сомнительная потому что на время исполнения триггера таблица блокируется но как POC сойдет
   
  +
* http://www.mooreds.com/wordpress/archives/1497 Пример
  +
  +
  +
==INSERT==
 
<PRE>
 
<PRE>
 
DELIMITER |
 
DELIMITER |
Строка 21: Строка 25:
 
END |
 
END |
 
DELIMITER ;
 
DELIMITER ;
 
 
 
</PRE>
 
</PRE>
   
   
  +
==BEFORE UPDATE==
 
 
<PRE>
 
<PRE>
 
 
DELIMITER |
 
DELIMITER |
 
DROP TRIGGER IF EXISTS nova_instances_before_update;
 
DROP TRIGGER IF EXISTS nova_instances_before_update;
Строка 41: Строка 42:
 
END |
 
END |
 
DELIMITER ;
 
DELIMITER ;
 
 
</PRE>
 
</PRE>
   
  +
==AFTER UPDATE==
 
<PRE>
 
<PRE>
 
DELIMITER |
 
DELIMITER |
Строка 57: Строка 58:
 
END |
 
END |
 
DELIMITER ;
 
DELIMITER ;
 
</PRE>
   
   
 
==Log==
</PRE>
 
  +
Табличка для записи в лог того что отправляется (debug)
   
 
<PRE>
 
<PRE>
 
 
DROP TABLE IF EXISTS httplog;
 
DROP TABLE IF EXISTS httplog;
 
CREATE TABLE `httplog`
 
CREATE TABLE `httplog`
Строка 73: Строка 75:
 
PRIMARY KEY (`seq`)
 
PRIMARY KEY (`seq`)
 
);
 
);
 
   
 
</PRE>
 
</PRE>
   
  +
==Отправка по HTTP==
==123==
 
 
 
 
<PRE>
 
<PRE>
   

Текущая версия на 14:35, 21 сентября 2016


Хранимые процедуры и отсылка оповещений об изменениях на HTTP

В MySQL есть такая возможность - использовать внешние пользовательские процедуры написанные на языке C
Это дает возможность сделать триггер который при апдейте таблицы будет форматировать JSON и отправлять на удаленный сервер (или сервера)
Идея на самом деле сомнительная потому что на время исполнения триггера таблица блокируется но как POC сойдет


INSERT

DELIMITER |
DROP TRIGGER IF EXISTS nova_instances_insert;
CREATE TRIGGER  nova_instances_insert
AFTER INSERT ON instances
FOR EACH ROW BEGIN
    SET @tt_json = (SELECT json_object(created_at,updated_at,id,user_id,project_id,image_ref,hostname,reservation_id,uuid,deleted ) FROM instances  WHERE uuid = NEW.uuid LIMIT 1);

    CALL send_http_data('http://172.16.169.34:8080/', @tt_json);
    CALL send_http_data('http://127.0.0.1:8081/', @tt_json);

END |
DELIMITER ;


BEFORE UPDATE

DELIMITER |
DROP TRIGGER IF EXISTS nova_instances_before_update;
CREATE TRIGGER nova_instances_before_update
BEFORE UPDATE ON instances
FOR EACH ROW BEGIN
    SET @tt_json = (SELECT json_object(created_at,updated_at,id,user_id,project_id,image_ref,hostname,reservation_id,uuid,deleted ) FROM instances  WHERE uuid = OLD.uuid LIMIT 1);

    CALL send_http_data('http://172.16.169.34:8080/', @tt_json);
    CALL send_http_data('http://127.0.0.1:8081/', @tt_json);

END |
DELIMITER ;

AFTER UPDATE

DELIMITER |
DROP TRIGGER IF EXISTS nova_instances_after_update;
CREATE TRIGGER nova_instances_after_update
AFTER UPDATE ON instances
FOR EACH ROW BEGIN
    SET @tt_json = (SELECT json_object(created_at,updated_at,id,user_id,project_id,image_ref,hostname,reservation_id,uuid,deleted ) FROM instances WHERE uuid= OLD.uuid LIMIT 1);

    CALL send_http_data('http://172.16.169.34:8080/', @tt_json);
    CALL send_http_data('http://127.0.0.1:8081/', @tt_json);

END |
DELIMITER ;


Log

Табличка для записи в лог того что отправляется (debug)

DROP TABLE IF EXISTS httplog;
CREATE TABLE `httplog` 
(
  `request` varchar(4096) DEFAULT NULL,
  `response` varchar(4096) DEFAULT NULL,
  `seq` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `local_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `host` varchar(512) DEFAULT NULL,
  PRIMARY KEY (`seq`)
);

Отправка по HTTP


DROP PROCEDURE IF EXISTS send_http_data;

DELIMITER |
CREATE PROCEDURE send_http_data(
IN http_host varchar(512),
IN http_data varchar(4096)
) BEGIN




    SET @tt_resu = (SELECT http_post(http_host, http_data));
    INSERT INTO httplog(host, request,response) values(http_host, http_data, @tt_resu);

END |
DELIMITER ;




    SET @tt_resu = (SELECT http_post(http_host, _data));
    INSERT INTO httplog(host, request,response) values(http_host, _data, @tt_resu);


DROP PROCEDURE IF EXISTS upload2;
DELIMITER |

CREATE PROCEDURE upload2()  BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE json_data TEXT;
  DECLARE _uuid TEXT;
  DECLARE cur CURSOR FOR SELECT uuid from instances;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _uuid;
    IF done THEN
      LEAVE testLoop;
    END IF;

    SELECT json_object(created_at,updated_at,id,user_id,project_id,image_ref,hostname,reservation_id,uuid,deleted) FROM instances WHERE uuid=_uuid LIMIT 1  INTO json_data;

    CALL send_http_data('http://172.16.169.34:8080/', json_data);
    CALL send_http_data('http://127.0.0.1:8081/', json_data);

  END LOOP testLoop;

  CLOSE cur;
END |
DELIMITER ;

Ссылки