summary tables for table DCIs refactoring and minor fixes
[public/netxms.git] / src / server / tools / nxdbmgr / upgrade.cpp
1 /*
2 ** nxdbmgr - NetXMS database manager
3 ** Copyright (C) 2004-2017 Victor Kirhenshtein
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 **
19 ** File: upgrade.cpp
20 **
21 **/
22
23 #include "nxdbmgr.h"
24 #include <nxevent.h>
25
26 /**
27 * Externals
28 */
29 BOOL MigrateMaps();
30 bool ConvertTDataTables();
31
32 /**
33 * Pre-defined GUID mapping for GenerateGUID
34 */
35 struct GUID_MAPPING
36 {
37 UINT32 id;
38 const TCHAR *guid;
39 };
40
41 /**
42 * Generate GUIDs
43 */
44 static bool GenerateGUID(const TCHAR *table, const TCHAR *idColumn, const TCHAR *guidColumn, const GUID_MAPPING *mapping)
45 {
46 TCHAR query[256];
47 _sntprintf(query, 256, _T("SELECT %s FROM %s"), idColumn, table);
48 DB_RESULT hResult = SQLSelect(query);
49 if (hResult == NULL)
50 return false;
51
52 uuid_t guid;
53 TCHAR buffer[64];
54
55 int count = DBGetNumRows(hResult);
56 for(int i = 0; i < count; i++)
57 {
58 const TCHAR *guidText = NULL;
59 UINT32 id = DBGetFieldULong(hResult, i, 0);
60 if (mapping != NULL)
61 {
62 for(int j = 0; mapping[j].guid != NULL; j++)
63 if (mapping[j].id == id)
64 {
65 guidText = mapping[j].guid;
66 break;
67 }
68 }
69 if (guidText == NULL)
70 {
71 _uuid_generate(guid);
72 guidText = _uuid_to_string(guid, buffer);
73 }
74 _sntprintf(query, 256, _T("UPDATE %s SET %s='%s' WHERE %s=%d"), table, guidColumn, guidText, idColumn, id);
75 if (!SQLQuery(query))
76 {
77 DBFreeResult(hResult);
78 return false;
79 }
80 }
81 DBFreeResult(hResult);
82 return true;
83 }
84
85 /**
86 * Create table
87 */
88 static bool CreateTable(const TCHAR *pszQuery)
89 {
90 String query(pszQuery);
91
92 query.replace(_T("$SQL:TEXT"), g_pszSqlType[g_dbSyntax][SQL_TYPE_TEXT]);
93 query.replace(_T("$SQL:TXT4K"), g_pszSqlType[g_dbSyntax][SQL_TYPE_TEXT4K]);
94 query.replace(_T("$SQL:INT64"), g_pszSqlType[g_dbSyntax][SQL_TYPE_INT64]);
95 if (g_dbSyntax == DB_SYNTAX_MYSQL)
96 query += g_pszTableSuffix;
97 return SQLQuery(query);
98 }
99
100 /**
101 * Check if configuration variable exist
102 */
103 static bool IsConfigurationVariableExist(const TCHAR *name)
104 {
105 bool found = false;
106 TCHAR query[256];
107 _sntprintf(query, 256, _T("SELECT var_value FROM config WHERE var_name='%s'"), name);
108 DB_RESULT hResult = DBSelect(g_hCoreDB, query);
109 if (hResult != 0)
110 {
111 found = (DBGetNumRows(hResult) > 0);
112 DBFreeResult(hResult);
113 }
114 return found;
115 }
116
117 /**
118 * Create configuration parameter if it doesn't exist (unless forceUpdate set to true)
119 */
120 bool CreateConfigParam(const TCHAR *name, const TCHAR *value, const TCHAR *description, char dataType, bool isVisible, bool needRestart, bool isPublic, bool forceUpdate)
121 {
122 bool success = true;
123 TCHAR szQuery[3024];
124 if (!IsConfigurationVariableExist(name))
125 {
126 if (DBGetSchemaVersion(g_hCoreDB) >= 454)
127 _sntprintf(szQuery, 3024, _T("INSERT INTO config (var_name,var_value,default_value,is_visible,need_server_restart,is_public,data_type,description) VALUES (%s,%s,%s,%d,%d,'%c','%c',%s)"),
128 (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63),
129 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000),
130 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000),
131 isVisible ? 1 : 0, needRestart ? 1 : 0,
132 isPublic ? _T('Y') : _T('N'), dataType, (const TCHAR *)DBPrepareString(g_hCoreDB, description, 255));
133 else
134 _sntprintf(szQuery, 3024, _T("INSERT INTO config (var_name,var_value,is_visible,need_server_restart,is_public,data_type,description) VALUES (%s,%s,%d,%d,'%c','%c',%s)"),
135 (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63),
136 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000), isVisible ? 1 : 0, needRestart ? 1 : 0,
137 isPublic ? _T('Y') : _T('N'), dataType, (const TCHAR *)DBPrepareString(g_hCoreDB, description, 255));
138 success = SQLQuery(szQuery);
139 }
140 else if (forceUpdate)
141 {
142 _sntprintf(szQuery, 3024, _T("UPDATE config SET var_value=%s WHERE var_name=%s"),
143 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000), (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63));
144 success = SQLQuery(szQuery);
145 }
146 return success;
147 }
148
149 /**
150 * Create configuration parameter if it doesn't exist (unless bForceUpdate set to true)
151 */
152 bool CreateConfigParam(const TCHAR *name, const TCHAR *value, bool isVisible, bool needRestart, bool forceUpdate)
153 {
154 bool success = true;
155 TCHAR szQuery[3024];
156 if (!IsConfigurationVariableExist(name))
157 {
158 if (DBGetSchemaVersion(g_hCoreDB) >= 454)
159 _sntprintf(szQuery, 3024, _T("INSERT INTO config (var_name,var_value,default_value,is_visible,need_server_restart) VALUES (%s,%s,%s,%d,%d)"),
160 (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63),
161 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000),
162 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000),
163 isVisible ? 1 : 0, needRestart ? 1 : 0);
164 else
165 _sntprintf(szQuery, 3024, _T("INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES (%s,%s,%d,%d)"),
166 (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63),
167 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000), isVisible ? 1 : 0, needRestart ? 1 : 0);
168 success = SQLQuery(szQuery);
169 }
170 else if (forceUpdate)
171 {
172 _sntprintf(szQuery, 3024, _T("UPDATE config SET var_value=%s WHERE var_name=%s"),
173 (const TCHAR *)DBPrepareString(g_hCoreDB, value, 2000), (const TCHAR *)DBPrepareString(g_hCoreDB, name, 63));
174 success = SQLQuery(szQuery);
175 }
176 return success;
177 }
178
179 /**
180 * Convert strings from # encoded form to normal form
181 */
182 static BOOL ConvertStrings(const TCHAR *table, const TCHAR *idColumn, const TCHAR *idColumn2, const TCHAR *column, bool isStringId)
183 {
184 DB_RESULT hResult;
185 TCHAR *query;
186 size_t queryLen = 512;
187 BOOL success = FALSE;
188
189 query = (TCHAR *)malloc(queryLen * sizeof(TCHAR));
190
191 switch(g_dbSyntax)
192 {
193 case DB_SYNTAX_MSSQL:
194 _sntprintf(query, queryLen, _T("UPDATE %s SET %s='' WHERE CAST(%s AS nvarchar(4000))=N'#00'"), table, column, column);
195 break;
196 case DB_SYNTAX_ORACLE:
197 _sntprintf(query, queryLen, _T("UPDATE %s SET %s='' WHERE to_char(%s)='#00'"), table, column, column);
198 break;
199 default:
200 _sntprintf(query, queryLen, _T("UPDATE %s SET %s='' WHERE %s='#00'"), table, column, column);
201 break;
202 }
203 if (!SQLQuery(query))
204 {
205 free(query);
206 return FALSE;
207 }
208
209 _sntprintf(query, queryLen, _T("SELECT %s,%s%s%s FROM %s WHERE %s LIKE '%%#%%'"),
210 idColumn, column, (idColumn2 != NULL) ? _T(",") : _T(""), (idColumn2 != NULL) ? idColumn2 : _T(""), table, column);
211 hResult = SQLSelect(query);
212 if (hResult == NULL)
213 {
214 free(query);
215 return FALSE;
216 }
217
218 int count = DBGetNumRows(hResult);
219 for(int i = 0; i < count; i++)
220 {
221 TCHAR *value = DBGetField(hResult, i, 1, NULL, 0);
222 if (_tcschr(value, _T('#')) != NULL)
223 {
224 DecodeSQLString(value);
225 String newValue = DBPrepareString(g_hCoreDB, value);
226 if (newValue.length() + 256 > queryLen)
227 {
228 queryLen = newValue.length() + 256;
229 query = (TCHAR *)realloc(query, queryLen * sizeof(TCHAR));
230 }
231 if (isStringId)
232 {
233 TCHAR *id = DBGetField(hResult, i, 0, NULL, 0);
234 if (idColumn2 != NULL)
235 {
236 TCHAR *id2 = DBGetField(hResult, i, 2, NULL, 0);
237 _sntprintf(query, queryLen, _T("UPDATE %s SET %s=%s WHERE %s=%s AND %s=%s"),
238 table, column, (const TCHAR *)newValue,
239 idColumn, (const TCHAR *)DBPrepareString(g_hCoreDB, id),
240 idColumn2, (const TCHAR *)DBPrepareString(g_hCoreDB, id2));
241 }
242 else
243 {
244 _sntprintf(query, queryLen, _T("UPDATE %s SET %s=%s WHERE %s=%s"), table, column,
245 (const TCHAR *)newValue, idColumn, (const TCHAR *)DBPrepareString(g_hCoreDB, id));
246 }
247 free(id);
248 }
249 else
250 {
251 INT64 id = DBGetFieldInt64(hResult, i, 0);
252 if (idColumn2 != NULL)
253 {
254 INT64 id2 = DBGetFieldInt64(hResult, i, 2);
255 _sntprintf(query, queryLen, _T("UPDATE %s SET %s=%s WHERE %s=") INT64_FMT _T(" AND %s=") INT64_FMT,
256 table, column, (const TCHAR *)newValue, idColumn, id, idColumn2, id2);
257 }
258 else
259 {
260 _sntprintf(query, queryLen, _T("UPDATE %s SET %s=%s WHERE %s=") INT64_FMT, table, column,
261 (const TCHAR *)newValue, idColumn, id);
262 }
263 }
264 if (!SQLQuery(query))
265 goto cleanup;
266 }
267 }
268 success = TRUE;
269
270 cleanup:
271 DBFreeResult(hResult);
272 free(query);
273 return success;
274 }
275
276 static BOOL ConvertStrings(const TCHAR *table, const TCHAR *idColumn, const TCHAR *column)
277 {
278 return ConvertStrings(table, idColumn, NULL, column, false);
279 }
280
281 /**
282 * Create new event template
283 */
284 static BOOL CreateEventTemplate(int code, const TCHAR *name, int severity, int flags, const TCHAR *guid, const TCHAR *message, const TCHAR *description)
285 {
286 TCHAR query[4096];
287
288 if (guid != NULL)
289 {
290 _sntprintf(query, 4096, _T("INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description,guid) VALUES (%d,'%s',%d,%d,%s,%s,'%s')"),
291 code, name, severity, flags, (const TCHAR *)DBPrepareString(g_hCoreDB, message),
292 (const TCHAR *)DBPrepareString(g_hCoreDB, description), guid);
293 }
294 else
295 {
296 _sntprintf(query, 4096, _T("INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES (%d,'%s',%d,%d,%s,%s)"),
297 code, name, severity, flags, (const TCHAR *)DBPrepareString(g_hCoreDB, message),
298 (const TCHAR *)DBPrepareString(g_hCoreDB, description));
299 }
300 return SQLQuery(query);
301 }
302
303 /**
304 * Re-create TDATA tables
305 */
306 static BOOL RecreateTData(const TCHAR *className, bool multipleTables, bool indexFix)
307 {
308 TCHAR query[1024];
309 _sntprintf(query, 256, _T("SELECT id FROM %s"), className);
310 DB_RESULT hResult = SQLSelect(query);
311 if (hResult != NULL)
312 {
313 int count = DBGetNumRows(hResult);
314 for(int i = 0; i < count; i++)
315 {
316 bool recreateTables = true;
317 DWORD id = DBGetFieldULong(hResult, i, 0);
318
319 if (indexFix)
320 {
321 _sntprintf(query, 256, _T("SELECT count(*) FROM dc_tables WHERE node_id=%d"), id);
322 DB_RESULT hResultCount = SQLSelect(query);
323 if (hResultCount != NULL)
324 {
325 recreateTables = (DBGetFieldLong(hResultCount, 0, 0) == 0);
326 DBFreeResult(hResultCount);
327 }
328
329 if (!recreateTables)
330 {
331 _sntprintf(query, 256, _T("CREATE INDEX idx_tdata_rec_%d_id ON tdata_records_%d(record_id)"), id, id);
332 if (!SQLQuery(query))
333 {
334 if (!g_bIgnoreErrors)
335 {
336 DBFreeResult(hResult);
337 return FALSE;
338 }
339 }
340 }
341 }
342
343 if (recreateTables)
344 {
345 if (multipleTables)
346 {
347 _sntprintf(query, 1024, _T("DROP TABLE tdata_rows_%d\nDROP TABLE tdata_records_%d\nDROP TABLE tdata_%d\n<END>"), id, id, id);
348 }
349 else
350 {
351 _sntprintf(query, 256, _T("DROP TABLE tdata_%d\n<END>"), id);
352 }
353 if (!SQLBatch(query))
354 {
355 if (!g_bIgnoreErrors)
356 {
357 DBFreeResult(hResult);
358 return FALSE;
359 }
360 }
361
362 if (!CreateTDataTable(id))
363 {
364 if (!g_bIgnoreErrors)
365 {
366 DBFreeResult(hResult);
367 return FALSE;
368 }
369 }
370 }
371 }
372 DBFreeResult(hResult);
373 }
374 else
375 {
376 if (!g_bIgnoreErrors)
377 return FALSE;
378 }
379 return TRUE;
380 }
381
382 /**
383 * Convert network masks from dotted decimal format to number of bits
384 */
385 static BOOL ConvertNetMasks(const TCHAR *table, const TCHAR *column, const TCHAR *idColumn, const TCHAR *idColumn2 = NULL, const TCHAR *condition = NULL)
386 {
387 TCHAR query[256];
388
389 if (idColumn2 != NULL)
390 _sntprintf(query, 256, _T("SELECT %s,%s,%s FROM %s"), idColumn, column, idColumn2, table);
391 else
392 _sntprintf(query, 256, _T("SELECT %s,%s FROM %s"), idColumn, column, table);
393 DB_RESULT hResult = SQLSelect(query);
394 if (hResult == NULL)
395 return FALSE;
396
397 bool success = DBDropColumn(g_hCoreDB, table, column);
398
399 if (success)
400 {
401 _sntprintf(query, 256, _T("ALTER TABLE %s ADD %s integer"), table, column);
402 success = SQLQuery(query);
403 }
404
405 if (success)
406 {
407 int count = DBGetNumRows(hResult);
408 for(int i = 0; (i < count) && success; i++)
409 {
410 if (idColumn2 != NULL)
411 {
412 TCHAR id2[256];
413 _sntprintf(query, 256, _T("UPDATE %s SET %s=%d WHERE %s=%d AND %s='%s'"),
414 table, column, BitsInMask(DBGetFieldIPAddr(hResult, i, 1)), idColumn, DBGetFieldLong(hResult, i, 0),
415 idColumn2, DBGetField(hResult, i, 2, id2, 256));
416 }
417 else
418 {
419 _sntprintf(query, 256, _T("UPDATE %s SET %s=%d WHERE %s=%d"),
420 table, column, BitsInMask(DBGetFieldIPAddr(hResult, i, 1)), idColumn, DBGetFieldLong(hResult, i, 0));
421 }
422 success = SQLQuery(query);
423 }
424 }
425
426 DBFreeResult(hResult);
427 return success;
428 }
429
430 /**
431 * Convert object tool macros to new format
432 */
433 static bool ConvertObjectToolMacros(UINT32 id, const TCHAR *text, const TCHAR *column)
434 {
435 if (_tcschr(text, _T('%')) == NULL)
436 return true; // nothing to convert
437
438 String s;
439 for(const TCHAR *p = text; *p != 0; p++)
440 {
441 if (*p == _T('%'))
442 {
443 TCHAR name[256];
444 int i = 0;
445 for(p++; (*p != _T('%')) && (*p != 0); p++)
446 {
447 if (i < 255)
448 name[i++] = *p;
449 }
450 if (*p == 0)
451 break; // malformed string
452 name[i] = 0;
453 if (!_tcscmp(name, _T("ALARM_ID")))
454 {
455 s.append(_T("%Y"));
456 }
457 else if (!_tcscmp(name, _T("ALARM_MESSAGE")))
458 {
459 s.append(_T("%A"));
460 }
461 else if (!_tcscmp(name, _T("ALARM_SEVERITY")))
462 {
463 s.append(_T("%s"));
464 }
465 else if (!_tcscmp(name, _T("ALARM_SEVERITY_TEXT")))
466 {
467 s.append(_T("%S"));
468 }
469 else if (!_tcscmp(name, _T("ALARM_STATE")))
470 {
471 s.append(_T("%y"));
472 }
473 else if (!_tcscmp(name, _T("OBJECT_ID")))
474 {
475 s.append(_T("%I"));
476 }
477 else if (!_tcscmp(name, _T("OBJECT_IP_ADDR")))
478 {
479 s.append(_T("%a"));
480 }
481 else if (!_tcscmp(name, _T("OBJECT_NAME")))
482 {
483 s.append(_T("%n"));
484 }
485 else if (!_tcscmp(name, _T("USERNAME")))
486 {
487 s.append(_T("%U"));
488 }
489 else
490 {
491 s.append(_T("%{"));
492 s.append(name);
493 s.append(_T('}'));
494 }
495 }
496 else
497 {
498 s.append(*p);
499 }
500 }
501
502 String query = _T("UPDATE object_tools SET ");
503 query.append(column);
504 query.append(_T('='));
505 query.append(DBPrepareString(g_hCoreDB, s));
506 query.append(_T(" WHERE tool_id="));
507 query.append(id);
508 return SQLQuery(query);
509 }
510
511 /**
512 * Create library script
513 */
514 static bool CreateLibraryScript(UINT32 id, const TCHAR *name, const TCHAR *code)
515 {
516 // Check if script exists
517 TCHAR query[256];
518 _sntprintf(query, 256, _T("SELECT script_id FROM script_library WHERE script_id=%d OR script_name=%s"),
519 id, (const TCHAR *)DBPrepareString(g_hCoreDB, name));
520 DB_RESULT hResult = SQLSelect(query);
521 if (hResult == NULL)
522 return false;
523 bool exist = (DBGetNumRows(hResult) > 0);
524 DBFreeResult(hResult);
525 if (exist)
526 return true;
527
528 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO script_library (script_id,script_name,script_code) VALUES (?,?,?)"));
529 if (hStmt == NULL)
530 return false;
531
532 DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, id);
533 DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, name, DB_BIND_STATIC);
534 DBBind(hStmt, 3, DB_SQLTYPE_TEXT, code, DB_BIND_STATIC);
535
536 bool success = SQLExecute(hStmt);
537 DBFreeStatement(hStmt);
538 return success;
539 }
540
541 /**
542 * Check if an event pair is handled by any EPP rules
543 */
544 static bool IsEventPairInUse(UINT32 code1, UINT32 code2)
545 {
546 TCHAR query[256];
547 _sntprintf(query, 256, _T("SELECT count(*) FROM policy_event_list WHERE event_code=%d OR event_code=%d"), code1, code2);
548 DB_RESULT hResult = SQLSelect(query);
549 if (hResult == NULL)
550 return false;
551 bool inUse = (DBGetFieldLong(hResult, 0, 0) > 0);
552 DBFreeResult(hResult);
553 return inUse;
554 }
555
556 /**
557 * Return the next free EPP rule ID
558 */
559 static int NextFreeEPPruleID()
560 {
561 int ruleId = 1;
562 DB_RESULT hResult = SQLSelect(_T("SELECT max(rule_id) FROM event_policy"));
563 if (hResult != NULL)
564 {
565 ruleId = DBGetFieldLong(hResult, 0, 0) + 1;
566 DBFreeResult(hResult);
567 }
568 return ruleId;
569 }
570
571 /**
572 * Add event to EPP rule by rule GUID
573 */
574 static bool AddEventToEPPRule(const TCHAR *guid, UINT32 eventCode)
575 {
576 TCHAR query[256];
577 _sntprintf(query, 256, _T("SELECT rule_id FROM event_policy WHERE rule_guid='%s'"), guid);
578 DB_RESULT hResult = SQLSelect(query);
579 if (hResult == NULL)
580 return false;
581
582 bool success = true;
583 if (DBGetNumRows(hResult) > 0)
584 {
585 _sntprintf(query, 256, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), DBGetFieldLong(hResult, 0, 0), eventCode);
586 success = SQLQuery(query);
587 }
588 DBFreeResult(hResult);
589 return success;
590 }
591
592 /**
593 * Set schema version
594 */
595 static bool SetSchemaVersion(int version)
596 {
597 TCHAR query[256];
598 _sntprintf(query, 256, _T("UPDATE metadata SET var_value='%d' WHERE var_name='SchemaVersion'"), version);
599 return SQLQuery(query);
600 }
601
602 /**
603 * Upgrade from V500 to V501
604 */
605 static BOOL H_UpgradeFromV500(int currVersion, int newVersion)
606 {
607 static const TCHAR *batch =
608 _T("ALTER TABLE users ADD created integer null\n")
609 _T("ALTER TABLE user_groups ADD created integer null\n")
610 _T("UPDATE users SET created=0\n")
611 _T("UPDATE user_groups SET created=0\n")
612 _T("<END>");
613 CHK_EXEC(SQLBatch(batch));
614 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("users"), _T("created")));
615 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("user_groups"), _T("created")));
616
617 CHK_EXEC(SetSchemaVersion(501));
618 return TRUE;
619 }
620
621 /**
622 * Upgrade from V459 to V500
623 */
624 static BOOL H_UpgradeFromV459(int currVersion, int newVersion)
625 {
626 CHK_EXEC(CreateTable(
627 _T("CREATE TABLE sensors (")
628 _T(" id integer not null,")
629 _T(" proxy_node integer not null,")
630 _T(" flags integer not null,")
631 _T(" mac_address varchar(16) null,")
632 _T(" device_class integer not null,")
633 _T(" vendor varchar(128) null,")
634 _T(" communication_protocol integer not null,")
635 _T(" xml_config varchar(4000) null,")
636 _T(" xml_reg_config varchar(4000) null,")
637 _T(" serial_number varchar(256) null,")
638 _T(" device_address varchar(256) null,")
639 _T(" meta_type varchar(256) null,")
640 _T(" description varchar(512) null,")
641 _T(" last_connection_time integer not null,")
642 _T(" frame_count integer not null,")
643 _T(" signal_strenght integer not null,")
644 _T(" signal_noise integer not null,")
645 _T(" frequency integer not null,")
646 _T(" runtime_flags integer null,")
647 _T("PRIMARY KEY(id))")));
648
649 CHK_EXEC(SetSchemaVersion(500));
650 return TRUE;
651 }
652
653 /**
654 * Upgrade from V458 to V459
655 */
656 static BOOL H_UpgradeFromV458(int currVersion, int newVersion)
657 {
658 CHK_EXEC(SQLQuery(_T("ALTER TABLE dci_summary_tables ADD table_dci_name varchar(255)")));
659 CHK_EXEC(SetSchemaVersion(459));
660 return TRUE;
661 }
662
663 /**
664 * Upgrade from V457 to V458
665 */
666 static BOOL H_UpgradeFromV457(int currVersion, int newVersion)
667 {
668 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',need_server_restart=0 WHERE var_name='DeleteUnreachableNodesPeriod'")));
669 CHK_EXEC(CreateConfigParam(_T("LongRunningQueryThreshold"), _T("0"), _T("Threshold in milliseconds to report long running SQL queries (0 to disable)"), 'I', true, true, false, false));
670 CHK_EXEC(SetSchemaVersion(458));
671 return TRUE;
672 }
673
674 /**
675 * Upgrade from V456 to V457
676 */
677 static BOOL H_UpgradeFromV456(int currVersion, int newVersion)
678 {
679 CHK_EXEC(SQLQuery(_T("DELETE FROM config WHERE var_name='EnableAdminInterface'")));
680 CHK_EXEC(SetSchemaVersion(457));
681 return TRUE;
682 }
683
684 /**
685 * Upgrade from V455 to V456
686 */
687 static BOOL H_UpgradeFromV455(int currVersion, int newVersion)
688 {
689 CHK_EXEC(
690 CreateEventTemplate(EVENT_PACKAGE_INSTALLED, _T("SYS_PACKAGE_INSTALLED"),
691 SEVERITY_NORMAL, EF_LOG, _T("92e5cf98-a415-4414-9ad8-d155dac77e96"),
692 _T("Package %1 %2 installed"),
693 _T("Generated when new software package is found.\r\n")
694 _T("Parameters:\r\n")
695 _T(" 1) Package name\r\n")
696 _T(" 2) Package version"))
697 );
698
699 CHK_EXEC(
700 CreateEventTemplate(EVENT_PACKAGE_UPDATED, _T("SYS_PACKAGE_UPDATED"),
701 SEVERITY_NORMAL, EF_LOG, _T("9d5878c1-525e-4cab-8f02-2a6c46d7fc36"),
702 _T("Package %1 updated from %3 to %2"),
703 _T("Generated when software package version change is detected.\r\n")
704 _T("Parameters:\r\n")
705 _T(" 1) Package name\r\n")
706 _T(" 2) New package version\r\n")
707 _T(" 3) Old package version"))
708 );
709
710 CHK_EXEC(
711 CreateEventTemplate(EVENT_PACKAGE_REMOVED, _T("SYS_PACKAGE_REMOVED"),
712 SEVERITY_NORMAL, EF_LOG, _T("6ada4ea4-43e4-4444-9d19-ef7366110bb9"),
713 _T("Package %1 %2 removed"),
714 _T("Generated when software package removal is detected.\r\n")
715 _T("Parameters:\r\n")
716 _T(" 1) Package name\r\n")
717 _T(" 2) Last known package version"))
718 );
719
720 int ruleId = NextFreeEPPruleID();
721 TCHAR query[1024];
722 _sntprintf(query, 1024, _T("INSERT INTO event_policy (rule_id,rule_guid,flags,comments,alarm_message,alarm_severity,alarm_key,script,alarm_timeout,alarm_timeout_event) ")
723 _T("VALUES (%d,'2bb3df47-482b-4e4b-9b49-8c72c6b33011',7944,'Generate alarm on software package changes','%%m',5,'SW_PKG_%%i_%%<name>','',0,%d)"),
724 ruleId, EVENT_ALARM_TIMEOUT);
725 CHK_EXEC(SQLQuery(query));
726
727 _sntprintf(query, 256, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_PACKAGE_INSTALLED);
728 CHK_EXEC(SQLQuery(query));
729 _sntprintf(query, 256, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_PACKAGE_UPDATED);
730 CHK_EXEC(SQLQuery(query));
731 _sntprintf(query, 256, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_PACKAGE_REMOVED);
732 CHK_EXEC(SQLQuery(query));
733
734 CHK_EXEC(SetSchemaVersion(456));
735 return TRUE;
736 }
737
738 /**
739 * Upgrade from V454 to V455
740 */
741 static BOOL H_UpgradeFromV454(int currVersion, int newVersion)
742 {
743 static const TCHAR *batch =
744 _T("ALTER TABLE interfaces ADD parent_iface integer\n")
745 _T("UPDATE interfaces SET parent_iface=0\n")
746 _T("<END>");
747 CHK_EXEC(SQLBatch(batch));
748 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("interfaces"), _T("parent_iface")));
749 CHK_EXEC(SetSchemaVersion(455));
750 return TRUE;
751 }
752
753 /**
754 * Upgrade from V453 to V454
755 */
756 static BOOL H_UpgradeFromV453(int currVersion, int newVersion)
757 {
758 static const TCHAR *batch =
759 _T("ALTER TABLE config ADD default_value varchar(2000) null\n")
760 _T("UPDATE config SET default_value='7200' WHERE var_name='ActiveDiscoveryInterval'\n")
761 _T("UPDATE config SET default_value='0' WHERE var_name='ActiveNetworkDiscovery'\n")
762 _T("UPDATE config SET default_value='4000' WHERE var_name='AgentCommandTimeout'\n")
763 _T("UPDATE config SET default_value='netxms' WHERE var_name='AgentDefaultSharedSecret'\n")
764 _T("UPDATE config SET default_value='600' WHERE var_name='AgentUpgradeWaitTime'\n")
765 _T("UPDATE config SET default_value='180' WHERE var_name='AlarmHistoryRetentionTime'\n")
766 _T("UPDATE config SET default_value='4096' WHERE var_name='AlarmListDisplayLimit'\n")
767 _T("UPDATE config SET default_value='0 0 * * *' WHERE var_name='AlarmSummaryEmailSchedule'\n")
768 _T("UPDATE config SET default_value='0' WHERE var_name='AllowDirectSMS'\n")
769 _T("UPDATE config SET default_value='63' WHERE var_name='AllowedCiphers'\n")
770 _T("UPDATE config SET default_value='1' WHERE var_name='AllowTrapVarbindsConversion'\n")
771 _T("UPDATE config SET default_value='0' WHERE var_name='AnonymousFileAccess'\n")
772 _T("UPDATE config SET default_value='1' WHERE var_name='ApplyDCIFromTemplateToDisabledDCI'\n")
773 _T("UPDATE config SET default_value='90' WHERE var_name='AuditLogRetentionTime'\n")
774 _T("UPDATE config SET default_value='1000' WHERE var_name='BeaconPollingInterval'\n")
775 _T("UPDATE config SET default_value='1000' WHERE var_name='BeaconTimeout'\n")
776 _T("UPDATE config SET default_value='0' WHERE var_name='BlockInactiveUserAccounts'\n")
777 _T("UPDATE config SET default_value='604800' WHERE var_name='CapabilityExpirationTime'\n")
778 _T("UPDATE config SET default_value='0' WHERE var_name='CaseInsensitiveLoginNames'\n")
779 _T("UPDATE config SET default_value='0' WHERE var_name='CheckTrustedNodes'\n")
780 _T("UPDATE config SET default_value='4701' WHERE var_name='ClientListenerPort'\n")
781 _T("UPDATE config SET default_value='0' WHERE var_name='ClusterContainerAutoBind'\n")
782 _T("UPDATE config SET default_value='0' WHERE var_name='ClusterTemplateAutoApply'\n")
783 _T("UPDATE config SET default_value='60' WHERE var_name='ConditionPollingInterval'\n")
784 _T("UPDATE config SET default_value='3600' WHERE var_name='ConfigurationPollingInterval'\n")
785 _T("UPDATE config SET default_value='1' WHERE var_name='DashboardDataExportEnableInterpolation'\n")
786 _T("UPDATE config SET default_value='10' WHERE var_name='DBConnectionPoolBaseSize'\n")
787 _T("UPDATE config SET default_value='300' WHERE var_name='DBConnectionPoolCooldownTime'\n")
788 _T("UPDATE config SET default_value='14400' WHERE var_name='DBConnectionPoolMaxLifetime'\n")
789 _T("UPDATE config SET default_value='30' WHERE var_name='DBConnectionPoolMaxSize'\n")
790 _T("UPDATE config SET default_value='0' WHERE var_name='DBLockPID'\n")
791 _T("UPDATE config SET default_value='UNLOCKED' WHERE var_name='DBLockStatus'\n")
792 _T("UPDATE config SET default_value='2' WHERE var_name='DefaultAgentCacheMode'\n")
793 _T("UPDATE config SET default_value='1' WHERE var_name='DefaultAgentProtocolCompressionMode'\n")
794 _T("UPDATE config SET default_value='dd.MM.yyyy' WHERE var_name='DefaultConsoleDateFormat'\n")
795 _T("UPDATE config SET default_value='HH:mm' WHERE var_name='DefaultConsoleShortTimeFormat'\n")
796 _T("UPDATE config SET default_value='HH:mm:ss' WHERE var_name='DefaultConsoleTimeFormat'\n")
797 _T("UPDATE config SET default_value='60' WHERE var_name='DefaultDCIPollingInterval'\n")
798 _T("UPDATE config SET default_value='30' WHERE var_name='DefaultDCIRetentionTime'\n")
799 _T("UPDATE config SET default_value='1' WHERE var_name='DefaultEncryptionPolicy'\n")
800 _T("UPDATE config SET default_value='1' WHERE var_name='DefaultInterfaceExpectedState'\n")
801 _T("UPDATE config SET default_value='0xffffff' WHERE var_name='DefaultMapBackgroundColor'\n")
802 _T("UPDATE config SET default_value='24' WHERE var_name='DefaultSubnetMaskIPv4'\n")
803 _T("UPDATE config SET default_value='64' WHERE var_name='DefaultSubnetMaskIPv6'\n")
804 _T("UPDATE config SET default_value='1' WHERE var_name='DeleteAlarmsOfDeletedObject'\n")
805 _T("UPDATE config SET default_value='0' WHERE var_name='DeleteEmptySubnets'\n")
806 _T("UPDATE config SET default_value='1' WHERE var_name='DeleteEventsOfDeletedObject'\n")
807 _T("UPDATE config SET default_value='0' WHERE var_name='DeleteUnreachableNodesPeriod'\n")
808 _T("UPDATE config SET default_value='none' WHERE var_name='DiscoveryFilter'\n")
809 _T("UPDATE config SET default_value='0' WHERE var_name='DiscoveryFilterFlags'\n")
810 _T("UPDATE config SET default_value='900' WHERE var_name='DiscoveryPollingInterval'\n")
811 _T("UPDATE config SET default_value='1' WHERE var_name='EnableAdminInterface'\n")
812 _T("UPDATE config SET default_value='1' WHERE var_name='EnableAgentRegistration'\n")
813 _T("UPDATE config SET default_value='1' WHERE var_name='EnableAuditLog'\n")
814 _T("UPDATE config SET default_value='0' WHERE var_name='EnableCheckPointSNMP'\n")
815 _T("UPDATE config SET default_value='0' WHERE var_name='EnableReportingServer'\n")
816 _T("UPDATE config SET default_value='0' WHERE var_name='EnableEventStormDetection'\n")
817 _T("UPDATE config SET default_value='0' WHERE var_name='EnableISCListener'\n")
818 _T("UPDATE config SET default_value='1' WHERE var_name='EnableNXSLContainerFunctions'\n")
819 _T("UPDATE config SET default_value='0' WHERE var_name='EnableObjectTransactions'\n")
820 _T("UPDATE config SET default_value='1' WHERE var_name='EnableSNMPTraps'\n")
821 _T("UPDATE config SET default_value='0' WHERE var_name='EnableAlarmSummaryEmails'\n")
822 _T("UPDATE config SET default_value='0' WHERE var_name='EnableSyslogReceiver'\n")
823 _T("UPDATE config SET default_value='1' WHERE var_name='EnableTimedAlarmAck'\n")
824 _T("UPDATE config SET default_value='0' WHERE var_name='EnableXMPPConnector'\n")
825 _T("UPDATE config SET default_value='0' WHERE var_name='EnableZoning'\n")
826 _T("UPDATE config SET default_value='0' WHERE var_name='EscapeLocalCommands'\n")
827 _T("UPDATE config SET default_value='90' WHERE var_name='EventLogRetentionTime'\n")
828 _T("UPDATE config SET default_value='15' WHERE var_name='EventStormDuration'\n")
829 _T("UPDATE config SET default_value='100' WHERE var_name='EventStormEventsPerSecond'\n")
830 _T("UPDATE config SET default_value='0' WHERE var_name='ExtendedLogQueryAccessControl'\n")
831 _T("UPDATE config SET default_value='13' WHERE var_name='ExternalAuditFacility'\n")
832 _T("UPDATE config SET default_value='514' WHERE var_name='ExternalAuditPort'\n")
833 _T("UPDATE config SET default_value='none' WHERE var_name='ExternalAuditServer'\n")
834 _T("UPDATE config SET default_value='5' WHERE var_name='ExternalAuditSeverity'\n")
835 _T("UPDATE config SET default_value='netxmsd-audit' WHERE var_name='ExternalAuditTag'\n")
836 _T("UPDATE config SET default_value='100' WHERE var_name='FirstFreeObjectId'\n")
837 _T("UPDATE config SET default_value='0' WHERE var_name='FixedStatusValue'\n")
838 _T("UPDATE config SET default_value='5' WHERE var_name='GraceLoginCount'\n")
839 _T("UPDATE config SET default_value='none' WHERE var_name='HelpDeskLink'\n")
840 _T("UPDATE config SET default_value='02:00' WHERE var_name='HousekeeperStartTime'\n")
841 _T("UPDATE config SET default_value='46' WHERE var_name='IcmpPingSize'\n")
842 _T("UPDATE config SET default_value='1500' WHERE var_name='IcmpPingTimeout'\n")
843 _T("UPDATE config SET default_value='1' WHERE var_name='ImportConfigurationOnStartup'\n")
844 _T("UPDATE config SET default_value='600' WHERE var_name='InstancePollingInterval'\n")
845 _T("UPDATE config SET default_value='0' WHERE var_name='InternalCA'\n")
846 _T("UPDATE config SET default_value='0' WHERE var_name='IntruderLockoutThreshold'\n")
847 _T("UPDATE config SET default_value='30' WHERE var_name='IntruderLockoutTime'\n")
848 _T("UPDATE config SET default_value='Task' WHERE var_name='JiraIssueType'\n")
849 _T("UPDATE config SET default_value='netxms' WHERE var_name='JiraLogin'\n")
850 _T("UPDATE config SET default_value='NETXMS' WHERE var_name='JiraProjectCode'\n")
851 _T("UPDATE config SET default_value='http://localhost' WHERE var_name='JiraServerURL'\n")
852 _T("UPDATE config SET default_value='90' WHERE var_name='JobHistoryRetentionTime'\n")
853 _T("UPDATE config SET default_value='5' WHERE var_name='JobRetryCount'\n")
854 _T("UPDATE config SET default_value='60' WHERE var_name='KeepAliveInterval'\n")
855 _T("UPDATE config SET default_value='ldap://localhost:389' WHERE var_name='LdapConnectionString'\n")
856 _T("UPDATE config SET default_value='displayName' WHERE var_name='LdapMappingFullName'\n")
857 _T("UPDATE config SET default_value='1000' WHERE var_name='LdapPageSize'\n")
858 _T("UPDATE config SET default_value='0' WHERE var_name='LdapSyncInterval'\n")
859 _T("UPDATE config SET default_value='1' WHERE var_name='LdapUserDeleteAction'\n")
860 _T("UPDATE config SET default_value='60000' WHERE var_name='LockTimeout'\n")
861 _T("UPDATE config SET default_value='0' WHERE var_name='LogAllSNMPTraps'\n")
862 _T("UPDATE config SET default_value='utf8' WHERE var_name='MailEncoding'\n")
863 _T("UPDATE config SET default_value='0' WHERE var_name='MinPasswordLength'\n")
864 _T("UPDATE config SET default_value='1000' WHERE var_name='MinViewRefreshInterval'\n")
865 _T("UPDATE config SET default_value='4747' WHERE var_name='MobileDeviceListenerPort'\n")
866 _T("UPDATE config SET default_value='25' WHERE var_name='NumberOfDataCollectors'\n")
867 _T("UPDATE config SET default_value='10' WHERE var_name='NumberOfUpgradeThreads'\n")
868 _T("UPDATE config SET default_value='86400' WHERE var_name='OfflineDataRelevanceTime'\n")
869 _T("UPDATE config SET default_value='0' WHERE var_name='PasswordComplexity'\n")
870 _T("UPDATE config SET default_value='0' WHERE var_name='PasswordExpiration'\n")
871 _T("UPDATE config SET default_value='0' WHERE var_name='PasswordHistoryLength'\n")
872 _T("UPDATE config SET default_value='1' WHERE var_name='PollCountForStatusChange'\n")
873 _T("UPDATE config SET default_value='10' WHERE var_name='PollerThreadPoolBaseSize'\n")
874 _T("UPDATE config SET default_value='250' WHERE var_name='PollerThreadPoolMaxSize'\n")
875 _T("UPDATE config SET default_value='PAP' WHERE var_name='RADIUSAuthMethod'\n")
876 _T("UPDATE config SET default_value='5' WHERE var_name='RADIUSNumRetries'\n")
877 _T("UPDATE config SET default_value='1645' WHERE var_name='RADIUSPort'\n")
878 _T("UPDATE config SET default_value='1645' WHERE var_name='RADIUSSecondaryPort'\n")
879 _T("UPDATE config SET default_value='netxms' WHERE var_name='RADIUSSecondarySecret'\n")
880 _T("UPDATE config SET default_value='none' WHERE var_name='RADIUSSecondaryServer'\n")
881 _T("UPDATE config SET default_value='netxms' WHERE var_name='RADIUSSecret'\n")
882 _T("UPDATE config SET default_value='none' WHERE var_name='RADIUSServer'\n")
883 _T("UPDATE config SET default_value='3' WHERE var_name='RADIUSTimeout'\n")
884 _T("UPDATE config SET default_value='0' WHERE var_name='ReceiveForwardedEvents'\n")
885 _T("UPDATE config SET default_value='localhost' WHERE var_name='ReportingServerHostname'\n")
886 _T("UPDATE config SET default_value='4710' WHERE var_name='ReportingServerPort'\n")
887 _T("UPDATE config SET default_value='0' WHERE var_name='ResolveDNSToIPOnStatusPoll'\n")
888 _T("UPDATE config SET default_value='1' WHERE var_name='ResolveNodeNames'\n")
889 _T("UPDATE config SET default_value='300' WHERE var_name='RoutingTableUpdateInterval'\n")
890 _T("UPDATE config SET default_value='0' WHERE var_name='RunNetworkDiscovery'\n")
891 _T("UPDATE config SET default_value='60' WHERE var_name='ServerCommandOutputTimeout'\n")
892 _T("UPDATE config SET default_value='<none>' WHERE var_name='SMSDriver'\n")
893 _T("UPDATE config SET default_value='161' WHERE var_name='SNMPPorts'\n")
894 _T("UPDATE config SET default_value='1500' WHERE var_name='SNMPRequestTimeout'\n")
895 _T("UPDATE config SET default_value='90' WHERE var_name='SNMPTrapLogRetentionTime'\n")
896 _T("UPDATE config SET default_value='162' WHERE var_name='SNMPTrapPort'\n")
897 _T("UPDATE config SET default_value='netxms@localhost' WHERE var_name='SMTPFromAddr'\n")
898 _T("UPDATE config SET default_value='NetXMS Server' WHERE var_name='SMTPFromName'\n")
899 _T("UPDATE config SET default_value='25' WHERE var_name='SMTPPort'\n")
900 _T("UPDATE config SET default_value='1' WHERE var_name='SMTPRetryCount'\n")
901 _T("UPDATE config SET default_value='localhost' WHERE var_name='SMTPServer'\n")
902 _T("UPDATE config SET default_value='1' WHERE var_name='StatusCalculationAlgorithm'\n")
903 _T("UPDATE config SET default_value='60' WHERE var_name='StatusPollingInterval'\n")
904 _T("UPDATE config SET default_value='1' WHERE var_name='StatusPropagationAlgorithm'\n")
905 _T("UPDATE config SET default_value='0' WHERE var_name='StatusShift'\n")
906 _T("UPDATE config SET default_value='75' WHERE var_name='StatusSingleThreshold'\n")
907 _T("UPDATE config SET default_value='503C2814' WHERE var_name='StatusThresholds'\n")
908 _T("UPDATE config SET default_value='01020304' WHERE var_name='StatusTranslation'\n")
909 _T("UPDATE config SET default_value='0' WHERE var_name='StrictAlarmStatusFlow'\n")
910 _T("UPDATE config SET default_value='60' WHERE var_name='SyncInterval'\n")
911 _T("UPDATE config SET default_value='0' WHERE var_name='SyncNodeNamesWithDNS'\n")
912 _T("UPDATE config SET default_value='0' WHERE var_name='SyslogIgnoreMessageTimestamp'\n")
913 _T("UPDATE config SET default_value='514' WHERE var_name='SyslogListenPort'\n")
914 _T("UPDATE config SET default_value='0' WHERE var_name='SyslogNodeMatchingPolicy'\n")
915 _T("UPDATE config SET default_value='90' WHERE var_name='SyslogRetentionTime'\n")
916 _T("UPDATE config SET default_value='0' WHERE var_name='ThresholdRepeatInterval'\n")
917 _T("UPDATE config SET default_value='http://tile.openstreetmap.org/' WHERE var_name='TileServerURL'\n")
918 _T("UPDATE config SET default_value='3' WHERE var_name='TopologyDiscoveryRadius'\n")
919 _T("UPDATE config SET default_value='900' WHERE var_name='TopologyExpirationTime'\n")
920 _T("UPDATE config SET default_value='1800' WHERE var_name='TopologyPollingInterval'\n")
921 _T("UPDATE config SET default_value='0' WHERE var_name='TrapSourcesInAllZones'\n")
922 _T("UPDATE config SET default_value='0' WHERE var_name='UseDNSNameForDiscoveredNodes'\n")
923 _T("UPDATE config SET default_value='1' WHERE var_name='UseFQDNForNodeNames'\n")
924 _T("UPDATE config SET default_value='1' WHERE var_name='UseIfXTable'\n")
925 _T("UPDATE config SET default_value='0' WHERE var_name='UseInterfaceAliases'\n")
926 _T("UPDATE config SET default_value='0' WHERE var_name='UseSNMPTrapsForDiscovery'\n")
927 _T("UPDATE config SET default_value='0' WHERE var_name='UseSyslogForDiscovery'\n")
928 _T("UPDATE config SET default_value='netxms@localhost' WHERE var_name='XMPPLogin'\n")
929 _T("UPDATE config SET default_value='netxms' WHERE var_name='XMPPPassword'\n")
930 _T("UPDATE config SET default_value='5222' WHERE var_name='XMPPPort'\n")
931 _T("UPDATE config SET default_value='localhost' WHERE var_name='XMPPServer'\n")
932 _T("<END>");
933 CHK_EXEC(SQLBatch(batch));
934
935 CHK_EXEC(SetSchemaVersion(454));
936 return TRUE;
937 }
938
939 /**
940 * Upgrade from V452 to V453
941 */
942 static BOOL H_UpgradeFromV452(int currVersion, int newVersion)
943 {
944 static const TCHAR *batch =
945 _T("ALTER TABLE audit_log ADD value_diff $SQL:TEXT\n")
946 _T("<END>");
947 CHK_EXEC(SQLBatch(batch));
948 CHK_EXEC(SetSchemaVersion(453));
949 return TRUE;
950 }
951
952 /**
953 * Upgrade from V451 to V452
954 */
955 static BOOL H_UpgradeFromV451(int currVersion, int newVersion)
956 {
957 static const TCHAR *batch =
958 _T("ALTER TABLE audit_log ADD old_value $SQL:TEXT\n")
959 _T("ALTER TABLE audit_log ADD new_value $SQL:TEXT\n")
960 _T("<END>");
961 CHK_EXEC(SQLBatch(batch));
962 CHK_EXEC(SetSchemaVersion(452));
963 return TRUE;
964 }
965
966 /**
967 * Upgrade from V450 to V451
968 */
969 static BOOL H_UpgradeFromV450(int currVersion, int newVersion)
970 {
971 CHK_EXEC(CreateTable(
972 _T("CREATE TABLE object_access_snapshot (")
973 _T(" user_id integer not null,")
974 _T(" object_id integer not null,")
975 _T(" access_rights integer not null,")
976 _T("PRIMARY KEY(user_id,object_id))")));
977
978 CHK_EXEC(SetSchemaVersion(451));
979 return TRUE;
980 }
981
982 /**
983 * Upgrade from V449 to V450
984 */
985 static BOOL H_UpgradeFromV449(int currVersion, int newVersion)
986 {
987 static const TCHAR *batch =
988 _T("ALTER TABLE dct_thresholds ADD sample_count integer\n")
989 _T("UPDATE dct_thresholds SET sample_count=1\n")
990 _T("<END>");
991 CHK_EXEC(SQLBatch(batch));
992 DBSetNotNullConstraint(g_hCoreDB, _T("dct_thresholds"), _T("sample_count"));
993
994 CHK_EXEC(CreateTable(
995 _T("CREATE TABLE dct_threshold_instances (")
996 _T(" threshold_id integer not null,")
997 _T(" instance varchar(255) not null,")
998 _T(" match_count integer not null,")
999 _T(" is_active char(1) not null,")
1000 _T("PRIMARY KEY(threshold_id,instance))")));
1001
1002 CHK_EXEC(SetSchemaVersion(450));
1003 return TRUE;
1004 }
1005
1006 /**
1007 * Upgrade from V448 to V449
1008 */
1009 static BOOL H_UpgradeFromV448(int currVersion, int newVersion)
1010 {
1011 CHK_EXEC(CreateConfigParam(_T("SMTPPort"), _T("25"), _T("Port used by SMTP server"), 'I', true, false, false, false));
1012 CHK_EXEC(SetSchemaVersion(449));
1013 return TRUE;
1014 }
1015
1016 /**
1017 * Upgrade from V447 to V448
1018 */
1019 static BOOL H_UpgradeFromV447(int currVersion, int newVersion)
1020 {
1021 CHK_EXEC(SQLQuery(_T("ALTER TABLE nodes ADD lldp_id varchar(63)")));
1022 CHK_EXEC(SetSchemaVersion(448));
1023 return TRUE;
1024 }
1025
1026 /**
1027 * Upgrade from V446 to V447
1028 */
1029 static BOOL H_UpgradeFromV446(int currVersion, int newVersion)
1030 {
1031 CHK_EXEC(CreateTable(
1032 _T("CREATE TABLE port_layouts (")
1033 _T(" device_oid varchar(255) not null,")
1034 _T(" numbering_scheme char(1) not null,")
1035 _T(" row_count char(1) not null,")
1036 _T(" layout_data varchar(4000) null,")
1037 _T("PRIMARY KEY(device_oid))")));
1038
1039 CHK_EXEC(SetSchemaVersion(447));
1040 return TRUE;
1041 }
1042
1043 /**
1044 * Upgrade from V445 to V446
1045 */
1046 static BOOL H_UpgradeFromV445(int currVersion, int newVersion)
1047 {
1048 CHK_EXEC(CreateTable(
1049 _T("CREATE TABLE network_map_seed_nodes (")
1050 _T(" map_id integer not null,")
1051 _T(" seed_node_id integer not null,")
1052 _T("PRIMARY KEY(map_id,seed_node_id))")));
1053
1054 DB_RESULT hResult = DBSelect(g_hCoreDB, _T("SELECT id,seed FROM network_maps"));
1055 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO network_map_seed_nodes (map_id,seed_node_id) VALUES (?,?)"));
1056 if (hResult != NULL)
1057 {
1058 if (hStmt != NULL)
1059 {
1060 int nRows = DBGetNumRows(hResult);
1061 for(int i = 0; i < nRows; i++)
1062 {
1063 DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 0));
1064 DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 1));
1065
1066 if (!SQLExecute(hStmt))
1067 {
1068 if (!g_bIgnoreErrors)
1069 {
1070 DBFreeStatement(hStmt);
1071 DBFreeResult(hResult);
1072 return FALSE;
1073 }
1074 }
1075 }
1076
1077 CHK_EXEC(DBDropColumn(g_hCoreDB, _T("network_maps"), _T("seed")));
1078 DBFreeStatement(hStmt);
1079 }
1080 DBFreeResult(hResult);
1081 }
1082
1083 CHK_EXEC(SetSchemaVersion(446));
1084 return TRUE;
1085 }
1086
1087 /**
1088 * Upgrade from V444 to V445
1089 */
1090 static BOOL H_UpgradeFromV444(int currVersion, int newVersion)
1091 {
1092 CHK_EXEC(SQLQuery(_T("ALTER TABLE nodes ADD tunnel_id varchar(36) null")));
1093 CHK_EXEC(SetSchemaVersion(445));
1094 return TRUE;
1095 }
1096
1097 /**
1098 * Upgrade from V443 to V444
1099 */
1100 static BOOL H_UpgradeFromV443(int currVersion, int newVersion)
1101 {
1102 CHK_EXEC(CreateConfigParam(_T("GraceLoginCount"), _T("5"), _T("User's grace login count"), 'I', true, false, false, false));
1103 CHK_EXEC(SetSchemaVersion(444));
1104 return TRUE;
1105 }
1106
1107 /**
1108 * Upgrade from V442 to V443
1109 */
1110 static BOOL H_UpgradeFromV442(int currVersion, int newVersion)
1111 {
1112 static const TCHAR *batch =
1113 _T("ALTER TABLE dc_tables ADD instance varchar(255) null\n")
1114 _T("ALTER TABLE dc_tables ADD instd_method integer null\n")
1115 _T("UPDATE dc_tables SET instd_method=0\n")
1116 _T("ALTER TABLE dc_tables ADD instd_data varchar(255) null\n")
1117 _T("ALTER TABLE dc_tables ADD instd_filter $SQL:TEXT null\n")
1118 _T("<END>");
1119 CHK_EXEC(SQLBatch(batch));
1120 DBSetNotNullConstraint(g_hCoreDB, _T("dc_tables"), _T("instd_method"));
1121 CHK_EXEC(SetSchemaVersion(443));
1122 return TRUE;
1123 }
1124
1125 /**
1126 * Upgrade from V441 to V442
1127 */
1128 static BOOL H_UpgradeFromV441(int currVersion, int newVersion)
1129 {
1130 CHK_EXEC(CreateTable(
1131 _T("CREATE TABLE object_urls (")
1132 _T(" object_id integer not null,")
1133 _T(" url_id integer not null,")
1134 _T(" url varchar(2000) null,")
1135 _T(" description varchar(2000) null,")
1136 _T(" PRIMARY KEY(object_id,url_id))")));
1137 CHK_EXEC(SetSchemaVersion(442));
1138 return TRUE;
1139 }
1140
1141 /**
1142 * Upgrade from V440 to V441
1143 */
1144 static BOOL H_UpgradeFromV440(int currVersion, int newVersion)
1145 {
1146 CHK_EXEC(CreateConfigParam(_T("TopologyPollingInterval"), _T("1800"), _T("Interval in seconds between topology polls"), 'I', true, true, false, false));
1147 CHK_EXEC(SetSchemaVersion(441));
1148 return TRUE;
1149 }
1150
1151 /**
1152 * Upgrade from V439 to V440
1153 */
1154 static BOOL H_UpgradeFromV439(int currVersion, int newVersion)
1155 {
1156 static const TCHAR *batch =
1157 _T("UPDATE config SET description='Enable/disable automatic deletion of subnet objects without any nodes within.' WHERE var_name='DeleteEmptySubnets'\n")
1158 _T("UPDATE config SET description='Instance polling interval (in seconds).' WHERE var_name='InstancePollingInterval'\n")
1159 _T("<END>");
1160 CHK_EXEC(SQLBatch(batch));
1161 CHK_EXEC(SetSchemaVersion(440));
1162 return TRUE;
1163 }
1164
1165 /**
1166 * Upgrade from V438 to V439
1167 */
1168 static BOOL H_UpgradeFromV438(int currVersion, int newVersion)
1169 {
1170 static const TCHAR *batch =
1171 _T("UPDATE config SET data_type='S' WHERE var_name='LdapUserUniqueId'\n")
1172 _T("UPDATE config SET data_type='S' WHERE var_name='LdapGroupUniqueId'\n")
1173 _T("<END>");
1174 CHK_EXEC(SQLBatch(batch));
1175 CHK_EXEC(SetSchemaVersion(439));
1176 return TRUE;
1177 }
1178
1179 /**
1180 * Upgrade from V437 to V438
1181 */
1182 static BOOL H_UpgradeFromV437(int currVersion, int newVersion)
1183 {
1184 static const TCHAR *batch =
1185 _T("ALTER TABLE snmp_trap_cfg ADD guid varchar(36)\n")
1186 _T("UPDATE snmp_trap_cfg SET guid='5d01e7e5-edbb-46ce-b53c-f7f64d1bf8ff' WHERE trap_id=1\n")
1187 _T("UPDATE snmp_trap_cfg SET guid='c5464919-fd76-4624-9c21-b6ab73d9df80' WHERE trap_id=2\n")
1188 _T("UPDATE snmp_trap_cfg SET guid='44d3b32e-33c5-4a39-b2ad-990a1120155d' WHERE trap_id=3\n")
1189 _T("UPDATE snmp_trap_cfg SET guid='c9660f48-a4b3-41c8-b3f9-e9a6a8129db5' WHERE trap_id=4\n")
1190 _T("UPDATE snmp_trap_cfg SET guid='4b422ba6-4b45-4881-931a-ed38dc798f9f' WHERE trap_id=5\n")
1191 _T("UPDATE snmp_trap_cfg SET guid='bd8b6971-a3e4-4cad-9c70-3a33e61e0913' WHERE trap_id=6\n")
1192 _T("ALTER TABLE script_library ADD guid varchar(36)\n")
1193 _T("UPDATE script_library SET guid='3b7bddce-3505-42ff-ac60-6a48a64bd0ae' WHERE script_id=1\n")
1194 _T("UPDATE script_library SET guid='2fb9212b-97e6-40e7-b434-2df4f7e8f6aa' WHERE script_id=2\n")
1195 _T("UPDATE script_library SET guid='38696a00-c519-438c-8cbd-4b3a0cba4af1' WHERE script_id=3\n")
1196 _T("UPDATE script_library SET guid='efe50915-47b2-43d8-b4f4-2c09a44970c3' WHERE script_id=4\n")
1197 _T("UPDATE script_library SET guid='7837580c-4054-40f2-981f-7185797fe7d7' WHERE script_id=11\n")
1198 _T("UPDATE script_library SET guid='f7d1bc7e-4046-4ee4-adb2-718f7361984d' WHERE script_id=12\n")
1199 _T("UPDATE script_library SET guid='048fcf32-765b-4702-9c70-f012f62d5a90' WHERE script_id=13\n")
1200 _T("UPDATE script_library SET guid='d515c10f-a5c9-4f41-afcd-9ddc8845f288' WHERE script_id=14\n")
1201 _T("UPDATE script_library SET guid='7cd1c471-2f14-4fae-8743-8899fed64d18' WHERE script_id=15\n")
1202 _T("UPDATE script_library SET guid='befdb083-ac68-481d-a7b7-127e11c3fae0' WHERE script_id=16\n")
1203 _T("<END>");
1204 CHK_EXEC(SQLBatch(batch));
1205
1206 DB_RESULT hResult = DBSelect(g_hCoreDB, _T("SELECT trap_id FROM snmp_trap_cfg WHERE guid IS NULL"));
1207 if (hResult != NULL)
1208 {
1209 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("UPDATE snmp_trap_cfg SET guid=? WHERE trap_id=?"));
1210 if (hStmt != NULL)
1211 {
1212 int numRows = DBGetNumRows(hResult);
1213 for(int i = 0; i < numRows; i++)
1214 {
1215 uuid guid = uuid::generate();
1216 DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, guid);
1217 DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 0));
1218
1219 if (!SQLExecute(hStmt))
1220 {
1221 if (!g_bIgnoreErrors)
1222 {
1223 DBFreeStatement(hStmt);
1224 DBFreeResult(hResult);
1225 return FALSE;
1226 }
1227 }
1228 }
1229 DBFreeStatement(hStmt);
1230 }
1231 DBFreeResult(hResult);
1232 }
1233
1234 hResult = DBSelect(g_hCoreDB, _T("SELECT guid,script_id FROM script_library WHERE guid IS NULL"));
1235 if (hResult != NULL)
1236 {
1237 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("UPDATE script_library SET guid=? WHERE script_id=?"));
1238 if (hStmt != NULL)
1239 {
1240 int numRows = DBGetNumRows(hResult);
1241 for(int i = 0; i < numRows; i++)
1242 {
1243 uuid guid = uuid::generate();
1244 DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, guid);
1245 DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 1));
1246 if (!SQLExecute(hStmt))
1247 {
1248 if (!g_bIgnoreErrors)
1249 {
1250 DBFreeStatement(hStmt);
1251 DBFreeResult(hResult);
1252 return FALSE;
1253 }
1254 }
1255 }
1256 DBFreeStatement(hStmt);
1257 }
1258 DBFreeResult(hResult);
1259 }
1260
1261 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("snmp_trap_cfg"), _T("guid")));
1262 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("script_library"), _T("guid")));
1263 CHK_EXEC(SetSchemaVersion(438));
1264 return TRUE;
1265 }
1266
1267 /**
1268 * Upgrade from V436 to V437
1269 */
1270 static BOOL H_UpgradeFromV436(int currVersion, int newVersion)
1271 {
1272 CHK_EXEC(
1273 CreateEventTemplate(EVENT_ROUTING_LOOP_DETECTED, _T("SYS_ROUTING_LOOP_DETECTED"),
1274 SEVERITY_MAJOR, EF_LOG, _T("98276f42-dc85-41a5-b449-6ba83d1a71b7"),
1275 _T("Routing loop detected for destination %3 (selected route %6/%7 via %9)"),
1276 _T("Generated when server detects routing loop during network path trace.\r\n")
1277 _T("Source of the event is node which routes packet back to already passed hop.\r\n")
1278 _T("Parameters:\r\n")
1279 _T(" 1) Protocol (IPv4 or IPv6)\r\n")
1280 _T(" 2) Path trace destination node ID\r\n")
1281 _T(" 3) Path trace destination address\r\n")
1282 _T(" 4) Path trace source node ID\r\n")
1283 _T(" 5) Path trace source node address\r\n")
1284 _T(" 6) Routing prefix (subnet address)\r\n")
1285 _T(" 7) Routing prefix length (subnet mask length)\r\n")
1286 _T(" 8) Next hop node ID\r\n")
1287 _T(" 9) Next hop address"))
1288 );
1289 CHK_EXEC(SetSchemaVersion(437));
1290 return TRUE;
1291 }
1292
1293 /**
1294 * Upgrade from V435 to V436
1295 */
1296 static BOOL H_UpgradeFromV435(int currVersion, int newVersion)
1297 {
1298 static const TCHAR *batch =
1299 _T("ALTER TABLE nodes ADD agent_comp_mode char(1)\n")
1300 _T("UPDATE nodes SET agent_comp_mode='0'\n")
1301 _T("<END>");
1302 CHK_EXEC(SQLBatch(batch));
1303 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("nodes"), _T("agent_comp_mode")));
1304 CHK_EXEC(SetSchemaVersion(436));
1305 return TRUE;
1306 }
1307
1308 /**
1309 * Upgrade from V434 to V435
1310 */
1311 static BOOL H_UpgradeFromV434(int currVersion, int newVersion)
1312 {
1313 CHK_EXEC(CreateConfigParam(_T("DefaultAgentProtocolCompressionMode"), _T("1"), _T("Default agent protocol compression mode"), 'C', true, false, false, false));
1314 static const TCHAR *batch =
1315 _T("UPDATE config SET data_type='C',description='Default agent cache mode' WHERE var_name='DefaultAgentCacheMode'\n")
1316 _T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultAgentCacheMode','1','On')\n")
1317 _T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultAgentCacheMode','2','Off')\n")
1318 _T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultAgentProtocolCompressionMode','1','Enabled')\n")
1319 _T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultAgentProtocolCompressionMode','2','Disabled')\n")
1320 _T("<END>");
1321 CHK_EXEC(SQLBatch(batch));
1322 CHK_EXEC(SetSchemaVersion(435));
1323 return TRUE;
1324 }
1325
1326 /**
1327 * Upgrade from V433 to V434
1328 */
1329 static BOOL H_UpgradeFromV433(int currVersion, int newVersion)
1330 {
1331 CHK_EXEC(
1332 CreateEventTemplate(EVENT_IF_EXPECTED_STATE_UP, _T("SYS_IF_EXPECTED_STATE_UP"),
1333 SEVERITY_NORMAL, EF_LOG, _T("4997c3f5-b332-4077-8e99-983142f0e193"),
1334 _T("Expected state for interface \"%2\" set to UP"),
1335 _T("Generated when interface expected state set to UP.\r\n")
1336 _T("Please note that source of event is node, not an interface itself.\r\n")
1337 _T("Parameters:\r\n")
1338 _T(" 1) Interface index\r\n")
1339 _T(" 2) Interface name"))
1340 );
1341
1342 CHK_EXEC(
1343 CreateEventTemplate(EVENT_IF_EXPECTED_STATE_DOWN, _T("SYS_IF_EXPECTED_STATE_DOWN"),
1344 SEVERITY_NORMAL, EF_LOG, _T("75de536c-4861-4f19-ba56-c43d814431d7"),
1345 _T("Expected state for interface \"%2\" set to DOWN"),
1346 _T("Generated when interface expected state set to DOWN.\r\n")
1347 _T("Please note that source of event is node, not an interface itself.\r\n")
1348 _T("Parameters:\r\n")
1349 _T(" 1) Interface index\r\n")
1350 _T(" 2) Interface name"))
1351 );
1352
1353 CHK_EXEC(
1354 CreateEventTemplate(EVENT_IF_EXPECTED_STATE_IGNORE, _T("SYS_IF_EXPECTED_STATE_IGNORE"),
1355 SEVERITY_NORMAL, EF_LOG, _T("0e488c0e-3340-4e02-ad96-b999b8392e55"),
1356 _T("Expected state for interface \"%2\" set to IGNORE"),
1357 _T("Generated when interface expected state set to IGNORE.\r\n")
1358 _T("Please note that source of event is node, not an interface itself.\r\n")
1359 _T("Parameters:\r\n")
1360 _T(" 1) Interface index\r\n")
1361 _T(" 2) Interface name"))
1362 );
1363
1364 CHK_EXEC(AddEventToEPPRule(_T("6f46d451-ee66-4563-8747-d129877df24d"), EVENT_IF_EXPECTED_STATE_DOWN));
1365 CHK_EXEC(AddEventToEPPRule(_T("6f46d451-ee66-4563-8747-d129877df24d"), EVENT_IF_EXPECTED_STATE_IGNORE));
1366 CHK_EXEC(AddEventToEPPRule(_T("ecc3fb57-672d-489d-a0ef-4214ea896e0f"), EVENT_IF_EXPECTED_STATE_UP));
1367 CHK_EXEC(AddEventToEPPRule(_T("ecc3fb57-672d-489d-a0ef-4214ea896e0f"), EVENT_IF_EXPECTED_STATE_IGNORE));
1368
1369 CHK_EXEC(SetSchemaVersion(434));
1370 return TRUE;
1371 }
1372
1373 /**
1374 * Upgrade from V432 to V433
1375 */
1376 static BOOL H_UpgradeFromV432(int currVersion, int newVersion)
1377 {
1378 CHK_EXEC(CreateConfigParam(_T("UseSyslogForDiscovery"), _T("0"), _T("Use syslog messages for new node discovery."), 'B', true, false, false, false));
1379 CHK_EXEC(SetSchemaVersion(433));
1380 return TRUE;
1381 }
1382
1383 /**
1384 * Upgrade from V431 to V432
1385 */
1386 static BOOL H_UpgradeFromV431(int currVersion, int newVersion)
1387 {
1388 CHK_EXEC(SQLQuery(_T("CREATE INDEX idx_syslog_source ON syslog(source_object_id)")));
1389 CHK_EXEC(SQLQuery(_T("CREATE INDEX idx_snmp_trap_log_oid ON snmp_trap_log(object_id)")));
1390 CHK_EXEC(SetSchemaVersion(432));
1391 return TRUE;
1392 }
1393
1394 /**
1395 * Upgrade from V430 to V431
1396 */
1397 static BOOL H_UpgradeFromV430(int currVersion, int newVersion)
1398 {
1399 CHK_EXEC(SQLQuery(_T("DELETE FROM config_values WHERE var_name='SNMPPorts'")));
1400 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Comma separated list of UDP ports used by SNMP capable devices.' WHERE var_name='SNMPPorts'")));
1401 CHK_EXEC(SetSchemaVersion(431));
1402 return TRUE;
1403 }
1404
1405 /**
1406 * Upgrade from V429 to V430
1407 */
1408 static BOOL H_UpgradeFromV429(int currVersion, int newVersion)
1409 {
1410 CHK_EXEC(CreateTable(
1411 _T("CREATE TABLE policy_pstorage_actions (")
1412 _T("rule_id integer not null,")
1413 _T("ps_key varchar(255) not null,")
1414 _T("value varchar(2000) null,")
1415 _T("action integer not null,")
1416 _T("PRIMARY KEY(rule_id,ps_key,action))")));
1417
1418 CHK_EXEC(CreateTable(
1419 _T("CREATE TABLE persistent_storage (")
1420 _T("entry_key varchar(255) not null,")
1421 _T("value varchar(2000) null,")
1422 _T("PRIMARY KEY(entry_key))")));
1423
1424 //Move previous attrs form situations to pstorage
1425 DB_RESULT hResult = SQLSelect(_T("SELECT event_policy.rule_id,situations.name,event_policy.situation_instance,")
1426 _T("policy_situation_attr_list.attr_name,policy_situation_attr_list.attr_value ")
1427 _T("FROM event_policy,situations,policy_situation_attr_list ")
1428 _T("WHERE event_policy.rule_id=policy_situation_attr_list.rule_id ")
1429 _T("AND situations.id=policy_situation_attr_list.situation_id"));
1430 if (hResult != NULL)
1431 {
1432 int count = DBGetNumRows(hResult);
1433 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO policy_pstorage_actions (rule_id,ps_key,value,action) VALUES (?,?,?,1)"));
1434 if (hStmt != NULL)
1435 {
1436 String key;
1437 for(int i = 0; i < count; i++)
1438 {
1439 TCHAR tmp[256];
1440 DBGetField(hResult, i, 1, tmp, 256);
1441 key.append(tmp);
1442 DBGetField(hResult, i, 2, tmp, 256);
1443 key.append(_T("."));
1444 key.append(tmp);
1445 DBGetField(hResult, i, 3, tmp, 256);
1446 key.append(_T("."));
1447 key.append(tmp);
1448 DBGetField(hResult, i, 4, tmp, 256);
1449
1450 DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, DBGetFieldLong(hResult, i, 0));
1451 DBBind(hStmt, 2, DB_SQLTYPE_TEXT, key, DB_BIND_STATIC, 512);
1452 DBBind(hStmt, 3, DB_SQLTYPE_TEXT, tmp, DB_BIND_STATIC);
1453 if (!SQLExecute(hStmt))
1454 {
1455 if (!g_bIgnoreErrors)
1456 {
1457 DBFreeStatement(hStmt);
1458 DBFreeResult(hResult);
1459 return FALSE;
1460 }
1461 }
1462 key.clear();
1463 }
1464 DBFreeStatement(hStmt);
1465 }
1466 else if (!g_bIgnoreErrors)
1467 {
1468 DBFreeStatement(hStmt);
1469 DBFreeResult(hResult);
1470 return FALSE;
1471 }
1472 DBFreeResult(hResult);
1473 }
1474 else
1475 {
1476 if (!g_bIgnoreErrors)
1477 return false;
1478 }
1479
1480 CHK_EXEC(SQLQuery(_T("DROP TABLE situations")));
1481 CHK_EXEC(SQLQuery(_T("DROP TABLE policy_situation_attr_list")));
1482 CHK_EXEC(DBDropColumn(g_hCoreDB, _T("event_policy"), _T("situation_id")));
1483 CHK_EXEC(DBDropColumn(g_hCoreDB, _T("event_policy"), _T("situation_instance")));
1484 CHK_EXEC(SetSchemaVersion(430));
1485 return TRUE;
1486 }
1487
1488 /**
1489 * Upgrade from V428 to V429
1490 */
1491 static BOOL H_UpgradeFromV428(int currVersion, int newVersion)
1492 {
1493 CHK_EXEC(DBResizeColumn(g_hCoreDB, _T("config"), _T("description"), 450, true));
1494 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between active network discovery polls.' WHERE var_name='ActiveDiscoveryInterval'")));
1495 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable active network discovery. This setting is change by Network Discovery GUI' WHERE var_name='ActiveNetworkDiscovery'")));
1496 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Timeout in milliseconds for commands sent to agent. If agent did not respond to command within given number of seconds, \ncommand considered as failed.' WHERE var_name='AgentCommandTimeout'")));
1497 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='String that will be used as a shared secret in case if agent will required authentication.' WHERE var_name='AgentDefaultSharedSecret'")));
1498 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Maximum wait time in seconds for agent restart after upgrade. If agent cannot be contacted after this time period, \nupgrade process is considered as failed.' WHERE var_name='AgentUpgradeWaitTime'")));
1499 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='A number of days the server keeps an alarm history in the database.' WHERE var_name='AlarmHistoryRetentionTime'")));
1500 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Maximum alarm count that will be displayed on Alarm Browser page. Alarms that exceed this count will not be shown.' WHERE var_name='AlarmListDisplayLimit'")));
1501 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='A semicolon separated list of alarm summary e-mail recipient addresses.' WHERE var_name='AlarmSummaryEmailRecipients'")));
1502 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Schedule for sending alarm summary e-mails in cron format' WHERE var_name='AlarmSummaryEmailSchedule'")));
1503 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Allow/disallow sending of SMS via NetXMS server using nxsms utility.' WHERE var_name='AllowDirectSMS'")));
1504 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='A bitmask for encryption algorithms allowed in the server(sum the values to allow multiple algorithms at once): \n\t*1 - AES256 \n\t*2 - Blowfish-256 \n\t*4 - IDEA \n\t*8 - 3DES\n\t*16 - AES128\n\t*32 - Blowfish-128' WHERE var_name='AllowedCiphers'")));
1505 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='AllowTrapVarbindsConversion'")));
1506 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='AnonymousFileAccess'")));
1507 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable applying all DCIs from a template to the node, including disabled ones.' WHERE var_name='ApplyDCIFromTemplateToDisabledDCI'")));
1508 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Retention time in days for the records in audit log. All records older than specified will be deleted by housekeeping process.' WHERE var_name='AuditLogRetentionTime'")));
1509 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Comma-separated list of hosts to be used as beacons for checking NetXMS server network connectivity. Either DNS names \nor IP addresses can be used. This list is pinged by NetXMS server and if none of the hosts have responded, server considers that connection \nwith network is lost and generates specific event.' WHERE var_name='BeaconHosts'")));
1510 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in milliseconds between beacon hosts polls.' WHERE var_name='BeaconPollingInterval'")));
1511 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Timeout in milliseconds to consider beacon host unreachable.' WHERE var_name='BeaconTimeout'")));
1512 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='BlockInactiveUserAccounts'")));
1513 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='CapabilityExpirationTime'")));
1514 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable case insensitive login names' WHERE var_name='CaseInsensitiveLoginNames'")));
1515 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable trusted nodes check' WHERE var_name='CheckTrustedNodes'")));
1516 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The server port for incoming client connections (such as management console).' WHERE var_name='ClientListenerPort'")));
1517 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable container auto binding for clusters.' WHERE var_name='ClusterContainerAutoBind'")));
1518 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable template auto apply for clusters.' WHERE var_name='ClusterTemplateAutoApply'")));
1519 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between polling (re-evaluating) of condition objects.' WHERE var_name='ConditionPollingInterval'")));
1520 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between configuration polls.' WHERE var_name='ConfigurationPollingInterval'")));
1521 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable data interpolation in dashboard data export.' WHERE var_name='DashboardDataExportEnableInterpolation'")));
1522 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='A number of connections to the database created on server startup.' WHERE var_name='DBConnectionPoolBaseSize'")));
1523 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='DBConnectionPoolCooldownTime'")));
1524 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='DBConnectionPoolMaxLifetime'")));
1525 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='A maximum number of connections in the connection pool.' WHERE var_name='DBConnectionPoolMaxSize'")));
1526 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='DBLockInfo'")));
1527 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='DBLockPID'")));
1528 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='DBLockStatus'")));
1529 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='DefaultAgentCacheMode'")));
1530 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Default date display format for GUI.' WHERE var_name='DefaultConsoleDateFormat'")));
1531 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Default short time display format for GUI.' WHERE var_name='DefaultConsoleShortTimeFormat'")));
1532 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Default long time display format for GUI.' WHERE var_name='DefaultConsoleTimeFormat'")));
1533 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Default polling interval for newly created DCI (in seconds).' WHERE var_name='DefaultDCIPollingInterval'")));
1534 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Default retention time for newly created DCI (in days).' WHERE var_name='DefaultDCIRetentionTime'")));
1535 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='Set the default encryption policy for communications with agents.' WHERE var_name='DefaultEncryptionPolicy'")));
1536 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='Default expected state for new interface objects.' WHERE var_name='DefaultInterfaceExpectedState'")));
1537 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='H',description='Default background color for new network map objects.' WHERE var_name='DefaultMapBackgroundColor'")));
1538 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Default mask for synthetic IPv4 subnets.' WHERE var_name='DefaultSubnetMaskIPv4'")));
1539 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Default mask for synthetic IPv6 subnets.' WHERE var_name='DefaultSubnetMaskIPv6'")));
1540 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable automatic alarm removal of an object when it is deleted' WHERE var_name='DeleteAlarmsOfDeletedObject'")));
1541 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable automatic deletion of subnet objects without any nodes within. When enabled, empty subnets will be deleted \nby housekeeping process.' WHERE var_name='DeleteEmptySubnets'")));
1542 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable automatic event removal of an object when it is deleted.' WHERE var_name='DeleteEventsOfDeletedObject'")));
1543 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Delete nodes which were unreachable for a number of days specified by this parameter.' WHERE var_name='DeleteUnreachableNodesPeriod'")));
1544 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='DiscoveryFilter'")));
1545 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='DiscoveryFilterFlags'")));
1546 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between passive network discovery polls.' WHERE var_name='DiscoveryPollingInterval'")));
1547 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableAdminInterface'")));
1548 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable agent self-registration' WHERE var_name='EnableAgentRegistration'")));
1549 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable audit log.' WHERE var_name='EnableAuditLog'")));
1550 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableCheckPointSNMP'")));
1551 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableReportingServer'")));
1552 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableEventStormDetection'")));
1553 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable Inter-Server Communications Listener.' WHERE var_name='EnableISCListener'")));
1554 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable server-side NXSL functions for container management (such as CreateContainer, RemoveContainer, BindObject, \nUnbindObject).' WHERE var_name='EnableNXSLContainerFunctions.'")));
1555 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableObjectTransactions'")));
1556 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable SNMP trap processing.' WHERE var_name='EnableSNMPTraps'")));
1557 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable alarm summary e-mails.' WHERE var_name='EnableAlarmSummaryEmails'")));
1558 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable receiving of syslog messages.' WHERE var_name='EnableSyslogReceiver'")));
1559 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EnableTimedAlarmAck'")));
1560 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable XMPP connector (required to enable XMPP message sending).' WHERE var_name='EnableXMPPConnector'")));
1561 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable zoning support' WHERE var_name='EnableZoning'")));
1562 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='EscapeLocalCommands'")));
1563 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The retention time of event logs' WHERE var_name='EventLogRetentionTime'")));
1564 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='EventStormDuration'")));
1565 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Event storm events per second' WHERE var_name='EventStormEventsPerSecond'")));
1566 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable extended access control in log queries.' WHERE var_name='ExtendedLogQueryAccessControl'")));
1567 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Syslog facility to be used in audit log records sent to external server.' WHERE var_name='ExternalAuditFacility'")));
1568 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='UDP port of external syslog server to send audit records to.' WHERE var_name='ExternalAuditPort'")));
1569 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='External syslog server to send audit records to. If set to ‘’none’‘, external audit logging is disabled.' WHERE var_name='ExternalAuditServer'")));
1570 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Syslog severity to be used in audit log records sent to external server.' WHERE var_name='ExternalAuditSeverity'")));
1571 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Syslog tag to be used in audit log records sent to external server.' WHERE var_name='ExternalAuditTag'")));
1572 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='FirstFreeObjectId'")));
1573 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='FixedStatusValue'")));
1574 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='HelpDeskLink'")));
1575 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Time when housekeeper starts. Housekeeper deletes old log lines, old DCI data, cleans removed objects and does VACUUM for \nPostgreSQL.' WHERE var_name='HousekeeperStartTime'")));
1576 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Size of ICMP packets (in bytes, excluding IP header size) used for status polls.' WHERE var_name='IcmpPingSize'")));
1577 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Timeout for ICMP ping used for status polls (in milliseconds).' WHERE var_name='IcmpPingTimeout'")));
1578 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Import configuration from local files on server startup.' WHERE var_name='ImportConfigurationOnStartup'")));
1579 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Instance polling interval (in milliseconds).' WHERE var_name='InstancePollingInterval'")));
1580 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable internal certificate authority.' WHERE var_name='InternalCA'")));
1581 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='IntruderLockoutThreshold'")));
1582 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='IntruderLockoutTime'")));
1583 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='JiraIssueType'")));
1584 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Jira login name.' WHERE var_name='JiraLogin'")));
1585 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Jira password' WHERE var_name='JiraPassword'")));
1586 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Jira project code' WHERE var_name='JiraProjectCode'")));
1587 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='JiraProjectComponent'")));
1588 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The URL of the Jira server' WHERE var_name='JiraServerURL'")));
1589 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='JobHistoryRetentionTime'")));
1590 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Maximum mumber of job execution retrys.' WHERE var_name='JobRetryCount'")));
1591 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between sending keep alive packets to connected clients.' WHERE var_name='KeepAliveInterval'")));
1592 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Specifies which object class represents group objects. If the found entry is not of user or group class, it will be ignored.' WHERE var_name='LdapGroupClass'")));
1593 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='LdapGroupUniqueId'")));
1594 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The LdapConnectionString configuration parameter may be a comma- or whitespace-separated list of URIs containing only the \nschema, the host, and the port fields. Format: schema://host:port.' WHERE var_name='LdapConnectionString'")));
1595 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The name of an attribute whose value will be used as a user`s description.' WHERE var_name='LdapMappingDescription'")));
1596 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The name of an attribute whose value will be used as a user`s full name.' WHERE var_name='LdapMappingFullName'")));
1597 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The name of an attribute whose value will be used as a user`s login name.' WHERE var_name='LdapMappingName'")));
1598 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The maximum amount of records that can be returned in one search page.' WHERE var_name='LdapPageSize'")));
1599 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The DN of the entry at which to start the search.' WHERE var_name='LdapSearchBase'")));
1600 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='A string representation of the filter to apply in the search.' WHERE var_name='LdapSearchFilter'")));
1601 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The synchronization interval (in minutes) between the NetXMS server and the LDAP server. If the parameter is set to 0, no \nsynchronization will take place.' WHERE var_name='LdapSyncInterval'")));
1602 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='User login for LDAP synchronization.' WHERE var_name='LdapSyncUser'")));
1603 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='User password for LDAP synchronization.' WHERE var_name='LdapSyncUserPassword'")));
1604 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The object class which represents user objects. If the found entry is not of user or group class, it will be ignored.' WHERE var_name='LdapUserClass'")));
1605 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='This parameter specifies what should be done while synchronizing with a deleted user/group from LDAP.' WHERE var_name='LdapUserDeleteAction'")));
1606 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='LdapUserUniqueId'")));
1607 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='LockTimeout'")));
1608 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Log all SNMP traps.' WHERE var_name='LogAllSNMPTraps'")));
1609 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Encoding for e-mails generated by NetXMS server.' WHERE var_name='MailEncoding'")));
1610 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Message to be shown when a user logs into the console.' WHERE var_name='MessageOfTheDay'")));
1611 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Default minimum password length for a NetXMS user. The default applied only if per-user setting is not defined.' WHERE var_name='MinPasswordLength'")));
1612 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='MinViewRefreshInterval'")));
1613 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='MobileDeviceListenerPort'")));
1614 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The number of threads used for data collection.' WHERE var_name='NumberOfDataCollectors'")));
1615 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The number of threads used to perform agent upgrades (i.e. maximum number of parallel upgrades).' WHERE var_name='NumberOfUpgradeThreads'")));
1616 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Time period in seconds within which received offline data still relevant for threshold validation.' WHERE var_name='OfflineDataRelevanceTime'")));
1617 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Set of flags to enforce password complexity.' WHERE var_name='PasswordComplexity'")));
1618 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Password expiration time in days. If set to 0, password expiration is disabled.' WHERE var_name='PasswordExpiration'")));
1619 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Number of previous passwords to keep. Users are not allowed to set password if it matches one from previous passwords list.' WHERE var_name='PasswordHistoryLength'")));
1620 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The number of consecutive unsuccessful polls required to declare interface as down.' WHERE var_name='PollCountForStatusChange'")));
1621 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The base thread pool size.' WHERE var_name='PollerThreadPoolBaseSize'")));
1622 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Maximum thread pool size.' WHERE var_name='PollerThreadPoolMaxSize'")));
1623 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='RADIUS authentication method to be used (PAP, CHAP, MS-CHAPv1, MS-CHAPv2).' WHERE var_name='RADIUSAuthMethod'")));
1624 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The number of retries for RADIUS authentication.' WHERE var_name='RADIUSNumRetries'")));
1625 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Port number used for connection to primary RADIUS server.' WHERE var_name='RADIUSPort'")));
1626 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Port number used for connection to secondary RADIUS server.' WHERE var_name='RADIUSSecondaryPort'")));
1627 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Shared secret used for communication with secondary RADIUS server.' WHERE var_name='RADIUSSecondarySecret'")));
1628 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Host name or IP address of secondary RADIUS server.' WHERE var_name='RADIUSSecondaryServer'")));
1629 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Shared secret used for communication with primary RADIUS server.' WHERE var_name='RADIUSSecret'")));
1630 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Host name or IP address of primary RADIUS server.' WHERE var_name='RADIUSServer'")));
1631 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Timeout in seconds for requests to RADIUS server.' WHERE var_name='RADIUSTimeout'")));
1632 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable reception of events forwarded by another NetXMS server. Please note that for external event reception ISC listener \nshould be enabled as well.' WHERE var_name='ReceiveForwardedEvents'")));
1633 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The hostname of the reporting server.' WHERE var_name='ReportingServerHostname'")));
1634 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The port of the reporting server.' WHERE var_name='ReportingServerPort'")));
1635 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Resolve DNS to IP on status poll.' WHERE var_name='ResolveDNSToIPOnStatusPoll'")));
1636 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='' WHERE var_name='ResolveNodeNames'")));
1637 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between reading routing table from node.' WHERE var_name='RoutingTableUpdateInterval'")));
1638 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable automatic network discovery process. *This setting is changed by Network Discovery in the GUI*.' WHERE var_name='RunNetworkDiscovery'")));
1639 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='H',description='Identification color for this server' WHERE var_name='ServerColor'")));
1640 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='ServerCommandOutputTimeout'")));
1641 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Name of this server' WHERE var_name='ServerName'")));
1642 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Mobile phone driver to be used for sending SMS.' WHERE var_name='SMSDriver'")));
1643 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='SMS driver parameters. For ‘’generic’’ driver, it should be the name of COM port device.' WHERE var_name='SMSDrvConfig'")));
1644 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The address used for sending mail from.' WHERE var_name='SMTPFromAddr'")));
1645 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The name used as the sender.' WHERE var_name='SMTPFromName'")));
1646 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Number of retries for sending mail.' WHERE var_name='SMTPRetryCount'")));
1647 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='TCP port for SMTP server.' WHERE var_name='SNMPPorts'")));
1648 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='An SMTP server used for sending mail.' WHERE var_name='SMTPServer'")));
1649 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Timeout in milliseconds for SNMP requests sent by NetXMS server.' WHERE var_name='SNMPRequestTimeout'")));
1650 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='The time how long SNMP trap logs are retained.' WHERE var_name='SNMPTrapLogRetentionTime'")));
1651 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Port used for SNMP traps.' WHERE var_name='SNMPTrapPort'")));
1652 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='StatusCalculationAlgorithm'")));
1653 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between status polls.' WHERE var_name='StatusPollingInterval'")));
1654 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='Algorithm for status propagation (how object’s status affects its child object statuses).' WHERE var_name='StatusPropagationAlgorithm'")));
1655 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='StatusShift'")));
1656 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='StatusSingleThreshold'")));
1657 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='StatusThresholds'")));
1658 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='' WHERE var_name='StatusTranslation'")));
1659 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable strict alarm status flow (alarm can be terminated only after it has been resolved).' WHERE var_name='StrictAlarmStatusFlow'")));
1660 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Interval in seconds between writing object changes to the database.' WHERE var_name='SyncInterval'")));
1661 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable synchronization of node names with DNS on each configuration poll.' WHERE var_name='SyncNodeNamesWithDNS'")));
1662 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Ignore timestamp received in syslog messages and always use server time.' WHERE var_name='SyslogIgnoreMessageTimestamp'")));
1663 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='UDP port used by built-in syslog server.' WHERE var_name='SyslogListenPort'")));
1664 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='Node matching policy for built-in syslog daemon.' WHERE var_name='SyslogNodeMatchingPolicy'")));
1665 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='Retention time in days for records in syslog. All records older than specified will be deleted by housekeeping process.' WHERE var_name='SyslogRetentionTime'")));
1666 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='System-wide interval in seconds for resending threshold violation events. Value of 0 disables event resending.' WHERE var_name='ThresholdRepeatInterval'")));
1667 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='The URL for the Tile server.' WHERE var_name='TileServerURL'")));
1668 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='TopologyDiscoveryRadius'")));
1669 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='' WHERE var_name='TopologyExpirationTime'")));
1670 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Search all zones to match trap/syslog source address to node.' WHERE var_name='TrapSourcesInAllZones'")));
1671 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable the use of DNS name instead of IP address as primary name for newly discovered nodes.' WHERE var_name='UseDNSNameForDiscoveredNodes'")));
1672 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable the use of fully qualified domain names as primary names for newly discovered nodes.' WHERE var_name='UseFQDNForNodeNames'")));
1673 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Enable/disable the use of SNMP ifXTable instead of ifTable for interface configuration polling.' WHERE var_name='UseIfXTable'")));
1674 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='C',description='Control usage of interface aliases (or descriptions).' WHERE var_name='UseInterfaceAliases'")));
1675 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='B',description='Use SNMP trap information for new node discovery.' WHERE var_name='UseSNMPTrapsForDiscovery'")));
1676 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Login name that will be used to authentication on XMPP server.' WHERE var_name='XMPPLogin'")));
1677 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='Password that will be used to authentication on XMPP server.' WHERE var_name='XMPPPassword'")));
1678 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='I',description='XMPP connection port.' WHERE var_name='XMPPPort'")));
1679 CHK_EXEC(SQLQuery(_T("UPDATE config SET data_type='S',description='XMPP connection server.' WHERE var_name='XMPPServer'")));
1680
1681 CHK_EXEC(CreateTable(
1682 _T("CREATE TABLE config_values (")
1683 _T("var_name varchar(63) not null,")
1684 _T("var_value varchar(15) not null,")
1685 _T("var_description varchar(255) null,")
1686 _T("PRIMARY KEY(var_name,var_value))")));
1687
1688 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('ClientListenerPort','65535')")));
1689 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('ExternalAuditPort','65535')")));
1690 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('MobileDeviceListenerPort','65535')")));
1691 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('RADIUSPort','65535')")));
1692 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('RADIUSSecondaryPort','65535')")));
1693 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('ReportingServerPort','65535')")));
1694 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('SNMPPorts','65535')")));
1695 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('SNMPTrapPort','65535')")));
1696 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('SyslogListenPort','65535')")));
1697 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('XMPPPort','65535')")));
1698 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value) VALUES ('AllowedCiphers','63')")));
1699 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultInterfaceExpectedState','0','UP')")));
1700 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultInterfaceExpectedState','1','DOWN')")));
1701 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultInterfaceExpectedState','2','IGNORE')")));
1702 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultEncryptionPolicy','0','Disabled')")));
1703 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultEncryptionPolicy','1','Allowed')")));
1704 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultEncryptionPolicy','2','Preferred')")));
1705 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('DefaultEncryptionPolicy','3','Required')")));
1706 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('StatusPropagationAlgorithm','0','Default')")));
1707 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('StatusPropagationAlgorithm','1','Unchanged')")));
1708 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('StatusPropagationAlgorithm','2','Fixed')")));
1709 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('StatusPropagationAlgorithm','3','Relative')")));
1710 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('StatusPropagationAlgorithm','4','Translated')")));
1711 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('UseInterfaceAliases','0','Don`t use aliases')")));
1712 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('UseInterfaceAliases','1','Use aliases when possible')")));
1713 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('UseInterfaceAliases','2','Concatenate alias and name')")));
1714 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('UseInterfaceAliases','3','Concatenate name and alias')")));
1715 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('SyslogNodeMatchingPolicy','0','IP, then hostname')")));
1716 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('SyslogNodeMatchingPolicy','1','Hostname, then IP')")));
1717 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('LdapUserDeleteAction','0','Delete user')")));
1718 CHK_EXEC(SQLQuery(_T("INSERT INTO config_values (var_name,var_value,var_description) VALUES ('LdapUserDeleteAction','1','Disable user')")));
1719
1720 CHK_EXEC(SetSchemaVersion(429));
1721 return TRUE;
1722 }
1723
1724 /**
1725 * Upgrade from V427 to V428
1726 */
1727 static BOOL H_UpgradeFromV427(int currVersion, int newVersion)
1728 {
1729 CHK_EXEC(CreateConfigParam(_T("ClusterContainerAutoBind"), _T("0"), _T("Enable/disable container auto binding for clusters"), 'B', true, false, false, false));
1730 CHK_EXEC(CreateConfigParam(_T("ClusterTemplateAutoApply"), _T("0"), _T("Enable/disable template auto apply for clusters"), 'B', true, false, false, false));
1731 CHK_EXEC(SetSchemaVersion(428));
1732 return TRUE;
1733 }
1734
1735 /**
1736 * Upgrade from V426 to V427
1737 */
1738 static BOOL H_UpgradeFromV426(int currVersion, int newVersion)
1739 {
1740 CHK_EXEC(SQLQuery(_T("ALTER TABLE nodes ADD port_rows integer")));
1741 CHK_EXEC(SQLQuery(_T("ALTER TABLE nodes ADD port_numbering_scheme integer")));
1742 CHK_EXEC(SetSchemaVersion(427));
1743 return TRUE;
1744 }
1745
1746 /**
1747 * Upgrade from V425 to V426
1748 */
1749 static BOOL H_UpgradeFromV425(int currVersion, int newVersion)
1750 {
1751 CHK_EXEC(CreateConfigParam(_T("EnableAlarmSummaryEmails"), _T(""), _T("Enable alarm summary e-mails"), 'I', true, false, false, false));
1752 CHK_EXEC(CreateConfigParam(_T("AlarmSummaryEmailSchedule"), _T(""), _T("Schedule for sending alarm summary e-mails in cron format"), 'S', true, false, false, false));
1753 CHK_EXEC(CreateConfigParam(_T("AlarmSummaryEmailRecipients"), _T(""), _T("A semicolon separated list of alarm summary e-mail recipient addresses"), 'S', true, false, false, false));
1754 CHK_EXEC(SetSchemaVersion(426));
1755 return TRUE;
1756 }
1757
1758 /**
1759 * Upgrade from V424 to V425
1760 */
1761 static BOOL H_UpgradeFromV424(int currVersion, int newVersion)
1762 {
1763 CHK_EXEC(SQLQuery(_T("ALTER TABLE scheduled_tasks ADD comments varchar(255)")));
1764 CHK_EXEC(SetSchemaVersion(425));
1765 return TRUE;
1766 }
1767
1768 /**
1769 * Upgrade from V423 to V424
1770 */
1771 static BOOL H_UpgradeFromV423(int currVersion, int newVersion)
1772 {
1773 CHK_EXEC(CreateConfigParam(_T("MessageOfTheDay"), _T(""), _T("Message to be shown when a user logs into the console"), 'S', true, false, false, false));
1774 CHK_EXEC(SetSchemaVersion(424));
1775 return TRUE;
1776 }
1777
1778 /**
1779 * Upgrade from V422 to V423
1780 */
1781 static BOOL H_UpgradeFromV422(int currVersion, int newVersion)
1782 {
1783 CHK_EXEC(CreateConfigParam(_T("RADIUSAuthMethod"), _T("PAP"), _T("RADIUS authentication method to be used (PAP, CHAP, MS-CHAPv1, MS-CHAPv2)"), 'S', true, false, false, false));
1784 CHK_EXEC(SetSchemaVersion(423));
1785 return TRUE;
1786 }
1787
1788 /**
1789 * Upgrade from V421 to V422
1790 */
1791 static BOOL H_UpgradeFromV421(int currVersion, int newVersion)
1792 {
1793 CHK_EXEC(CreateConfigParam(_T("ServerColor"), _T(""), _T("Identification color for this server"), 'S', true, false, false, false));
1794 CHK_EXEC(CreateConfigParam(_T("ServerName"), _T(""), _T("Name of this server"), 'S', true, false, false, false));
1795 CHK_EXEC(SetSchemaVersion(422));
1796 return TRUE;
1797 }
1798
1799 /**
1800 * Upgrade from V420 to V421
1801 */
1802 static BOOL H_UpgradeFromV420(int currVersion, int newVersion)
1803 {
1804 DB_RESULT hResult = SQLSelect(_T("SELECT access_rights,user_id,object_id FROM acl"));
1805 if (hResult != NULL)
1806 {
1807 UINT32 rights;
1808 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("UPDATE acl SET access_rights=? WHERE user_id=? AND object_id=?"));
1809 if (hStmt != NULL)
1810 {
1811 for(int i = 0; i < DBGetNumRows(hResult); i++)
1812 {
1813 rights = DBGetFieldULong(hResult, i, 0);
1814 if ((rights & 0x2) == 0x2)
1815 {
1816 rights = rights | 0x8000; // Add Manage maintenance access right to all users which have Modify object access right
1817 DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, rights);
1818 DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 1));
1819 DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 2));
1820 SQLExecute(hStmt);
1821 }
1822 }
1823 DBFreeStatement(hStmt);
1824 }
1825 else
1826 {
1827 if (!g_bIgnoreErrors)
1828 {
1829 DBFreeResult(hResult);
1830 return FALSE;
1831 }
1832 }
1833 DBFreeResult(hResult);
1834 }
1835 else
1836 {
1837 if (!g_bIgnoreErrors)
1838 return FALSE;
1839 }
1840
1841 CHK_EXEC(SetSchemaVersion(421));
1842 return TRUE;
1843 }
1844
1845 /**
1846 * Upgrade from V419 to V420
1847 */
1848 static BOOL H_UpgradeFromV419(int currVersion, int newVersion)
1849 {
1850 CHK_EXEC(CreateConfigParam(_T("EnableReportingServer"), _T("0"), 1, 1));
1851 CHK_EXEC(CreateConfigParam(_T("ReportingServerHostname"), _T("localhost"), 1, 1));
1852 CHK_EXEC(CreateConfigParam(_T("ReportingServerPort"), _T("4710"), 1, 1));
1853 CHK_EXEC(SetSchemaVersion(420));
1854 return TRUE;
1855 }
1856
1857 /**
1858 * Upgrade from V418 to V419
1859 */
1860 static BOOL H_UpgradeFromV418(int currVersion, int newVersion)
1861 {
1862 CHK_EXEC(SQLQuery(_T("ALTER TABLE items ADD npe_name varchar(15)")));
1863 CHK_EXEC(SetSchemaVersion(419));
1864 return TRUE;
1865 }
1866
1867 /**
1868 * Upgrade from V417 to V418
1869 */
1870 static BOOL H_UpgradeFromV417(int currVersion, int newVersion)
1871 {
1872 // Update in object tools objectToolFilter objectMenuFilter
1873 // move object tool flags to filter structure
1874 DB_RESULT hResult = SQLSelect(_T("SELECT tool_id,flags,tool_filter FROM object_tools"));
1875 if (hResult != NULL)
1876 {
1877 int count = DBGetNumRows(hResult);
1878 for(int i = 0; i < count; i++)
1879 {
1880 int filteringFlag = 0;
1881 int objectToolFlag = DBGetFieldLong(hResult, i, 1);
1882
1883 // Separate and reorder flags for filter and for object tools
1884 for(int j = 1; j < 5; j = j << 1) //REQUIRES_SNMP 0x01, REQUIRES_AGENT 0x02, REQUIRES_OID_MATCH 0x04
1885 {
1886 if ((objectToolFlag & j) != 0)
1887 {
1888 objectToolFlag = objectToolFlag & ~j;
1889 filteringFlag = filteringFlag | j;
1890 }
1891 }
1892
1893 if ((objectToolFlag & 0x08) != 0) //ASK_CONFIRMATION
1894 {
1895 objectToolFlag = objectToolFlag & ~0x08;
1896 objectToolFlag = objectToolFlag | 0x01;
1897 }
1898
1899 if ((objectToolFlag & 0x10) != 0) //GENERATES_OUTPUT
1900 {
1901 objectToolFlag = objectToolFlag & ~0x10;
1902 objectToolFlag = objectToolFlag | 0x02;
1903 }
1904
1905 if ((objectToolFlag & 0x20) != 0) //DISABLED
1906 {
1907 objectToolFlag = objectToolFlag & ~0x20;
1908 objectToolFlag = objectToolFlag | 0x04;
1909 }
1910
1911 if ((objectToolFlag & 0x40) != 0) //SHOW_IN_COMMANDS
1912 {
1913 objectToolFlag = objectToolFlag & ~0x40;
1914 objectToolFlag = objectToolFlag | 0x08;
1915 }
1916
1917 if ((objectToolFlag & 0x80) != 0) //REQUIRES_NODE_OS_MATCH
1918 {
1919 objectToolFlag = objectToolFlag & ~0x80;
1920 filteringFlag = filteringFlag | 0x08;
1921 }
1922
1923 if ((objectToolFlag & 0x100) != 0) //REQUIRES_TEMPLATE_MATCH
1924 {
1925 objectToolFlag = objectToolFlag & ~0x100;
1926 filteringFlag = filteringFlag | 0x10;
1927 }
1928
1929 if ((objectToolFlag & 0x10000) != 0) //SNMP_INDEXED_BY_VALUE
1930 {
1931 objectToolFlag = objectToolFlag & ~0x10000;
1932 objectToolFlag = objectToolFlag | 0x10;
1933 }
1934
1935 if ((objectToolFlag & 0x20000) != 0) //REQUIRES_WORKSTATION_OS_MATCH
1936 {
1937 objectToolFlag = objectToolFlag & ~0x20000;
1938 filteringFlag = filteringFlag | 0x20;
1939 }
1940
1941 // Add filter flags to XML
1942 TCHAR *xml = DBGetField(hResult, i, 2, NULL, 0);
1943 size_t len = (xml != NULL) ? _tcslen(xml) + 1024 : 1024;
1944 TCHAR *tmp = (TCHAR *)malloc(len * sizeof(TCHAR));
1945 TCHAR *ptr = (xml != NULL) ? _tcsrchr(xml, '<') : NULL;
1946 if (ptr != NULL)
1947 {
1948 *ptr = 0;
1949 _sntprintf(tmp, len, _T("%s<flags>%d</flags></objectMenuFilter>"), xml, filteringFlag);
1950 _tcsncpy(tmp, _T("<objectMenuFilter"), 17); //Change main tag name
1951 }
1952 else
1953 {
1954 _sntprintf(tmp, len, _T("<objectMenuFilter><flags>%d</flags></objectMenuFilter>"), filteringFlag);
1955 }
1956
1957 DB_STATEMENT hStmt = DBPrepare(g_hCoreDB, _T("UPDATE object_tools SET flags=?,tool_filter=? WHERE tool_id=?"));
1958 if (hStmt != NULL)
1959 {
1960 DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, objectToolFlag);
1961 DBBind(hStmt, 2, DB_SQLTYPE_TEXT, tmp, DB_BIND_DYNAMIC);
1962 DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, DBGetFieldULong(hResult, i, 0));
1963 if (!SQLExecute(hStmt))
1964 {
1965 if (!g_bIgnoreErrors)
1966 {
1967 free(xml);
1968 DBFreeStatement(hStmt);
1969 DBFreeResult(hResult);
1970 return FALSE;
1971 }
1972 }
1973 }
1974 else
1975 {
1976 free(tmp);
1977 if (!g_bIgnoreErrors)
1978 {
1979 free(xml);
1980 DBFreeResult(hResult);
1981 return FALSE;
1982 }
1983 }
1984 free(xml);
1985 }
1986 DBFreeResult(hResult);
1987 }
1988 else
1989 {
1990 if (!g_bIgnoreErrors)
1991 return false;
1992 }
1993
1994 CHK_EXEC(SetSchemaVersion(418));
1995 return TRUE;
1996 }
1997
1998 /**
1999 * Upgrade from V416 to V417
2000 */
2001 static BOOL H_UpgradeFromV416(int currVersion, int newVersion)
2002 {
2003 CHK_EXEC(CreateConfigParam(_T("JiraIssueType"), _T("Task"), true, false));
2004 CHK_EXEC(CreateConfigParam(_T("JiraLogin"), _T("netxms"), true, true));
2005 CHK_EXEC(CreateConfigParam(_T("JiraPassword"), _T(""), true, true));
2006 CHK_EXEC(CreateConfigParam(_T("JiraProjectCode"), _T("NETXMS"), true, false));
2007 CHK_EXEC(CreateConfigParam(_T("JiraProjectComponent"), _T(""), true, false));
2008 CHK_EXEC(CreateConfigParam(_T("JiraServerURL"), _T("http://localhost"), true, true));
2009
2010 CHK_EXEC(SetSchemaVersion(417));
2011 return TRUE;
2012 }
2013
2014 /**
2015 * Upgrade from V415 to V416
2016 */
2017 static BOOL H_UpgradeFromV415(int currVersion, int newVersion)
2018 {
2019 CHK_EXEC(CreateTable(
2020 _T("CREATE TABLE alarm_categories (")
2021 _T("id integer not null,")
2022 _T("name varchar(63) null,")
2023 _T("descr varchar(255) null,")
2024 _T("PRIMARY KEY(id))")));
2025 CHK_EXEC(CreateTable(
2026 _T("CREATE TABLE alarm_category_acl (")
2027 _T("category_id integer not null,")
2028 _T("user_id integer not null,")
2029 _T("PRIMARY KEY(category_id,user_id))")));
2030 CHK_EXEC(CreateTable(
2031 _T("CREATE TABLE alarm_category_map (")
2032 _T("alarm_id integer not null,")
2033 _T("category_id integer not null,")
2034 _T("PRIMARY KEY(alarm_id,category_id))")));
2035
2036 CHK_EXEC(SQLQuery(
2037 _T("ALTER TABLE alarms ADD alarm_category_ids varchar(255)")));
2038
2039 // Add view all alarms system access to user group - Everyone
2040 DB_RESULT hResult = SQLSelect(_T("SELECT system_access FROM user_groups WHERE name='Everyone'"));
2041 if (hResult != NULL)
2042 {
2043 UINT64 sysAccess = DBGetFieldUInt64(hResult, 0, 0);
2044 sysAccess = sysAccess | SYSTEM_ACCESS_VIEW_ALL_ALARMS;
2045
2046 TCHAR query[MAX_DB_STRING];
2047 _sntprintf(query, MAX_DB_STRING, _T("UPDATE user_groups SET system_access=%ld WHERE name='Everyone'"), sysAccess);
2048 CHK_EXEC(SQLQuery(query));
2049
2050 DBFreeResult(hResult);
2051 }
2052 else
2053 {
2054 if (!g_bIgnoreErrors)
2055 return false;
2056 }
2057
2058 CHK_EXEC(SetSchemaVersion(416));
2059 return TRUE;
2060 }
2061
2062 /**
2063 * Upgrade from V414 to V415
2064 */
2065 static BOOL H_UpgradeFromV414(int currVersion, int newVersion)
2066 {
2067 CHK_EXEC(DBRemoveNotNullConstraint(g_hCoreDB, _T("dci_summary_tables"), _T("menu_path")));
2068 CHK_EXEC(SetSchemaVersion(415));
2069 return TRUE;
2070 }
2071
2072 /**
2073 * Upgrade from V413 to V414
2074 */
2075 static BOOL H_UpgradeFromV413(int currVersion, int newVersion)
2076 {
2077 CHK_EXEC(SQLQuery(_T("UPDATE config SET var_name='EnableSyslogReceiver' WHERE var_name='EnableSyslogDaemon'")));
2078 CHK_EXEC(SetSchemaVersion(414));
2079 return TRUE;
2080 }
2081
2082 /**
2083 * Upgrade from V412 to V413
2084 */
2085 static BOOL H_UpgradeFromV412(int currVersion, int newVersion)
2086 {
2087 CHK_EXEC(SQLQuery(_T("UPDATE users SET name='system',description='Built-in system account',full_name='',flags=12 WHERE id=0")));
2088
2089 TCHAR password[128];
2090 DB_RESULT hResult = SQLSelect(_T("SELECT password FROM users WHERE id=0"));
2091 if (hResult != NULL)
2092 {
2093 if (DBGetNumRows(hResult) > 0)
2094 DBGetField(hResult, 0, 0, password, 128);
2095 else
2096 _tcscpy(password, _T("3A445C0072CD69D9030CC6644020E5C4576051B1")); // Use default password "netxms"
2097 DBFreeResult(hResult);
2098 }
2099 else
2100 {
2101 if (!g_bIgnoreErrors)
2102 return false;
2103 }
2104
2105 UINT32 userId = 1;
2106 hResult = SQLSelect(_T("SELECT max(id) FROM users"));
2107 if (hResult != NULL)
2108 {
2109 if (DBGetNumRows(hResult) > 0)
2110 userId = DBGetFieldULong(hResult, 0, 0) + 1;
2111 DBFreeResult(hResult);
2112 }
2113 else
2114 {
2115 if (!g_bIgnoreErrors)
2116 return false;
2117 }
2118
2119 uuid guid = uuid::generate();
2120 TCHAR query[1024];
2121 _sntprintf(query, 1024,
2122 _T("INSERT INTO users (id,name,password,system_access,flags,full_name,")
2123 _T(" description,grace_logins,auth_method,guid,")
2124 _T(" cert_mapping_method,cert_mapping_data,")
2125 _T(" auth_failures,last_passwd_change,min_passwd_length,")
2126 _T(" disabled_until,last_login) VALUES (%d,'admin','%s',274877906943,0,")
2127 _T(" '','Default administrator account',5,0,'%s',0,'',0,0,0,0,0)"),
2128 userId, password, (const TCHAR *)guid.toString());
2129 CHK_EXEC(SQLQuery(query));
2130
2131 for(int i = 1; i < 10; i++)
2132 {
2133 _sntprintf(query, 256, _T("INSERT INTO acl (object_id,user_id,access_rights) VALUES (%d,%d,32767)"), i, userId);
2134 CHK_EXEC(SQLQuery(query));
2135 }
2136
2137 //Add adming to Admin group if exists
2138 UINT32 groupId = 0;
2139 hResult = SQLSelect(_T("SELECT id FROM user_groups WHERE name='Admins'"));
2140 if (hResult != NULL)
2141 {
2142 if (DBGetNumRows(hResult) > 0)
2143 groupId = DBGetFieldULong(hResult, 0, 0);
2144 DBFreeResult(hResult);
2145 }
2146 else
2147 {
2148 if (!g_bIgnoreErrors)
2149 return false;
2150 }
2151 if(groupId != 0)
2152 {
2153 _sntprintf(query, 256, _T("INSERT INTO user_group_members (group_id,user_id) VALUES (%d,%d)"), groupId, userId);
2154 CHK_EXEC(SQLQuery(query));
2155 }
2156
2157 //Update non object ACL
2158 _sntprintf(query, 256, _T("UPDATE object_tools_acl SET user_id=%d WHERE user_id=0"), userId);
2159 CHK_EXEC(SQLQuery(query));
2160
2161 _sntprintf(query, 256, _T("UPDATE graph_acl SET user_id=%d WHERE user_id=0"), userId);
2162 CHK_EXEC(SQLQuery(query));
2163
2164 _sntprintf(query, 256, _T("UPDATE graphs SET owner_id=%d WHERE owner_id=0"), userId);
2165 CHK_EXEC(SQLQuery(query));
2166
2167
2168 CHK_EXEC(SetSchemaVersion(413));
2169 return TRUE;
2170 }
2171
2172 /**
2173 * Upgrade from V411 to V412
2174 */
2175 static BOOL H_UpgradeFromV411(int currVersion, int newVersion)
2176 {
2177 DB_RESULT hResult = SQLSelect(_T("SELECT id,zone_guid,agent_proxy,snmp_proxy,icmp_proxy,ssh_proxy FROM zones"));
2178 if (hResult != NULL)
2179 {
2180 CHK_EXEC(SQLQuery(_T("DROP TABLE zones")));
2181 CHK_EXEC(CreateTable(
2182 _T("CREATE TABLE zones (")
2183 _T("id integer not null,")
2184 _T("zone_guid integer not null,")
2185 _T("proxy_node integer not null,")
2186 _T("PRIMARY KEY(id))")));
2187 int count = DBGetNumRows(hResult);
2188 if (count > 0)
2189 {
2190 TCHAR query[256];
2191 for(int i = 0; i < count; i++)
2192 {
2193 UINT32 proxy = 0;
2194 for(int j = 2; (j < 6) && (proxy == 0); j++)
2195 proxy = DBGetFieldULong(hResult, i, j);
2196 _sntprintf(query, 256, _T("INSERT INTO zones (id,zone_guid,proxy_node) VALUES (%d,%d,%d)"),
2197 DBGetFieldLong(hResult, i, 0), DBGetFieldLong(hResult, i, 1), (int)proxy);
2198 CHK_EXEC(SQLQuery(query));
2199 }
2200 }
2201 DBFreeResult(hResult);
2202 }
2203 else
2204 {
2205 if (!g_bIgnoreErrors)
2206 return false;
2207 }
2208 CHK_EXEC(SetSchemaVersion(412));
2209 return TRUE;
2210 }
2211
2212 /**
2213 * Upgrade from V410 to V411
2214 */
2215 static BOOL H_UpgradeFromV410(int currVersion, int newVersion)
2216 {
2217 //check if tdata upgrade was already done, then just delete "TdataTableUpdated" metadata parameter
2218 if (!MetaDataReadInt(_T("TdataTableUpdated"), 0))
2219 {
2220 StringMap savedMetadata;
2221 DB_RESULT hResult = SQLSelect(_T("SELECT var_name,var_value FROM metadata WHERE var_name LIKE 'TDataTableCreationCommand_%' OR var_name LIKE 'TDataIndexCreationCommand_%'"));
2222 if (hResult != NULL)
2223 {
2224 int count = DBGetNumRows(hResult);
2225 for(int i = 0; i < count; i++)
2226 {
2227 savedMetadata.setPreallocated(DBGetField(hResult, i, 0, NULL, 0), DBGetField(hResult, i, 1, NULL, 0));
2228 }
2229 DBFreeResult(hResult);
2230 }
2231 else if (!g_bIgnoreErrors)
2232 {
2233 return false;
2234 }
2235
2236 static const TCHAR *batch =
2237 _T("DELETE FROM metadata WHERE var_name LIKE 'TDataTableCreationCommand_%' OR var_name LIKE 'TDataIndexCreationCommand_%'\n")
2238 _T("INSERT INTO metadata (var_name,var_value) VALUES ('TDataTableCreationCommand_0','CREATE TABLE tdata_%d (item_id integer not null,tdata_timestamp integer not null,tdata_value $SQL:TEXT null)')\n")
2239 _T("<END>");
2240 CHK_EXEC(SQLBatch(batch));
2241
2242 if (g_dbSyntax == DB_SYNTAX_MSSQL)
2243 CHK_EXEC(SQLQuery(_T("INSERT INTO metadata (var_name,var_value) VALUES ('TDataIndexCreationCommand_0','CREATE CLUSTERED INDEX idx_tdata_%d ON tdata_%d(item_id,tdata_timestamp)')")));
2244 else
2245 CHK_EXEC(SQLQuery(_T("INSERT INTO metadata (var_name,var_value) VALUES ('TDataIndexCreationCommand_0','CREATE INDEX idx_tdata_%d ON tdata_%d(item_id,tdata_timestamp)')")));
2246
2247 // table conversion will require multiple commits
2248 DBCommit(g_hCoreDB);
2249 if (!ConvertTDataTables())
2250 {
2251 if (!g_bIgnoreErrors)
2252 {
2253 // Restore metadata
2254 SQLQuery(_T("DELETE FROM metadata WHERE var_name LIKE 'TDataTableCreationCommand_%' OR var_name LIKE 'TDataIndexCreationCommand_%'"));
2255 StringList *keys = savedMetadata.keys();
2256 for(int i = 0; i < keys->size(); i++)
2257 {
2258 TCHAR query[4096];
2259 _sntprintf(query, 4096, _T("INSERT INTO metadata (var_name,var_value) VALUES (%s,%s)"),
2260 (const TCHAR *)DBPrepareString(g_hCoreDB, keys->get(i)),
2261 (const TCHAR *)DBPrepareString(g_hCoreDB, savedMetadata.get(keys->get(i))));
2262 SQLQuery(query);
2263 }
2264 return false;
2265 }
2266 }
2267
2268 DBBegin(g_hCoreDB);
2269 }
2270 else
2271 {
2272 CHK_EXEC(SQLQuery(_T("DELETE FROM metadata WHERE var_name='TdataTableUpdated'")));
2273 }
2274 CHK_EXEC(SetSchemaVersion(411));
2275 return TRUE;
2276 }
2277
2278 /**
2279 * Upgrade from V409 to V410
2280 */
2281 static BOOL H_UpgradeFromV409(int currVersion, int newVersion)
2282 {
2283 static const TCHAR *batch =
2284 _T("ALTER TABLE zones ADD ssh_proxy integer\n")
2285 _T("UPDATE zones SET ssh_proxy=0\n")
2286 _T("ALTER TABLE nodes ADD ssh_login varchar(63)\n")
2287 _T("ALTER TABLE nodes ADD ssh_password varchar(63)\n")
2288 _T("ALTER TABLE nodes ADD ssh_proxy integer\n")
2289 _T("UPDATE nodes SET ssh_proxy=0\n")
2290 _T("<END>");
2291 CHK_EXEC(SQLBatch(batch));
2292
2293 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("nodes"), _T("ssh_proxy")));
2294 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("zones"), _T("ssh_proxy")));
2295
2296 CHK_EXEC(SetSchemaVersion(410));
2297 return TRUE;
2298 }
2299
2300 /**
2301 * Upgrade from V408 to V409
2302 */
2303 static BOOL H_UpgradeFromV408(int currVersion, int newVersion)
2304 {
2305 static const TCHAR *batch =
2306 _T("ALTER TABLE nodes ADD node_type integer\n")
2307 _T("ALTER TABLE nodes ADD node_subtype varchar(127)\n")
2308 _T("UPDATE nodes SET node_type=0\n")
2309 _T("<END>");
2310 CHK_EXEC(SQLBatch(batch));
2311
2312 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("nodes"), _T("node_type")));
2313
2314 CHK_EXEC(SetSchemaVersion(409));
2315 return TRUE;
2316 }
2317
2318 /**
2319 * Upgrade from V407 to V408
2320 */
2321 static BOOL H_UpgradeFromV407(int currVersion, int newVersion)
2322 {
2323 CHK_EXEC(CreateTable(
2324 _T("CREATE TABLE chassis (")
2325 _T(" id integer not null,")
2326 _T(" flags integer not null,")
2327 _T(" controller_id integer not null,")
2328 _T(" rack_id integer not null,")
2329 _T(" rack_image varchar(36) null,")
2330 _T(" rack_position integer not null,")
2331 _T(" rack_height integer not null,")
2332 _T(" PRIMARY KEY(id))")
2333 ));
2334
2335 static const TCHAR *batch =
2336 _T("ALTER TABLE nodes ADD chassis_id integer\n")
2337 _T("UPDATE nodes SET chassis_id=0\n")
2338 _T("<END>");
2339 CHK_EXEC(SQLBatch(batch));
2340
2341 CHK_EXEC(DBSetNotNullConstraint(g_hCoreDB, _T("nodes"), _T("chassis_id")));
2342
2343 CHK_EXEC(SetSchemaVersion(408));
2344 return TRUE;
2345 }
2346
2347 /**
2348 * Upgrade from V406 to V407
2349 */
2350 static BOOL H_UpgradeFromV406(int currVersion, int newVersion)
2351 {
2352 DBResizeColumn(g_hCoreDB, _T("user_groups"), _T("ldap_unique_id"), 64, true);
2353 CHK_EXEC(SetSchemaVersion(407));
2354 return TRUE;
2355 }
2356
2357 /**
2358 * Upgrade from V405 to V406
2359 */
2360 static BOOL H_UpgradeFromV405(int currVersion, int newVersion)
2361 {
2362 static const TCHAR *batch =
2363 _T("ALTER TABLE nodes ADD syslog_msg_count $SQL:INT64\n")
2364 _T("ALTER TABLE nodes ADD snmp_trap_count $SQL:INT64\n")
2365 _T("UPDATE nodes SET syslog_msg_count=0,snmp_trap_count=0\n")
2366 _T("<END>");
2367 CHK_EXEC(SQLBatch(batch));
2368 CHK_EXEC(SetSchemaVersion(406));
2369 return TRUE;
2370 }
2371
2372 /**
2373 * Upgrade from V404 to V405
2374 */
2375 static BOOL H_UpgradeFromV404(int currVersion, int newVersion)
2376 {
2377 CHK_EXEC(CreateEventTemplate(EVENT_AGENT_LOG_PROBLEM, _T("SYS_AGENT_LOG_PROBLEM"),
2378 SEVERITY_MAJOR, EF_LOG, _T("262057ca-357a-4a4d-9b78-42ae96e490a1"),
2379 _T("Problem with agent log: %2"),
2380 _T("Generated on status poll if agent reports problem with log file.\r\n")
2381 _T("Parameters:\r\n")
2382 _T(" 1) Status code\r\n")
2383 _T(" 2) Description")));
2384 CHK_EXEC(CreateEventTemplate(EVENT_AGENT_LOCAL_DATABASE_PROBLEM, _T("SYS_AGENT_LOCAL_DATABASE_PROBLEM"),
2385 SEVERITY_MAJOR, EF_LOG, _T("d02b63f1-1151-429e-adb9-1dfbb3a31b32"),
2386 _T("Problem with agent local database: %2"),
2387 _T("Generated on status poll if agent reports local database problem.\r\n")
2388 _T("Parameters:\r\n")
2389 _T(" 1) Status code\r\n")
2390 _T(" 2) Description")));
2391
2392 int ruleId = NextFreeEPPruleID();
2393 TCHAR query[1024];
2394 _sntprintf(query, 1024, _T("INSERT INTO event_policy (rule_id,rule_guid,flags,comments,alarm_message,alarm_severity,alarm_key,script,alarm_timeout,alarm_timeout_event,situation_id,situation_instance) ")
2395 _T("VALUES (%d,'19bd89ba-8bb2-4915-8546-a1ecc650dedd',7944,'Generate an alarm when there is problem with agent log','%%m',5,'SYS_AGENT_LOG_PROBLEM_%%i','',0,%d,0,'')"),
2396 ruleId, EVENT_ALARM_TIMEOUT);
2397 CHK_EXEC(SQLQuery(query));
2398 _sntprintf(query, 1024, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_AGENT_LOG_PROBLEM);
2399 CHK_EXEC(SQLQuery(query));
2400
2401 ruleId = NextFreeEPPruleID();
2402 _sntprintf(query, 1024, _T("INSERT INTO event_policy (rule_id,rule_guid,flags,comments,alarm_message,alarm_severity,alarm_key,script,alarm_timeout,alarm_timeout_event,situation_id,situation_instance) ")
2403 _T("VALUES (%d,'cff7fe6b-2ad1-4c18-8a8f-4d397d44fe04',7944,'Generate an alarm when there is problem with agent local database','%%m',5,'SYS_AGENT_LOCAL_DATABASE_PROBLEM_%%i','',0,%d,0,'')"),
2404 ruleId, EVENT_ALARM_TIMEOUT);
2405 CHK_EXEC(SQLQuery(query));
2406 _sntprintf(query, 1024, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_AGENT_LOCAL_DATABASE_PROBLEM);
2407 CHK_EXEC(SQLQuery(query));
2408
2409 CHK_EXEC(SetSchemaVersion(405));
2410 return TRUE;
2411 }
2412
2413 /**
2414 * Upgrade from V403 to V404
2415 */
2416 static BOOL H_UpgradeFromV403(int currVersion, int newVersion)
2417 {
2418 CHK_EXEC(CreateConfigParam(_T("SyslogIgnoreMessageTimestamp"), _T("0"),
2419 _T("Ignore timestamp received in syslog messages and always use server time"),
2420 'B', true, false, false, false));
2421 CHK_EXEC(SetSchemaVersion(404));
2422 return TRUE;
2423 }
2424
2425 /**
2426 * Upgrade from V402 to V403
2427 */
2428 static BOOL H_UpgradeFromV402(int currVersion, int newVersion)
2429 {
2430 CHK_EXEC(SQLQuery(_T("DROP TABLE policy_time_range_list")));
2431 CHK_EXEC(SQLQuery(_T("DROP TABLE time_ranges")));
2432 CHK_EXEC(SetSchemaVersion(403));
2433 return TRUE;
2434 }
2435
2436 /**
2437 * Upgrade from V401 to V402
2438 */
2439 static BOOL H_UpgradeFromV401(int currVersion, int newVersion)
2440 {
2441 CHK_EXEC(SQLQuery(_T("CREATE INDEX idx_event_log_source ON event_log(event_source)")));
2442 CHK_EXEC(SetSchemaVersion(402));
2443 return TRUE;
2444 }
2445
2446 /**
2447 * Upgrade from V400 to V401
2448 */
2449 static BOOL H_UpgradeFromV400(int currVersion, int newVersion)
2450 {
2451 CHK_EXEC(CreateEventTemplate(EVENT_LDAP_SYNC_ERROR, _T("SYS_LDAP_SYNC_ERROR"),
2452 SEVERITY_MAJOR, EF_LOG, _T("f7e8508d-1503-4736-854b-1e5b8b0ad1f2"),
2453 _T("LDAP sync error: %5"),
2454 _T("Generated when LDAP synchronization error occurs.\r\n")
2455 _T("Parameters:\r\n")
2456 _T(" 1) User ID\r\n")
2457 _T(" 2) User GUID\r\n")
2458 _T(" 3) User LDAP DN\r\n")
2459 _T(" 4) User name\r\n")
2460 _T(" 5) Problem description")));
2461
2462 int ruleId = NextFreeEPPruleID();
2463 TCHAR query[1024];
2464 _sntprintf(query, 1024, _T("INSERT INTO event_policy (rule_id,rule_guid,flags,comments,alarm_message,alarm_severity,alarm_key,script,alarm_timeout,alarm_timeout_event,situation_id,situation_instance) VALUES (%d,'417648af-5361-49a5-9471-6ef31e857b2d',7944,'Generate an alarm when error occurred during LDAP synchronization','%%m',5,'SYS_LDAP_SYNC_ERROR_%%2','',0,%d,0,'')"), ruleId, EVENT_ALARM_TIMEOUT);
2465 CHK_EXEC(SQLQuery(query));
2466 _sntprintf(query, 1024, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_LDAP_SYNC_ERROR);
2467 CHK_EXEC(SQLQuery(query));
2468
2469 CHK_EXEC(SQLQuery(_T("ALTER TABLE users ADD ldap_unique_id varchar(64)")));
2470 CHK_EXEC(SQLQuery(_T("ALTER TABLE user_groups ADD ldap_unique_id varchar(64)")));
2471 CHK_EXEC(CreateConfigParam(_T("LdapUserUniqueId"), _T(""), true, false, false));
2472 CHK_EXEC(CreateConfigParam(_T("LdapGroupUniqueId"), _T(""), true, false, false));
2473
2474 CHK_EXEC(SetSchemaVersion(401));
2475 return TRUE;
2476 }
2477
2478 /**
2479 * Upgrade from V399 to V400
2480 */
2481 static BOOL H_UpgradeFromV399(int currVersion, int newVersion)
2482 {
2483 CHK_EXEC(CreateConfigParam(_T("JobRetryCount"), _T("5"), _T("Maximum mumber of job execution retrys"), 'I', true, false, false, false));
2484 CHK_EXEC(SetSchemaVersion(400));
2485 return TRUE;
2486 }
2487
2488 /**
2489 * Upgrade from V398 to V399
2490 */
2491 static BOOL H_UpgradeFromV398(int currVersion, int newVersion)
2492 {
2493 CHK_EXEC(CreateTable(
2494 _T("CREATE TABLE config_repositories (")
2495 _T(" id integer not null,")
2496 _T(" url varchar(1023) not null,")
2497 _T(" auth_token varchar(63) null,")
2498 _T(" description varchar(1023) null,")
2499 _T(" PRIMARY KEY(id))")
2500 ));
2501
2502 CHK_EXEC(SetSchemaVersion(399));
2503 return TRUE;
2504 }
2505
2506 /**
2507 * Upgrade from V397 to V398
2508 */
2509 static BOOL H_UpgradeFromV397(int currVersion, int newVersion)
2510 {
2511 CHK_EXEC(CreateTable(
2512 _T("CREATE TABLE currency_codes (")
2513 _T(" numeric_code char(3) not null,")
2514 _T(" alpha_code char(3) not null,")
2515 _T(" description varchar(127) not null,")
2516 _T(" exponent integer not null,")
2517 _T(" PRIMARY KEY(numeric_code))")
2518 ));
2519
2520 CHK_EXEC(CreateTable(
2521 _T("CREATE TABLE country_codes (")
2522 _T(" numeric_code char(3) not null,")
2523 _T(" alpha_code char(2) not null,")
2524 _T(" alpha3_code char(3) not null,")
2525 _T(" name varchar(127) not null,")
2526 _T(" PRIMARY KEY(numeric_code))")
2527 ));
2528
2529 static const TCHAR *batch1 =
2530 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('008', 'ALL', 'Lek', 2)\n")
2531 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('012', 'DZD', 'Algerian Dinar', 2)\n")
2532 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('031', 'AZM', 'Azerbaijanian Manat', 0)\n")
2533 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('032', 'ARS', 'Argentine Peso', 2)\n")
2534 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('036', 'AUD', 'Australian Dollar', 2)\n")
2535 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('044', 'BSD', 'Bahamian Dollar', 2)\n")
2536 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('048', 'BHD', 'Bahraini Dinar', 3)\n")
2537 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('050', 'BDT', 'Taka', 2)\n")
2538 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('051', 'AMD', 'Armenian Dram', 2)\n")
2539 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('052', 'BBD', 'Barbados Dollar', 2)\n")
2540 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('060', 'BMD', 'Bermudian Dollar', 2)\n")
2541 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('064', 'BTN', 'Ngultrum', 2)\n")
2542 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('068', 'BOB', 'Boliviano', 2)\n")
2543 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('072', 'BWP', 'Pula', 2)\n")
2544 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('084', 'BZD', 'Belize Dollar', 2)\n")
2545 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('090', 'SBD', 'Solomon Islands Dollar', 2)\n")
2546 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('096', 'BND', 'Brunei Dollar', 2)\n")
2547 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('100', 'BGL', 'Lev', 0)\n")
2548 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('104', 'MMK', 'Kyat', 2)\n")
2549 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('108', 'BIF', 'Burundi Franc', 0)\n")
2550 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('116', 'KHR', 'Riel', 2)\n")
2551 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('124', 'CAD', 'Canadian Dollar', 2)\n")
2552 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('132', 'CVE', 'Cape Verde Escudo', 2)\n")
2553 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('136', 'KYD', 'Cayman Islands Dollar', 2)\n")
2554 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('144', 'LKR', 'Sri Lanka Rupee', 2)\n")
2555 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('152', 'CLP', 'Chilean Peso', 0)\n")
2556 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('156', 'CNY', 'Yuan Renminbi', 2)\n")
2557 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('170', 'COP', 'Colombian Peso', 2)\n")
2558 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('174', 'KMF', 'Comoro Franc', 0)\n")
2559 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('188', 'CRC', 'Costa Rican Colon', 2)\n")
2560 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('191', 'HRK', 'Croatian Kuna', 2)\n")
2561 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('192', 'CUP', 'Cuban Peso', 2)\n")
2562 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('196', 'CYP', 'Cyprus Pound', 0)\n")
2563 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('203', 'CZK', 'Czech Koruna', 2)\n")
2564 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('208', 'DKK', 'Danish Krone', 2)\n")
2565 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('214', 'DOP', 'Dominican Peso', 2)\n")
2566 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('222', 'SVC', 'El Salvador Colon', 2)\n")
2567 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('230', 'ETB', 'Ethiopian Birr', 2)\n")
2568 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('232', 'ERN', 'Nakfa', 2)\n")
2569 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('233', 'EEK', 'Estonian Kroon', 0)\n")
2570 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('238', 'FKP', 'Falkland Islands Pound', 2)\n")
2571 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('242', 'FJD', 'Fiji Dollar', 2)\n")
2572 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('262', 'DJF', 'Djibouti Franc', 0)\n")
2573 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('270', 'GMD', 'Dalasi', 2)\n")
2574 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('288', 'GHC', 'Cedi', 0)\n")
2575 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('292', 'GIP', 'Gibraltar Pound', 2)\n")
2576 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('320', 'GTQ', 'Quetzal', 2)\n")
2577 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('324', 'GNF', 'Guinea Franc', 0)\n")
2578 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('328', 'GYD', 'Guyana Dollar', 2)\n")
2579 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('332', 'HTG', 'Gourde', 2)\n")
2580 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('340', 'HNL', 'Lempira', 2)\n")
2581 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('344', 'HKD', 'Hong Kong Dollar', 2)\n")
2582 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('348', 'HUF', 'Forint', 2)\n")
2583 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('352', 'ISK', 'Iceland Krona', 0)\n")
2584 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('356', 'INR', 'Indian Rupee', 2)\n")
2585 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('360', 'IDR', 'Rupiah', 2)\n")
2586 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('364', 'IRR', 'Iranian Rial', 2)\n")
2587 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('368', 'IQD', 'Iraqi Dinar', 3)\n")
2588 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('376', 'ILS', 'New Israeli Sheqel', 2)\n")
2589 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('388', 'JMD', 'Jamaican Dollar', 2)\n")
2590 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('392', 'JPY', 'Yen', 0)\n")
2591 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('398', 'KZT', 'Tenge', 2)\n")
2592 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('400', 'JOD', 'Jordanian Dinar', 3)\n")
2593 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('404', 'KES', 'Kenyan Shilling', 2)\n")
2594 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('408', 'KPW', 'North Korean Won', 2)\n")
2595 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('410', 'KRW', 'Won', 0)\n")
2596 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('414', 'KWD', 'Kuwaiti Dinar', 3)\n")
2597 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('417', 'KGS', 'Som', 2)\n")
2598 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('418', 'LAK', 'Kip', 2)\n")
2599 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('422', 'LBP', 'Lebanese Pound', 2)\n")
2600 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('426', 'LSL', 'Lesotho Loti', 2)\n")
2601 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('428', 'LVL', 'Latvian Lats', 2)\n")
2602 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('430', 'LRD', 'Liberian Dollar', 2)\n")
2603 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('434', 'LYD', 'Lybian Dinar', 3)\n")
2604 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('440', 'LTL', 'Lithuanian Litas', 2)\n")
2605 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('446', 'MOP', 'Pataca', 2)\n")
2606 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('450', 'MGF', 'Malagasy Franc', 0)\n")
2607 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('454', 'MWK', 'Kwacha', 2)\n")
2608 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('458', 'MYR', 'Malaysian Ringgit', 2)\n")
2609 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('462', 'MVR', 'Rufiyaa', 2)\n")
2610 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('470', 'MTL', 'Maltese Lira', 0)\n")
2611 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('478', 'MRO', 'Ouguiya', 2)\n")
2612 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('480', 'MUR', 'Mauritius Rupee', 2)\n")
2613 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('484', 'MXN', 'Mexican Peso', 2)\n")
2614 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('496', 'MNT', 'Tugrik', 2)\n")
2615 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('498', 'MDL', 'Moldovan Leu', 2)\n")
2616 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('504', 'MAD', 'Moroccan Dirham', 2)\n")
2617 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('508', 'MZM', 'Metical', 0)\n")
2618 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('512', 'OMR', 'Rial Omani', 3)\n")
2619 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('516', 'NAD', 'Namibia Dollar', 2)\n")
2620 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('524', 'NPR', 'Nepalese Rupee', 2)\n")
2621 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('532', 'ANG', 'Netherlands Antillan Guilder', 2)\n")
2622 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('533', 'AWG', 'Aruban Guilder', 2)\n")
2623 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('548', 'VUV', 'Vatu', 0)\n")
2624 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('554', 'NZD', 'New Zealand Dollar', 2)\n")
2625 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('558', 'NIO', 'Cordoba Oro', 2)\n")
2626 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('566', 'NGN', 'Naira', 2)\n")
2627 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('578', 'NOK', 'Norvegian Krone', 2)\n")
2628 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('586', 'PKR', 'Pakistan Rupee', 2)\n")
2629 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('590', 'PAB', 'Balboa', 2)\n")
2630 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('598', 'PGK', 'Kina', 2)\n")
2631 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('600', 'PYG', 'Guarani', 0)\n")
2632 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('604', 'PEN', 'Nuevo Sol', 2)\n")
2633 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('608', 'PHP', 'Philippine Peso', 2)\n")
2634 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('624', 'GWP', 'Guinea-Bissau Peso', 0)\n")
2635 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('634', 'QAR', 'Qatari Rial', 2)\n")
2636 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('642', 'ROL', 'Leu', 0)\n")
2637 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('643', 'RUB', 'Russian Ruble', 2)\n")
2638 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('646', 'RWF', 'Rwanda Franc', 0)\n")
2639 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('654', 'SHP', 'Saint Helena Pound', 2)\n")
2640 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('678', 'STD', 'Dobra', 2)\n")
2641 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('682', 'SAR', 'Saudi Riyal', 2)\n")
2642 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('690', 'SCR', 'Seychelles Rupee', 2)\n")
2643 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('694', 'SLL', 'Leone', 2)\n")
2644 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('702', 'SGD', 'Singapore Dollar', 2)\n")
2645 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('703', 'SKK', 'Slovak Koruna', 0)\n")
2646 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('704', 'VND', 'Dong', 0)\n")
2647 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('706', 'SOS', 'Somali Shilling', 2)\n")
2648 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('710', 'ZAR', 'Rand', 2)\n")
2649 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('716', 'ZWD', 'Zimbabwe Dollar', 0)\n")
2650 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('728', 'SSP', 'South Sudanese pound', 2)\n")
2651 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('740', 'SRG', 'Suriname Guilder', 0)\n")
2652 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('748', 'SZL', 'Lilangeni', 2)\n")
2653 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('752', 'SEK', 'Swedish Krona', 2)\n")
2654 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('756', 'CHF', 'Swiss Franc', 2)\n")
2655 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('760', 'SYP', 'Syrian Pound', 2)\n")
2656 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('764', 'THB', 'Baht', 2)\n")
2657 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('776', 'TOP', 'Paanga', 2)\n")
2658 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('780', 'TTD', 'Trinidad and Tobago Dollar', 2)\n")
2659 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('784', 'AED', 'UAE Dirham', 2)\n")
2660 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('788', 'TND', 'Tunisian Dinar', 3)\n")
2661 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('795', 'TMM', 'Manat', 0)\n")
2662 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('800', 'UGX', 'Uganda Shilling', 2)\n")
2663 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('807', 'MKD', 'Denar', 2)\n")
2664 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('810', 'RUR', 'Russian Ruble', 0)\n")
2665 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('818', 'EGP', 'Egyptian Pound', 2)\n")
2666 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('826', 'GBP', 'Pound Sterling', 2)\n")
2667 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('834', 'TZS', 'Tanzanian Shilling', 2)\n")
2668 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('840', 'USD', 'US Dollar', 2)\n")
2669 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('858', 'UYU', 'Peso Uruguayo', 2)\n")
2670 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('860', 'UZS', 'Uzbekistan Sum', 2)\n")
2671 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('862', 'VEB', 'Bolivar', 0)\n")
2672 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('882', 'WST', 'Tala', 2)\n")
2673 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('886', 'YER', 'Yemeni Rial', 2)\n")
2674 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('891', 'CSD', 'Serbian Dinar', 0)\n")
2675 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('894', 'ZMK', 'Kwacha', 2)\n")
2676 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('901', 'TWD', 'New Taiwan Dollar', 2)\n")
2677 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('933', 'BYN', 'Belarussian New Ruble', 2)\n")
2678 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('934', 'TMT', 'Turkmenistani Manat', 2)\n")
2679 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('937', 'VEF', 'Venezuelan Bolivar', 2)\n")
2680 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('938', 'SDG', 'Sudanese Pound', 2)\n")
2681 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('941', 'RSD', 'Serbian Dinar', 2)\n")
2682 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('943', 'MZN', 'Mozambican Metical', 2)\n")
2683 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('944', 'AZN', 'Azerbaijani Manat', 2)\n")
2684 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('946', 'RON', 'New Romanian Leu', 2)\n")
2685 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('949', 'TRY', 'New Turkish Lira', 2)\n")
2686 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('950', 'XAF', 'CFA Franc BEAC', 0)\n")
2687 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('951', 'XCD', 'East Carribbean Dollar', 2)\n")
2688 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('952', 'XOF', 'CFA Franc BCEAO', 0)\n")
2689 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('953', 'XPF', 'CFP Franc', 0)\n")
2690 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('967', 'ZMW', 'Zambian Kwacha', 2)\n")
2691 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('968', 'SRD', 'Surinamese Dollar', 2)\n")
2692 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('969', 'MGA', 'Malagasy Ariary', 2)\n")
2693 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('971', 'AFN', 'Afghani', 2)\n")
2694 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('972', 'TJS', 'Somoni', 2)\n")
2695 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('973', 'AOA', 'Kwanza', 2)\n")
2696 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('974', 'BYR', 'Belarussian Ruble', 0)\n")
2697 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('975', 'BGN', 'Bulgarian Lev', 2)\n")
2698 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('976', 'CDF', 'Franc Congolais', 2)\n")
2699 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('977', 'BAM', 'Convertible Marks', 2)\n")
2700 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('978', 'EUR', 'Euro', 2)\n")
2701 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('979', 'MXV', 'Mexican Unidad de Inversion (UDI)', 2)\n")
2702 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('980', 'UAH', 'Hryvnia', 2)\n")
2703 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('981', 'GEL', 'Lari', 2)\n")
2704 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('984', 'BOV', 'Mvdol', 2)\n")
2705 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('985', 'PLN', 'Zloty', 2)\n")
2706 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('986', 'BRL', 'Brazilian Real', 2)\n")
2707 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('990', 'CLF', 'Unidades de Fomento', 0)\n")
2708 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('997', 'USN', 'US dollar (next day funds code)', 2)\n")
2709 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('998', 'USS', 'US dollar (same day funds code)', 2)\n")
2710 _T("INSERT INTO currency_codes (numeric_code, alpha_code, description, exponent) VALUES ('999', 'XXX', 'No currency', 0)\n")
2711 _T("<END>");
2712 static const TCHAR *batch2 =
2713 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AD','AND','020','Andorra')\n")
2714 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AE','ARE','784','United Arab Emirates')\n")
2715 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AF','AFG','004','Afghanistan')\n")
2716 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AG','ATG','028','Antigua and Barbuda')\n")
2717 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AI','AIA','660','Anguilla')\n")
2718 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AL','ALB','008','Albania')\n")
2719 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AM','ARM','051','Armenia')\n")
2720 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AN','ANT','530','Netherlands Antilles')\n")
2721 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AO','AGO','024','Angola')\n")
2722 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AQ','ATA','010','Antarctica')\n")
2723 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AR','ARG','032','Argentina')\n")
2724 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AS','ASM','016','American Samoa')\n")
2725 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AT','AUT','040','Austria')\n")
2726 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AU','AUS','036','Australia')\n")
2727 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AW','ABW','533','Aruba')\n")
2728 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AX','ALA','248','Aland Islands')\n")
2729 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('AZ','AZE','031','Azerbaijan')\n")
2730 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BA','BIH','070','Bosnia and Herzegovina')\n")
2731 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BB','BRB','052','Barbados')\n")
2732 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BD','BGD','050','Bangladesh')\n")
2733 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BE','BEL','056','Belgium')\n")
2734 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BF','BFA','854','Burkina Faso')\n")
2735 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BG','BGR','100','Bulgaria')\n")
2736 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BH','BHR','048','Bahrain')\n")
2737 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BI','BDI','108','Burundi')\n")
2738 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BJ','BEN','204','Benin')\n")
2739 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BL','BLM','652','Saint-Barthelemy')\n")
2740 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BM','BMU','060','Bermuda')\n")
2741 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BN','BRN','096','Brunei Darussalam')\n")
2742 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BO','BOL','068','Bolivia')\n")
2743 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BQ','BES','535','Bonaire, Sint Eustatius and Saba')\n")
2744 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BR','BRA','076','Brazil')\n")
2745 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BS','BHS','044','Bahamas')\n")
2746 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BT','BTN','064','Bhutan')\n")
2747 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BV','BVT','074','Bouvet Island')\n")
2748 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BW','BWA','072','Botswana')\n")
2749 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BY','BLR','112','Belarus')\n")
2750 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('BZ','BLZ','084','Belize')\n")
2751 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CA','CAN','124','Canada')\n")
2752 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CC','CCK','166','Cocos (Keeling) Islands')\n")
2753 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CD','COD','180','Congo, Democratic Republic of the')\n")
2754 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CF','CAF','140','Central African Republic')\n")
2755 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CG','COG','178','Congo (Brazzaville)')\n")
2756 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CH','CHE','756','Switzerland')\n")
2757 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CI','CIV','384','Cote d''Ivoire')\n")
2758 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CK','COK','184','Cook Islands')\n")
2759 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CL','CHL','152','Chile')\n")
2760 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CM','CMR','120','Cameroon')\n")
2761 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CN','CHN','156','China')\n")
2762 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CO','COL','170','Colombia')\n")
2763 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CR','CRI','188','Costa Rica')\n")
2764 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CU','CUB','192','Cuba')\n")
2765 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CV','CPV','132','Cape Verde')\n")
2766 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CW','CUW','531','Curacao')\n")
2767 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CX','CXR','162','Christmas Island')\n")
2768 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CY','CYP','196','Cyprus')\n")
2769 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('CZ','CZE','203','Czech Republic')\n")
2770 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DE','DEU','276','Germany')\n")
2771 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DJ','DJI','262','Djibouti')\n")
2772 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DK','DNK','208','Denmark')\n")
2773 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DM','DMA','212','Dominica')\n")
2774 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DO','DOM','214','Dominican Republic')\n")
2775 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('DZ','DZA','012','Algeria')\n")
2776 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('EC','ECU','218','Ecuador')\n")
2777 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('EE','EST','233','Estonia')\n")
2778 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('EG','EGY','818','Egypt')\n")
2779 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('EH','ESH','732','Western Sahara')\n")
2780 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ER','ERI','232','Eritrea')\n")
2781 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ES','ESP','724','Spain')\n")
2782 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ET','ETH','231','Ethiopia')\n")
2783 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FI','FIN','246','Finland')\n")
2784 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FJ','FJI','242','Fiji')\n")
2785 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FK','FLK','238','Falkland Islands (Malvinas)')\n")
2786 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FM','FSM','583','Micronesia, Federated States of')\n")
2787 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FO','FRO','234','Faroe Islands')\n")
2788 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('FR','FRA','250','France')\n")
2789 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GA','GAB','266','Gabon')\n")
2790 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GB','GBR','826','United Kingdom')\n")
2791 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GD','GRD','308','Grenada')\n")
2792 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GE','GEO','268','Georgia')\n")
2793 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GF','GUF','254','French Guiana')\n")
2794 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GG','GGY','831','Guernsey')\n")
2795 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GH','GHA','288','Ghana')\n")
2796 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GI','GIB','292','Gibraltar')\n")
2797 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GL','GRL','304','Greenland')\n")
2798 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GM','GMB','270','Gambia')\n")
2799 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GN','GIN','324','Guinea')\n")
2800 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GP','GLP','312','Guadeloupe')\n")
2801 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GQ','GNQ','226','Equatorial Guinea')\n")
2802 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GR','GRC','300','Greece')\n")
2803 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GS','SGS','239','South Georgia and the South Sandwich Islands')\n")
2804 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GT','GTM','320','Guatemala')\n")
2805 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GU','GUM','316','Guam')\n")
2806 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GW','GNB','624','Guinea-Bissau')\n")
2807 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('GY','GUY','328','Guyana')\n")
2808 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HK','HKG','344','Hong Kong, Special Administrative Region of China')\n")
2809 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HM','HMD','334','Heard Island and Mcdonald Islands')\n")
2810 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HN','HND','340','Honduras')\n")
2811 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HR','HRV','191','Croatia')\n")
2812 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HT','HTI','332','Haiti')\n")
2813 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('HU','HUN','348','Hungary')\n")
2814 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ID','IDN','360','Indonesia')\n")
2815 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IE','IRL','372','Ireland')\n")
2816 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IL','ISR','376','Israel')\n")
2817 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IM','IMN','833','Isle of Man')\n")
2818 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IN','IND','356','India')\n")
2819 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IO','IOT','086','British Indian Ocean Territory')\n")
2820 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IQ','IRQ','368','Iraq')\n")
2821 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IR','IRN','364','Iran, Islamic Republic of')\n")
2822 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IS','ISL','352','Iceland')\n")
2823 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('IT','ITA','380','Italy')\n")
2824 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('JE','JEY','832','Jersey')\n")
2825 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('JM','JAM','388','Jamaica')\n")
2826 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('JO','JOR','400','Jordan')\n")
2827 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('JP','JPN','392','Japan')\n")
2828 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KE','KEN','404','Kenya')\n")
2829 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KG','KGZ','417','Kyrgyzstan')\n")
2830 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KH','KHM','116','Cambodia')\n")
2831 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KI','KIR','296','Kiribati')\n")
2832 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KM','COM','174','Comoros')\n")
2833 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KN','KNA','659','Saint Kitts and Nevis')\n")
2834 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KP','PRK','408','Korea, Democratic People''s Republic of')\n")
2835 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KR','KOR','410','Korea, Republic of')\n")
2836 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KW','KWT','414','Kuwait')\n")
2837 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KY','CYM','136','Cayman Islands')\n")
2838 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('KZ','KAZ','398','Kazakhstan')\n")
2839 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LA','LAO','418','Lao PDR')\n")
2840 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LB','LBN','422','Lebanon')\n")
2841 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LC','LCA','662','Saint Lucia')\n")
2842 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LI','LIE','438','Liechtenstein')\n")
2843 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LK','LKA','144','Sri Lanka')\n")
2844 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LR','LBR','430','Liberia')\n")
2845 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LS','LSO','426','Lesotho')\n")
2846 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LT','LTU','440','Lithuania')\n")
2847 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LU','LUX','442','Luxembourg')\n")
2848 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LV','LVA','428','Latvia')\n")
2849 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('LY','LBY','434','Libya')\n")
2850 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MA','MAR','504','Morocco')\n")
2851 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MC','MCO','492','Monaco')\n")
2852 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MD','MDA','498','Moldova')\n")
2853 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ME','MNE','499','Montenegro')\n")
2854 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MF','MAF','663','Saint-Martin (French part)')\n")
2855 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MG','MDG','450','Madagascar')\n")
2856 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MH','MHL','584','Marshall Islands')\n")
2857 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MK','MKD','807','Macedonia, Republic of')\n")
2858 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('ML','MLI','466','Mali')\n")
2859 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MM','MMR','104','Myanmar')\n")
2860 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MN','MNG','496','Mongolia')\n")
2861 _T("INSERT INTO country_codes (alpha_code,alpha3_code,numeric_code,name) VALUES ('MO','MAC','446','Macao, Special Administrative Region of China')\n")