Skip to content

Commit

Permalink
modify db module
Browse files Browse the repository at this point in the history
  • Loading branch information
ubuntu14 committed Aug 22, 2015
1 parent 8bd3101 commit bc119e8
Show file tree
Hide file tree
Showing 28 changed files with 332 additions and 154 deletions.
4 changes: 2 additions & 2 deletions app/redis_tools/redis_builder/redis_builder_vc2012.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDll|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\lib_acl_cpp\include;..\..\..\lib_acl\include;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ACL_CPP_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ACL_CPP_DLL;ACL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<PrecompiledHeader>Create</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
Expand Down Expand Up @@ -279,7 +279,7 @@ copy ..\..\..\dist\lib\win32\lib_protocol.dll $(OutDir) /Y</Command>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\lib_acl_cpp\include;..\..\..\lib_acl\include;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;ACL_CPP_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;ACL_CPP_DLL;ACL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
Expand Down
1 change: 1 addition & 0 deletions app/wizard/tmpl/http/http_servlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ bool http_servlet::doPost(acl::HttpServletRequest& req,

res.setContentType("text/xml; charset=utf-8") // 设置响应字符集
.setKeepAlive(req.isKeepAlive()) // 设置是否保持长连接
.setContentEncoding(true) // 自动支持压缩传输
.setChunkedTransferEncoding(true); // 采用 chunk 传输方式

const char* param1 = req.getParameter("name1");
Expand Down
19 changes: 13 additions & 6 deletions lib_acl/src/stdlib/sys/acl_env.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,15 @@ void acl_clean_env(char **preserve_list)
#define STRING_AND_LENGTH(x, y) (x), (ssize_t) (y)

save_list = acl_argv_alloc(10);
for (cpp = preserve_list; *cpp; cpp++)
for (cpp = preserve_list; *cpp; cpp++) {
if ((eq = strchr(*cpp, '=')) != 0)
acl_argv_addn(save_list, STRING_AND_LENGTH(*cpp, eq - *cpp),
STRING_AND_LENGTH(eq + 1, strlen(eq + 1)), (char *) 0);
acl_argv_addn(save_list,
STRING_AND_LENGTH(*cpp, eq - *cpp),
STRING_AND_LENGTH(eq + 1, strlen(eq + 1)),
(char *) 0);
else if ((value = acl_safe_getenv(*cpp)) != 0)
acl_argv_add(save_list, *cpp, value, (char *) 0);
}

/*
* Truncate the process environment, if available. On some systems
Expand All @@ -66,7 +69,8 @@ void acl_clean_env(char **preserve_list)
#elif defined(ACL_WINDOWS)
if (!SetEnvironmentVariable(cpp[0], cpp[1]))
#endif
acl_msg_error("setenv(%s, %s): %s", cpp[0], cpp[1], acl_last_serror());
acl_msg_error("setenv(%s, %s): %s",
cpp[0], cpp[1], acl_last_serror());

/*
* Cleanup.
Expand Down Expand Up @@ -143,7 +147,8 @@ int acl_putenv(char *str)
}
if (!SetEnvironmentVariable(argv->argv[0], argv->argv[1])) {
acl_msg_error("%s(%d): putenv(%s, %s) error(%s)",
myname, __LINE__, argv->argv[0], argv->argv[1], acl_last_serror());
myname, __LINE__, argv->argv[0],
argv->argv[1], acl_last_serror());
return (-1);
}
return (0);
Expand Down Expand Up @@ -192,7 +197,8 @@ const char *acl_getenv_list(void)
ACL_VSTRING_TERMINATE(buf);
return (acl_vstring_str(buf));
#else
static acl_pthread_key_t buf_key = (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES;
static acl_pthread_key_t buf_key =
(acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES;
ACL_VSTRING *buf;
extern char **environ;
char **pptr = environ;
Expand All @@ -216,6 +222,7 @@ const char *acl_getenv_list(void)
acl_vstring_strcat(buf, *pptr);
pptr++;
}

return (acl_vstring_str(buf));
#endif
}
3 changes: 3 additions & 0 deletions lib_acl_cpp/changes.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
�޸���ʷ�б���

------------------------------------------------------------------------
348) 2015.8.20
348.1) compile: zlib_stream ���ڲ�ʹ���˶�̬���� zlib ��ķ�ʽ��

347) 2015.8.19
347.1) feature: db_handle/db_mysql ֧�������ύ�ӿ�

Expand Down
14 changes: 8 additions & 6 deletions lib_acl_cpp/include/acl_cpp/db/db_handle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,16 +302,16 @@ class ACL_CPP_API db_handle : public connect_client
virtual bool close() = 0;

/**
* 纯虚接口,子类必须实现此接口用于执行 SQL 语句
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* 纯虚接口,子类必须实现此接口用于执行 SELECT SQL 语句
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注意该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
virtual bool sql_select(const char* sql) = 0;

/**
* 纯虚接口,子类必须实现此接口用于执行 SQL 语句
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* 纯虚接口,子类必须实现此接口用于执行 INSERT/UPDATE/DELETE SQL 语句
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注意该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
Expand All @@ -331,15 +331,17 @@ class ACL_CPP_API db_handle : public connect_client

/**
* 更安全易用的查询过程,调用此函数功能等同于 sql_select,只是查询
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入,该方法
* 执行 SELECT SQL 语句
* @param query {query&}
* @return {bool} 执行是否成功
*/
bool exec_select(query& query);

/**
* 更安全易用的更新过程,调用此函数功能等同于 sql_update,只是查询
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入,该方法
* 执行 INSERT/UPDATE/DELETE SQL 语句
* @param query {query&}
* @return {bool} 执行是否成功
*/
Expand Down
8 changes: 4 additions & 4 deletions lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,16 @@ class ACL_CPP_API db_mysql : public db_handle

/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @param sql {const char*} 标准的 SELECT SQL 语句,非空,并且一定
* 得要注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
bool sql_select(const char* sql);

/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @param sql {const char*} 标准的 INSERT/UPDATE/DELETE SQL 语句,
* 并且一定得要注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
bool sql_update(const char* sql);
Expand Down
8 changes: 4 additions & 4 deletions lib_acl_cpp/include/acl_cpp/db/db_sqlite.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,16 @@ class ACL_CPP_API db_sqlite : public db_handle

/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @param sql {const char*} 标准的 SELECT SQL 语句,并且一定得要
* 注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
bool sql_select(const char* sql);

/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 SQL 语句,非空,并且一定得要注册该
* SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @param sql {const char*} 标准的 INSERT/UPDATE/DELETE SQL 语句,
* 并且一定得要注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
bool sql_update(const char* sql);
Expand Down
4 changes: 2 additions & 2 deletions lib_acl_cpp/include/acl_cpp/redis/redis_string.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,8 @@ class ACL_CPP_API redis_string : virtual public redis_command
* @return {bool} 操作是否成功
* if the command was executed correctly
*/
bool setbit(const char* key, unsigned offset, bool bit);
bool setbit(const char* key, size_t len, unsigned offset, bool bit);
bool setbit_(const char* key, unsigned offset, bool bit);
bool setbit_(const char* key, size_t len, unsigned offset, bool bit);

/**
* 对 key 所储存的字符串值,获取指定偏移量上的位(bit),当 offset 比字符串值
Expand Down
20 changes: 20 additions & 0 deletions lib_acl_cpp/include/acl_cpp/stdlib/zlib_stream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,15 @@ class ACL_CPP_API zlib_stream : public pipe_stream
*/
bool zip_reset();

/**
* 在压缩过程中可使用此函数计算数据的 crc32 校验值
* @param n {unsigned} 上次计算的校验和值,第一次时可写 0
* @param buf {const void*} 需要校验的数据地址,第一次使用时写 NULL
* @param dlen {size_t} buf 数据的长度,第一次使用时写 0
* @return {unsinged} 本次计算的校验和值
*/
unsigned crc32_update(unsigned n, const void* buf, size_t dlen);

/**
* 开始解压缩过程,如果采用流式解压缩方式,则调用顺序必须是:
* unzip_begin->unzip_update->unzip_finish,如果中间任何一个
Expand Down Expand Up @@ -224,6 +233,17 @@ class ACL_CPP_API zlib_stream : public pipe_stream
return zstream_;
}

/**
* 当采用动态加载方式加载动态库时,可以使用此函数设置动态库的加载全路径
*/
static void set_loadpath(const char* path);

/**
* 当设置了动态库的动态加载全路径时,可以通过本函数获得动态库加载全路径
* @return {const char*} 当未设置时则返回 NULL
*/
static const char* get_loadpath();

///////////////////////////////////////////////////////////////

bool pipe_zip_begin(zlib_level_t level = zlib_default,
Expand Down
20 changes: 10 additions & 10 deletions lib_acl_cpp/lib_acl_cpp_vc2003.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=".\include;..\lib_protocol\include;..\lib_acl\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;USE_WIN_ICONV"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;USE_WIN_ICONV;HAS_ZLIB_DLL;HAS_MYSQL_DLL"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
Expand Down Expand Up @@ -69,7 +69,7 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=".\include;..\lib_protocol\include;..\lib_acl\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV;HAS_ZLIB_DLL;HAS_MYSQL_DLL"
RuntimeLibrary="0"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="acl_stdafx.hpp"
Expand Down Expand Up @@ -708,19 +708,19 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y
RelativePath=".\src\db\mysql_conf.cpp">
</File>
<File
RelativePath=".\src\db\mysql_pool.cpp">
RelativePath=".\src\db\mysql_manager.cpp">
</File>
<File
RelativePath=".\src\db\mysql_manager.cpp">
RelativePath=".\src\db\mysql_pool.cpp">
</File>
<File
RelativePath=".\src\db\query.cpp">
</File>
<File
RelativePath=".\src\db\sqlite_pool.cpp">
RelativePath=".\src\db\sqlite_manager.cpp">
</File>
<File
RelativePath=".\src\db\sqlite_manager.cpp">
RelativePath=".\src\db\sqlite_pool.cpp">
</File>
</Filter>
<Filter
Expand Down Expand Up @@ -1251,19 +1251,19 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y
RelativePath=".\include\acl_cpp\db\mysql_conf.hpp">
</File>
<File
RelativePath=".\include\acl_cpp\db\mysql_pool.hpp">
RelativePath=".\include\acl_cpp\db\mysql_manager.hpp">
</File>
<File
RelativePath=".\include\acl_cpp\db\mysql_manager.hpp">
RelativePath=".\include\acl_cpp\db\mysql_pool.hpp">
</File>
<File
RelativePath=".\include\acl_cpp\db\query.hpp">
</File>
<File
RelativePath=".\include\acl_cpp\db\sqlite_pool.hpp">
RelativePath=".\include\acl_cpp\db\sqlite_manager.hpp">
</File>
<File
RelativePath=".\include\acl_cpp\db\sqlite_manager.hpp">
RelativePath=".\include\acl_cpp\db\sqlite_pool.hpp">
</File>
</Filter>
<Filter
Expand Down
8 changes: 4 additions & 4 deletions lib_acl_cpp/lib_acl_cpp_vc2008.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=".\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
Expand Down Expand Up @@ -111,7 +111,7 @@
EnableIntrinsicFunctions="true"
WholeProgramOptimization="false"
AdditionalIncludeDirectories=".\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="2"
Expand Down Expand Up @@ -176,7 +176,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=".\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
Expand Down Expand Up @@ -255,7 +255,7 @@
EnableIntrinsicFunctions="true"
WholeProgramOptimization="false"
AdditionalIncludeDirectories=".\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;HAS_MYSQL_DLL"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_WIN_ICONV;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;HAS_MYSQL_DLL;HAS_ZLIB_DLL"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="2"
Expand Down
8 changes: 4 additions & 4 deletions lib_acl_cpp/lib_acl_cpp_vc2010.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_MT;USE_WIN_ICONV;HAS_MYSQL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_MT;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
Expand All @@ -113,7 +113,7 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y</Command>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>.\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>acl_stdafx.hpp</PrecompiledHeaderFile>
Expand All @@ -134,7 +134,7 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y</Command>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_MT;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_MT;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
Expand Down Expand Up @@ -167,7 +167,7 @@ copy $(TargetName).pdb ..\dist\lib\win32\$(TargetName).pdb /Y
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.\include;..\lib_acl\include;..\lib_protocol\include;..\include\sqlite;..\include\zlib;..\include\mysql;.\src;..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_MT;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_MT;ACL_DLL;ACL_CPP_DLL;ACL_CPP_EXPORTS;USE_WIN_ICONV;HAS_MYSQL_DLL;HAS_ZLIB_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
Expand Down
Loading

0 comments on commit bc119e8

Please sign in to comment.