@@ -9,7 +9,7 @@ CREATE OR REPLACE PACKAGE T4SQL.ENGINE IS
99-- You must not remove this notice, or any other, from this software.
1010--
1111-- Original Author: Abel Cheng <
[email protected] >
12- -- Created Date: October ? 15, ? 2013, ?? 11:30:05 PM
12+ -- Created Date: October 15, 2013, 11:30:05 PM
1313-- Primary Host: http://t4sql.codeplex.com
1414-- Change Log:
1515-- Author Date Comment
@@ -22,10 +22,61 @@ CREATE OR REPLACE PACKAGE T4SQL.ENGINE IS
2222----------------------------------------------------------------------------------------------------
2323
2424
25- FUNCTION GET_POLL_INTERVAL
26- RETURN NUMBER;
25+ PROCEDURE GET_CONFIG
26+ (
27+ outPoll_Interval OUT NUMBER
28+ );
29+
30+
31+ PROCEDURE STANDBY_PING
32+ (
33+ outSwitch_To_Mode OUT VARCHAR2
34+ );
35+
36+ PROCEDURE PRIMARY_PING
37+ (
38+ outSwitch_To_Mode OUT VARCHAR2
39+ );
40+
41+
42+ PROCEDURE GET_DB_SERVER_ENV
43+ (
44+ outDatabase_Platform OUT VARCHAR2,
45+ outDatabase_Product OUT VARCHAR2,
46+ outProduct_Version OUT VARCHAR2,
47+ outServer_Name OUT VARCHAR2
48+ );
49+
50+
51+ PROCEDURE REGISTER_TEMPLATE
52+ (
53+ inFull_Name VARCHAR2,
54+ inModule NVARCHAR2,
55+ inAssembly_String VARCHAR2,
56+ inClass_Description NVARCHAR2
57+ );
58+
59+
60+ PROCEDURE REGISTER_TEMPLATE_SPEC
61+ (
62+ inClass_Name VARCHAR2,
63+ inProperty_Name NVARCHAR2,
64+ inDefault_Value NVARCHAR2,
65+ inLink_State NVARCHAR2,
66+ inProperty_Description NVARCHAR2,
67+ inProperty_Order NUMBER
68+ );
69+
70+
71+ PROCEDURE LOG_SYS_ERROR
72+ (
73+ inReference NVARCHAR2,
74+ inMessage VARCHAR
75+ );
2776
2877
78+ PROCEDURE SERVICE_RESTART;
79+
2980
3081END ENGINE;
3182/
@@ -48,6 +99,204 @@ BEGIN
4899END GET_POLL_INTERVAL;
49100
50101
102+ PROCEDURE GET_CONFIG
103+ (
104+ outPoll_Interval OUT NUMBER
105+ ) AS
106+ BEGIN
107+ outPoll_Interval := GET_POLL_INTERVAL();
108+ END GET_CONFIG;
109+
110+
111+ PROCEDURE SERVICE_PING
112+ (
113+ inIs_Primary CHAR
114+ ) AS
115+ BEGIN
116+ MERGE INTO T4SQL.ENGINE_SERVER P
117+ USING
118+ (
119+ SELECT
120+ NVL(SYS_CONTEXT('USERENV', 'TERMINAL'), '?') AS SERVER_NAME,
121+ SYSTIMESTAMP AS SERVICE_BEAT,
122+ inIs_Primary AS IS_PRIMARY,
123+ NVL(SYS_CONTEXT('USERENV', 'OS_USER'), '?') AS SERVICE_ACCOUNT
124+ FROM
125+ DUAL
126+ ) C
127+ ON (P.SERVER_NAME = C.SERVER_NAME)
128+ WHEN MATCHED THEN
129+ UPDATE SET
130+ P.SERVICE_BEAT = C.SERVICE_BEAT,
131+ P.IS_PRIMARY = C.IS_PRIMARY,
132+ P.SERVICE_ACCOUNT = C.SERVICE_ACCOUNT
133+ WHEN NOT MATCHED THEN
134+ INSERT (P.SERVER_NAME, P.SERVICE_BEAT, P.IS_PRIMARY, P.SERVICE_ACCOUNT)
135+ VALUES (C.SERVER_NAME, C.SERVICE_BEAT, C.IS_PRIMARY, C.SERVICE_ACCOUNT);
136+ END SERVICE_PING;
137+
138+
139+ PROCEDURE STANDBY_PING
140+ (
141+ outSwitch_To_Mode OUT VARCHAR2
142+ ) AS
143+ tInterval NUMBER := GET_POLL_INTERVAL();
144+ tNow DATE := SYSDATE;
145+ tPrimary_Beat DATE;
146+ BEGIN
147+ UPDATE T4SQL.ENGINE_CONFIG
148+ SET DATE_VALUE = tNow
149+ WHERE DATE_VALUE <= tNow - tInterval
150+ AND ELEMENT_NAME = 'STANDBY_BEAT';
151+
152+ IF SQL%ROWCOUNT > 0 THEN
153+ SELECT DATE_VALUE INTO tPrimary_Beat FROM T4SQL.ENGINE_CONFIG WHERE ELEMENT_NAME = 'PRIMARY_BEAT';
154+ IF (tNow - tPrimary_Beat) > (tInterval / 2) THEN
155+ outSwitch_To_Mode := 'Primary';
156+ ELSE
157+ outSwitch_To_Mode := 'Standby';
158+ END IF;
159+ END IF;
160+
161+ SERVICE_PING('N');
162+ COMMIT;
163+ END STANDBY_PING;
164+
165+
166+ PROCEDURE PRIMARY_PING
167+ (
168+ outSwitch_To_Mode OUT VARCHAR2
169+ ) AS
170+ tNow DATE := SYSDATE;
171+ BEGIN
172+ UPDATE T4SQL.ENGINE_CONFIG
173+ SET DATE_VALUE = tNow
174+ WHERE ELEMENT_NAME = 'PRIMARY_BEAT';
175+
176+ outSwitch_To_Mode := 'Primary';
177+
178+ SERVICE_PING('Y');
179+ COMMIT;
180+ END PRIMARY_PING;
181+
182+
183+ PROCEDURE GET_DB_SERVER_ENV
184+ (
185+ outDatabase_Platform OUT VARCHAR2,
186+ outDatabase_Product OUT VARCHAR2,
187+ outProduct_Version OUT VARCHAR2,
188+ outServer_Name OUT VARCHAR2
189+ ) AS
190+ BEGIN
191+ outDatabase_Platform := 'Oracle';
192+ outServer_Name := SYS_CONTEXT('USERENV', 'DB_NAME');
193+
194+ SELECT
195+ banner,
196+ REGEXP_SUBSTR(banner, '\d+\.\d+(\.\d+)?(\.\d+)?')
197+ INTO
198+ outDatabase_Product,
199+ outProduct_Version
200+ FROM
201+ v$version
202+ WHERE
203+ banner LIKE 'Oracle Database%';
204+ END GET_DB_SERVER_ENV;
205+
206+
207+ PROCEDURE REGISTER_TEMPLATE
208+ (
209+ inFull_Name VARCHAR2,
210+ inModule NVARCHAR2,
211+ inAssembly_String VARCHAR2,
212+ inClass_Description NVARCHAR2
213+ ) AS
214+ BEGIN
215+ MERGE INTO T4SQL.TEMPLATE_CLASS T
216+ USING
217+ (
218+ SELECT
219+ inFull_Name AS FULL_NAME,
220+ inModule AS MODULE,
221+ inAssembly_String AS ASSEMBLY_STRING,
222+ inClass_Description AS CLASS_DESCRIPTION,
223+ SYSDATE AS REGISTER_TIME
224+ FROM
225+ DUAL
226+ ) R
227+ ON (T.FULL_NAME = R.FULL_NAME)
228+ WHEN MATCHED THEN
229+ UPDATE SET
230+ T.MODULE = R.MODULE,
231+ T.ASSEMBLY_STRING = R.ASSEMBLY_STRING,
232+ T.START_TIME = R.REGISTER_TIME,
233+ T.IS_ACTIVE = 'Y',
234+ T.CLASS_DESCRIPTION = R.CLASS_DESCRIPTION
235+ WHEN NOT MATCHED THEN
236+ INSERT (FULL_NAME, MODULE, ASSEMBLY_STRING, CREATED_TIME, START_TIME, IS_ACTIVE, CLASS_DESCRIPTION)
237+ VALUES (R.FULL_NAME, R.MODULE, R.ASSEMBLY_STRING, R.REGISTER_TIME, R.REGISTER_TIME, 'Y', R.CLASS_DESCRIPTION);
238+ COMMIT;
239+ END REGISTER_TEMPLATE;
240+
241+
242+ PROCEDURE REGISTER_TEMPLATE_SPEC
243+ (
244+ inClass_Name VARCHAR2,
245+ inProperty_Name NVARCHAR2,
246+ inDefault_Value NVARCHAR2,
247+ inLink_State NVARCHAR2,
248+ inProperty_Description NVARCHAR2,
249+ inProperty_Order NUMBER
250+ ) AS
251+ BEGIN
252+ MERGE INTO T4SQL.TEMPLATE_SPEC T
253+ USING
254+ (
255+ SELECT
256+ inClass_Name AS CLASS_NAME,
257+ inProperty_Name AS PROPERTY_NAME,
258+ inDefault_Value AS DEFAULT_VALUE,
259+ inLink_State AS LINK_STATE,
260+ inProperty_Description AS PROPERTY_DESCRIPTION,
261+ inProperty_Order AS PROPERTY_ORDER
262+ FROM
263+ DUAL
264+ ) R
265+ ON (T.PROPERTY_NAME = R.PROPERTY_NAME AND T.CLASS_NAME = R.CLASS_NAME)
266+ WHEN MATCHED THEN
267+ UPDATE SET
268+ T.DEFAULT_VALUE = R.DEFAULT_VALUE,
269+ T.LINK_STATE = R.LINK_STATE,
270+ T.PROPERTY_DESCRIPTION = R.PROPERTY_DESCRIPTION,
271+ T.PROPERTY_ORDER = R.PROPERTY_ORDER
272+ WHEN NOT MATCHED THEN
273+ INSERT (CLASS_NAME, PROPERTY_NAME, DEFAULT_VALUE, LINK_STATE, PROPERTY_DESCRIPTION, PROPERTY_ORDER)
274+ VALUES (R.CLASS_NAME, R.PROPERTY_NAME, R.DEFAULT_VALUE, R.LINK_STATE, R.PROPERTY_DESCRIPTION, R.PROPERTY_ORDER);
275+ COMMIT;
276+ END REGISTER_TEMPLATE_SPEC;
277+
278+
279+ PROCEDURE LOG_SYS_ERROR
280+ (
281+ inReference NVARCHAR2,
282+ inMessage VARCHAR
283+ ) AS
284+ BEGIN
285+ INSERT INTO T4SQL.EVENT_LOG (LOG_TIME, LOG_TYPE, REFERENCE_, MESSAGE_)
286+ VALUES (SYSTIMESTAMP, 'Error', inReference, inMessage);
287+ COMMIT;
288+ END LOG_SYS_ERROR;
289+
290+
291+ PROCEDURE SERVICE_RESTART
292+ AS
293+ BEGIN
294+ UPDATE T4SQL.TEMPLATE_CLASS
295+ SET IS_ACTIVE = 'N'
296+ WHERE IS_ACTIVE = 'Y';
297+ COMMIT;
298+ END SERVICE_RESTART;
299+
51300
52301END ENGINE;
53302/
0 commit comments