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 */