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