upgrade_ph_task.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. {**************************************************************************}
  2. {* *}
  3. {* Licensed Materials - Property of IBM and/or HCL *}
  4. {* *}
  5. {* IBM Informix Dynamic Server *}
  6. {* (c) Copyright IBM Corporation 2011 , 2015 *}
  7. {* (c) Copyright HCL Technologies Ltd. 2017. All Rights Reserved. *}
  8. {* *}
  9. {**************************************************************************}
  10. {* update the task attributes for task post_alarm_message *}
  11. UPDATE ph_task SET tk_attributes = BITOR(tk_attributes,"0x4000")
  12. WHERE tk_name = "post_alarm_message";
  13. DROP FUNCTION IF EXISTS informix.json_listener(INT, INT);
  14. CREATE FUNCTION informix.json_listener(task_id INT, task_seq INT)
  15. RETURNING INTEGER
  16. DEFINE rc INTEGER;
  17. DEFINE tmp INTEGER;
  18. DEFINE prop_file VARCHAR(130);
  19. DEFINE msg LVARCHAR;
  20. FOREACH SELECT TRIM(value)
  21. INTO prop_file
  22. FROM ph_threshold
  23. WHERE name MATCHES "JSON LISTENER PROP*"
  24. EXECUTE FUNCTION admin("json listener start", prop_file) INTO rc;
  25. IF rc < 0 THEN
  26. LET msg = "";
  27. SELECT cmd_ret_msg INTO msg FROM command_history WHERE cmd_number = rc;
  28. INSERT INTO ph_alert
  29. (ID, alert_task_id,alert_task_seq,alert_type,
  30. alert_color, alert_object_type,
  31. alert_object_name, alert_message,alert_action)
  32. VALUES
  33. (0,task_id, task_seq, "INFO", "GREEN", "SERVER", prop_file,
  34. "JSON Listener "||TRIM(prop_file)||" failed to started. "||TRIM(msg),
  35. NULL);
  36. ELSE
  37. INSERT INTO ph_alert
  38. (ID, alert_task_id,alert_task_seq,alert_type,
  39. alert_color, alert_object_type,
  40. alert_object_name, alert_message,alert_action)
  41. VALUES
  42. (0,task_id, task_seq, "INFO", "GREEN", "SERVER", prop_file,
  43. "JSON Listener "||TRIM(prop_file)||" started",
  44. NULL);
  45. END IF
  46. END FOREACH
  47. END FUNCTION;
  48. UPDATE ph_task SET tk_attributes = 0 WHERE tk_name = "json listener";
  49. DELETE FROM ph_task where tk_name = "json listener";
  50. INSERT INTO ph_task
  51. (
  52. tk_name,
  53. tk_type,
  54. tk_group,
  55. tk_description,
  56. tk_execute,
  57. tk_start_time,
  58. tk_stop_time,
  59. tk_frequency,
  60. tk_next_execution,
  61. tk_delete,
  62. tk_enable
  63. )
  64. VALUES
  65. (
  66. "json listener",
  67. "STARTUP TASK",
  68. "SERVER",
  69. "Start JSON Listener",
  70. "json_listener",
  71. NULL,
  72. NULL,
  73. INTERVAL ( 10 ) SECOND TO SECOND,
  74. NULL,
  75. INTERVAL ( 30 ) DAY TO DAY,
  76. 't'
  77. );
  78. {* Need to change the function signature as parameter and column *}
  79. {* are getting confused *}
  80. MERGE
  81. INTO ph_threshold AS t
  82. USING ( SELECT
  83. "ALERT HISTORY MAX ROWS", "Alert Cleanup","100000","NUMERIC",
  84. "Stop cleaning the ph_alert and ph_run tables after exceeding the cleanup threshold."
  85. FROM sysmaster:sysdual)
  86. AS s(name,task_name,value,value_type,description)
  87. ON t.name = s.name
  88. WHEN MATCHED THEN UPDATE
  89. SET (t.value_type, t.description) = (s.value_type,s.description )
  90. WHEN NOT MATCHED THEN INSERT
  91. (t.name,t.task_name,t.value,t.value_type,t.description)
  92. VALUES
  93. (s.name,s.task_name,s.value,s.value_type,s.description);
  94. DROP FUNCTION IF EXISTS informix.AlertCleanup(INTEGER, INTEGER);
  95. CREATE FUNCTION informix.AlertCleanup(task_id INTEGER, seq_id INTEGER)
  96. RETURNING INTEGER
  97. DEFINE cur_run_id LIKE ph_run.run_id;
  98. DEFINE cur_id LIKE ph_alert.id;
  99. DEFINE count INTEGER;
  100. DEFINE duration DATETIME YEAR TO SECOND;
  101. DEFINE max_rows INTEGER;
  102. LET count =0;
  103. LET duration = (
  104. SELECT CURRENT - MAX(value)::INTERVAL DAY to SECOND
  105. FROM ph_threshold
  106. WHERE name = 'ALERT HISTORY RETENTION' );
  107. LET max_rows = (
  108. SELECT MAX(value)::INTEGER
  109. FROM ph_threshold
  110. WHERE name = 'ALERT HISTORY MAX ROWS' );
  111. IF max_rows IS NULL OR max_rows < 100 THEN
  112. LET max_rows = 100;
  113. END IF
  114. FOREACH SELECT id, run_id
  115. INTO cur_id, cur_run_id
  116. FROM ph_alert, OUTER ph_run
  117. WHERE ph_alert.alert_task_id = ph_run.run_task_id
  118. AND ph_alert.alert_task_seq = ph_run.run_task_seq
  119. AND alert_time < duration
  120. ORDER BY id, run_id
  121. IF cur_id > 0 THEN
  122. DELETE FROM ph_run WHERE run_id < cur_run_id AND run_task_id = cur_id;
  123. ELSE
  124. DELETE FROM ph_run where run_id = cur_run_id;
  125. END IF
  126. LET count = count + DBINFO('sqlca.sqlerrd2');
  127. DELETE FROM ph_alert where id = cur_id;
  128. LET count = count + 1;
  129. IF count > max_rows THEN
  130. EXIT FOREACH;
  131. END IF
  132. END FOREACH
  133. RETURN count;
  134. END FUNCTION;
  135. {* Alter some integer columns of table mon_users to bigint to reflect *}
  136. {* the coresponding change in sysmaster tables *}
  137. DROP PROCEDURE IF EXISTS alter_table_mon_users( );
  138. CREATE PROCEDURE alter_table_mon_users( )
  139. DEFINE tab_exists INTEGER;
  140. DEFINE is_cols_altered INTEGER;
  141. LET tab_exists = 0 ;
  142. LET is_cols_altered = 0;
  143. SELECT count(*) INTO tab_exists FROM sysadmin:systables
  144. WHERE tabname = "mon_users";
  145. SELECT count(*) INTO is_cols_altered FROM sysadmin:syscolumns c,
  146. sysadmin:systables t WHERE tabname="mon_users" AND
  147. t.tabid = c.tabid AND colname = "upf_rqlock" AND coltype = 52;
  148. IF tab_exists == 1 AND is_cols_altered == 0 THEN
  149. ALTER TABLE mon_users MODIFY (upf_rqlock bigint, upf_wtlock bigint,
  150. upf_deadlk bigint, upf_lktouts bigint, upf_lgrecs bigint,
  151. upf_isread bigint, upf_iswrite bigint, upf_isrwrite bigint,
  152. upf_isdelete bigint, upf_iscommit bigint, upf_isrollback bigint,
  153. upf_longtxs bigint, upf_bufreads bigint, upf_bufwrites bigint,
  154. upf_logspuse bigint, upf_logspmax bigint, upf_seqscans bigint,
  155. upf_totsorts bigint, upf_dsksorts bigint, upf_srtspmax bigint);
  156. UPDATE mon_users set upf_rqlock = upf_rqlock WHERE 1=1;
  157. END IF;
  158. END PROCEDURE;
  159. EXECUTE PROCEDURE alter_table_mon_users();
  160. DROP PROCEDURE alter_table_mon_users();
  161. DROP PROCEDURE IF EXISTS alter_table_mon_table_profile();
  162. CREATE PROCEDURE alter_table_mon_table_profile()
  163. DEFINE tab_exists INTEGER;
  164. DEFINE is_col_altered INTEGER;
  165. LET tab_exists = 0 ;
  166. LET is_col_altered = 0;
  167. SELECT count(*) INTO tab_exists FROM sysadmin:systables
  168. WHERE tabname = "mon_table_profile";
  169. SELECT count(*) INTO is_col_altered FROM sysadmin:syscolumns c,
  170. sysadmin:systables t WHERE tabname="mon_table_profile" AND
  171. t.tabid = c.tabid AND colname = "nrows" AND coltype = 52;
  172. IF tab_exists == 1 AND is_col_altered == 0 THEN
  173. ALTER TABLE mon_table_profile MODIFY (nrows bigint);
  174. UPDATE mon_table_profile set nrows = nrows WHERE 1=1;
  175. END IF;
  176. END PROCEDURE;
  177. EXECUTE PROCEDURE alter_table_mon_table_profile();
  178. DROP PROCEDURE alter_table_mon_table_profile();
  179. DROP PROCEDURE IF EXISTS alter_table_mon_page_usage();
  180. CREATE PROCEDURE alter_table_mon_page_usage()
  181. DEFINE tab_exists INTEGER;
  182. DEFINE is_col_altered INTEGER;
  183. LET tab_exists = 0;
  184. LET is_col_altered = 0;
  185. SELECT count(*) INTO tab_exists FROM sysadmin:systables
  186. WHERE tabname = "mon_page_usage";
  187. SELECT count(*) INTO is_col_altered FROM sysadmin:syscolumns c,
  188. sysadmin:systables t WHERE tabname="mon_page_usage" AND
  189. t.tabid = c.tabid AND colname = "nrows" AND coltype = 52;
  190. IF tab_exists == 1 AND is_col_altered == 0 THEN
  191. ALTER TABLE mon_page_usage MODIFY (nrows bigint);
  192. UPDATE mon_page_usage set nrows = nrows WHERE 1=1;
  193. END IF;
  194. END PROCEDURE;
  195. EXECUTE PROCEDURE alter_table_mon_page_usage();
  196. DROP PROCEDURE alter_table_mon_page_usage();
  197. DROP PROCEDURE IF EXISTS add_new_indexes();
  198. CREATE PROCEDURE add_new_indexes()
  199. DEFINE tab_exists INTEGER;
  200. SELECT NVL(count(*),0) INTO tab_exists
  201. FROM sysadmin:systables WHERE tabname = "mon_prof";
  202. IF tab_exists > 0 THEN
  203. CREATE INDEX IF NOT EXISTS informix.mon_prof_idx2 ON mon_prof(number);
  204. CREATE INDEX IF NOT EXISTS informix.mon_config_idx2 ON mon_config(id,config_id);
  205. END IF;
  206. SELECT NVL(count(*),0) INTO tab_exists
  207. FROM sysadmin:systables WHERE tabname = "ph_alert";
  208. IF tab_exists > 0 THEN
  209. CREATE INDEX IF NOT EXISTS informix.ix_ph_alert_03 ON ph_alert(alert_time);
  210. END IF;
  211. SELECT NVL(count(*),0) INTO tab_exists
  212. FROM sysadmin:systables WHERE tabname = "mon_page_usage";
  213. IF tab_exists > 0 THEN
  214. ALTER TABLE mon_page_usage MODIFY ( type char(2));
  215. UPDATE mon_page_usage set type = type WHERE 1=1;
  216. UPDATE ph_task SET
  217. tk_execute = 'INSERT INTO mon_page_usage select $DATA_SEQ_ID, trunc(P.partnum / 1048577) as dbsnum, CASE WHEN bitand(P.flags,"0x80000000") > 0 THEN "TS" WHEN bitand(P.flags,"0x22760") > 0 THEN "T" WHEN P.nkeys = 1 AND P.npused > 1 AND P.partnum <> P.lockid AND bitand(P.flags,4) = 0 THEN "I" ELSE "T" END::CHAR(2) as type, P.partnum, P.lockid, P.nextns, P.nrows, P.nptotal, P.npused, P.nptotal - ( BM.partly_used+BM.mostly_used+BM.very_full) AS free ,BM.partly_used ,BM.mostly_used , BM.very_full, CURRENT FROM sysmaster:sysptnhdr P, outer (select b.pb_partnum as partnum, (b.pb_partnum/1048577)::integer as dbsnum ,sum(decode(bitand(b.pb_bitmap, 12),4 ,1,0)) as partly_used ,sum(decode(bitand(b.pb_bitmap, 12),8 ,1,0)) as mostly_used ,sum(decode(bitand(b.pb_bitmap, 12),12,1,0)) as very_full from sysmaster:sysptnbit b where b.pb_bitmap > 0 group by b.pb_partnum ) as BM WHERE P.partnum = BM.partnum and bitand(p.flags,"0xE0") = 0 and sysmaster:partpagenum(P.partnum)>1;UPDATE STATISTICS HIGH FOR TABLE mon_page_usage(ID,dbsnum,partnum,lockid)'
  218. WHERE tk_name = 'mon_page_usage';
  219. END IF;
  220. END PROCEDURE;
  221. EXECUTE PROCEDURE add_new_indexes();
  222. DROP PROCEDURE add_new_indexes();
  223. EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('T');
  224. UPDATE ph_task SET tk_attributes = BITANDNOT(tk_attributes, 4)
  225. WHERE tk_name = "mongo_pam_auth";
  226. DELETE FROM ph_task where tk_name = "mongo_pam_auth";
  227. INSERT INTO ph_task
  228. (
  229. tk_name,
  230. tk_type,
  231. tk_group,
  232. tk_description,
  233. tk_result_table,
  234. tk_dbs,
  235. tk_execute,
  236. tk_create,
  237. tk_frequency,
  238. tk_next_execution,
  239. tk_delete,
  240. tk_enable
  241. )
  242. VALUES
  243. (
  244. "mongo_pam_auth",
  245. "STARTUP SENSOR",
  246. "MISC",
  247. "Create if required and load the sysmongouser_ext from sysmongousers for the wire listener client to authenticate via pam.",
  248. NULL,
  249. "sysuser",
  250. "select count(*) FROM sysmongousers;",
  251. "CREATE FUNCTION IF NOT EXISTS informix.sync_mongo_users(task_id INT DEFAULT -1,
  252. task_seq INT DEFAULT -1)
  253. RETURNING INTEGER
  254. DEFINE ifxdir VARCHAR(130);
  255. DEFINE cmd VARCHAR(255);
  256. CREATE TABLE IF NOT EXISTS sysmongousers (
  257. username nchar(32),
  258. hashed_password varchar(128)
  259. ) lock mode row;
  260. CREATE UNIQUE INDEX IF NOT EXISTS sysmongousers_idx_username ON
  261. sysmongousers(username) IN TABLE;
  262. SELECT TRIM(NVL(env_value,'/usr/informix'))
  263. INTO ifxdir
  264. FROM sysmaster:sysenv
  265. WHERE env_name = 'INFORMIXDIR';
  266. LET cmd = 'CREATE EXTERNAL TABLE IF NOT EXISTS ' ||
  267. 'sysmongousers_ext SAMEAS sysmongousers ' ||
  268. 'USING ( DATAFILES ( ''DISK:' || ifxdir || '/etc/mongohash'') ) ';
  269. EXECUTE IMMEDIATE cmd;
  270. REVOKE ALL ON sysmongousers FROM PUBLIC AS INFORMIX;
  271. GRANT SELECT ON sysmongousers TO PUBLIC AS INFORMIX;
  272. INSERT into sysmongousers_ext select * FROM sysmongousers ORDER BY username;
  273. drop table sysmongousers_ext;
  274. RETURN DBINFO('sqlca.sqlerrd2');
  275. END FUNCTION;
  276. ",
  277. INTERVAL ( 5 ) SECOND TO SECOND,
  278. NULL,
  279. INTERVAL ( 30 ) DAY TO DAY,
  280. 'f'
  281. );
  282. UPDATE ph_task SET tk_attributes = BITOR(tk_attributes, 4)
  283. WHERE tk_name IN ( "mongo_pam_auth", "mongo_pam_init" );