You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2017/09/26 23:48:29 UTC

[1/4] incubator-trafodion git commit: add json loading function

Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 0ff0d92a1 -> e1ae98fb0


add json loading function


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/2c71ae1d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/2c71ae1d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/2c71ae1d

Branch: refs/heads/master
Commit: 2c71ae1d18ec34e1a58c8bd1db698a9715d5db1b
Parents: 574452e
Author: SuJinpei <87...@qq.com>
Authored: Mon Sep 18 15:03:07 2017 +0800
Committer: SuJinpei <87...@qq.com>
Committed: Mon Sep 18 15:03:07 2017 +0800

----------------------------------------------------------------------
 core/conn/odb/Makefile                |   7 +-
 core/conn/odb/odb/odb.vcxproj         | 342 ++++++++--------
 core/conn/odb/odb/odb.vcxproj.filters |  92 +++--
 core/conn/odb/src/JsonReader.c        | 540 +++++++++++++++++++++++++
 core/conn/odb/src/JsonReader.h        | 142 +++++++
 core/conn/odb/src/odb.c               | 609 ++++++++++++++++++++++++++++-
 6 files changed, 1516 insertions(+), 216 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/Makefile
----------------------------------------------------------------------
diff --git a/core/conn/odb/Makefile b/core/conn/odb/Makefile
index 09936ce..1911d47 100644
--- a/core/conn/odb/Makefile
+++ b/core/conn/odb/Makefile
@@ -65,9 +65,9 @@ profile: CFLAGS_LNX += -DODB_PROFILE
 profile: LIBS_64luo += -lrt
 profile: generic 
 
-odb64luo: odb64luo.o mreadline.o memcpy_wrapper.o versodb.o
+odb64luo: odb64luo.o mreadline.o memcpy_wrapper.o versodb.o JsonReader.o
 	gcc -m64 -O2 -mtune=generic  -DODBC64 -DHDFS -DXML $(LDFLAGS_LNX) \
-		-o $(EXEC_64luo) bin/memcpy_wrapper.o bin/odb64luo.o bin/mreadline.o bin/versodb.o \
+		-o $(EXEC_64luo) bin/memcpy_wrapper.o bin/odb64luo.o bin/mreadline.o bin/versodb.o bin/JsonReader.o \
 		-D ODBBLD=$(ODBBLD_64luo) $(LIBPATH_64luo) $(INCPATH_64luo) $(LIBS_64luo) -o bin/odb64luo
 	tar -czf ../clients/odb64_linux.tar.gz bin/odb64luo README
 	ln -sf $(TRAF_HOME)/../conn/odb/bin/odb64luo $(TRAF_HOME)/export/bin$(SQ_MBTYPE)/odb64luo
@@ -92,6 +92,9 @@ memcpy_wrapper.o: memcpy_wrapper.c
 versodb.o: versodb.c
 	gcc -m64 -O2 -mtune=generic -g -c src/versodb.c $(INCPATH_64luo) -o bin/versodb.o
 
+JsonReader.o: JsonReader.c
+	gcc $(CFLAGS_LNX) -c src/JsonReader.c -o bin/JsonReader.o
+
 clean: 
 	rm -f bin/*.o bin/odb64luo
 	rm -f ../clients/odb64_linux.tar.gz

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/odb/odb.vcxproj
----------------------------------------------------------------------
diff --git a/core/conn/odb/odb/odb.vcxproj b/core/conn/odb/odb/odb.vcxproj
old mode 100644
new mode 100755
index 153cebe..61e964e
--- a/core/conn/odb/odb/odb.vcxproj
+++ b/core/conn/odb/odb/odb.vcxproj
@@ -1,171 +1,173 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{EB971278-DDE8-4A67-8433-D66A54D42FAD}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>odb</RootNamespace>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
-    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
-    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
-    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>$(ZlibIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <AdditionalLibraryDirectories>$(ZlibLibDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\memcpy_wrapper.c" />
-    <ClCompile Include="..\src\mreadline.c" />
-    <ClCompile Include="..\src\odb.c" />
-    <ClCompile Include="..\src\versodb.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\src\verslib.h" />
-    <ClInclude Include="resource.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="odb.rc" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{EB971278-DDE8-4A67-8433-D66A54D42FAD}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>odb</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
+    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
+    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>C:\zlib\include;$(IncludePath)</IncludePath>
+    <LibraryPath>C:\zlib\lib;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <AdditionalIncludeDirectories>$(ZlibIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>$(ZlibLibDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\src\JsonReader.c" />
+    <ClCompile Include="..\src\memcpy_wrapper.c" />
+    <ClCompile Include="..\src\mreadline.c" />
+    <ClCompile Include="..\src\odb.c" />
+    <ClCompile Include="..\src\versodb.c" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\src\JsonReader.h" />
+    <ClInclude Include="..\src\verslib.h" />
+    <ClInclude Include="resource.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="odb.rc" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/odb/odb.vcxproj.filters
----------------------------------------------------------------------
diff --git a/core/conn/odb/odb/odb.vcxproj.filters b/core/conn/odb/odb/odb.vcxproj.filters
old mode 100644
new mode 100755
index c5a0e1c..50cd90a
--- a/core/conn/odb/odb/odb.vcxproj.filters
+++ b/core/conn/odb/odb/odb.vcxproj.filters
@@ -1,44 +1,50 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\memcpy_wrapper.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\mreadline.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\odb.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\versodb.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\src\verslib.h">
-      <Filter>Source Files</Filter>
-    </ClInclude>
-    <ClInclude Include="resource.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="odb.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\src\memcpy_wrapper.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\mreadline.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\odb.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\versodb.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\JsonReader.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\src\verslib.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="resource.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\JsonReader.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="odb.rc">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/src/JsonReader.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.c b/core/conn/odb/src/JsonReader.c
new file mode 100755
index 0000000..d118ee8
--- /dev/null
+++ b/core/conn/odb/src/JsonReader.c
@@ -0,0 +1,540 @@
+#include "JsonReader.h"
+#include <errno.h>
+#include <string.h>
+
+JsonReader *jsonReaderNew(const char *path)
+{
+    JsonReader *pJsonReader = (JsonReader *)calloc(1, sizeof(JsonReader));
+    if (!pJsonReader) {
+        return NULL;
+    }
+
+    pJsonReader->jsonFile = fopen(path, "r");
+    if (!pJsonReader->jsonFile) {
+        free(pJsonReader);
+        return NULL;
+    }
+
+    strncpy(pJsonReader->jsonFileName, path, JSON_PARSER_MAX_FILE_NAME_LEN);
+    pJsonReader->nestDepth = 0;
+    pJsonReader->state = JSON_STATE_START;
+    pJsonReader->errorCode = JSON_SUCCESS;
+    pJsonReader->currentCharPtr = pJsonReader->buf;
+
+    return pJsonReader;
+}
+
+JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader)
+{
+    if (pJsonReader->isBufReady) {
+        ++pJsonReader->currentCharPtr;
+    }
+
+    if (pJsonReader->currentCharPtr == pJsonReader->buf + pJsonReader->numberReadBuf) {
+        if ((pJsonReader->numberReadBuf = fread(pJsonReader->buf, sizeof(char), JSON_PARSER_BUF_LEN, pJsonReader->jsonFile))) {
+            pJsonReader->currentCharPtr = pJsonReader->buf;
+            pJsonReader->isBufReady = true;
+        }
+        else {
+            pJsonReader->errorCode = JSON_ERROR_PARSE_EOF;
+        }
+    }
+
+    if (*(pJsonReader->currentCharPtr) == '\n') {
+        ++pJsonReader->lineNum;
+        pJsonReader->linePos = 0;
+    }
+    else {
+        ++pJsonReader->linePos;
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonSaveAndToState(JsonReader *pJsonReader, JsonReaderState state)
+{
+    if (pJsonReader->nestDepth < JSON_PARSER_MAX_NESTED_NUM) {
+        pJsonReader->statesSave[(pJsonReader->nestDepth)++] = pJsonReader->state;
+        pJsonReader->state = state;
+    }
+    else {
+        pJsonReader->errorCode = JSON_ERROR_DEPTH;
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonReaderSetTmpbuf(JsonReader *pJsonReader, char *buf, size_t len)
+{
+    pJsonReader->tmpSaveBuf = buf;
+    pJsonReader->bufLen = len;
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonReaderUnsetTmpbuf(JsonReader *pJsonReader)
+{
+    pJsonReader->tmpSaveBuf = NULL;
+    pJsonReader->bufLen = 0;
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseStateStart(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*(pJsonReader->currentCharPtr))) {
+            if (*pJsonReader->currentCharPtr == '{') {
+                pJsonReader->state = JSON_STATE_OBJECT_INITIAL;
+                break;
+            }
+            else if (*pJsonReader->currentCharPtr == '[') {
+                pJsonReader->state = JSON_STATE_ARRAY_INITIAL;
+                break;
+            }
+            else {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseObjectInitial(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*(pJsonReader->currentCharPtr))) {
+            switch (*pJsonReader->currentCharPtr)
+            {
+            case '"':
+                pJsonReader->state = JSON_STATE_MEMBER_KEY;
+                goto ret;
+            case '}':
+                pJsonReader->state = JSON_STATE_OBJECT_FINISH;
+                goto ret;
+            default:
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                goto ret;
+            }
+        }
+    }
+
+ret:
+    return pJsonReader->errorCode;
+}
+
+char *jsonGetStringValue(JsonReader *pJsonReader, char *strValue, size_t len)
+{
+    bool isEscape = 0;
+    size_t pos = 0;
+
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (isEscape) {
+            if (strValue && pos < len)
+                strValue[pos++] = *pJsonReader->currentCharPtr;
+            isEscape = false;
+        }
+        else {
+            switch (*pJsonReader->currentCharPtr) {
+            case '"':
+                if (strValue && pos < len)
+                    strValue[pos++] = '\0';
+                goto ret;
+            case '\\':
+                isEscape = true; 
+                break;
+            default:
+                if (strValue && pos < len)
+                    strValue[pos++] = *pJsonReader->currentCharPtr;
+                break;
+            }
+        }
+    }
+
+ret:
+    if (strValue)
+        strValue[len - 1] = '\0';
+    return strValue;
+}
+
+JsonReaderError jsonParseMemberKey(JsonReader *pJsonReader)
+{
+    jsonGetStringValue(pJsonReader, pJsonReader->tmpSaveBuf, pJsonReader->bufLen);
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*(pJsonReader->currentCharPtr))) {
+            if (*pJsonReader->currentCharPtr == ':') {
+                pJsonReader->state = JSON_STATE_KEY_VALUE_DELIMITER;
+                break;
+            }
+            else {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseKeyValueDelimiter(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*(pJsonReader->currentCharPtr))) {
+            switch (*(pJsonReader->currentCharPtr)) {
+            CASE_VALUE:
+                pJsonReader->state = JSON_STATE_MEMBER_VALUE;
+                goto ret;
+            case '[':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_ARRAY_INITIAL);
+                goto ret;
+            case '{':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_OBJECT_INITIAL);
+                goto ret;
+            default:
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                goto ret;
+            }
+        }
+    }
+ret:
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonInternalGetValue(JsonReader *pJsonReader, char *endChars, size_t len)
+{
+    const char *pBooleanOrNull = NULL;
+    // string
+    if (*pJsonReader->currentCharPtr == '"' && pJsonReader->tmpSaveBuf) {
+        jsonGetStringValue(pJsonReader, pJsonReader->tmpSaveBuf, pJsonReader->bufLen);
+    }
+    // maybe false,true,null
+    else if ((*pJsonReader->currentCharPtr == 'f' ? (pBooleanOrNull = "false") : 0) ||
+        (*pJsonReader->currentCharPtr == 't' ? (pBooleanOrNull = "true") : 0) ||
+        (*pJsonReader->currentCharPtr == 'n' ? (pBooleanOrNull = "null") : 0)) {
+        size_t lenBN = strlen(pBooleanOrNull);
+        size_t pos = 1;
+        while ((jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) && (pos < lenBN)) {
+            if (pBooleanOrNull[pos] != *pJsonReader->currentCharPtr) {
+                break;
+            }
+            ++pos;
+        }
+        if ((pos < lenBN) || (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr) &&
+            !IN_CHARS(*pJsonReader->currentCharPtr, endChars, lenBN))) {
+            pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+        }
+        if (pJsonReader->tmpSaveBuf) {
+            strncpy(pJsonReader->tmpSaveBuf, pBooleanOrNull, pJsonReader->bufLen);
+        }
+    }
+    // should be number
+    else {
+        size_t pos = 0;
+        do {
+            if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr) &&
+                !IN_CHARS(*pJsonReader->currentCharPtr, endChars, len)) {
+                if (pJsonReader->tmpSaveBuf && pos < pJsonReader->bufLen) {
+                    pJsonReader->tmpSaveBuf[pos++] = *pJsonReader->currentCharPtr;
+                }
+            }
+            else {
+                break;
+            }
+        } while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS);
+        if (pJsonReader->tmpSaveBuf) {
+            pJsonReader->tmpSaveBuf[pos < len ? pos : len] = '\0';
+        }
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseMemberValueEnd(JsonReader *pJsonReader)
+{
+    do {
+        if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+            if (*pJsonReader->currentCharPtr == ',') {
+                pJsonReader->state = JSON_STATE_MEMBER_DELIMITER;
+                break;
+            }
+            else if (*pJsonReader->currentCharPtr == '}') {
+                pJsonReader->state = JSON_STATE_OBJECT_FINISH;
+                break;
+            }
+            else if (*pJsonReader->currentCharPtr != '"') {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    } while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS);
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseElementEnd(JsonReader *pJsonReader)
+{
+    do {
+        if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+            if (*pJsonReader->currentCharPtr == ',') {
+                pJsonReader->state = JSON_STATE_ELEMENT_DELIMITER;
+                break;
+            }
+            else if (*pJsonReader->currentCharPtr == ']') {
+                pJsonReader->state = JSON_STATE_ARRAY_FINISH;
+                break;
+            }
+            else if (*pJsonReader->currentCharPtr != '"') {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    } while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS);
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseMemberValue(JsonReader *pJsonReader) {
+    
+    if (jsonInternalGetValue(pJsonReader, ",}", 2) == JSON_SUCCESS) {
+        jsonParseMemberValueEnd(pJsonReader);
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseMemberDelimiter(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+            if (*pJsonReader->currentCharPtr == '"') {
+                pJsonReader->state = JSON_STATE_MEMBER_KEY;
+                break;
+            }
+            else {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    }
+    
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseObjectFinish(JsonReader *pJsonReader)
+{
+    if (pJsonReader->nestDepth == 0) {
+        while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+            if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    }
+    else {
+        switch (pJsonReader->statesSave[--(pJsonReader->nestDepth)])
+        {
+        case JSON_STATE_ARRAY_INITIAL:
+        case JSON_STATE_ELEMENT_DELIMITER:
+            jsonMoveCurrentCharPtr(pJsonReader);
+            jsonParseElementEnd(pJsonReader);
+            break;
+        case JSON_STATE_KEY_VALUE_DELIMITER:
+            jsonMoveCurrentCharPtr(pJsonReader);
+            jsonParseMemberValueEnd(pJsonReader);
+            break;
+        default:
+            pJsonReader->errorCode = JSON_ERROR_STATE;
+            break;
+        }
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseArrayInitial(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+            switch (*pJsonReader->currentCharPtr)
+            {
+            case '{':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_OBJECT_INITIAL);
+                goto ret;
+            case '[':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_ARRAY_INITIAL);
+                goto ret;
+            case ']':
+                pJsonReader->state = JSON_STATE_ARRAY_FINISH;
+                goto ret;
+            CASE_VALUE:
+                pJsonReader->state = JSON_STATE_ELEMENT;
+                goto ret;
+            default:
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                goto ret;
+            }
+        }
+    }
+
+ret:
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseElement(JsonReader *pJsonReader)
+{
+    if (jsonInternalGetValue(pJsonReader, "],", 2) == JSON_SUCCESS) {
+        jsonParseElementEnd(pJsonReader);
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseElementDelimiter(JsonReader *pJsonReader)
+{
+    while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+        if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+            switch (*pJsonReader->currentCharPtr)
+            {
+            CASE_VALUE:
+                pJsonReader->state = JSON_STATE_ELEMENT;
+                goto ret;
+            case '[':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_ARRAY_INITIAL);
+                goto ret;
+            case '{':
+                jsonSaveAndToState(pJsonReader, JSON_STATE_OBJECT_INITIAL);
+                goto ret;
+            default:
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                goto ret;
+            }
+        }
+    }
+
+ret:
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParseArrayFinish(JsonReader *pJsonReader)
+{
+    if (pJsonReader->nestDepth == 0) {
+        while (jsonMoveCurrentCharPtr(pJsonReader) == JSON_SUCCESS) {
+            if (IS_NOT_WHITE_SPACE(*pJsonReader->currentCharPtr)) {
+                pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+                break;
+            }
+        }
+    }
+    else {
+        switch (pJsonReader->statesSave[--(pJsonReader->nestDepth)])
+        {
+        case JSON_STATE_KEY_VALUE_DELIMITER:
+            jsonMoveCurrentCharPtr(pJsonReader);
+            jsonParseMemberValueEnd(pJsonReader);
+            break;
+        case JSON_STATE_ELEMENT_DELIMITER:
+        case JSON_STATE_ARRAY_INITIAL:
+            jsonMoveCurrentCharPtr(pJsonReader);
+            jsonParseElementEnd(pJsonReader);
+            break;
+        default:
+            pJsonReader->errorCode = JSON_ERROR_BAD_FORMAT;
+            break;
+        }
+    }
+
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonReadKey(JsonReader *pJsonReader, char *keyBuf, size_t len)
+{
+    if (pJsonReader->state == JSON_STATE_MEMBER_KEY) {
+        jsonReaderSetTmpbuf(pJsonReader, keyBuf, len);
+        jsonParseMemberKey(pJsonReader);
+        jsonReaderUnsetTmpbuf(pJsonReader);
+    }
+    else {
+        pJsonReader->errorCode = JSON_ERROR_STATE;
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonReadMemberValue(JsonReader *pJsonReader, char *memberValbuf, size_t len)
+{
+    if (pJsonReader->state == JSON_STATE_MEMBER_VALUE) {
+        jsonReaderSetTmpbuf(pJsonReader, memberValbuf, len);
+        jsonParseMemberValue(pJsonReader);
+        jsonReaderUnsetTmpbuf(pJsonReader);
+    }
+    else {
+        pJsonReader->errorCode = JSON_ERROR_STATE;
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonReadArrayValue(JsonReader *pJsonReader, char *arrayValBuf, size_t len)
+{
+    if (pJsonReader->state == JSON_STATE_ELEMENT) {
+        jsonReaderSetTmpbuf(pJsonReader, arrayValBuf, len);
+        jsonParseElement(pJsonReader);
+        jsonReaderUnsetTmpbuf(pJsonReader);
+    }
+    else {
+        pJsonReader->errorCode = JSON_ERROR_STATE;
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonRead(JsonReader *pJsonReader) {
+    switch (pJsonReader->state)
+    {
+    case JSON_STATE_START:
+        jsonParseStateStart(pJsonReader);
+        break;
+    case JSON_STATE_OBJECT_INITIAL:
+        jsonParseObjectInitial(pJsonReader);
+        break;
+    case JSON_STATE_ARRAY_INITIAL:
+        jsonParseArrayInitial(pJsonReader);
+        break;
+    case JSON_STATE_MEMBER_KEY:
+        jsonParseMemberKey(pJsonReader);
+        break;
+    case JSON_STATE_ELEMENT:
+        jsonParseElement(pJsonReader);
+        break;
+    case JSON_STATE_KEY_VALUE_DELIMITER:
+        jsonParseKeyValueDelimiter(pJsonReader);
+        break;
+    case JSON_STATE_ELEMENT_DELIMITER:
+        jsonParseElementDelimiter(pJsonReader);
+        break;
+    case JSON_STATE_ARRAY_FINISH:
+        jsonParseArrayFinish(pJsonReader);
+        break;
+    case JSON_STATE_MEMBER_VALUE:
+        jsonParseMemberValue(pJsonReader);
+        break;
+    case JSON_STATE_MEMBER_DELIMITER:
+        jsonParseMemberDelimiter(pJsonReader);
+        break;
+    case JSON_STATE_OBJECT_FINISH:
+        jsonParseObjectFinish(pJsonReader);
+        break;
+    default:
+        break;
+    }
+    return pJsonReader->errorCode;
+}
+
+JsonReaderError jsonParse(JsonReader *pJsonReader)
+{
+    while ((pJsonReader->errorCode == JSON_SUCCESS)) {
+        jsonRead(pJsonReader);
+    }
+
+    return pJsonReader->errorCode;
+}
+
+void jsonReaderFree(JsonReader *pJsonReader)
+{
+    fclose(pJsonReader->jsonFile);
+    free(pJsonReader);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/src/JsonReader.h
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.h b/core/conn/odb/src/JsonReader.h
new file mode 100755
index 0000000..d23dc23
--- /dev/null
+++ b/core/conn/odb/src/JsonReader.h
@@ -0,0 +1,142 @@
+#ifndef JSONREADER_H
+#define JSONREADER_H
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define JSON_PARSER_BUF_LEN 1024
+#define JSON_PARSER_ERROR_MESSAGE_LEN 512
+#define JSON_PARSER_MAX_FILE_NAME_LEN 256
+#define JSON_PARSER_MAX_NESTED_NUM 100
+
+#ifndef bool
+#define bool unsigned char
+#endif // !_Bool
+
+#ifndef true
+#define true 1
+#endif // !true
+
+#ifndef false
+#define false 0
+#endif // !false
+
+
+enum JsonReaderState_
+{
+    JSON_STATE_START,
+    JSON_STATE_OBJECT_INITIAL,
+    JSON_STATE_ARRAY_INITIAL,
+    JSON_STATE_MEMBER_KEY,
+    JSON_STATE_ELEMENT,
+    JSON_STATE_KEY_VALUE_DELIMITER,
+    JSON_STATE_ELEMENT_DELIMITER,
+    JSON_STATE_ARRAY_FINISH,
+    JSON_STATE_MEMBER_VALUE,
+    JSON_STATE_MEMBER_DELIMITER,
+    JSON_STATE_OBJECT_FINISH,
+    JSON_STATE_FINISH
+};
+typedef enum JsonReaderState_ JsonReaderState;
+
+enum JsonReaderError_
+{
+    JSON_SUCCESS,
+    JSON_CONTINUE,
+    JSON_ERROR_DEPTH,
+    JSON_ERROR_PARSE_EOF,
+    JSON_ERROR_PARSE_UNEXPECTED,
+    JSON_ERROR_PARSE_NULL,
+    JSON_ERROR_PARSE_BOOLEAN,
+    JSON_ERROR_PARSE_NUMBER,
+    JSON_ERROR_PARSE_ARRAY,
+    JSON_ERROR_PARSE_OBJECT_KEY_NAME,
+    JSON_ERROR_PARSE_OBJECT_KEY_SEP,
+    JSON_ERROR_PARSE_OBJECT_VALUE_SEP,
+    JSON_ERROR_PARSE_STRING,
+    JSON_ERROR_PARSE_COMMENT,
+    JSON_ERROR_SIZE,
+    JSON_ERROR_STATE,
+    JSON_ERROR_BAD_FORMAT
+};
+typedef enum JsonReaderError_ JsonReaderError;
+
+#define IS_NOT_WHITE_SPACE(c) (((c)!=' ') && ((c)!='\t') && ((c)!='\n') && ((c)!='\r'))
+// 1 <= len <= 3
+#define IN_CHARS(c, cs, len) (((c) == (cs)[0]) || ((len) > 1 && (c) == (cs)[1]) || ((len) > 2 && (c) == (cs)[2]))
+#define CASE_VALUE case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '-':case 'f':case 't':case 'n':case '"'
+
+struct JsonReader_
+{
+    bool isBufReady;
+    FILE *jsonFile;
+    char *tmpSaveBuf; // save parsed contents.
+    size_t bufLen;
+    size_t nestDepth;
+    JsonReaderState state;
+    JsonReaderError errorCode;
+    char errorMsg[JSON_PARSER_ERROR_MESSAGE_LEN];
+    char buf[JSON_PARSER_BUF_LEN];
+    char *currentCharPtr;
+    char jsonFileName[JSON_PARSER_MAX_FILE_NAME_LEN];
+    size_t numberReadBuf;
+    size_t lineNum;
+    size_t linePos;
+    JsonReaderState statesSave[JSON_PARSER_MAX_NESTED_NUM];
+};
+
+typedef struct JsonReader_ JsonReader;
+
+JsonReader *jsonReaderNew(const char *path);
+
+JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader);
+
+JsonReaderError jsonSaveAndToState(JsonReader *pJsonReader, JsonReaderState state);
+
+JsonReaderError jsonReaderSetTmpbuf(JsonReader *pJsonReader, char *buf, size_t len);
+
+JsonReaderError jsonReaderUnsetTmpbuf(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseStateStart(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseObjectInitial(JsonReader *pJsonReader);
+
+char *jsonGetStringValue(JsonReader *pJsonReader, char *strValue, size_t len);
+
+JsonReaderError jsonParseMemberKey(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseKeyValueDelimiter(JsonReader *pJsonReader);
+
+JsonReaderError jsonInternalGetValue(JsonReader *pJsonReader, char *endChars, size_t len);
+
+JsonReaderError jsonParseMemberValueEnd(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseElementEnd(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseMemberValue(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseMemberDelimiter(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseObjectFinish(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseArrayInitial(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseElement(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseElementDelimiter(JsonReader *pJsonReader);
+
+JsonReaderError jsonParseArrayFinish(JsonReader *pJsonReader);
+
+JsonReaderError jsonReadKey(JsonReader *pJsonReader, char *keyBuf, size_t len);
+
+JsonReaderError jsonReadMemberValue(JsonReader *pJsonReader, char *memberValbuf, size_t len);
+
+JsonReaderError jsonReadArrayValue(JsonReader *pJsonReader, char *arrayValBuf, size_t len);
+
+JsonReaderError jsonRead(JsonReader *pJsonReader);
+
+JsonReaderError jsonParse(JsonReader *pJsonReader);
+
+void jsonReaderFree(JsonReader *pJsonReader);
+
+#endif //JSONREADER_H
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/2c71ae1d/core/conn/odb/src/odb.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/odb.c b/core/conn/odb/src/odb.c
index bf72f1b..23f7cad 100755
--- a/core/conn/odb/src/odb.c
+++ b/core/conn/odb/src/odb.c
@@ -63,6 +63,7 @@ char *odbauth = "Trafodion Dev <tr...@lists.launchpad.net>";
 #define RWBUFF_LEN  262144      /* default read/write buffer length */
 
 #include <zlib.h>
+#include "JsonReader.h"
 #define windowBits 15
 #define GZIP_ENCODING 16
 #define ENABLE_ZLIB_GZIP 32
@@ -511,6 +512,7 @@ struct execute {
 #ifdef XML
     char *xrt;                  /* load: xml row tag */
 #endif
+    char *jsonKey;              /* load: json key */
     unsigned int nl;            /* Null string length. Copy: number of loaders per extraction thread */
     unsigned int el;            /* Empty String Length. Copy: total number of loaders per grandparent (ps * nl) */
     unsigned int k;             /* load lines to skip. extract: returned rsds. Copy: grandparent ID */
@@ -682,6 +684,7 @@ static int etabout ( int eid , char *file );
 static void Oload(int eid);             /* load tables using etab entries #eid */
 static void Oload2(int eid);            /* fast load tables using etab entries #eid (only CSV with no map, no string qualifiers no escapes */
 static void OloadX(int eid);            /* load tables using etab entries #eid (only from XML) */
+static void OloadJson(int eid);         /* load tables using etab entries #eid (only from JSON) */
 static void Oextract(int eid);          /* extract tables using etab entries #eid */
 static void strmcpy(char *tgt, char *src, size_t len);
 static unsigned int strmcat(char *tgt, char *src, size_t len, char cas);
@@ -4019,6 +4022,8 @@ static void *Oruncmd(void *tid)
 #endif
                      if ( etab[eid].flg & 01000000 )
                     Oload ( eid ) ;     /* complex load */
+                else if (etab[eid].jsonKey)
+                    OloadJson ( eid ) ;
                 else
                     Oload2 ( eid );     /* simple (fast) CSV load */
                 break;
@@ -9264,6 +9269,604 @@ static void OloadX(int eid)
 }
 #endif
 
+/* OloadJson:
+*      load json files using parameters in etab[eid]
+*
+*      eid (I): etab entry ID to run
+*
+*      return: void
+*/
+static void OloadJson(int eid)
+{
+    int tid = etab[eid].id;     /* Thread ID */
+    SQLCHAR *Oins = 0;          /* INSERT Statement */
+    SQLCHAR *Odel = 0;          /* DELETE Statement */
+    SQLCHAR *O = 0;             /* ODBC temp variable for memory realloc */
+    SQLRETURN Or = 0;             /* ODBC return value */
+    unsigned long nw = 0,         /* no of wait cycles */
+        nt = 0,         /* No of total write cycles */
+        nrf = 0;        /* no of read records */
+    long telaps = 0,            /* Elapsed time in ms */
+        tinit = 0;             /* Initialization time in ms */
+    size_t nb = 0,              /* number of bytes read from input file */
+        cl = CMD_CHUNK,      /* INSERT command buffer length */
+        cmdl = 0,            /* INSERT command length */
+        dell = CMD_CHUNK,    /* DELETE command length */
+        ifl = 0;             /* input field length */
+    int z = 0;                  /* loop variable */
+    unsigned int nldr = 0,        /* number of loaders */
+        k = 0,           /* input file field number */
+        m = 0,         /* rowset array record index */
+        i = 0,           /* loop variable */
+        pstats = 0,    /* Error flag: 0 = print stats, 1 = don't print stats */
+        l = 0,           /* destination table fields */
+        j = 0;           /* loop variable */
+    int *ldrs = 0;                /* pointer to array containing loaders EIDs */
+    char buff[128];             /* buffer to build output file name */
+    char num[32];               /* Formatted Number String */
+    char tim[15];               /* Formatted Time String */
+    struct timeval tve;         /* timeval struct to define elapesd/timelines */
+    SQLCHAR *Odp = 0;           /* rowset buffer data pointer */
+    double seconds = 0;         /* seconds used for timings */
+    JsonReader *pJsonReader = 0; /* XML reader */
+    int readState = 0; /* 0: look for key, 1: look for array value */
+    char keybuf[128];
+    char valuebuf[1024];
+    /* Check if we have to use another ODBC connection */
+    if (thps[tid].cr > 0) {
+        thps[tid].Oc = thps[thps[tid].cr].Oc;
+        thps[tid].Os = thps[thps[tid].cr].Os;
+    }
+
+    /* Set "tgt" variable */
+    var_set(&thps[tid].tva, VTYPE_I, "tgt", etab[eid].tgt);
+
+    /* Run "pre" SQL */
+    if (etab[eid].pre) {
+        etab[eid].flg2 |= 020000000;           /* Oexec to allocate/use its own handle */
+        if (etab[eid].pre[0] == '@')          /* run a sql script */
+            z = runsql(tid, eid, 0, (etab[eid].pre + 1));
+        else                                    /* Run single SQL command */
+            z = Oexec(tid, eid, 0, 0, (SQLCHAR *)etab[eid].pre, "");
+        etab[eid].flg2 &= ~020000000;          /* reset Oexec to allocate/use its own handle */
+        if (z && etab[eid].flg & 0004)
+            goto oloadJson_exit;
+        etab[eid].nr = 0;   /* reset number of resulting rows */
+        (void)SQLFreeHandle(SQL_HANDLE_STMT, thps[tid].Os);
+        if (!SQL_SUCCEEDED(Or = SQLAllocHandle(SQL_HANDLE_STMT, thps[tid].Oc, &thps[tid].Os))) {
+            Oerr(eid, tid, __LINE__, Oc, SQL_HANDLE_DBC);
+            goto oloadJson_exit;
+        }
+    }
+
+    /* Check database type */
+    etab[eid].dbt = checkdb(eid, &thps[tid].Oc, NULL, NULL);
+
+    /* Check if truncate */
+    if (etab[eid].flg & 0002) {
+        etab[eid].flg &= ~0200000;      /* if truncate... unset ifempty */
+        if ((Odel = malloc(dell)) == (void *)NULL) {
+            fprintf(stderr, "odb [OloadJson(%d)] - Error allocating Odel memory: [%d] %s\n",
+                __LINE__, errno, strerror(errno));
+            goto oloadJson_exit;
+        }
+        strmcpy((char *)Odel, dbscmds[etab[eid].dbt].trunc, dell);
+        Odel = (SQLCHAR *)var_exp((char *)Odel, &dell, &thps[tid].tva);
+    }
+
+    /* check ifempty */
+    if (etab[eid].flg & 0200000) {    /* ifempty is set */
+        if (ifempty(eid, etab[eid].tgt)) {
+            fprintf(stderr, "odb [OloadJson(%d)] - Target table %s is not empty\n",
+                __LINE__, etab[eid].tgt);
+            etab[eid].post = 0; /* prevent post SQL execution */
+            goto oloadJson_exit;
+        }
+    }
+
+    /* Open input file */
+    for (i = j = 0; etab[eid].src[i] && i < sizeof(buff); i++) {
+        switch (etab[eid].src[i]) {
+        case '%':
+            switch (etab[eid].src[++i]) {
+            case 't':
+                j += strmcat(buff, (char *)etab[eid].Ocso[2], (size_t)etab[eid].buffsz, 2);
+                break;
+            case 'T':
+                j += strmcat(buff, (char *)etab[eid].Ocso[2], (size_t)etab[eid].buffsz, 1);
+                break;
+            case 's':
+                j += strmcat(buff, (char *)etab[eid].Ocso[1], (size_t)etab[eid].buffsz, 2);
+                break;
+            case 'S':
+                j += strmcat(buff, (char *)etab[eid].Ocso[1], (size_t)etab[eid].buffsz, 1);
+                break;
+            case 'c':
+                j += strmcat(buff, (char *)etab[eid].Ocso[0], (size_t)etab[eid].buffsz, 2);
+                break;
+            case 'C':
+                j += strmcat(buff, (char *)etab[eid].Ocso[0], (size_t)etab[eid].buffsz, 1);
+                break;
+            default:
+                fprintf(stderr, "odb [OloadJson(%d)] - Invalid expansion %%%c in %s\n",
+                    __LINE__, etab[eid].src[i], etab[eid].src);
+                goto oloadJson_exit;
+            }
+            break;
+        default:
+            buff[j++] = etab[eid].src[i];
+            break;
+        }
+    }
+    buff[j] = '\0';
+
+    /* Open input file */
+    if (etab[eid].jsonKey) {
+        if ((pJsonReader = jsonReaderNew(buff)) == NULL) {
+            fprintf(stderr, "odb [OloadJson(%d} - Error opening json input file %s\n", __LINE__, etab[eid].src);
+            goto oloadJson_exit;
+        }
+    }
+
+    /* Analyze target table */
+    z = Otcol(eid, &thps[tid].Oc);
+    if (z <= 0) {
+        fprintf(stderr, "odb [OloadJson(%d)] - Error analyzing target table %s.%s.%s\n",
+            __LINE__, etab[eid].Ocso[0], etab[eid].Ocso[1], etab[eid].Ocso[2]);
+        goto oloadJson_exit;
+    }
+    else {
+        l = (unsigned int)z;
+    }
+
+    /* Adjust Osize for WCHAR field (up to 4 bytes/char). Set buffer size */
+    if (etab[eid].dbt != VERTICA) {       /* Vertica's CHAR field length is in bytes (not chars) */
+        for (j = 0; j < l; j++) {
+            switch (etab[eid].td[j].Otype) {
+            case SQL_WCHAR:
+            case SQL_WVARCHAR:
+            case SQL_WLONGVARCHAR:
+                etab[eid].td[j].Osize *= etab[eid].bpwc;    /* Space for UTF-8 conversion */
+                break;
+            case SQL_CHAR:
+            case SQL_VARCHAR:
+            case SQL_LONGVARCHAR:
+                etab[eid].td[j].Osize *= etab[eid].bpc;/* Space for UTF-8 conversion */
+                break;
+            }
+        }
+    }
+
+    /* Determine buffer start positions and size */
+    for (j = 0; j < l; j++) {
+        etab[eid].td[j].start = etab[eid].s;
+#ifdef __hpux
+        if (etab[eid].td[j].Osize % WORDSZ)
+            etab[eid].td[j].pad = WORDSZ - etab[eid].td[j].Osize % WORDSZ;
+#endif
+        etab[eid].s += (etab[eid].td[j].Osize + etab[eid].td[j].pad + sizeof(SQLLEN));    /* space for length indicator */
+    }
+
+    /* Truncate target table */
+    if (etab[eid].flg & 0002) {   /* truncate target table */
+        if (f & 020000)   /* if verbose */
+            fprintf(stderr, "odb: Now truncating target table (%s)... ", (char *)Odel);
+        etab[eid].flg2 |= 020000000;           /* Oexec to allocate/use its own handle */
+        z = Oexec(tid, eid, 0, 0, Odel, "");    /* Run Truncate */
+        etab[eid].flg2 &= ~020000000;          /* reset Oexec to allocate/use its own handle */
+        if (j && etab[eid].flg & 0004) {
+            fprintf(stderr, "odb [OloadJson(%d)] - Error truncating Target table. Exiting because Stop On Error was set\n",
+                __LINE__);
+            goto oloadJson_exit;
+        }
+        if (etab[eid].cmt) {  /* Autocommit off: have to commit truncate */
+            if (!SQL_SUCCEEDED(Or = SQLEndTran(SQL_HANDLE_DBC, thps[tid].Oc, SQL_COMMIT))) {
+                Oerr(eid, tid, __LINE__, thps[tid].Oc, SQL_HANDLE_DBC);
+                goto oloadJson_exit;
+            }
+        }
+        etab[eid].nr = 0;   /* reset number of resulting rows */
+        if (f & 020000)   /* if verbose */
+            fprintf(stderr, "done\n");
+    }
+
+    /* Calculate rowset if buffer size is set */
+    if (etab[eid].rbs) {
+        etab[eid].r = etab[eid].rbs / etab[eid].s;
+        etab[eid].r = etab[eid].r < 1 ? 1 : etab[eid].r;    /* at least one record at a time  */
+    }
+    if (etab[eid].flg2 & 0001)    /* commit as multiplier */
+        etab[eid].cmt *= (int)etab[eid].r;
+
+    /* Build INSERT statement */
+    if ((Oins = malloc(cl)) == (void *)NULL) {
+        fprintf(stderr, "odb [OloadJson(%d)] - Error allocating Oins memory\n", __LINE__);
+        goto oloadJson_exit;
+    }
+
+    if (!strcasecmp(etab[eid].loadcmd, "UL"))
+    {
+        cmdl += snprintf((char *)Oins, cl, "UPSERT USING LOAD %s%sINTO %s%c%s%c%s VALUES(",
+            etab[eid].flg & 040000000 ? "/*+ DIRECT */ " : "",
+            etab[eid].flg2 & 0002 ? "WITH NO ROLLBACK " : "",
+            etab[eid].Ocso[0] ? (char *)etab[eid].Ocso[0] : " ",
+            etab[eid].Ocso[0] ? '.' : ' ',
+            etab[eid].Ocso[1] ? (char *)etab[eid].Ocso[1] : " ",
+            etab[eid].Ocso[1] ? '.' : ' ', (char *)etab[eid].Ocso[2]);
+    }
+    else if (!strcasecmp(etab[eid].loadcmd, "UP"))
+    {
+        cmdl += snprintf((char *)Oins, cl, "UPSERT %s%sINTO %s%c%s%c%s VALUES(",
+            etab[eid].flg & 040000000 ? "/*+ DIRECT */ " : "",
+            etab[eid].flg2 & 0002 ? "WITH NO ROLLBACK " : "",
+            etab[eid].Ocso[0] ? (char *)etab[eid].Ocso[0] : " ",
+            etab[eid].Ocso[0] ? '.' : ' ',
+            etab[eid].Ocso[1] ? (char *)etab[eid].Ocso[1] : " ",
+            etab[eid].Ocso[1] ? '.' : ' ', (char *)etab[eid].Ocso[2]);
+    }
+    else if (!strcasecmp(etab[eid].loadcmd, "IN"))
+    {
+        cmdl += snprintf((char *)Oins, cl, "INSERT %s%sINTO %s%c%s%c%s VALUES(",
+            etab[eid].flg & 040000000 ? "/*+ DIRECT */ " : "",
+            etab[eid].flg2 & 0002 ? "WITH NO ROLLBACK " : "",
+            etab[eid].Ocso[0] ? (char *)etab[eid].Ocso[0] : " ",
+            etab[eid].Ocso[0] ? '.' : ' ',
+            etab[eid].Ocso[1] ? (char *)etab[eid].Ocso[1] : " ",
+            etab[eid].Ocso[1] ? '.' : ' ', (char *)etab[eid].Ocso[2]);
+    }
+
+    for (i = 0; i < l; i++) {
+        if (i)
+            cl += strmcat((char *)Oins, ",", cl, 0);
+        cl += strmcat((char *)Oins, "?", cl, 0);
+        if (cmdl + CMD_CHUNK < cl) {  /* increase Oins buffer */
+            cl += CMD_CHUNK;
+            O = Oins;
+            if ((O = realloc(O, cl)) == (void *)NULL) {
+                fprintf(stderr, "odb [OloadJson(%d)] - Error re-allocating memory for Ocmd: [%d] %s\n",
+                    __LINE__, errno, strerror(errno));
+                goto oloadJson_exit;
+            }
+            Oins = O;
+        }
+    }
+    (void)strmcat((char *)Oins, ")", cl, 0);
+    if (f & 020000)   /* if verbose */
+        fprintf(stderr, "odb [OloadJson(%d)] - INSERT statement: %s\n", __LINE__, (char *)Oins);
+
+    /* Allocate loader eids array */
+    nldr = etab[eid].ps ? etab[eid].ps : 1;
+    if ((ldrs = (int *)calloc(nldr, sizeof(int))) == (void *)NULL) {
+        fprintf(stderr, "odb [OloadJson(%d)] - Error allocating loader eids array: [%d] %s\n",
+            __LINE__, errno, strerror(errno));
+        goto oloadJson_exit;
+    }
+
+    /* Initialize loader eids array */
+    if (etab[eid].ps) {
+        for (i = 0, j = 0; i < (unsigned int)no && j < etab[eid].ps; i++) {
+            if (etab[i].type == 'L' && etab[i].parent == eid) {
+                etab[i].r = etab[eid].r;    /* adjust rowset when rbs is specified */
+                etab[i].cmt = etab[eid].cmt;/* adjust rowset when cmt is a multiplier */
+                etab[i].lstat = 0;          /* reset buffer status to available */
+                etab[i].td = etab[eid].td;  /* copy table structure pointer */
+                ldrs[j++] = i;
+            }
+        }
+    }
+    else {
+        ldrs[0] = eid;
+    }
+
+    /* Allocate rowset & status memory */
+    if ((Odp = etab[eid].Orowsetl = (SQLCHAR *)calloc(etab[eid].r, etab[eid].s)) == (void *)NULL ||
+        (etab[eid].Ostatusl = (SQLUSMALLINT *)calloc(etab[eid].r, sizeof(SQLUSMALLINT))) == (void *)NULL) {
+        fprintf(stderr, "odb [OloadJson(%d)] - Error allocating rowset memory: [%d] %s\n",
+            __LINE__, errno, strerror(errno));
+        goto oloadJson_exit;
+    }
+    if (etab[eid].ps) {
+        for (j = 0; j < nldr; j++) {    /* for all loading threads... */
+            if ((etab[ldrs[j]].Orowsetl = (SQLCHAR *)calloc(etab[eid].r, etab[eid].s)) == (void *)NULL ||
+                (etab[ldrs[j]].Ostatusl = (SQLUSMALLINT *)calloc(etab[eid].r, sizeof(SQLUSMALLINT))) == (void *)NULL) {
+                fprintf(stderr, "odb [OloadJson(%d)] - Error allocating rowset memory: [%d] %s\n",
+                    __LINE__, errno, strerror(errno));
+                goto oloadJson_exit;
+            }
+        }
+    }
+
+    /* Set rowset size, bind parameters and prepare INSERT */
+    for (j = 0; j < nldr; j++) {
+        /* Set max commit mode */
+        if (etab[eid].cmt) {
+            if (!SQL_SUCCEEDED(Or = SQLSetConnectAttr(thps[etab[ldrs[j]].id].Oc,
+                SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_UINTEGER))) {
+                Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Oc, SQL_HANDLE_DBC);
+                goto oloadJson_exit;
+            }
+        }
+        else {
+            if (!SQL_SUCCEEDED(Or = SQLSetConnectAttr(thps[etab[ldrs[j]].id].Oc,
+                SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_UINTEGER))) {
+                Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Oc, SQL_HANDLE_DBC);
+                goto oloadJson_exit;
+            }
+        }
+        /* Set max char/varchar/binary column length */
+        if (!SQL_SUCCEEDED(Oret = SQLSetStmtAttr(thps[etab[ldrs[j]].id].Os, SQL_ATTR_MAX_LENGTH,
+            (SQLPOINTER)etab[eid].Omaxl, SQL_IS_UINTEGER))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+        }
+        /* Bind parameters */
+        if (!SQL_SUCCEEDED(Or = SQLSetStmtAttr(thps[etab[ldrs[j]].id].Os, SQL_ATTR_PARAM_BIND_TYPE,
+            (SQLPOINTER)(etab[eid].s), 0))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+            goto oloadJson_exit;
+        }
+        if (!SQL_SUCCEEDED(Or = SQLSetStmtAttr(thps[etab[ldrs[j]].id].Os, SQL_ATTR_PARAMSET_SIZE,
+            (SQLPOINTER)(etab[eid].r), 0))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+            goto oloadJson_exit;
+        }
+        if (!SQL_SUCCEEDED(Or = SQLSetStmtAttr(thps[etab[ldrs[j]].id].Os, SQL_ATTR_PARAM_STATUS_PTR,
+            etab[ldrs[j]].Ostatusl, 0))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+            goto oloadJson_exit;
+        }
+        if (!SQL_SUCCEEDED(Or = SQLSetStmtAttr(thps[etab[ldrs[j]].id].Os, SQL_ATTR_PARAMS_PROCESSED_PTR,
+            &etab[ldrs[j]].Oresl, 0))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+            goto oloadJson_exit;
+        }
+        for (i = 0, z = 1; i < l; i++) {
+            if (!SQL_SUCCEEDED(Or = SQLBindParameter(thps[etab[ldrs[j]].id].Os, (SQLUSMALLINT)z++,
+                SQL_PARAM_INPUT, SQL_C_CHAR, etab[eid].td[i].Otype, (SQLULEN)etab[eid].td[i].Osize,
+                etab[eid].td[i].Odec, &etab[ldrs[j]].Orowsetl[0 + etab[eid].td[i].start], etab[eid].td[i].Osize,
+                (SQLLEN *)&etab[ldrs[j]].Orowsetl[0 + etab[eid].td[i].start + etab[eid].td[i].Osize + etab[eid].td[i].pad]))) {
+                Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+                goto oloadJson_exit;
+            }
+        }
+        if (!SQL_SUCCEEDED(Or = SQLPrepare(thps[etab[ldrs[j]].id].Os, Oins, SQL_NTS))) {
+            Oerr(eid, tid, __LINE__, thps[etab[ldrs[j]].id].Os, SQL_HANDLE_STMT);
+            goto oloadJson_exit;
+        }
+        etab[ldrs[j]].sp = l;   /* save number of target table fields for prec */
+    }
+
+    /* Register Load Start Time */
+    gettimeofday(&tve, (void *)NULL);
+    tinit = 1000 * (tve.tv_sec - tvi.tv_sec) + (tve.tv_usec - tvi.tv_usec) / 1000;
+
+    /* Json load */
+    pstats = 1;    /* from now on print stats on exit */
+    while (pJsonReader->errorCode == JSON_SUCCESS) {
+        // read start
+        if (readState == 0) {
+            while (pJsonReader->errorCode == JSON_SUCCESS) {
+                if (pJsonReader->state == JSON_STATE_MEMBER_KEY) {
+                    jsonReadKey(pJsonReader, keybuf, sizeof(keybuf));
+                    if (pJsonReader->errorCode == JSON_SUCCESS && !strmicmp((char *)etab[eid].td[k].Oname, keybuf, strlen(keybuf))) {
+                        readState = 1;
+                        break;
+                    }
+                }
+                else {
+                    jsonRead(pJsonReader);
+                }
+            }
+        }
+        else {
+            // read rows
+            while (pJsonReader->errorCode == JSON_SUCCESS) {
+                if (pJsonReader->state == JSON_STATE_MEMBER_KEY) {
+                    jsonReadKey(pJsonReader, keybuf, sizeof(keybuf));
+                }
+                else if (pJsonReader->state == JSON_STATE_MEMBER_VALUE) {
+                    jsonReadMemberValue(pJsonReader, valuebuf, sizeof(valuebuf));
+                    ifl = strlen(valuebuf);
+
+                    for (k = 0; k < l; k++) {
+                        if (!strmicmp((char *)etab[eid].td[k].Oname, keybuf, strlen(keybuf))) {    /* name matches */
+                            Odp = etab[eid].Orowsetl + m*etab[eid].s + etab[eid].td[k].start;
+                            MEMCPY(Odp, valuebuf, ifl);
+                            Odp += etab[eid].td[k].Osize + etab[eid].td[k].pad;
+                            *((SQLLEN *)(Odp)) = (SQLLEN)(ifl);
+                            break;
+                        }
+                    }
+                }
+                else if (pJsonReader->state == JSON_STATE_OBJECT_FINISH) {
+                    ++m;
+                    jsonRead(pJsonReader);
+                }
+                else if (pJsonReader->state == JSON_STATE_ARRAY_FINISH) {
+                    readState = 0;
+                    break;
+                }
+                else {
+                    jsonRead(pJsonReader);
+                }
+            }
+        }
+
+        if (m == etab[eid].r) {                           /* Insert rowset */
+            nt++;
+            while (go) {
+                if (etab[eid].ps) {                       /* Find a buffer loader thread available */
+                    MutexLock(&etab[eid].pmutex);
+                    while (go) {
+                        for (i = 0; i < nldr; i++) {    /* Look for write_available buffers */
+                            if (etab[ldrs[i]].lstat == 0) {
+                                etab[ldrs[i]].lstat = 2;    /* write_busy */
+                                break;
+                            }
+                        }
+                        if (etab[eid].flg & 04000) {      /* Oloadbuff set error flag */
+                            break;
+                        }
+                        else if (i >= nldr) {           /* nothing available... wait */
+                            nw++;
+                            CondWait(&etab[eid].pcvp, &etab[eid].pmutex);
+                        }
+                        else {
+                            break;
+                        }
+                    }
+                    MutexUnlock(&etab[eid].pmutex);
+                    if (etab[eid].flg & 04000)            /* Oloadbuff set error flag */
+                        break;
+                    memcpy(etab[ldrs[i]].Orowsetl, etab[eid].Orowsetl, m * etab[eid].s);
+                    etab[ldrs[i]].nbs = nrf - (unsigned long)m;    /* pass the input file base row for this rowset */
+                    etab[ldrs[i]].lstat = 1;                /* read_available */
+                    etab[ldrs[i]].ar = m;
+                    CondWakeAll(&etab[eid].pcvc);
+                }
+                else {
+                    etab[ldrs[0]].nbs = nrf - (unsigned long)m;    /* pass the input file base row for this rowset */
+                    etab[ldrs[0]].ar = m;
+                    Oloadbuff(eid);
+                }
+                break;
+            }
+            if (etab[eid].flg & 04000)                    /* Oloadbuff set error flag */
+                break;
+            m = 0;
+            k = 0;
+        }
+    }
+    jsonReaderFree(pJsonReader);
+    /* load trailing rows */
+    if (m) {                          /* Insert rowset */
+        nt++;
+        while (go) {
+            if (etab[eid].ps) {                       /* Find a buffer loader thread available */
+                MutexLock(&etab[eid].pmutex);
+                while (go) {
+                    for (i = 0; i < nldr; i++) {    /* Look for write_available buffers */
+                        if (etab[ldrs[i]].lstat == 0) {
+                            etab[ldrs[i]].lstat = 2;    /* write_busy */
+                            break;
+                        }
+                    }
+                    if (etab[eid].flg & 04000) {      /* Oloadbuff set error flag */
+                        break;
+                    }
+                    else if (i >= nldr) {           /* nothing available... wait */
+                        nw++;
+                        CondWait(&etab[eid].pcvp, &etab[eid].pmutex);
+                    }
+                    else {
+                        break;
+                    }
+                }
+                MutexUnlock(&etab[eid].pmutex);
+                if (etab[eid].flg & 04000)            /* Oloadbuff set error flag */
+                    break;
+                memcpy(etab[ldrs[i]].Orowsetl, etab[eid].Orowsetl, m * etab[eid].s);
+                etab[ldrs[i]].nbs = nrf - (unsigned long)m;    /* pass the input file base row for this rowset */
+                etab[ldrs[i]].lstat = 1;                /* read_available */
+                etab[ldrs[i]].ar = m;
+                CondWakeAll(&etab[eid].pcvc);
+            }
+            else {
+                etab[ldrs[0]].nbs = nrf - (unsigned long)m;    /* pass the input file base row for this rowset */
+                etab[ldrs[0]].ar = m;
+                Oloadbuff(eid);
+            }
+            break;
+        }
+    }
+oloadJson_exit:
+    etab[eid].flg |= 02000;                 /* mark EOF */
+    if (etab[eid].ps) {                   /* wait all loaders to complete */
+        CondWakeAll(&etab[eid].pcvc);
+        MutexLock(&etab[eid].pmutex);
+        while (go) {
+            for (i = 0, k = 0; i < nldr; i++) {
+                k += etab[ldrs[i]].lstat;
+            }
+            if (k != nldr * 10)
+                CondWait(&etab[eid].pcvp, &etab[eid].pmutex);
+            else
+                break;
+        }
+        MutexUnlock(&etab[eid].pmutex);
+    }
+    telaps -= 1000 * tve.tv_sec + tve.tv_usec / 1000;
+    gettimeofday(&tve, (void *)NULL);       /* register end time */
+    telaps += 1000 * tve.tv_sec + tve.tv_usec / 1000;
+
+    for (i = 0; i < nldr; i++)
+        etab[eid].nrt += etab[ldrs[i]].nr;
+
+    /* Print results */
+    if (pstats) {
+        fprintf(stderr, "[%d] %s Load(X) statistics:\n\t[%d] Target table: %s.%s.%s\n",
+            tid, odbid, tid, etab[eid].Ocso[0], etab[eid].Ocso[1], etab[eid].Ocso[2]);
+        fprintf(stderr, "\t[%d] Source: %s\n", tid, etab[eid].src);
+        seconds = (double)tinit / 1000.0;
+        fprintf(stderr, "\t[%d] Pre-loading time: %s s (%s)\n", tid,
+            strmnum(seconds, num, sizeof(num), 3), strmtime(seconds, tim));
+        seconds = (double)telaps / 1000.0;
+        fprintf(stderr, "\t[%d] Loading time: %s s(%s)\n", tid,
+            strmnum(seconds, num, sizeof(num), 3), strmtime(seconds, tim));
+        fprintf(stderr, "\t[%d] Total records read: %s\n", tid, strmnum((double)nrf, num, sizeof(num), 0));
+        fprintf(stderr, "\t[%d] Total records inserted: %s\n", tid, strmnum((double)etab[eid].nrt, num, sizeof(num), 0));
+        fprintf(stderr, "\t[%d] Total number of columns: %s\n", tid, strmnum((double)l, num, sizeof(num), 0));
+        fprintf(stderr, "\t[%d] Average input row size: %s B\n", tid, strmnum((double)nb*1.0 / nrf, num, sizeof(num), 1));
+        fprintf(stderr, "\t[%d] ODBC row size: %s B (data)", tid, strmnum((double)(etab[eid].s - l * sizeof(SQLLEN)), num, sizeof(num), 0));
+        fprintf(stderr, " + %s B (len ind)\n", strmnum((double)(l * sizeof(SQLLEN)), num, sizeof(num), 0));
+        fprintf(stderr, "\t[%d] Rowset size: %s\n", tid, strmnum((double)etab[eid].r, num, sizeof(num), 0));
+        fprintf(stderr, "\t[%d] Rowset buffer size: %s KiB\n", tid, strmnum((double)etab[eid].s / 1024.0*etab[eid].r, num, sizeof(num), 2));
+        fprintf(stderr, "\t[%d] Load throughput (real data): %s KiB/s\n", tid, strmnum((double)nb / 1.024 / telaps, num, sizeof(num), 3));
+        fprintf(stderr, "\t[%d] Load throughput (ODBC): %s KiB/s\n", tid,
+            strmnum((double)((etab[eid].s - l * sizeof(SQLLEN))*etab[eid].nrt) / 1.024 / telaps, num, sizeof(num), 3));
+        if (etab[eid].ps) {
+            fprintf(stderr, "\t[%d] Reader Total/Wait Cycles: %s", tid, strmnum((double)nt, num, sizeof(num), 0));
+            fprintf(stderr, "/%s\n", strmnum((double)nw, num, sizeof(num), 0));
+        }
+    }
+
+    /* Unbind parameters (if parallel unbind is executed in Oloadbuff) */
+    if (!etab[eid].ps)
+        (void)SQLFreeStmt(thps[tid].Os, SQL_RESET_PARAMS);
+
+    /* Free Memory */
+    if (Odel)
+        free(Odel);
+    if (Oins)
+        free(Oins);
+    if (ldrs)     /* Free ldrs */
+        free(ldrs);
+    if (etab[eid].Orowsetl)       /* Free Orowsetl if allocated */
+        free(etab[eid].Orowsetl);
+    if (etab[eid].Ostatusl)       /* Free Ostatusl if allocated */
+        free(etab[eid].Ostatusl);
+    if (etab[eid].td) {
+        for (i = 0; i < l; i++)
+            free(etab[eid].td[i].Oname);
+        free(etab[eid].td);
+    }
+
+    /* Close bad file */
+    if (etab[eid].fo != stderr)
+        fclose(etab[eid].fo);
+
+    /* Run "post" SQL */
+    if (etab[eid].post) {
+        var_set(&thps[tid].tva, VTYPE_I, "tgt", etab[eid].tgt);
+        etab[eid].flg2 |= 020000000;           /* Oexec to allocate/use its own handle */
+        if (etab[eid].post[0] == '@')         /* run a sql script */
+            (void)runsql(tid, eid, 0, (etab[eid].post + 1));
+        else                                    /* Run single SQL command */
+            (void)Oexec(tid, eid, 0, 0, (SQLCHAR *)etab[eid].post, "");
+        etab[eid].flg2 &= ~020000000;          /* reset Oexec to allocate/use its own handle */
+    }
+    return;
+}
+
 /* Oloadbuff:
  *      load buffer pointed by etab[eid].Orowsetl 
  *
@@ -13642,7 +14245,11 @@ static int Otcol(int eid, SQLHDBC *Ocn)
                     //etab[no].loadcmd = &str[l];
                     strncpy(etab[no].loadcmd, &str[l], 2);
                     etab[no].loadcmd[2] = '\0';
-                } else {
+                } else if (type == 'l' && !strcmp(&str[n], "jsonkey")) {
+                    fprintf(stderr, "odb [parseopt(%d)] - Warning: this function is not fully tested \"%s\"\n", __LINE__, &str[n]);
+                    etab[no].jsonKey = &str[n];
+                }
+                else {
                     fprintf(stderr, "odb [parseopt(%d)] - Error: unknown parameter \"%s\"\n",
                         __LINE__, &str[n]);
                     no = tn = 0;        /* reset tn */


[4/4] incubator-trafodion git commit: Merge [TRAFODION-2726] PR 1237 odb support for JSON files

Posted by db...@apache.org.
Merge [TRAFODION-2726] PR 1237 odb support for JSON files


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/e1ae98fb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/e1ae98fb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/e1ae98fb

Branch: refs/heads/master
Commit: e1ae98fb0d16df9b7973344ded9825809d883cbc
Parents: 0ff0d92 0f8c3e2
Author: Dave Birdsall <db...@apache.org>
Authored: Tue Sep 26 23:47:25 2017 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Tue Sep 26 23:47:25 2017 +0000

----------------------------------------------------------------------
 core/conn/odb/Makefile                |   7 +-
 core/conn/odb/odb/odb.vcxproj         | 342 ++++++++--------
 core/conn/odb/odb/odb.vcxproj.filters |  92 +++--
 core/conn/odb/src/JsonReader.c        | 598 ++++++++++++++++++++++++++++
 core/conn/odb/src/JsonReader.h        | 301 ++++++++++++++
 core/conn/odb/src/odb.c               | 614 ++++++++++++++++++++++++++++-
 6 files changed, 1738 insertions(+), 216 deletions(-)
----------------------------------------------------------------------



[2/4] incubator-trafodion git commit: add license and comments

Posted by db...@apache.org.
add license and comments


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/e1959ad5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/e1959ad5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/e1959ad5

Branch: refs/heads/master
Commit: e1959ad54e9b44c49bddf7d659d30946d9079089
Parents: 2c71ae1
Author: SuJinpei <87...@qq.com>
Authored: Mon Sep 18 22:33:49 2017 +0800
Committer: SuJinpei <87...@qq.com>
Committed: Mon Sep 18 22:33:49 2017 +0800

----------------------------------------------------------------------
 core/conn/odb/src/JsonReader.c |  27 +++++-
 core/conn/odb/src/JsonReader.h | 168 +++++++++++++++++++++++++++++++++++-
 2 files changed, 192 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e1959ad5/core/conn/odb/src/JsonReader.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.c b/core/conn/odb/src/JsonReader.c
index d118ee8..df65170 100755
--- a/core/conn/odb/src/JsonReader.c
+++ b/core/conn/odb/src/JsonReader.c
@@ -1,4 +1,27 @@
-#include "JsonReader.h"
+//------------------------------------------------------------------
+//
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+#include "JsonReader.h"
 #include <errno.h>
 #include <string.h>
 
@@ -537,4 +560,4 @@ void jsonReaderFree(JsonReader *pJsonReader)
 {
     fclose(pJsonReader->jsonFile);
     free(pJsonReader);
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e1959ad5/core/conn/odb/src/JsonReader.h
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.h b/core/conn/odb/src/JsonReader.h
index d23dc23..e1420f1 100755
--- a/core/conn/odb/src/JsonReader.h
+++ b/core/conn/odb/src/JsonReader.h
@@ -1,3 +1,26 @@
+//------------------------------------------------------------------
+//
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
 #ifndef JSONREADER_H
 #define JSONREADER_H
 
@@ -87,56 +110,199 @@ struct JsonReader_
 
 typedef struct JsonReader_ JsonReader;
 
+/* jsonReaderNew: create a json reader
+ *
+ * path: path of json file
+ * return: pointer to json reader
+ */
 JsonReader *jsonReaderNew(const char *path);
 
+/* jsonMoveCurrentCharPtr: move current char pointer forward.
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader);
 
+/* jsonSaveAndToState: save and change parser state
+ *
+ * pJsonReader: pointer of json reader
+ * JsonReaderState : parser state
+ * return: json reader error code
+ */
 JsonReaderError jsonSaveAndToState(JsonReader *pJsonReader, JsonReaderState state);
 
+/* jsonReaderSetTmpbuf: set temp buffer to save parsed contents
+ *
+ * pJsonReader: pointer of json reader
+ * buf: the buf to save contents
+ * len: length of buf
+ * return: json reader error code
+ */
 JsonReaderError jsonReaderSetTmpbuf(JsonReader *pJsonReader, char *buf, size_t len);
 
+/* jsonReaderUnsetTmpbuf: unset tempbuf to save parsed contents.
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonReaderUnsetTmpbuf(JsonReader *pJsonReader);
 
+/* jsonParseStateStart: parse json file start
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseStateStart(JsonReader *pJsonReader);
 
+/* jsonParseObjectInitial: encuntered '{'
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseObjectInitial(JsonReader *pJsonReader);
 
+/* jsonGetStringValue: parse string value
+ *
+ * pJsonReader: pointer of json reader
+ * strValue: pointer to buf to save string
+ * len: length of strValue
+ * return: strValue
+ */
 char *jsonGetStringValue(JsonReader *pJsonReader, char *strValue, size_t len);
 
+/* jsonParseMemberKey: parse member key
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseMemberKey(JsonReader *pJsonReader);
 
+/* jsonParseKeyValueDelimiter: encountered key value delimiter
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseKeyValueDelimiter(JsonReader *pJsonReader);
 
+/* jsonInternalGetValue: common function to get string value
+ *
+ * pJsonReader: pointer of json reader
+ * endChars: encounter these chars function end
+ * len: length of end chars
+ * return: json reader error code
+ */
 JsonReaderError jsonInternalGetValue(JsonReader *pJsonReader, char *endChars, size_t len);
 
+/* jsonParseMemberValueEnd: parse member value end
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseMemberValueEnd(JsonReader *pJsonReader);
 
+/* jsonParseElementEnd: parse element value end
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseElementEnd(JsonReader *pJsonReader);
 
+/* jsonParseMemberValue: parse member value
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseMemberValue(JsonReader *pJsonReader);
 
+/* jsonParseMemberDelimiter: parse contents after member delimiter
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseMemberDelimiter(JsonReader *pJsonReader);
 
+/* jsonParseObjectFinish: parse contents after object finish
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseObjectFinish(JsonReader *pJsonReader);
 
+/* jsonParseArrayInitial: encounter '['
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseArrayInitial(JsonReader *pJsonReader);
 
+/* jsonParseElement: parse array element
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseElement(JsonReader *pJsonReader);
 
+/* jsonParseElementDelimiter: parse contents after array elements delimiter
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseElementDelimiter(JsonReader *pJsonReader);
 
+/* jsonParseArrayFinish: parse contents after array finish
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParseArrayFinish(JsonReader *pJsonReader);
 
+/* jsonReadKey: parse key
+ *
+ * pJsonReader: pointer of json reader
+ * keyBuf: buf to save key
+ * len: keyBuf length
+ * return: json reader error code
+ */
 JsonReaderError jsonReadKey(JsonReader *pJsonReader, char *keyBuf, size_t len);
 
+/* jsonReadMemberValue: parse member value
+ *
+ * pJsonReader: pointer of json reader
+ * memberValbuf: buf to save member value
+ * len: memberValbuf length
+ * return: json reader error code
+ */
 JsonReaderError jsonReadMemberValue(JsonReader *pJsonReader, char *memberValbuf, size_t len);
 
+/* jsonReadArrayValue: parse array value
+ *
+ * pJsonReader: pointer of json reader
+ * arrayValbuf: buf to save array value
+ * len: arrayValbuf length
+ * return: json reader error code
+ */
 JsonReaderError jsonReadArrayValue(JsonReader *pJsonReader, char *arrayValBuf, size_t len);
 
+/* jsonRead: parse stream to next state
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonRead(JsonReader *pJsonReader);
 
+/* jsonParse: parse stream to end if no error
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 JsonReaderError jsonParse(JsonReader *pJsonReader);
 
+/* jsonReaderFree: free json reader
+ *
+ * pJsonReader: pointer of json reader
+ * return: json reader error code
+ */
 void jsonReaderFree(JsonReader *pJsonReader);
 
-#endif //JSONREADER_H
\ No newline at end of file
+#endif //JSONREADER_H


[3/4] incubator-trafodion git commit: add error handling and improve robustness

Posted by db...@apache.org.
add error handling and improve robustness


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/0f8c3e23
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/0f8c3e23
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/0f8c3e23

Branch: refs/heads/master
Commit: 0f8c3e23f23f1728c0ec6675dc414b2e4bae3bdc
Parents: e1959ad
Author: SuJinpei <87...@qq.com>
Authored: Tue Sep 26 14:01:30 2017 +0800
Committer: SuJinpei <87...@qq.com>
Committed: Tue Sep 26 14:01:30 2017 +0800

----------------------------------------------------------------------
 core/conn/odb/src/JsonReader.c | 39 +++++++++++++++++++++++++++++++++++--
 core/conn/odb/src/JsonReader.h | 23 ++++++++--------------
 core/conn/odb/src/odb.c        |  5 +++++
 3 files changed, 50 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/0f8c3e23/core/conn/odb/src/JsonReader.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.c b/core/conn/odb/src/JsonReader.c
index df65170..c621651 100755
--- a/core/conn/odb/src/JsonReader.c
+++ b/core/conn/odb/src/JsonReader.c
@@ -38,7 +38,12 @@ JsonReader *jsonReaderNew(const char *path)
         return NULL;
     }
 
-    strncpy(pJsonReader->jsonFileName, path, JSON_PARSER_MAX_FILE_NAME_LEN);
+    pJsonReader->jsonFileName = (char *)malloc(strlen(path) + 1);
+    if (!pJsonReader->jsonFileName) {
+        return NULL;
+    }
+
+    strcpy(pJsonReader->jsonFileName, path);
     pJsonReader->nestDepth = 0;
     pJsonReader->state = JSON_STATE_START;
     pJsonReader->errorCode = JSON_SUCCESS;
@@ -47,6 +52,33 @@ JsonReader *jsonReaderNew(const char *path)
     return pJsonReader;
 }
 
+const char *jsonReaderErrorMessage(JsonReader *pJsonReader) {
+    switch (pJsonReader->errorCode)
+    {
+    case JSON_SUCCESS:
+        strcpy(pJsonReader->errorMessage, "success");
+        break;
+    case JSON_ERROR_DEPTH:
+        sprintf(pJsonReader->errorMessage, "nested depth exceeding limit of %d in file:%s, line:%lu, pos:%lu",
+            JSON_PARSER_MAX_NESTED_NUM, pJsonReader->jsonFileName, pJsonReader->lineNum, pJsonReader->linePos);
+        break;
+    case JSON_ERROR_PARSE_EOF:
+        strcpy(pJsonReader->errorMessage, "parse to end of file");
+        break;
+    case JSON_ERROR_STATE:
+        strcpy(pJsonReader->errorMessage, "error state");
+        break;
+    case JSON_ERROR_BAD_FORMAT:
+        sprintf(pJsonReader->errorMessage, "unexpected character in file:%s, line:%lu, pos:%lu",
+            pJsonReader->jsonFileName, pJsonReader->lineNum, pJsonReader->linePos);
+        break;
+    default:
+        strcpy(pJsonReader->errorMessage, "unexpected error code");
+        break;
+    }
+    return pJsonReader->errorMessage;
+}
+
 JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader)
 {
     if (pJsonReader->isBufReady) {
@@ -59,7 +91,7 @@ JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader)
             pJsonReader->isBufReady = true;
         }
         else {
-            pJsonReader->errorCode = JSON_ERROR_PARSE_EOF;
+            return (pJsonReader->errorCode = JSON_ERROR_PARSE_EOF);
         }
     }
 
@@ -559,5 +591,8 @@ JsonReaderError jsonParse(JsonReader *pJsonReader)
 void jsonReaderFree(JsonReader *pJsonReader)
 {
     fclose(pJsonReader->jsonFile);
+    if (pJsonReader->jsonFileName) {
+        free(pJsonReader->jsonFileName);
+    }
     free(pJsonReader);
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/0f8c3e23/core/conn/odb/src/JsonReader.h
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/JsonReader.h b/core/conn/odb/src/JsonReader.h
index e1420f1..1ed7d03 100755
--- a/core/conn/odb/src/JsonReader.h
+++ b/core/conn/odb/src/JsonReader.h
@@ -29,7 +29,6 @@
 
 #define JSON_PARSER_BUF_LEN 1024
 #define JSON_PARSER_ERROR_MESSAGE_LEN 512
-#define JSON_PARSER_MAX_FILE_NAME_LEN 256
 #define JSON_PARSER_MAX_NESTED_NUM 100
 
 #ifndef bool
@@ -65,20 +64,8 @@ typedef enum JsonReaderState_ JsonReaderState;
 enum JsonReaderError_
 {
     JSON_SUCCESS,
-    JSON_CONTINUE,
     JSON_ERROR_DEPTH,
     JSON_ERROR_PARSE_EOF,
-    JSON_ERROR_PARSE_UNEXPECTED,
-    JSON_ERROR_PARSE_NULL,
-    JSON_ERROR_PARSE_BOOLEAN,
-    JSON_ERROR_PARSE_NUMBER,
-    JSON_ERROR_PARSE_ARRAY,
-    JSON_ERROR_PARSE_OBJECT_KEY_NAME,
-    JSON_ERROR_PARSE_OBJECT_KEY_SEP,
-    JSON_ERROR_PARSE_OBJECT_VALUE_SEP,
-    JSON_ERROR_PARSE_STRING,
-    JSON_ERROR_PARSE_COMMENT,
-    JSON_ERROR_SIZE,
     JSON_ERROR_STATE,
     JSON_ERROR_BAD_FORMAT
 };
@@ -98,10 +85,10 @@ struct JsonReader_
     size_t nestDepth;
     JsonReaderState state;
     JsonReaderError errorCode;
-    char errorMsg[JSON_PARSER_ERROR_MESSAGE_LEN];
     char buf[JSON_PARSER_BUF_LEN];
+    char errorMessage[JSON_PARSER_ERROR_MESSAGE_LEN];
     char *currentCharPtr;
-    char jsonFileName[JSON_PARSER_MAX_FILE_NAME_LEN];
+    char *jsonFileName;
     size_t numberReadBuf;
     size_t lineNum;
     size_t linePos;
@@ -117,6 +104,12 @@ typedef struct JsonReader_ JsonReader;
  */
 JsonReader *jsonReaderNew(const char *path);
 
+/* jsonReaderErrorMessage: get json reader error message
+ * pJsonReader: pointer to json reader
+ * return: pointer to json reader
+ */
+const char *jsonReaderErrorMessage(JsonReader *pJsonReader);
+
 /* jsonMoveCurrentCharPtr: move current char pointer forward.
  *
  * pJsonReader: pointer of json reader

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/0f8c3e23/core/conn/odb/src/odb.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/odb.c b/core/conn/odb/src/odb.c
index 23f7cad..5d26c03 100755
--- a/core/conn/odb/src/odb.c
+++ b/core/conn/odb/src/odb.c
@@ -9736,6 +9736,11 @@ static void OloadJson(int eid)
             k = 0;
         }
     }
+
+    if (pJsonReader->errorCode != JSON_ERROR_PARSE_EOF) {
+        fprintf(stderr, "odb [OloadJson(%d)] - Error parse json file encountered error:%s\n", __LINE__, jsonReaderErrorMessage(pJsonReader));
+    }
+
     jsonReaderFree(pJsonReader);
     /* load trailing rows */
     if (m) {                          /* Insert rowset */