added support for batches in Oracle driver
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 21 Oct 2014 17:27:11 +0000 (20:27 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 21 Oct 2014 17:27:11 +0000 (20:27 +0300)
16 files changed:
configure.ac
include/nxdbapi.h
netxms.sln
src/db/dbdrv/oracle/oracle.cpp
src/db/dbdrv/oracle/oracledrv.h
src/db/dbdrv/sqlite/sqlite.cpp
src/db/libnxdb/drivers.cpp
src/db/libnxdb/libnxdb.h
src/db/libnxdb/session.cpp
src/server/core/main.cpp
tests/Makefile.am
tests/include/testtools.h
tests/test-libnxdb/Makefile.am [copied from tests/Makefile.am with 57% similarity]
tests/test-libnxdb/oracle.cpp [new file with mode: 0644]
tests/test-libnxdb/test-libnxdb.cpp [new file with mode: 0644]
tests/test-libnxdb/test-libnxdb.vcproj [new file with mode: 0644]

index 7b27745..b45089f 100644 (file)
@@ -2709,6 +2709,7 @@ AC_CONFIG_FILES([
        tests/Makefile
        tests/include/Makefile
        tests/test-libnetxms/Makefile
+       tests/test-libnxdb/Makefile
        tools/Makefile
 ])
 
index 4fa5a34..214e8b9 100644 (file)
@@ -118,6 +118,8 @@ DB_STATEMENT LIBNXDB_EXPORTABLE DBPrepare(DB_HANDLE hConn, const TCHAR *szQuery)
 DB_STATEMENT LIBNXDB_EXPORTABLE DBPrepareEx(DB_HANDLE hConn, const TCHAR *szQuery, TCHAR *errorText);
 void LIBNXDB_EXPORTABLE DBFreeStatement(DB_STATEMENT hStmt);
 const TCHAR LIBNXDB_EXPORTABLE *DBGetStatementSource(DB_STATEMENT hStmt);
+bool LIBNXDB_EXPORTABLE DBOpenBatch(DB_STATEMENT hStmt);
+void LIBNXDB_EXPORTABLE DBNextBatchRow(DB_STATEMENT hStmt);
 void LIBNXDB_EXPORTABLE DBBind(DB_STATEMENT hStmt, int pos, int sqlType, int cType, void *buffer, int allocType);
 void LIBNXDB_EXPORTABLE DBBind(DB_STATEMENT hStmt, int pos, int sqlType, const TCHAR *value, int allocType);
 void LIBNXDB_EXPORTABLE DBBind(DB_STATEMENT hStmt, int pos, int sqlType, const TCHAR *value, int allocType, int maxLen);
index 78e2f46..9fb5c4a 100644 (file)
@@ -5,22 +5,22 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libexpat", "src\libexpat\li
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnetxms", "src\libnetxms\libnetxms.vcproj", "{B1745870-F3ED-4ACB-B813-0C4F47EF0793}"
        ProjectSection(ProjectDependencies) = postProject
-               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
                {6A88EF62-C4F2-4295-A833-549DAE4DF5ED} = {6A88EF62-C4F2-4295-A833-549DAE4DF5ED}
+               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxlp", "src\libnxlp\libnxlp.vcproj", "{64EFC0C2-C67B-41F6-851D-F11DAB27A60B}"
        ProjectSection(ProjectDependencies) = postProject
-               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
-               {6A88EF62-C4F2-4295-A833-549DAE4DF5ED} = {6A88EF62-C4F2-4295-A833-549DAE4DF5ED}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {6A88EF62-C4F2-4295-A833-549DAE4DF5ED} = {6A88EF62-C4F2-4295-A833-549DAE4DF5ED}
+               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxagentd", "src\agent\core\nxagentd.vcproj", "{57598B02-3295-4FE8-9322-94CE871CC84D}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {6B249E47-4BAF-4DE2-B62B-C6DD0330753F} = {6B249E47-4BAF-4DE2-B62B-C6DD0330753F}
                {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {6B249E47-4BAF-4DE2-B62B-C6DD0330753F} = {6B249E47-4BAF-4DE2-B62B-C6DD0330753F}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "subagents", "subagents", "{451F583D-C2DB-4414-870C-7FA0189BE7DD}"
@@ -60,8 +60,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sms", "src\agent\subagents\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portcheck", "src\agent\subagents\portcheck\portcheck.vcproj", "{F66A27F0-2943-4A16-ACC7-B450314B5163}"
        ProjectSection(ProjectDependencies) = postProject
-               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ping", "src\agent\subagents\ping\ping.vcproj", "{C5CCF5DE-152E-40F3-AC6C-C5E54BB7C45F}"
@@ -76,8 +76,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "odbcquery", "src\agent\suba
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logwatch", "src\agent\subagents\logwatch\logwatch.vcproj", "{F8A8749E-E539-4A3B-A21C-2C5C86AE33EA}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {64EFC0C2-C67B-41F6-851D-F11DAB27A60B} = {64EFC0C2-C67B-41F6-851D-F11DAB27A60B}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ecs", "src\agent\subagents\ecs\ecs.vcproj", "{BBE9028E-725C-45C6-97C9-BFC443F19DB6}"
@@ -94,114 +94,114 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxmap", "src\libnxmap\li
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxcl", "src\libnxcl\libnxcl.vcproj", "{3CB9B8C6-E6BF-4002-A61A-7A21FEADB531}"
        ProjectSection(ProjectDependencies) = postProject
-               {AB386821-B630-49F5-95C3-677B9DCE1270} = {AB386821-B630-49F5-95C3-677B9DCE1270}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {AB386821-B630-49F5-95C3-677B9DCE1270} = {AB386821-B630-49F5-95C3-677B9DCE1270}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{39BF23C9-D903-4C20-8E88-19533A745625}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxalarm", "src\client\nxalarm\nxalarm.vcproj", "{F9FFAAE9-D669-451E-B9EF-18BC8AD37FAB}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531} = {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxevent", "src\client\nxevent\nxevent.vcproj", "{C7A460E8-12A8-4FC7-9F59-C9C5CE17ED20}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531} = {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxpush", "src\client\nxpush\nxpush.vcproj", "{B8671BF7-94E1-4615-A8C2-F5C78DB8C515}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531} = {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsms", "src\client\nxsms\nxsms.vcproj", "{B0A70A32-A8F0-4071-8044-FDA3C834A5C5}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531} = {3CB9B8C6-E6BF-4002-A61A-7A21FEADB531}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxsnmp", "src\snmp\libnxsnmp\libnxsnmp.vcproj", "{7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}"
        ProjectSection(ProjectDependencies) = postProject
-               {E7410EB4-3355-4C83-8E05-D2877581CDA1} = {E7410EB4-3355-4C83-8E05-D2877581CDA1}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {E7410EB4-3355-4C83-8E05-D2877581CDA1} = {E7410EB4-3355-4C83-8E05-D2877581CDA1}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxzlib", "src\zlib\nxzlib.vcproj", "{E7410EB4-3355-4C83-8E05-D2877581CDA1}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsnmpget", "src\snmp\nxsnmpget\nxsnmpget.vcproj", "{0A4CE471-020A-42C6-91C0-DFEFA7E815E0}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsnmpset", "src\snmp\nxsnmpset\nxsnmpset.vcproj", "{9EA98E79-EB7D-4F6C-8105-AC7B231ABB10}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsnmpwalk", "src\snmp\nxsnmpwalk\nxsnmpwalk.vcproj", "{5FA3AADC-3AD7-4B17-A581-D5E02DE17727}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxmibc", "src\snmp\nxmibc\nxmibc.vcproj", "{9F722C62-78FD-4D8C-A7C7-2815B09F1943}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxsrv", "src\server\libnxsrv\libnxsrv.vcproj", "{CB89D905-C8BE-4027-B2D8-F96C245E9160}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxcore", "src\server\core\nxcore.vcproj", "{3B172035-5EEC-45A3-8471-2C390B7ED683}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {F4169894-5C48-4E11-A82E-1055F9572EEF} = {F4169894-5C48-4E11-A82E-1055F9572EEF}
-               {B2988503-1921-4B9F-BBC1-5E5CF62F335E} = {B2988503-1921-4B9F-BBC1-5E5CF62F335E}
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
-               {64EFC0C2-C67B-41F6-851D-F11DAB27A60B} = {64EFC0C2-C67B-41F6-851D-F11DAB27A60B}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {AB386821-B630-49F5-95C3-677B9DCE1270} = {AB386821-B630-49F5-95C3-677B9DCE1270}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {64EFC0C2-C67B-41F6-851D-F11DAB27A60B} = {64EFC0C2-C67B-41F6-851D-F11DAB27A60B}
+               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B2988503-1921-4B9F-BBC1-5E5CF62F335E} = {B2988503-1921-4B9F-BBC1-5E5CF62F335E}
+               {F4169894-5C48-4E11-A82E-1055F9572EEF} = {F4169894-5C48-4E11-A82E-1055F9572EEF}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nxsl", "nxsl", "{CE0DA89E-CF0C-452C-9C33-75A143355BDC}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxsl", "src\libnxsl\libnxsl.vcproj", "{B2988503-1921-4B9F-BBC1-5E5CF62F335E}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxscript", "src\nxscript\nxscript.vcproj", "{BA263F92-D5A9-4F26-9606-5A1C1495FEA5}"
        ProjectSection(ProjectDependencies) = postProject
-               {B2988503-1921-4B9F-BBC1-5E5CF62F335E} = {B2988503-1921-4B9F-BBC1-5E5CF62F335E}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {B2988503-1921-4B9F-BBC1-5E5CF62F335E} = {B2988503-1921-4B9F-BBC1-5E5CF62F335E}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netxmsd", "src\server\netxmsd\netxmsd.vcproj", "{E417A0C4-41F1-4F87-8C33-8526ECB1F8AF}"
        ProjectSection(ProjectDependencies) = postProject
-               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{64482674-7B36-4A14-A612-247333174315}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxaction", "src\server\tools\nxaction\nxaction.vcproj", "{BF5CE6BA-C84A-4448-B1B7-1B355AC77D12}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxadm", "src\server\tools\nxadm\nxadm.vcproj", "{67E35735-2115-45FF-9E93-EE67AF5C9C2C}"
@@ -211,43 +211,43 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxadm", "src\server\tools\n
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxget", "src\server\tools\nxget\nxget.vcproj", "{1AC3C8D1-E309-4327-9E17-0E4CE0FC68CF}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxupload", "src\server\tools\nxupload\nxupload.vcproj", "{DA863269-ED58-4910-AA6A-2572A3EE745D}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxdbmgr", "src\server\tools\nxdbmgr\nxdbmgr.vcproj", "{4940613E-A11C-4259-95C8-8D23217EE60E}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {87CAA25D-991E-45E1-BB69-337D45121F19} = {87CAA25D-991E-45E1-BB69-337D45121F19}
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {AB386821-B630-49F5-95C3-677B9DCE1270} = {AB386821-B630-49F5-95C3-677B9DCE1270}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {87CAA25D-991E-45E1-BB69-337D45121F19} = {87CAA25D-991E-45E1-BB69-337D45121F19}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "smsdrv", "smsdrv", "{5818CCA9-B585-44B8-B29E-98B1DC278A3C}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generic", "src\server\smsdrv\generic\generic.vcproj", "{41A5009F-4467-4D89-A171-5A919FEFE16E}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxagent", "src\server\smsdrv\nxagent\nxagent.vcproj", "{C317231C-B984-4423-ACF2-C19DE8B6AA3F}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxlptest", "src\nxlptest\nxlptest.vcproj", "{1EA79FC6-F395-43DF-9E3C-2030CA05ED1D}"
        ProjectSection(ProjectDependencies) = postProject
-               {64EFC0C2-C67B-41F6-851D-F11DAB27A60B} = {64EFC0C2-C67B-41F6-851D-F11DAB27A60B}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {64EFC0C2-C67B-41F6-851D-F11DAB27A60B} = {64EFC0C2-C67B-41F6-851D-F11DAB27A60B}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsqlite", "src\sqlite\nxsqlite.vcproj", "{87CAA25D-991E-45E1-BB69-337D45121F19}"
@@ -293,14 +293,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pgsql", "src\db\dbdrv\pgsql
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite", "src\db\dbdrv\sqlite\sqlite.vcproj", "{AA18FD4D-7B01-4932-BA04-B0F54F001F66}"
        ProjectSection(ProjectDependencies) = postProject
-               {87CAA25D-991E-45E1-BB69-337D45121F19} = {87CAA25D-991E-45E1-BB69-337D45121F19}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {87CAA25D-991E-45E1-BB69-337D45121F19} = {87CAA25D-991E-45E1-BB69-337D45121F19}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxconfig", "src\server\tools\nxconfig\nxconfig.vcproj", "{A76CCCF5-D70B-4307-B84C-219289CEAA6D}"
        ProjectSection(ProjectDependencies) = postProject
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "flow analyzer", "flow analyzer", "{89B3A66E-5853-4B14-A5E3-9E4C6524BE65}"
@@ -312,9 +312,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libipfix", "src\flow_analyz
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxflowd", "src\flow_analyzer\nxflowd\nxflowd.vcproj", "{D7F709ED-7483-49F0-8B17-ABB705606FEA}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {2DEF303B-5FEF-4F5E-87C4-FB7895058F59} = {2DEF303B-5FEF-4F5E-87C4-FB7895058F59}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db2", "src\db\dbdrv\db2\db2.vcproj", "{297D9A45-B928-4470-91B5-0E07A20C2405}"
@@ -324,8 +324,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db2", "src\db\dbdrv\db2\db2
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxap", "src\server\tools\nxap\nxap.vcproj", "{36749C31-C8C6-4DD2-A11C-E41ED86927C7}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtre", "src\libtre\libtre.vcproj", "{406AE5C7-343D-4C88-B8F3-84E46255B830}"
@@ -334,50 +334,50 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "drivers", "drivers", "{5399
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "baystack", "src\server\drivers\baystack\baystack.vcproj", "{13A91F2E-A17B-4ABA-B5B2-285807BD7832}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {DA651576-4E4F-448C-A0A3-9EDD15C81078} = {DA651576-4E4F-448C-A0A3-9EDD15C81078}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {DA651576-4E4F-448C-A0A3-9EDD15C81078} = {DA651576-4E4F-448C-A0A3-9EDD15C81078}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ers8000", "src\server\drivers\ers8000\ers8000.vcproj", "{076E6815-4B6B-4F1E-A36C-CD3DD26EA5AC}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {DA651576-4E4F-448C-A0A3-9EDD15C81078} = {DA651576-4E4F-448C-A0A3-9EDD15C81078}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{D73BB67D-032B-4FB7-AEB8-5795B246A072}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "avaya-ers", "src\server\drivers\lib\avaya-ers\avaya-ers.vcproj", "{DA651576-4E4F-448C-A0A3-9EDD15C81078}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cisco", "src\server\drivers\lib\cisco\cisco.vcproj", "{375F95BD-EFBA-4AA3-8DA3-E79779A12896}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cat2900xl", "src\server\drivers\cat2900xl\cat2900xl.vcproj", "{FEEF505B-75AE-4E52-8177-51FFC4AB2ED2}"
        ProjectSection(ProjectDependencies) = postProject
-               {375F95BD-EFBA-4AA3-8DA3-E79779A12896} = {375F95BD-EFBA-4AA3-8DA3-E79779A12896}
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {375F95BD-EFBA-4AA3-8DA3-E79779A12896} = {375F95BD-EFBA-4AA3-8DA3-E79779A12896}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portech", "src\server\smsdrv\portech\portech.vcproj", "{7D0A15A1-7F6E-480D-9926-13BB6DAA0E10}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netscreen", "src\server\drivers\netscreen\netscreen.vcproj", "{500DE9BF-6FC1-4ACB-91A9-308BA1D37F37}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "informix", "src\db\dbdrv\informix\informix.vcproj", "{7DE4A043-48B8-4D66-8D3F-8CF5C757EEB5}"
@@ -387,35 +387,35 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "informix", "src\db\dbdrv\in
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "informix", "src\agent\subagents\informix\informix.vcproj", "{12F5AF3E-A688-4852-A0ED-921D0E088AC4}"
        ProjectSection(ProjectDependencies) = postProject
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbemu", "src\server\smsdrv\dbemu\dbemu.vcproj", "{912783D2-CF6F-4040-B564-4E2436EB0827}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxinstall", "src\nxinstall\nxinstall.vcproj", "{C177FB94-66E8-424E-BDBE-A96C75D2672C}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {B2988503-1921-4B9F-BBC1-5E5CF62F335E} = {B2988503-1921-4B9F-BBC1-5E5CF62F335E}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "catalyst", "src\server\drivers\catalyst\catalyst.vcproj", "{F343CDCB-1DB5-4563-86DF-6AF1596090B2}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
                {375F95BD-EFBA-4AA3-8DA3-E79779A12896} = {375F95BD-EFBA-4AA3-8DA3-E79779A12896}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oracle", "src\agent\subagents\oracle\oracle.vcproj", "{90B762AB-B7BA-42D6-9819-C687AB3F59D0}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
                {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{896A7CDA-423A-460A-83E2-6ED37DAE187C}"
@@ -427,14 +427,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxapush", "src\agent\tools\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "procurve", "src\server\drivers\procurve\procurve.vcproj", "{B51F1406-AF43-4396-96C0-31176DDAA3FB}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dell-pwc", "src\server\drivers\dell-pwc\dell-pwc.vcproj", "{4CD8D04D-375D-40B5-AB1C-C8AC8A38FB45}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cisco-esw", "src\server\drivers\cisco-esw\cisco-esw.vcproj", "{15B67A25-48BB-4A05-8FF5-9FE747F6D3EB}"
@@ -446,8 +446,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnxsd", "src\agent\libnxs
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbquery", "src\agent\subagents\dbquery\dbquery.vcproj", "{784D1668-124C-46D9-B985-51276FFA282A}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appagent", "src\agent\appagent\appagent.vcproj", "{6B249E47-4BAF-4DE2-B62B-C6DD0330753F}"
@@ -457,15 +457,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appagent", "src\agent\appag
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxappget", "src\agent\tools\nxappget\nxappget.vcproj", "{21D35413-495C-4DD2-BDBF-7BD708C70B74}"
        ProjectSection(ProjectDependencies) = postProject
-               {6B249E47-4BAF-4DE2-B62B-C6DD0330753F} = {6B249E47-4BAF-4DE2-B62B-C6DD0330753F}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {6B249E47-4BAF-4DE2-B62B-C6DD0330753F} = {6B249E47-4BAF-4DE2-B62B-C6DD0330753F}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dlink", "src\server\drivers\dlink\dlink.vcproj", "{45C17A03-3478-4BA4-90B2-F74FE13BFB83}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxencpasswd", "src\tools\nxencpasswd\nxencpasswd.vcproj", "{49F5280F-147B-46D0-98BF-931F0646CF82}"
@@ -475,31 +475,31 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxencpasswd", "src\tools\nx
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "symbol-ws", "src\server\drivers\symbol-ws\symbol-ws.vcproj", "{AB4F7846-5024-4666-8F5E-56B2D9FBF55F}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dummy", "src\server\smsdrv\dummy\dummy.vcproj", "{60BB5936-BF12-423F-9276-26F179E9C230}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ntws", "src\server\drivers\ntws\ntws.vcproj", "{E614F3CF-58CC-4B7F-9B2D-975921E06522}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{3AB343C9-A67D-49F1-A8CD-EA0D9CA98467}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "driverloader", "src\server\tools\driverloader\driverloader.vcproj", "{3FE49724-9935-4988-9573-156668B1E20C}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "java", "src\agent\subagents\java\java.vcproj", "{4967B29B-4272-4D7B-9CF6-8ABFF9D21348}"
@@ -509,16 +509,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "java", "src\agent\subagents
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ping3", "src\server\drivers\ping3\ping3.vcproj", "{741E8D29-2362-4022-85D6-C1383A413BD6}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "at", "src\server\drivers\at\at.vcproj", "{01924916-D158-4370-97C8-D17B8D2A7D4F}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxcproxy", "src\nxcproxy\nxcproxy.vcproj", "{C6F495E0-71D7-4B7E-AC3A-ABBEFBFFD2DF}"
@@ -533,14 +533,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libstrophe", "src\libstroph
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netsvc", "src\agent\subagents\netsvc\netsvc.vcproj", "{17C5C5F3-3F13-47F4-8606-1EC9B5416DB2}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {406AE5C7-343D-4C88-B8F3-84E46255B830} = {406AE5C7-343D-4C88-B8F3-84E46255B830}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cisco-sb", "src\server\drivers\cisco-sb\cisco-sb.vcproj", "{6D040459-7E6D-44A5-95EE-636853A05033}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "devemu", "src\agent\subagents\devemu\devemu.vcproj", "{BBE9028E-725C-45C6-97C9-BFC443F19DB7}"
@@ -550,47 +550,47 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "devemu", "src\agent\subagen
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "websms", "src\server\smsdrv\websms\websms.vcproj", "{60BB5936-BF12-423F-9276-26F179E9C231}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hdlink", "hdlink", "{80EB59BF-5CEC-4248-BF3B-7C30E67063B8}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jira", "src\server\hdlink\jira\jira.vcproj", "{01924916-D158-4370-97C8-D17B8D2A7D4E}"
        ProjectSection(ProjectDependencies) = postProject
-               {12D6E037-84D8-406A-8A9B-3E00D3E0D426} = {12D6E037-84D8-406A-8A9B-3E00D3E0D426}
-               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
+               {12D6E037-84D8-406A-8A9B-3E00D3E0D426} = {12D6E037-84D8-406A-8A9B-3E00D3E0D426}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jansson", "src\jansson\jansson.vcproj", "{12D6E037-84D8-406A-8A9B-3E00D3E0D426}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mikrotik", "src\server\drivers\mikrotik\mikrotik.vcproj", "{500DE9BF-6FC1-4ACB-91AA-308BA1D37F38}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "airespace", "src\server\drivers\airespace\airespace.vcproj", "{AB4F7846-5024-4666-8F5E-56B2D9FCF77F}"
        ProjectSection(ProjectDependencies) = postProject
-               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubnt", "src\server\drivers\ubnt\ubnt.vcproj", "{500DE9BF-6FC1-4ACB-91AA-308BA2D33F38}"
        ProjectSection(ProjectDependencies) = postProject
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db2", "src\agent\subagents\db2\db2.vcproj", "{90B762AB-B7BA-42D6-9819-C787AB3F59D1}"
        ProjectSection(ProjectDependencies) = postProject
-               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "filemgr", "src\agent\subagents\filemgr\filemgr.vcproj", "{BBE9028E-725C-45C6-97C9-BFC443F19EA8}"
@@ -605,8 +605,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "src\libpng\libpng
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nxsagent", "src\agent\nxsagent\nxsagent.vcproj", "{9C6790BA-385D-476D-944A-552C87018733}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {C1A5E28A-CF47-4D96-9656-3312F16E3724} = {C1A5E28A-CF47-4D96-9656-3312F16E3724}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6FC2F162-5E91-47D7-AE00-45C595ED8C85}"
@@ -620,16 +620,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pds-drivers", "pds-drivers"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rrdtool", "src\server\pdsdrv\rrdtool\rrdtool.vcproj", "{1B7CA1B1-C702-49D7-8339-7FF82B188D32}"
        ProjectSection(ProjectDependencies) = postProject
-               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+               {3B172035-5EEC-45A3-8471-2C390B7ED683} = {3B172035-5EEC-45A3-8471-2C390B7ED683}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
        EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "h3c", "src\server\drivers\h3c\h3c.vcproj", "{B51F1406-AF43-4396-96C0-31176DDAA3FC}"
        ProjectSection(ProjectDependencies) = postProject
+               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
+               {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
                {CB89D905-C8BE-4027-B2D8-F96C245E9160} = {CB89D905-C8BE-4027-B2D8-F96C245E9160}
+       EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-libnxdb", "tests\test-libnxdb\test-libnxdb.vcproj", "{CB4F1D89-AC66-49AF-9273-BA77D39E7707}"
+       ProjectSection(ProjectDependencies) = postProject
+               {F3E29541-3A0E-45EC-8BEC-E193F2401622} = {F3E29541-3A0E-45EC-8BEC-E193F2401622}
                {B1745870-F3ED-4ACB-B813-0C4F47EF0793} = {B1745870-F3ED-4ACB-B813-0C4F47EF0793}
-               {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB} = {7DC90EE4-E31C-4F12-8F1E-81F10E9099FB}
        EndProjectSection
 EndProject
 Global
@@ -1456,6 +1462,14 @@ Global
                {B51F1406-AF43-4396-96C0-31176DDAA3FC}.Release|Win32.Build.0 = Release|Win32
                {B51F1406-AF43-4396-96C0-31176DDAA3FC}.Release|x64.ActiveCfg = Release|x64
                {B51F1406-AF43-4396-96C0-31176DDAA3FC}.Release|x64.Build.0 = Release|x64
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Debug|Win32.ActiveCfg = Debug|Win32
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Debug|Win32.Build.0 = Debug|Win32
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Debug|x64.ActiveCfg = Debug|x64
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Debug|x64.Build.0 = Debug|x64
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Release|Win32.ActiveCfg = Release|Win32
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Release|Win32.Build.0 = Release|Win32
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Release|x64.ActiveCfg = Release|x64
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707}.Release|x64.Build.0 = Release|x64
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
@@ -1572,6 +1586,7 @@ Global
                {21D35413-495C-4DD2-BDBF-7BD708C70B74} = {896A7CDA-423A-460A-83E2-6ED37DAE187C}
                {01924916-D158-4370-97C8-D17B8D2A7D4E} = {80EB59BF-5CEC-4248-BF3B-7C30E67063B8}
                {8DD0AA99-52B2-4680-8CB5-89556B566177} = {6FC2F162-5E91-47D7-AE00-45C595ED8C85}
+               {CB4F1D89-AC66-49AF-9273-BA77D39E7707} = {6FC2F162-5E91-47D7-AE00-45C595ED8C85}
                {1B7CA1B1-C702-49D7-8339-7FF82B188D32} = {7C6DD495-5A44-4D50-B065-A8CA120272F7}
        EndGlobalSection
 EndGlobal
index 96a497d..a8832fe 100644 (file)
@@ -383,7 +383,10 @@ extern "C" ORACLE_STATEMENT EXPORT *DrvPrepare(ORACLE_CONN *pConn, WCHAR *pwszQu
                stmt->connection = pConn;
                stmt->handleStmt = handleStmt;
                stmt->bindings = new Array(8, 8, false);
+      stmt->batchBindings = NULL;
                stmt->buffers = new Array(8, 8, true);
+      stmt->batchMode = 0;
+      stmt->batchSize = 0;
                OCIHandleAlloc(pConn->handleEnv, (void **)&stmt->handleError, OCI_HTYPE_ERROR, 0, NULL);
                *pdwError = DBERR_SUCCESS;
        }
@@ -405,13 +408,52 @@ extern "C" ORACLE_STATEMENT EXPORT *DrvPrepare(ORACLE_CONN *pConn, WCHAR *pwszQu
 }
 
 /**
- * Bind parameter to statement
+ * Open batch
  */
-extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int cType, void *buffer, int allocType)
+extern "C" bool EXPORT DrvOpenBatch(ORACLE_STATEMENT *stmt)
+{
+   stmt->buffers->clear();
+   if (stmt->batchBindings != NULL)
+      stmt->batchBindings->clear();
+   else
+      stmt->batchBindings = new ObjectArray<OracleBatchBind>(16, 16, true);
+   stmt->batchMode = true;
+   stmt->batchSize = 0;
+   return true;
+}
+
+/**
+ * Start next batch row
+ */
+extern "C" void EXPORT DrvNextBatchRow(ORACLE_STATEMENT *stmt)
 {
-       static DWORD bufferSize[] = { 0, sizeof(LONG), sizeof(DWORD), sizeof(INT64), sizeof(QWORD), sizeof(double) };
-       static ub2 oracleType[] = { SQLT_STR, SQLT_INT, SQLT_UIN, SQLT_INT, SQLT_UIN, SQLT_FLT };
+   if (!stmt->batchMode)
+      return;
+   
+   for(int i = 0; i < stmt->batchBindings->size(); i++)
+   {
+          OracleBatchBind *bind = stmt->batchBindings->get(i);
+      if (bind != NULL)
+         bind->addRow();
+   }
+   stmt->batchSize++;
+}
 
+/**
+ * Buffer sizes for different C types
+ */
+static DWORD s_bufferSize[] = { 0, sizeof(LONG), sizeof(DWORD), sizeof(INT64), sizeof(QWORD), sizeof(double) };
+
+/**
+ * Corresponding Oracle types for C types
+ */
+static ub2 s_oracleType[] = { SQLT_STR, SQLT_INT, SQLT_UIN, SQLT_INT, SQLT_UIN, SQLT_FLT };
+
+/**
+ * Bind parameter to statement - normal mode (non-batch)
+ */
+static void BindNormal(ORACLE_STATEMENT *stmt, int pos, int sqlType, int cType, void *buffer, int allocType)
+{
        OCIBind *handleBind = (OCIBind *)stmt->bindings->get(pos - 1);
        void *sqlBuffer;
        switch(cType)
@@ -419,14 +461,14 @@ extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int
                case DB_CTYPE_STRING:
 #if UNICODE_UCS4
                        sqlBuffer = UCS2StringFromUCS4String((WCHAR *)buffer);
-                       stmt->buffers->set(pos - 1, sqlBuffer);
+                  stmt->buffers->set(pos - 1, sqlBuffer);
                        if (allocType == DB_BIND_DYNAMIC)
                                free(buffer);
 #else
-                       if (allocType == DB_BIND_TRANSIENT)
+         if (allocType == DB_BIND_TRANSIENT)
                        {
                                sqlBuffer = wcsdup((WCHAR *)buffer);
-                               stmt->buffers->set(pos - 1, sqlBuffer);
+                  stmt->buffers->set(pos - 1, sqlBuffer);
                        }
                        else
                        {
@@ -435,10 +477,10 @@ extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int
                                        stmt->buffers->set(pos - 1, sqlBuffer);
                        }
 #endif
-                       OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
-                                                        ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
-                                                        (sqlType == DB_SQLTYPE_TEXT) ? SQLT_LNG : SQLT_STR,
-                                                        NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+                  OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
+                                                   ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
+                                                   (sqlType == DB_SQLTYPE_TEXT) ? SQLT_LNG : SQLT_STR,
+                                                   NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
                        break;
                case DB_CTYPE_INT64:    // OCI prior to 11.2 cannot bind 64 bit integers
 #ifdef UNICODE_UCS2
@@ -451,10 +493,10 @@ extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int
                                sqlBuffer = UCS2StringFromMBString(temp);
                        }
 #endif
-                       stmt->buffers->set(pos - 1, sqlBuffer);
-                       OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
-                                                        ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
-                                                        SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+                  stmt->buffers->set(pos - 1, sqlBuffer);
+                  OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
+                                                   ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
+                                                   SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
                        if (allocType == DB_BIND_DYNAMIC)
                                free(buffer);
                        break;
@@ -469,35 +511,243 @@ extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int
                                sqlBuffer = UCS2StringFromMBString(temp);
                        }
 #endif
-                       stmt->buffers->set(pos - 1, sqlBuffer);
-                       OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
-                                                        ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
-                                                        SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+                  stmt->buffers->set(pos - 1, sqlBuffer);
+                  OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer,
+                                                   ((sb4)ucs2_strlen((UCS2CHAR *)sqlBuffer) + 1) * sizeof(UCS2CHAR), 
+                                                   SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
                        if (allocType == DB_BIND_DYNAMIC)
                                free(buffer);
                        break;
                default:
-                       switch(allocType)
+                  switch(allocType)
+                  {
+                          case DB_BIND_STATIC:
+                                  sqlBuffer = buffer;
+                                  break;
+                          case DB_BIND_DYNAMIC:
+                                  sqlBuffer = buffer;
+                                  stmt->buffers->set(pos - 1, buffer);
+                                  break;
+                          case DB_BIND_TRANSIENT:
+                                  sqlBuffer = nx_memdup(buffer, s_bufferSize[cType]);
+                                  stmt->buffers->set(pos - 1, sqlBuffer);
+                                  break;
+                          default:
+                                  return;      // Invalid call
+                  }
+                  OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer, s_bufferSize[cType],
+                                                   s_oracleType[cType], NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+                       break;
+       }
+
+   stmt->bindings->set(pos - 1, handleBind);
+}
+
+/**
+ * Batch bind - constructor
+ */
+OracleBatchBind::OracleBatchBind(int cType, int sqlType)
+{
+   m_cType = cType;
+   m_size = 0;
+   m_allocated = 256;
+   if ((cType == DB_CTYPE_STRING) || (cType == DB_CTYPE_INT64) || (cType == DB_CTYPE_UINT64))
+   {
+      m_elementSize = sizeof(UCS2CHAR);
+      m_string = true;
+      m_oraType = (sqlType == DB_SQLTYPE_TEXT) ? SQLT_LNG : SQLT_STR;
+      m_data = NULL;
+      m_strings = (UCS2CHAR **)calloc(m_allocated, sizeof(UCS2CHAR *));
+   }
+   else
+   {
+      m_elementSize = s_bufferSize[cType];
+      m_string = false;
+      m_oraType = s_oracleType[cType];
+      m_data = calloc(m_allocated, m_elementSize);
+      m_strings = NULL;
+   }
+}
+
+/**
+ * Batch bind - destructor
+ */
+OracleBatchBind::~OracleBatchBind()
+{
+   if (m_strings != NULL)
+   {
+      for(int i = 0; i < m_size; i++)
+         safe_free(m_strings[i]);
+      free(m_strings);
+   }
+   safe_free(m_data);
+}
+
+/**
+ * Batch bind - add row
+ */
+void OracleBatchBind::addRow()
+{
+   if (m_size == m_allocated)
+   {
+      m_allocated += 256;
+      if (m_string)
+      {
+         m_strings = (UCS2CHAR **)realloc(m_strings, m_allocated * sizeof(UCS2CHAR *));
+         memset(m_strings + m_size, 0, (m_allocated - m_size) * sizeof(UCS2CHAR *));
+      }
+      else
+      {
+         m_data = realloc(m_data, m_allocated * m_elementSize);
+         memset((char *)m_data + m_size * m_elementSize, 0, (m_allocated - m_size) * m_elementSize);
+      }
+   }
+   if (m_size > 0)
+   {
+      // clone last element
+      if (m_string)
+      {
+         UCS2CHAR *p = m_strings[m_size - 1];
+         m_strings[m_size] = (p != NULL) ? ucs2_strdup(p) : NULL;
+      }
+      else
+      {
+         memcpy((char *)m_data + m_size * m_elementSize, (char *)m_data + (m_size - 1) * m_elementSize, m_elementSize);
+      }
+   }
+   m_size++;
+}
+
+/**
+ * Batch bind - set value
+ */
+void OracleBatchBind::set(void *value)
+{
+   if (m_string)
+   {
+      safe_free(m_strings[m_size - 1]);
+      m_strings[m_size - 1] = (UCS2CHAR *)value;
+      if (value != NULL)
+      {
+         int l = (int)(ucs2_strlen((UCS2CHAR *)value) + 1) * sizeof(UCS2CHAR);
+         if (l > m_elementSize)
+            m_elementSize = l;
+      }
+   }
+   else
+   {
+      memcpy((char *)m_data + (m_size - 1) * m_elementSize, value, m_elementSize);
+   }
+}
+
+/**
+ * Get data for OCI bind
+ */
+void *OracleBatchBind::getData()
+{
+   if (!m_string)
+      return m_data;
+
+   safe_free(m_data);
+   m_data = calloc(m_size, m_elementSize);
+   char *p = (char *)m_data;
+   for(int i = 0; i < m_size; i++)
+   {
+      if (m_strings[i] == NULL)
+         continue;
+      memcpy(p, m_strings[i], ucs2_strlen(m_strings[i]) * sizeof(UCS2CHAR));
+      p += m_elementSize;
+   }
+   return m_data;
+}
+
+/**
+ * Bind parameter to statement - batch mode
+ */
+static void BindBatch(ORACLE_STATEMENT *stmt, int pos, int sqlType, int cType, void *buffer, int allocType)
+{
+   if (stmt->batchSize == 0)
+      return;  // no batch rows added yet
+
+       OracleBatchBind *bind = stmt->batchBindings->get(pos - 1);
+   if (bind == NULL)
+   {
+      bind = new OracleBatchBind(cType, sqlType);
+      stmt->batchBindings->set(pos - 1, bind);
+      for(int i = 0; i < stmt->batchSize; i++)
+         bind->addRow();
+   }
+
+   if (bind->getCType() != cType)
+      return;
+
+       void *sqlBuffer;
+   switch(bind->getCType())
+       {
+               case DB_CTYPE_STRING:
+#if UNICODE_UCS4
+                       sqlBuffer = UCS2StringFromUCS4String((WCHAR *)buffer);
+         if (allocType == DB_BIND_DYNAMIC)
+                               free(buffer);
+#else
+         if (allocType == DB_BIND_DYNAMIC)
+         {
+                               sqlBuffer = buffer;
+         }
+         else
                        {
-                               case DB_BIND_STATIC:
-                                       sqlBuffer = buffer;
-                                       break;
-                               case DB_BIND_DYNAMIC:
-                                       sqlBuffer = buffer;
-                                       stmt->buffers->set(pos - 1, buffer);
-                                       break;
-                               case DB_BIND_TRANSIENT:
-                                       sqlBuffer = nx_memdup(buffer, bufferSize[cType]);
-                                       stmt->buffers->set(pos - 1, sqlBuffer);
-                                       break;
-                               default:
-                                       return; // Invalid call
+                               sqlBuffer = wcsdup((WCHAR *)buffer);
+                       }
+#endif
+         bind->set(sqlBuffer);
+                       break;
+               case DB_CTYPE_INT64:    // OCI prior to 11.2 cannot bind 64 bit integers
+#ifdef UNICODE_UCS2
+                       sqlBuffer = malloc(64 * sizeof(WCHAR));
+                       swprintf((WCHAR *)sqlBuffer, 64, INT64_FMTW, *((INT64 *)buffer));
+#else
+                       {
+                               char temp[64];
+                               snprintf(temp, 64, INT64_FMTA, *((INT64 *)buffer));
+                               sqlBuffer = UCS2StringFromMBString(temp);
+                       }
+#endif
+         bind->set(sqlBuffer);
+                       if (allocType == DB_BIND_DYNAMIC)
+                               free(buffer);
+                       break;
+               case DB_CTYPE_UINT64:   // OCI prior to 11.2 cannot bind 64 bit integers
+#ifdef UNICODE_UCS2
+                       sqlBuffer = malloc(64 * sizeof(WCHAR));
+                       swprintf((WCHAR *)sqlBuffer, 64, UINT64_FMTW, *((QWORD *)buffer));
+#else
+                       {
+                               char temp[64];
+                               snprintf(temp, 64, UINT64_FMTA, *((QWORD *)buffer));
+                               sqlBuffer = UCS2StringFromMBString(temp);
                        }
-                       OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, pos, sqlBuffer, bufferSize[cType],
-                                                        oracleType[cType], NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+#endif
+         bind->set(sqlBuffer);
+                       if (allocType == DB_BIND_DYNAMIC)
+                               free(buffer);
+                       break;
+               default:
+         bind->set(buffer);
+                       if (allocType == DB_BIND_DYNAMIC)
+                               free(buffer);
                        break;
        }
-       stmt->bindings->set(pos - 1, handleBind);
+}
+
+/**
+ * Bind parameter to statement
+ */
+extern "C" void EXPORT DrvBind(ORACLE_STATEMENT *stmt, int pos, int sqlType, int cType, void *buffer, int allocType)
+{
+   if (stmt->batchMode)
+      BindBatch(stmt, pos, sqlType, cType, buffer, allocType);
+   else
+      BindNormal(stmt, pos, sqlType, cType, buffer, allocType);
 }
 
 /**
@@ -507,8 +757,23 @@ extern "C" DWORD EXPORT DrvExecute(ORACLE_CONN *pConn, ORACLE_STATEMENT *stmt, W
 {
        DWORD dwResult;
 
+   if (stmt->batchMode)
+   {
+      for(int i = 0; i < stmt->batchBindings->size(); i++)
+      {
+         OracleBatchBind *b = stmt->batchBindings->get(i);
+         if (b == NULL)
+            continue;
+
+         OCIBind *handleBind = NULL;
+         OCIBindByPos(stmt->handleStmt, &handleBind, stmt->handleError, i + 1, b->getData(), 
+                      b->getElementSize(), b->getOraType(), NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
+      }
+   }
+
        MutexLock(pConn->mutexQueryLock);
-       if (OCIStmtExecute(pConn->handleService, stmt->handleStmt, pConn->handleError, 1, 0, NULL, NULL,
+   if (OCIStmtExecute(pConn->handleService, stmt->handleStmt, pConn->handleError, 
+                      stmt->batchMode ? stmt->batchSize : 1, 0, NULL, NULL,
                           (pConn->nTransLevel == 0) ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT) == OCI_SUCCESS)
        {
                dwResult = DBERR_SUCCESS;
@@ -525,6 +790,13 @@ extern "C" DWORD EXPORT DrvExecute(ORACLE_CONN *pConn, ORACLE_STATEMENT *stmt, W
                errorText[DBDRV_MAX_ERROR_TEXT - 1] = 0;
        }
        MutexUnlock(pConn->mutexQueryLock);
+
+   if (stmt->batchMode)
+   {
+      stmt->batchMode = false;
+      stmt->batchBindings->clear();
+   }
+
        return dwResult;
 }
 
@@ -541,6 +813,7 @@ extern "C" void EXPORT DrvFreeStatement(ORACLE_STATEMENT *stmt)
        OCIHandleFree(stmt->handleError, OCI_HTYPE_ERROR);
        MutexUnlock(stmt->connection->mutexQueryLock);
        delete stmt->bindings;
+   delete stmt->batchBindings;
        delete stmt->buffers;
        free(stmt);
 }
index cddaa86..7c8dcd3 100644 (file)
 #include <dbdrv.h>
 #include <oci.h>
 
-typedef struct
+/**
+ * Fetch buffer
+ */
+struct ORACLE_FETCH_BUFFER
 {
        UCS2CHAR *pData;
    OCILobLocator *lobLocator;
        ub2 nLength;
        ub2 nCode;
        sb2 isNull;
-} ORACLE_FETCH_BUFFER;
+};
 
-typedef struct
+/**
+ * Database connection
+ */
+struct ORACLE_CONN
 {
        OCIEnv *handleEnv;
        OCIServer *handleServer;
@@ -65,23 +71,59 @@ typedef struct
        int nCols;
        char **columnNames;
    ub4 prefetchLimit;
-} ORACLE_CONN;
+};
 
-typedef struct
+/**
+ * Batch bind data for single column
+ */
+class OracleBatchBind
+{
+private:
+   int m_cType;
+   ub2 m_oraType;
+   int m_size;
+   int m_allocated;
+   int m_elementSize;
+   bool m_string;
+   UCS2CHAR **m_strings;
+   void *m_data;
+
+public:
+   OracleBatchBind(int cType, int sqlType);
+   ~OracleBatchBind();
+
+   void addRow();
+   void set(void *value);
+   void *getData();
+   int getElementSize() { return m_elementSize; }
+   int getCType() { return m_cType; }
+   ub2 getOraType() { return m_oraType; }
+};
+
+/**
+ * Statement
+ */
+struct ORACLE_STATEMENT
 {
        ORACLE_CONN *connection;
        OCIStmt *handleStmt;
        OCIError *handleError;
        Array *bindings;
+   ObjectArray<OracleBatchBind> *batchBindings;
        Array *buffers;
-} ORACLE_STATEMENT;
+   bool batchMode;
+   int batchSize;
+};
 
-typedef struct
+/**
+ * Result set
+ */
+struct ORACLE_RESULT
 {
        int nRows;
        int nCols;
        WCHAR **pData;
        char **columnNames;
-} ORACLE_RESULT;
+};
 
 #endif   /* _oracledrv_h_ */
index 1d64c2b..fb80159 100644 (file)
@@ -118,8 +118,11 @@ extern "C" WCHAR EXPORT *DrvPrepareStringW(const WCHAR *str)
  */
 extern "C" bool EXPORT DrvInit(const char *cmdLine)
 {
-   return sqlite3_threadsafe() &&      // Fail if SQLite compiled without threading support
-                   (sqlite3_initialize() == SQLITE_OK);
+   if (!sqlite3_threadsafe() ||        // Fail if SQLite compiled without threading support
+                (sqlite3_initialize() != SQLITE_OK))
+      return false;
+   sqlite3_enable_shared_cache(1);
+   return true;
 }
 
 /**
@@ -181,7 +184,16 @@ extern "C" DBDRV_STATEMENT EXPORT DrvPrepare(SQLITE_CONN *hConn, WCHAR *pwszQuer
    char *pszQueryUTF8 = UTF8StringFromWideString(pwszQuery);
    MutexLock(hConn->mutexQueryLock);
        sqlite3_stmt *stmt;
-       if (sqlite3_prepare_v2(hConn->pdb, pszQueryUTF8, -1, &stmt, NULL) != SQLITE_OK)
+
+retry:
+   int rc = sqlite3_prepare_v2(hConn->pdb, pszQueryUTF8, -1, &stmt, NULL);
+   if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      goto retry;
+   }
+       else if (rc != SQLITE_OK)
    {
                GetErrorMessage(hConn->pdb, errorText);
                stmt = NULL;
@@ -244,6 +256,7 @@ extern "C" DWORD EXPORT DrvExecute(SQLITE_CONN *hConn, sqlite3_stmt *stmt, WCHAR
        DWORD result;
 
        MutexLock(hConn->mutexQueryLock);
+retry:
        int rc = sqlite3_step(stmt);
        if ((rc == SQLITE_DONE) || (rc == SQLITE_ROW))
        {
@@ -257,6 +270,13 @@ extern "C" DWORD EXPORT DrvExecute(SQLITE_CONN *hConn, sqlite3_stmt *stmt, WCHAR
                   result = DBERR_OTHER_ERROR;
           }
        }
+   else if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      sqlite3_reset(stmt);
+      goto retry;
+   }
        else
        {
                GetErrorMessage(hConn->pdb, errorText);
@@ -285,10 +305,18 @@ static DWORD DrvQueryInternal(SQLITE_CONN *pConn, const char *pszQuery, WCHAR *e
    DWORD result;
 
    MutexLock(pConn->mutexQueryLock);
-   if (sqlite3_exec(pConn->pdb, pszQuery, NULL, NULL, NULL) == SQLITE_OK)
+retry:
+   int rc = sqlite3_exec(pConn->pdb, pszQuery, NULL, NULL, NULL);
+   if (rc == SQLITE_OK)
        {
                result = DBERR_SUCCESS;
        }
+   else if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      goto retry;
+   }
        else
        {
                GetErrorMessage(pConn->pdb, errorText);
@@ -384,7 +412,15 @@ extern "C" DBDRV_RESULT EXPORT DrvSelect(SQLITE_CONN *hConn, WCHAR *pwszQuery, D
    memset(result, 0, sizeof(SQLITE_RESULT));
 
        MutexLock(hConn->mutexQueryLock);
-   if (sqlite3_exec(hConn->pdb, pszQueryUTF8, SelectCallback, result, NULL) != SQLITE_OK)
+retry:
+   int rc = sqlite3_exec(hConn->pdb, pszQueryUTF8, SelectCallback, result, NULL);
+   if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      goto retry;
+   }
+   else if (rc != SQLITE_OK)
    {
                GetErrorMessage(hConn->pdb, errorText);
                DrvFreeResult(result);
@@ -414,7 +450,16 @@ extern "C" DBDRV_RESULT EXPORT DrvSelectPrepared(SQLITE_CONN *hConn, sqlite3_stm
        while(1)
        {
                int rc = sqlite3_step(stmt);
-               if (((rc == SQLITE_DONE) || (rc ==SQLITE_ROW)) && firstRow)
+
+      if (firstRow && ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE)))
+      {
+         // database locked by another thread, retry in 10 milliseconds
+         ThreadSleepMs(10);
+         sqlite3_reset(stmt);
+         continue;
+      }
+
+               if (((rc == SQLITE_DONE) || (rc == SQLITE_ROW)) && firstRow)
                {
                        firstRow = false;
                        for(int i = 0; i < nCols; i++)
@@ -550,11 +595,19 @@ extern "C" DBDRV_ASYNC_RESULT EXPORT DrvAsyncSelect(SQLITE_CONN *hConn, WCHAR *p
 
    pszQueryUTF8 = UTF8StringFromWideString(pwszQuery);
    MutexLock(hConn->mutexQueryLock);
-       if (sqlite3_prepare(hConn->pdb, pszQueryUTF8, -1, &hConn->pvm, NULL) == SQLITE_OK)
+retry:
+   int rc = sqlite3_prepare(hConn->pdb, pszQueryUTF8, -1, &hConn->pvm, NULL);
+       if (rc == SQLITE_OK)
    {
       hResult = hConn;
                *pdwError = DBERR_SUCCESS;
    }
+   else if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      goto retry;
+   }
    else
    {
                GetErrorMessage(hConn->pdb, errorText);
@@ -574,11 +627,20 @@ extern "C" bool EXPORT DrvFetch(DBDRV_ASYNC_RESULT hResult)
        if (hResult == NULL)
                return false;
 
-       if (sqlite3_step(((SQLITE_CONN *)hResult)->pvm) == SQLITE_ROW)
+retry:
+   int rc = sqlite3_step(((SQLITE_CONN *)hResult)->pvm);
+       if (rc == SQLITE_ROW)
        {
                ((SQLITE_CONN *)hResult)->nNumCols = sqlite3_column_count(((SQLITE_CONN *)hResult)->pvm);
                return true;
        }
+   else if ((rc == SQLITE_LOCKED) || (rc == SQLITE_LOCKED_SHAREDCACHE))
+   {
+      // database locked by another thread, retry in 10 milliseconds
+      ThreadSleepMs(10);
+      sqlite3_reset(((SQLITE_CONN *)hResult)->pvm);
+      goto retry;
+   }
        return false;
 }
 
@@ -652,7 +714,7 @@ extern "C" void EXPORT DrvFreeAsyncResult(DBDRV_ASYNC_RESULT hResult)
  */
 extern "C" DWORD EXPORT DrvBegin(SQLITE_CONN *pConn)
 {
-   return DrvQueryInternal(pConn, "BEGIN", NULL);
+   return DrvQueryInternal(pConn, "BEGIN IMMEDIATE", NULL);
 }
 
 /**
index 356add6..8ea3a34 100644 (file)
@@ -190,6 +190,8 @@ DB_DRIVER LIBNXDB_EXPORTABLE DBLoadDriver(const TCHAR *module, const TCHAR *init
    driver->m_fpDrvSetPrefetchLimit = (bool (*)(DBDRV_CONNECTION, int))DLGetSymbolAddrEx(driver->m_handle, "DrvSetPrefetchLimit", false);
        driver->m_fpDrvPrepare = (DBDRV_STATEMENT (*)(DBDRV_CONNECTION, const WCHAR *, DWORD *, WCHAR *))DLGetSymbolAddrEx(driver->m_handle, "DrvPrepare");
        driver->m_fpDrvFreeStatement = (void (*)(DBDRV_STATEMENT))DLGetSymbolAddrEx(driver->m_handle, "DrvFreeStatement");
+       driver->m_fpDrvOpenBatch = (bool (*)(DBDRV_STATEMENT))DLGetSymbolAddrEx(driver->m_handle, "DrvOpenBatch", false);
+       driver->m_fpDrvNextBatchRow = (void (*)(DBDRV_STATEMENT))DLGetSymbolAddrEx(driver->m_handle, "DrvNextBatchRow", false);
        driver->m_fpDrvBind = (void (*)(DBDRV_STATEMENT, int, int, int, void *, int))DLGetSymbolAddrEx(driver->m_handle, "DrvBind");
        driver->m_fpDrvExecute = (DWORD (*)(DBDRV_CONNECTION, DBDRV_STATEMENT, WCHAR *))DLGetSymbolAddrEx(driver->m_handle, "DrvExecute");
    driver->m_fpDrvQuery = (DWORD (*)(DBDRV_CONNECTION, const WCHAR *, WCHAR *))DLGetSymbolAddrEx(driver->m_handle, "DrvQuery");
index 8732c56..c976822 100644 (file)
@@ -52,6 +52,8 @@ struct db_driver_t
        bool (* m_fpDrvSetPrefetchLimit)(DBDRV_CONNECTION, int);
        DBDRV_STATEMENT (* m_fpDrvPrepare)(DBDRV_CONNECTION, const WCHAR *, DWORD *, WCHAR *);
        void (* m_fpDrvFreeStatement)(DBDRV_STATEMENT);
+       bool (* m_fpDrvOpenBatch)(DBDRV_STATEMENT);
+       void (* m_fpDrvNextBatchRow)(DBDRV_STATEMENT);
        void (* m_fpDrvBind)(DBDRV_STATEMENT, int, int, int, void *, int);
        DWORD (* m_fpDrvExecute)(DBDRV_CONNECTION, DBDRV_STATEMENT, WCHAR *);
        DWORD (* m_fpDrvQuery)(DBDRV_CONNECTION, const WCHAR *, WCHAR *);
index f0d26a3..c4f24a5 100644 (file)
@@ -1095,6 +1095,25 @@ const TCHAR LIBNXDB_EXPORTABLE *DBGetStatementSource(DB_STATEMENT hStmt)
    return hStmt->m_query;
 }
 
+/**
+ * Open batch
+ */
+bool LIBNXDB_EXPORTABLE DBOpenBatch(DB_STATEMENT hStmt)
+{
+   if (!IS_VALID_STATEMENT_HANDLE(hStmt) || (hStmt->m_driver->m_fpDrvOpenBatch == NULL))
+      return false;
+   return hStmt->m_driver->m_fpDrvOpenBatch(hStmt->m_statement);
+}
+
+/**
+ * Start next batch row batch
+ */
+void LIBNXDB_EXPORTABLE DBNextBatchRow(DB_STATEMENT hStmt)
+{
+   if (IS_VALID_STATEMENT_HANDLE(hStmt) && (hStmt->m_driver->m_fpDrvNextBatchRow != NULL))
+      hStmt->m_driver->m_fpDrvNextBatchRow(hStmt->m_statement);
+}
+
 /**
  * Bind parameter (generic)
  */
index d14da82..53c6089 100644 (file)
@@ -321,14 +321,16 @@ static void LoadGlobalConfig()
                // SQLite has troubles with multiple connections to the same database
                // from different threads, and it does not speed up database access
                // anyway, so we will not enable multiple connections for SQLite
-               if (g_dbSyntax != DB_SYNTAX_SQLITE)
+               //if (g_dbSyntax != DB_SYNTAX_SQLITE)
                {
                        g_flags |= AF_ENABLE_MULTIPLE_DB_CONN;
                }
+      /*
                else
                {
                        DbgPrintf(1, _T("Configuration parameter EnableMultipleDBConnections ignored because database engine is SQLite"));
                }
+      */
        }
        if (ConfigReadInt(_T("RunNetworkDiscovery"), 0))
                g_flags |= AF_ENABLE_NETWORK_DISCOVERY;
index 5ab39ed..dabdeba 100644 (file)
@@ -8,4 +8,4 @@
 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-SUBDIRS = include test-libnetxms
+SUBDIRS = include test-libnetxms test-libnxdb
index edb252e..e34f33a 100644 (file)
@@ -4,7 +4,12 @@
 /**
  * Assert failure
  */
-#define Assert(c) do { if (!(c)) { _tprintf(_T("FAIL\nAssert failed at %hs:%d\n"), __FILE__, __LINE__); exit(1); } } while(0)
+#define Assert(c) do { if (!(c)) { _tprintf(_T("FAIL\n   Assert failed at %hs:%d\n"), __FILE__, __LINE__); exit(1); } } while(0)
+
+/**
+ * Assert failure with additional message
+ */
+#define AssertEx(c, m) do { if (!(c)) { _tprintf(_T("FAIL\n   %s\n   Assert failed at %hs:%d\n"), (m), __FILE__, __LINE__); exit(1); } } while(0)
 
 /**
  * Assert that two values are equal
  */
 #define AssertTrue(x) Assert((x))
 
+/**
+ * Assert that value is TRUE with message
+ */
+#define AssertTrueEx(x, m) AssertEx((x), (m))
+
 /**
  * Assert that value is FALSE
  */
 #define AssertFalse(x) Assert(!(x))
 
+/**
+ * Assert that value is FALSE with message
+ */
+#define AssertFalseEx(x, m) AssertEx(!(x), (m))
+
 /**
  * Assert that value is NULL
  */
  */
 #define AssertNotNull(x) Assert((x) != NULL)
 
+/**
+ * Assert that value is not NULL with message
+ */
+#define AssertNotNullEx(x, m) AssertEx((x) != NULL, (m))
+
 /**
  * Show test start mark
  */
similarity index 57%
copy from tests/Makefile.am
copy to tests/test-libnxdb/Makefile.am
index 5ab39ed..ba0c876 100644 (file)
@@ -8,4 +8,13 @@
 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-SUBDIRS = include test-libnetxms
+bin_PROGRAMS = test-libnetxms
+test_libnxdb_SOURCES = test-libnxdb.cpp
+test_libnxdb_CPPFLAGS = -I@top_srcdir@/include -I../include
+test_libnxdb_LDADD = @top_srcdir@/src/libnetxms/libnetxms.la @top_srcdir@/src/db/libnxdb/libnxdb.la
+
+if USE_INTERNAL_LIBTRE
+test_libnxdb_LDADD += @top_srcdir@/src/libtre/libnxtre.la
+endif
+
+EXTRA_DIST = test-libnxdb.vcproj
diff --git a/tests/test-libnxdb/oracle.cpp b/tests/test-libnxdb/oracle.cpp
new file mode 100644 (file)
index 0000000..edaaee7
--- /dev/null
@@ -0,0 +1,96 @@
+#include <nms_common.h>
+#include <nms_util.h>
+#include <nxdbapi.h>
+#include <testtools.h>
+
+#define ORA_SERVER   _T("//127.0.0.1/XE")
+#define ORA_LOGIN    _T("netxms")
+#define ORA_PASSWORD _T("netxms")
+
+/**
+ * Test batches in Oracle
+ */
+void TestOracleBatch()
+{
+   /*** connect ***/
+   StartTest(_T("Connect to Oracle"));
+
+   DB_DRIVER drv = DBLoadDriver(_T("oracle.ddr"), _T(""), false, NULL, NULL);
+   AssertNotNull(drv);
+
+   TCHAR buffer[DBDRV_MAX_ERROR_TEXT];
+   DB_HANDLE session = DBConnect(drv, ORA_SERVER, NULL, ORA_LOGIN, ORA_PASSWORD, NULL, buffer);
+   AssertNotNull(session);
+
+   EndTest();
+
+   /*** drop test table if exist ***/
+   if (DBIsTableExist(session, _T("nx_test")) == DBIsTableExist_Found)
+      DBQuery(session, _T("DROP TABLE nx_test"));
+
+   /*** create test table ***/
+   StartTest(_T("Create test table"));
+   AssertTrueEx(DBQueryEx(session, _T("CREATE TABLE nx_test (id integer not null,value1 varchar(63), value2 integer, PRIMARY KEY(id))"), buffer), buffer);
+   AssertTrue(DBIsTableExist(session, _T("nx_test")) == DBIsTableExist_Found);
+   EndTest();
+
+   /*** insert single record ***/
+   StartTest(_T("Insert single record"));
+   DB_STATEMENT hStmt = DBPrepareEx(session, _T("INSERT INTO nx_test (id,value1,value2) VALUES (?,?,?)"), buffer);
+   AssertNotNullEx(hStmt, buffer);
+   DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, (INT32)0);
+   DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, WideStringFromMBString(__FILE__), DB_BIND_DYNAMIC);
+   DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, (INT32)42);
+   AssertTrueEx(DBExecuteEx(hStmt, buffer), buffer);
+   DBFreeStatement(hStmt);
+   EndTest();
+
+   /*** check record count ***/
+   StartTest(_T("Check record count"));
+   DB_RESULT hResult = DBSelectEx(session, _T("SELECT count(*) FROM nx_test"), buffer);
+   AssertNotNullEx(hResult, buffer);
+   AssertTrue(DBGetFieldLong(hResult, 0, 0) == 1);
+   DBFreeResult(hResult);
+   EndTest();
+
+   /*** do bulk insert ***/
+   StartTest(_T("Bulk insert"));
+   hStmt = DBPrepareEx(session, _T("INSERT INTO nx_test (id,value1,value2) VALUES (?,?,?)"), buffer);
+   AssertNotNullEx(hStmt, buffer);
+   AssertTrueEx(DBOpenBatch(hStmt), _T("Call to DBOpenBatch() failed"));
+   for(INT32 i = 1; i <= 110; i++)
+   {
+      DBNextBatchRow(hStmt);
+      if (i == 1)
+      {
+         DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, (INT32)42);
+      }
+      TCHAR *text = (TCHAR *)calloc(256, sizeof(TCHAR));
+      _sntprintf(text, 256, _T("i=%d ABCDEFGHIJKLMNO"), i);
+      text[i % 8 + 6] = 0;
+      DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, text, DB_BIND_DYNAMIC);
+      DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, i);
+   }
+   AssertTrueEx(DBExecuteEx(hStmt, buffer), buffer);
+   DBFreeStatement(hStmt);
+   EndTest();
+
+   /*** check record count after bulk insert ***/
+   StartTest(_T("Check record count"));
+   hResult = DBSelectEx(session, _T("SELECT count(*) FROM nx_test"), buffer);
+   AssertNotNullEx(hResult, buffer);
+   AssertTrue(DBGetFieldLong(hResult, 0, 0) == 111);
+   DBFreeResult(hResult);
+   EndTest();
+
+   /*** drop test table ***/
+   StartTest(_T("Drop test table"));
+   AssertTrue(DBQuery(session, _T("DROP TABLE nx_test")));
+   EndTest();
+
+   /*** disconnect ***/
+   StartTest(_T("Disconnect from Oracle"));
+   DBDisconnect(session);
+   DBUnloadDriver(drv);
+   EndTest();
+}
diff --git a/tests/test-libnxdb/test-libnxdb.cpp b/tests/test-libnxdb/test-libnxdb.cpp
new file mode 100644 (file)
index 0000000..b6e1d74
--- /dev/null
@@ -0,0 +1,17 @@
+#include <nms_common.h>
+#include <nms_util.h>
+#include <nxdbapi.h>
+#include <testtools.h>
+
+void TestOracleBatch();
+
+/**
+ * main()
+ */
+int main(int argc, char *argv[])
+{
+   DBInit(0, 0);
+
+   TestOracleBatch();
+   return 0;
+}
diff --git a/tests/test-libnxdb/test-libnxdb.vcproj b/tests/test-libnxdb/test-libnxdb.vcproj
new file mode 100644 (file)
index 0000000..2e1f254
--- /dev/null
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="8.00"
+       Name="test-libnxdb"
+       ProjectGUID="{CB4F1D89-AC66-49AF-9273-BA77D39E7707}"
+       RootNamespace="testlibnxdb"
+       Keyword="Win32Proj"
+       >
+       <Platforms>
+               <Platform
+                       Name="Win32"
+               />
+               <Platform
+                       Name="x64"
+               />
+       </Platforms>
+       <ToolFiles>
+       </ToolFiles>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="1"
+                       CharacterSet="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               AdditionalIncludeDirectories="..\include;..\..\include"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="2"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCWebDeploymentTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="1"
+                       CharacterSet="1"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               AdditionalIncludeDirectories="..\include;..\..\include"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+                               RuntimeLibrary="2"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="1"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCWebDeploymentTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Debug|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="1"
+                       CharacterSet="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               AdditionalIncludeDirectories="..\include;..\..\include"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="2"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCWebDeploymentTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="1"
+                       CharacterSet="1"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               AdditionalIncludeDirectories="..\include;..\..\include"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+                               RuntimeLibrary="2"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="1"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCWebDeploymentTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="Source Files"
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+                       >
+                       <File
+                               RelativePath=".\oracle.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\test-libnxdb.cpp"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Header Files"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+                       >
+                       <File
+                               RelativePath="..\include\testtools.h"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Resource Files"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+                       >
+               </Filter>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>