修改历史列表：

603) 2020.7.18 - 7.20
603.1) redis: 重构 redis_client_cluster/redis_command 类。

602) 2020.7.1
602.1) feature: ssl 模块及 http_request 支持 ssl SNI

601) 2020.5.5
601.1) bugfix: mbedtls_cond.cpp 中没有完全按 mbedtls 中的 config.h 的编译选项
MBEDTLS_THREADING_ALT 进行条件编译
601.2) feature: redis 模块支持 Redis6 的 SSL 加密通信方式，示例参见：
samples/redis/redis_ssl.

600) 2020.4.6
601.1) bugfix: http_ctype.cpp 中在分析 content-type 时，当为扩展类型时不能正确
地分析出 stype，原因是下标值取的不对。

599) 2020.2.16
599.1) bugfix: thread.cpp 中当线程类对象被反复使用启动时存在运行时内存泄露

598) 2020.1.12
598.1) workaround: 简化 acl::sslconf::open() 接口

597) 2020.1.2
597.1) feature: 完成对 mbedtls 新版本的功能支持及测试!

596) 2019.12.23
596.1) bugfix: 修复 http_aclient.cpp 中当启用 GZIP 压缩方式时的内存泄露问题

595) 2019.12.18
595.1) feature: 增加 sslbase_io/sslbase_conf 基础类，以方便扩展至其它 SSL 库

594) 2019.12.17
594.1) feature: 开始支持 mbedtls 。。。

593) 2019.12.12
593.1) feature: aio_listen_stream 增加了 reactor 模式，即 aio_listen_stream
可以同时支持 proactor 和 reactor 模式

592) 2019.10.31
592.1) bugfix: http_aclient.cpp 中当 HTTP 连接被重复使用时存在内存泄露问题，因为
http_res_ 及 hdr_res_ 未被及时释放

591) 2019.9.24
591.1) compile: 使用 cmake 编译的 .so 库不能正常使用，原因是使用了 -fvisibility=hidden
编译选项

590) 2019.9.17
590.1) bugfix: 在客户端模式下，需要在 http_aclient::ws_handshake() 中需要调用
set_frame_masking_key() 设置客户端发送数据的掩码

589) 2019.9.16
589.1) bugfix: aio_stream 类中 get_peer() / get_local() 返回有误
589.2) bugfix: redis_pubsub::get_message() 添加读超时时间

588) 2019.8.22
588.1) bugfix: socket_stream.cpp 中 get_ip() 方法在使用 std::string 时应该对
源串判空，否则会引起崩溃

587) 2019.8.20
587.1) optimize: 优化 aio_socket_stream/aio_istream/aio_ostream/aio_stream,
socket_stream/istream/ostream/stream 等类的成员变量，以降低类对象的尺寸大小

586) 2019.8.9
586.1) bugfix: http_aclient.cpp 通过 set_ws_key() 设置的 key 应该做 Base64 编码

585) 2019.8.8
585.1) feature: url_coder 支持值为空的场景

584) 2019.8.2
584.1) bugfix: atomic_long 整型原子数使用方法在 Windows 存在问题

583) 2019.7.27
583.1) bugfix: redis_set::spop 当键不存在或集合为空时应该返回 false

582) 2019.7.24
582.1) feature: fstream 新增静态方法 fsize 用来获取指定文件路径的文件大小
582.2) feature: ifstream 针对 load 新增不同重载接口
582.3) feature: ofstream::open_write 方法增加参数决定是否需要清空打开的文件

581) 2019.7.20
581.1) feature: HttpServletRequest 不再依赖 body_parse_ 参数，而是根据用户调用
getJson/getXml/getBody 时才会真正去读请求数据体，免得用户误用

580) 2019.7.12
580.1) feature: polarssl_io 支持引用计数为 0 时自动销毁

579) 2019.7.4
579.1) feature: http_client/HttpServletRequest 支持获得 HTTP 连接的 HTTP 版本
579.2) optimize: HTTP 相关类，针对 HTTP/1.1 传输，默认按长连接对待
579.3) feature: http_request/http_client 当使用者未设置 Host 字段时，默认按
HTTP/1.0 协议发送，以免服务端报错
579.4) feature: http_request::request 内部根据 data, len 参数及请求方法自动
设置请求头中的 Content-Length 字段

578) 2019.6.23
578.1) bugfix: http_request::get_body 当 out 类型为 string 时，因为 ps 对象提前
被释放而引起程序崩溃

577) 2019.6.20
577.1) feature: string 类支持连加功能

576) 2019.6.12
576.1) feature: http_header 类丰富了 cookie 的存取方法，可以存取 request 或
response 的 cookies

575) 2019.6.11
575.1) bugfix: websocket::set_frame_pong 中没有设置 payload length
575.2) bugfix: polarssl_io.cpp 中针对静态编译缺少函数声明，导致编译有错
575.3) feature: aio_istream/aio_ostream 分别提供输入参数为套接字句柄的构造方法，
方便将非阻塞管道纳入异步 IO 处理中

574) 2019.6.10
574.1) feature: http_aclient 类增加自动解压功能

573) 2019.6.9
573.1) feature: http_aclient 类增加针对 websocket 的支持

572) 2019.6.8
572.1) feature: redis_client/redis_client_pool/redis_client_cluster 支持 SSL 通信方式

571) 2019.6.5
571.1) feature: 新增 http_aclient 异步 HTTP 客户端类，支持异步远程解析 WEB 服务
器地址及异步连接 WEB 服务器获得响应数据，同时支持 SSL 通信方式

570) 2019.5.27
570.1) feature: db_handle/db_mysql/db_pgsql 支持获取字段值的长度
-- by 孙良灿(1142263518)

569) 2019.5.18
569.1) compile: 增加宏编译选项 ACL_CLIENT_ONLY，当将 acl 库用于客户端模式时可以有效地
减少编译库的大小

568) 2019.5.14
568.1) bugfix: redis_stream.cpp 中针对 XREADGROUP/XREAD 命令，当 block 为 0 时，
应该采用阻塞模式等待消息到达

567) 2019.5.9
567.1) safety & feature: 针对所有不允许拷贝复制的对象，增加了 noncopyable 限制，
以防止使用者因用错而造成的潜在问题

566) 2019.4.28
566.1: bugfix: server_socket 去掉一个容易引起歧义的构造方法

565) 2019.4.27
565.1) feature: redis_zset 类增加 zpopmin/zpopmax/bzpopmin/bzpopmax 命令支持

-----------------------------------------------------------------------

564) 2019.2.1
564.1) bugfix: scan_dir.cpp 当扫描的节点为目录时给的路径有误
564.2) feature: scan_dir.cpp 增加删除空目录功能

563) 2019.1.30
563.1) feature: thread::start() 增加同步启动线程的控制参数；在异步创建线程时，
如果创建者想通过 thread::thread_id() 获得新线程的线程 ID 号时，原来的方式还有
等待过程导致 1 秒延迟返回，现在通过 tbox 方式可以"立即"获得线程 ID 号

562) 2019.1.21
562.1) bugfix: connect_manager::check_idle() 当 pools_size 为 0 时应该直接返回

561) 2019.1.14
561.1) compatible: http_request::check_range() 在校验返回 range 数据字段时，
需要兼容返回值比预值小的情况

560) 2019.1.2
560.1) workaround: tbox.hpp, mbox.hpp 统一了 free_obj 缺省参数值

559) 2018.12.29
559.1) feature: http_request/http_client 类以 socket_stream 为参数的构造方法中，
增加控制参数 stream_fixed，决定当对象销毁时是否自动将 socket_stream 对象一起销毁

558) 2018.12.25
558.1) workaround: tbox::push 增加 bool 类型的返回值

557) 2018.12.19
557.1) feature: connect_pool 支持放置非自己创建的连接对象，同时支持在 peek 连接
时，仅从已有的连接中提取而不是创建新的连接

556) 2018.12.16
556.1) feature: connect_manager 连接池管理器可以更好地支持协程的多线程模式，
使用者仅需调用 connect_manager::bind_thread(true) 即可

555) 2018.12.12
555.1) bugfix: redis_stream::get_one_message 存在一处数据提取的错误

554) 2018.12.2
554.1) feature: redis_stream 功能模块单元测试基本 OK :)
554.2) feature: redis_stream 功能模块压力测试 OK
554.3) bugfix: 552.1) 修复的 bug 有问题？

553) 2018.11.28
553.1) feature: master_thread.cpp 增加 task_qlen() 方便用户获得当前线程池任务
队列中积压的任务数; 增 threads_pool() 方法用来获得 lib_acl C 库中的线程池句柄

552) 2018.11.22
552.1) bugfix: sha1::result 的参数应该为 unsigned char*
--- by dawei.lin@net263.com

551) 2018.11.14
551.1) feature: 增加 redis_stream::claim and claim_with_justid 方法用来支持 CLAIM 命令

550) 2018.11.12
550.1) feature: 增加 redis_stream::xpending_xxx 方法用来支持 XPENDING 命令

549) 2018.11.11
549.1) feature: 增加 redis_stream::xinfo 命令

548) 2018.11.8
548.1) feature: 增加 redis_stream 中的 xtrim, xdel, xrange, xrevrange, xlen, xack 命令

547) 2018.11.7
547.1) feature: 增加 redis_stream::xreadgroup 命令

546) 2018.11.6
546.1) feature: 开始增加针对 redis_stream 的支持
546.2) feature: 添加 redis_stream::xread 命令

545) 2018.10.21
545.1) feature: redis_client, redis_client_pool 在非集群模式下创建连接时自动选择db
545.2) feature: websocket::send_frame_data 在被循环调用时需检查长度是否一致，
且需要根据实际写入的帧长度设置掩码

544) 2018.10.20
544.1) bugfix: websocket::read_frame_data 被循环调用时，掩码使用方式有误
544.2) bugfix: WebSocketServlet.cpp 中有多个成员变量未初始化

543) 2018.10.8
543.1) feature: server_socket 构造方法分开多个，避免使用时产生歧义
543.2) feature: master_udp 增加 proc_on_unbind 虚方法，用于当套接口关闭前的回调

542) 2018.10.7
542.1) feature: acl::string 添加 end_with 方法

541) 2018.9.25
541.1) bugfix: master_aio/master_threads 在添加 server_socket 时，应该加锁

540) 2018.9.22
540.1) feature: server_socket 类的构造函数中新增标志位 OPEN_FLAG_EXCLUSIVE 用
来控制创建监听套接口是否禁止地址复用，缺省是允许地址复用

539) 2018.9.21
539.1) bugfix: master_udp::service_on_bind 被多线程同时调用时，需要对成员变量
sstream_ 加锁保护

538) 2018.9.16
538.1) feature: acl::socket_stream 增加 sock_type 来判断 socket 类型

537) 2018.9.8
537.1) bugfix: acl::string::begin_with 判断方法有误

536) 2018.9.2
536.1) feature: 添加 sqlite_cursor 类，从而使 db_sqlite 支持 Sqlite 游标功能

535) 2018.8.19
535.1) feature: 添加 token_tree 类，该类封装了 C 版的 256 叉匹配树算法

534) 2018.8.17
534.1) workaround: thread_cond::wait, server_socket::accept 参数含义发生改变

533) 2018.8.7
533.1) bugfix: db_mysql.cpp, 如果在执行操作的时候，发现跟mysql已经断开链接了，
就会重连，万一在连接时间内都没有重连成功，就会释放掉MYSQL*指针，造成这个连接对象
永不可用了。因为dbmysql::sane_mysql_query函数判断conn_为null就直接返回了
--- young_hb

532) 2018.8.2
532.1) bugfix: gson_helper.ipp 在处理空数组时有误

531) 2018.7.27
531.1) feature: tbox 模板类允许传递空消息对象

530) 2018.7.24
530.1) bugfix: json 序列化工具对 double/float 类型且值不带小数部分时的支持不够
完善，通过在 acl::json_node::is_double 增加针对整数的支持得以解决

530.2) feature: acl::string 支持更多与 std::string 之间的互相操作

529) 2018.7.10
529.1) bugfix: acl::HttpServlet 当 session 对象内部创建时，需在析构函数里将其
释放，否则会造成内存泄露。

528) 2018.7.5
528.1) feature: acl::fstream 增加文件锁方法

527) 2018.6.29
527.1) bugfix: acl::thread 线程对象被创建时，默认采用非分离状态，以便于和操作
系统的 API 行为相近，原来采用的是分离状态。

526) 2018.6.28
526.1) feature: tbox 类完全由 C++ 模板类实现，不再依赖于 C 版中的消息队列，
代码更简洁清晰

525) 2018.6.15
525.1) feature: thread_cond 类中的 wait 方法参加参数 locked，内部会先判断该
参数决定是否需要加锁

524) 2018.6.4
524.1) feature: connect_monitor 类增加三个虚方法：on_connected, on_refused,
on_timeout

523) 2018.5.31
523.1) sqlite: sqlite 库升级到 3.23.1 版本

522) 2018.5.23
522.1) bugfix: redis_key::renamenx 返回值类型有误

521) 2018.5.14
521.1) feature: redis_client_cluster 增加新方法 get_password/get_passwords
521.2) feature: connect_manager 增加 check_idle 用来检测并释放过期空闲连接

-----------------------------------------------------------------------

520) 2018.5.6
520.1) bugfix: redis_pubsub.cpp 中，对于同一个连接同时订阅多个频道的情况，如果
某一频道已经在生产数据时，如果该连接订阅另外频道时则可能会先收到某频道的消息而
导致新订阅频道的响应数据与消息重叠，而无法判断是订阅响应还是消息响应，从而导致
出错，现在的策略时，在订阅命令发出过程中如果收到了已订阅频道的消息则忽略该消息

519) 2018.5.4
519.1) bugfix: 420.1 中引入的特性会导致 redis_pubsub.cpp 模块出现内存非法访问
问题，主要原因为在 redis_command::run 内部自动调用了清理临时内存过程，但该 run
方法返回后，在 redis_pubsub.cpp 里又会引用前面分配的临时内存，从而造成内存非法
使用，所以去掉了 420.1 的新增特性，所以当使用者反复使用一个 redis_xxx 命令时，
应该自己注意及时调用 clear 方法以清理临时内存，以免引起内存临时性浪费（虽然类
对象退出时，该临时内存会被释放掉）

-----------------------------------------------------------------------
518) 2018.4.27
518.1) feature: 针对 HTTP 请求 uri 中的 "?" 问号被转义成 "%3F" 的情况，可以做兼容性处理

517) 2018.4.19
517.1) feature: 添加 diff_xxx 类对象集，用来快速对比两个集合的差集

516) 2018.4.12
516.1) workaroud: thread_cond::wait 当等待超时时不必记录日志信息

515) 2018.4.8
515.1) bugfix: acl::thread 对象被重复使用时(即线程退出后再次调用 start)，需要
将 thread_id_ 置 0 --- by 562351190@qq.com

514) 2018.3.22
514.1) feature: add redis_role class

513) 2018.3.20
513.1) feature: atomic_long 类增加赋值拷贝重载功能，同时禁止构造拷贝功能

512) 2018.3.19
512.1) bugfix: thread_cond.cpp 中的方法 wait 内部计算时间有误

511) 2018.3.19
511.1) feature: add redis_sentinel class

510) 2018.2.22
510.1) bugfix: serialize/gsoner.cpp 针对 std::map 类型的数据对象不支持 optional

509) 2018.2.13
509.1) bugfix: server_socket 中的 buf_ 为固定 64 字节大小，对于 UNIX 域套接口
是不够用的，将其类型改为 acl::string

508) 2018.2.5
508.1) bugfix: redis_client.cpp 中当连接需要认证时，如果因网络或其它原因可能会造成
认证死循环状态，通过增加标志位成员(authing_) 以防止循环认证

507) 2018.2.1
507.1) bugfix: redis_client_cluster::set_all_slot 方法不支持连接认证功能

506) 2018.1.29
506.1) feature: server_socket 类支持 SO_REUSEPORT

505) 2018.1.9
505.1) feature: aio_handle 类增加方法 last_nready 用来获得本次事件循环触发的事件数

504) 2018.1.1
504.1) feature: redis_cluster class can support redis.4.x.x for command:
"CLUSTER NODES" as show below:
d52ea3cb4cdf7294ac1fb61c696ae6483377bcfc 127.0.0.1:16385@116385 master - 0 1428410625374 73 connected 5461-10922

503) 2017.12.14
503.1) compile: 使用 cmake 编译时报错

502) 2017.12.7
502.1) bugfix: polarssl_conf.cpp 将库的初始化放在构造函数之外，以应对应用不同的
使用方式

501) 2017.12.5
501.1) bugfix: redis 模块中有些命令类对于二进制的数据支持存在问题

500) 2017.12.2
500.1) bugfix: polarssl_conf.cpp 在动态加载 polarssl 库时，如果应用定义了全局
的 acl::polarssl_conf 对象，则会因 polarssl_conf 类内部的 __polarssl_path 也是
静态全局的，编译器在构建此两个对象时的顺序是先构造应用的 polarssl_conf 对象而
后构造 __polarssl_path，从而导致 polarssl_conf 在构造时会引起崩溃

499) 2017.11.14
499.1) feature: 增加 tbox 类，用于在多线程环境中传递消息对象

498) 2017.11.7
498.1) bugfix: string.cpp 中在重载 < 和 > 符号时，应取最小长度值进行比较，但
内部却误写成取最长长度进行比较，容易造成内存非法访问

497) 2017.10.26
497.1) bugfix: redis_hash.cpp 中当调用 hmset 命令时有一处填写了错误的命令字

496) 2017.10.6
496.1) feature: 添加新类 event_mutex，该类以原子操作 + IO 事件方式支持线程级
或协程级的互斥功能

495) 2017.9.29
495.1) feature: thread_mutex 将是否创建递归锁做为构造参数选项

494) 2017.9.28
494.1) valgrind: 在 master_base.cpp 中的析构函数中需要释放掉一些全局内存对象，
以免让 valgrind 产生误报而干扰应用进程中真正的内存问题

493) 2017.9.21
493.1) bitmap 类中的方法名可能与其它系统冲突

492) 2017.9.18
492.1) feature: 增加 trigger.hpp 文件，用于按时间进行定时触发操作

491) 2017.9.1
491.1) feature: acl::mbox 采用模板范型方式

490) 2017.8.23
490.1) feature: 在 stdlib/ 目录下新增 bitmap 类，用于位映射操作

489) 2017.8.18
489.1) feature: 增加原子操作类 atomic
489.2) samples/atomic: 增加测试原子操作的例子

488) 2017.8.8
488.1) feature: 增加了 tcp 连接池通信模块

487) 2017.8.4
487.1) feature: polarssl_conf & polarssl_io 两个类支持动态加载 polarssl 动态库

486) 2017.7.27
486.1) feature: redis_hash 类针对 hmset 方法增加几种实现，以方便用户使用

485) 2017.7.22
485.1) feature: master_proc/master_aio/master_threads/master_udp/master_trigger
增加 get_conf_path 方法用于获得当前服务器的配置文件路径

484) 2017.7.20
484.1) compile: 消除了 clang++ -Wunused-private-field 编译警告

483) 2017.7.4
483.1) feature: 所有服务器模板支持 SIGHUP 信号回调处理过程
483.2) 重构所有服务器模板

482) 2017.6.28
482.1) feature: db_sqlite 类增加了事务处理接口 --- by lindawei <672496008@qq.com>

481) 2017.6.24
481.1) bugfix: http_request.cpp 中的 reset 方法应该增加 header_.reset() 和
client_->reset()，否则会引起内存泄露

480) 2017.6.21
480.1) feature: master_udp.cpp 完全封装了 acl_udp_server.c 中的代码逻辑，之前
在 alone 运行方式下的逻辑是独立于 acl_udp_server.c 的，不利于使用 valgrind
查找内存问题

479) 2017.5.31
479.1) feature: add WebSocketServlet by "fuwangqin" <niukey@qq.com> 

478) 2017.5.27
478.1) bugfix: websocket::make_frame_header 中当 payload_len 为 126 时会遇到
内存跨界问题 --- found by "lindawei" <672496008@qq.com>

477) 2017.5.25
477.1) bugfix: connect_manager::remove 中存在一处删除问题
--- "fuwangqin" <niukey@qq.com>

476) 2017.5.22
476.1) performance: http_client.cpp 支持缓冲方式写数据，从而提升了写的性能
476.2) feature: ostream::write 支持缓冲式写数据

475) 2017.5.13
475.1) bugfix: gson_helper.ipp 中 gson 模板函数中当第二个参数为 std::list 或
std::vector 时，如果容器中元素中的成员为对象指针时会因浅拷贝的原因导致指针对象
被二次释放的问题 -- "lindawei" <672496008@qq.com>

474) 2017.5.5
474.1) feature: db_pgsql.cpp 支持以 UNIX 域套接口方式连接 postgresql 数据库

473) 2017.4.28
473.1) bugfix: query.cpp 中 escape 在转义时不应对 \r\n 进行转义

472) 2017.4.27
472.1) feature: 增加针对 postgreqsl 的支持

-----------------------------------------------------------------------
471) 2017.4.5
471.1) feature: 增加 mbox 类用于消息队列的发送与读取，该类封装了 C 对象 ACL_MBOX

470) 2017.3.30
470.1) feature: json 类对象在创建 json 字符串时默认不自动添加空格，但允许调用者
设置参数以便于自动添加空格从而使 json 字符串更可读

469) 2017.3.29
469.1) feature: db_handle 模块支持事务回滚

468) 2017.3.25
468.1) connect_pool 连接池模块取消自动将连接池置为不可用操作

467) 2017.3.24
467.1) bugfix: db_mysql/db_sqlite 模块当采用静态方式使用时，编译出错

466) 2017.3.21
466.1) feature: db 模块中 db_handle/db_mysql/db_sqlite 在查询时，允许将结果集
存储于用户输入的对象中，从而实现结果集与 db 句柄分离的目的

465) 2017.3.9
465.1) bugfix: db_mysql.cpp 当进程退出前会自动卸载 mysql 动态库，但 mysql 的
句柄有可能会在该操作后发生，从而造成程序崩溃，增加判断条件以防止此问题发生

464) 2017.2.24
464.1) bugfix: redis_command::run 当连接异常断开时，在将连接归还给连接池时应
提前保留连接池对象以备下面使用

463) 2017.2.22
463.1) bugfix: redis_command::run 当连接异常断开时应该对 request_obj_ 判空

462) 2017.2.5
462.1) compile & bug: 当启用 -DNDEBUG 编译选项时，内部一些调用 assert 的语句
会被过滤掉，可能导致一些代码逻辑无法执行

461) 2017.1.3
461.1) feature: gson 对象序列化模块增加成员函数限定符的支持

460) 2016.12.31
460.1) bugfix: gson 对象序列化模块修改了 std::map 第二个参数不能为类对象的问题
460.2) feature: gson 对象序列化模块支持 struct 对象的成员函数及非序列化成员变量

459) 2016.12.22
459.1) feature: json.cpp 中 json 类及 json_node 类中的 to_string 方法允许复用
用户传入的缓冲区

458) 2016.12.21
458.1) compile: gsoner.cpp, http_header.cpp 用 VC x64 编译时有警告
458.2) bugfix: master_threads.cpp 中 thread_on_handshake 被调用了两次

457) 2016.12.19
457.1) bugfix: redis_command::run 中当遇到 ASK 命令执行重定向成功，但紧接着执行
命令时如果失败，则应该将该连接归还给连接池

456) 2016.12.15
456.1) feature: redis_command/redis_client 增加连接 IP 地址校验检测功能，主要
用于调试情况
456.2) bugfix: redis_pubsub 类中如果通过 psubcribe 订阅消息时，get_message 则
会出错，需要 get_message 使其同时支持 subcribe 及 psubscribe

455) 2016.12.14
455.1) bugfix: redis_client.cpp 中的 run 方法在进行连接重试时，如果请求数据为空，则不
应进行重试，而是应直接给上层应用返回失败，由应用层处理，比如对于 redis_pubsub 类中的方法 
get_message 是没有请求命令的，针对此情况的连接重试，并不会重新获得订阅信息
455.2) bugfix: redis_script 类中的参数顺序有误

454) 2016.12.1
454.1) freature: master_proc.cpp/master_threads.cpp/master_aio.cpp 的类中增加
虚方法 (proc_)on_listen，以便将监听对象传递给应用

453) 2016.11.24
453.1) bugfix: istream.cpp 中的 gets 函数不应当读超时时设置 eof_ 标志位

452) 2016.11.18
452.1) bugfix: redis_list::bpop 及 redis_pubsub::get_message 的超时时间应
不受 socket_stream 里的超时时间影响

451) 2016.11.8
451.1) bugfix: redis_command::run() 中当循环次数超过阀值后应该将连接归还给连接池

450) 2016.11.7
450.1) bugfix: redis_result::argv_to_string 返回值应该 >= 0

-----------------------------------------------------------------------
449) 2016.11.2
449.1) bugfix: db_pool.cpp 中的方法 peek_open 禁止动态设置字符集，因为可能会引起
线程冲突问题，如果想要设置字符集，必须在 db_mysql/db_sqlite 的构造中指定；对于 db_mysql
类，当使用 mysql_conf 类进行初始化 db_mysql 构造时，在 mysql_conf 提前设定字符集

448) 2016.11.2
448.1) bugfix: db_mysql.cpp 中类 db_mysql 的构造函数没有针对 charset_ 初始化
有可能会造成崩溃

447) 2016.10.31
447.1) bugfix: redis_string::incrbyfloat 及 redis_hash::hincrbyfloat 中在
调用 get_string 后判断是否出错的方式有问题，应该使用长度做为判定条件而不是 bool 值

446) 2016.10.26
446.1) bugfix: redis_zset.cpp 中第二个 zrevrangebyscore_with_scores 返回结果
集顺序是反的

445) 2016.10.24
445.1) bugfix: db_handle::peek_open 函数中的参数 charset 没有生效

444) 2016.10.21
444.1) bugfix: HttpServletRequest.cpp 中的方法 getLocalPort 无法取得本地端口
444.2) feature: fstream 类新方法 rename 用于修改文件名

443) 2016.10.20
443.1) bugfix: websocket 类中的函数 read_frame_head 里，当数据长度字段为两个
字节时，应该使用 short 类型且要使用 ntohs 而非 ntohl 做转换

442) 2016.10.14
442.1) feature: gson C++ 对象序列化库支持非 C++11 模式

441) 2016.10.13
441.1) bugfix: json_node 类中的 get_text 方法当字符串长度为 0 时应该返回空串 ""
而不是返回 NULL 空指针
441.2) feature: gson 序列化模块支持 struct 中的成员变量直接初始化 -niukey@qq.com

440) 2016.10.10
440.1) featur: json 类增加了 add_null/add_array_null 用于增加 null 类型节点

439) 2016.10.8
439.1) feature: 增加对象系列化模块 gson 类，用来将 struct 对象序列化为 json
对象及由 json 对象反序列化为 struct 对象

438) 2016.10.7
438.1) bugfix: json.cpp 中判断 json 节点类型的方法有误

437) 2016.9.17 -- 9.19
437.1) feature: 增加了 websocket 类

436) 2016.9.7
436.1) bugfix: istream.cpp 中的函数 gets 在调用 acl_vstream_gets 或
acl_vstream_gets_nonl 后判断标志位 ACL_VSTREAM_FLAG_TAGYES 的方法有误

435) 2016.8.31
435.1) feature: 添加了 SHA1 类 sha1

-----------------------------------------------------------------------
434) 2016.8.23
434.1) bugfix: json_node::set_text 判断节点是否为叶节点的方法有误

433) 2016.8.14
433.1) feature: Makefile 添加条件编译选项：允许在编译时以 make polarssl=on
方式将 POLARSSL 编译进去
 
432) 2016.7.29
432.1) feature: mime 类增加两个方法 get_plain_body/get_html_body 便于提取不同类型的
432.2) feature: json 增加对 double 类型的支持
正文内容

431) 2016.7.7
431.1) bugfix: mime::body_node 取正文有误

430) 2016.6.7
430.1) bugfix: string 类应该只检查空指针，而不应检查空串

429) 2016.5.30
429.1) safety: string 类针对指针类参数做了安全性检查

428) 2016.5.10
428.1) bugfix: http_request 类的get_body方法中，对象 ps 为局部变量，出作用域后
依然被使用而导致崩溃

427) 2016.5.5
427.1) feature: xml/xml1/xml2 类中的方法 update 允许返回剩余的 xml 数据

426) 2016.5.2
426.1) bugfix: http 模块设置的读超时与 stream 的读超时冲突

425) 2016.4.27
425.1) feature: http_header 类中的方法 set_url 增加参数 encoding，该参数决定
是否对出现于 url 中的参数进行 url 编码
425.2) feature: dbuf_guard 类将容纳 dbuf_obj 的数组封装在链表中，以免该数组
过大

424) 2016.4.26
424.1) feature: xml/xml1/xml2 在进行对象构造时允许初始化 dbuf 的参数

423) 2016.4.19
423.1) bugfix: thread 类中，在创建线程后对 thread_id_ 赋值时，可能会因为线程
创建足够快且用户提前释放了线程对象而造成内存非法访问

-----------------------------------------------------------------------
422) 2016.4.16
422.1) compile: 消除了 VC2012 使用 x64 方式编译时的一些编译警告

421) 2016.4.14
421.1) feature: string 类修改两个方法 split/split2，对 lib_acl C 库中新增的
字符串分割函数(带引号引用的字符串)进行封装

420) 2016.4.6
420.1) feature&safety: redis_command::run 中当发现 used_ > 0 时会强制调用 clear
来释放上次操作时临时创建的内存，以免用户反复使用该命令时忘记调用 clear

419) 2016.4.2
419.1) feature: redis_server 类增加接口 info 方便提取服务器配置信息

418) 2016.4.1
418.1) feature: redis_command 类支持直接组装 redis 协议方式

417) 2016.3.30
417.1) bugfix: session::set_ttl 针对 redis 缓存时有问题，去掉了针对 sid_saved_ 的判断

416) 2016.3.24
416.1) safety: master_threads 类中的 service_main 方法中，当应用返回 true 时，
需要进一步检查该连接流是否已经出现异常，如果出现异常，则忽略应用的返回值，开始调用连接流
的关闭过程，这样可以防止应用的误操作

415) 2016.3.18
415.1) bugfix: json 类中的 reset 方法在重置 json 对象时，因为 json 的 C 库
内部会重建 root 节点，所以需要以 json 类中重新指定 root 节点

414) 2016.3.17
414.1) bugfix: redis_client_cluster 类中的 set_password 方法在设置集群中节点
密码时，该方法的调用与添加集群节点的方法(set)与顺序相关，容易造成误操作导致密码设计无效

413) 2016.3.16
413.1) feature: queue_file::create 在产生唯一  ID 时，可以明显区分出进程号
以便于调试检查当前队列文件所属的进程

412) 2016.3.11
412.1) bugfix: json_node::is_array 判断方式有问题

411) 2016.3.9
411.1) feature: HttpServletRequest::getParameter 在查找参数时允许不区分大小写

410) 2016.3.5
410.1) feature: db/query 类增加了创建 sql 的接口 create

409) 2016.2.29
409.1) 接口调整：将 master_threads 类与 master_threads2 类名互换

408) 2016.2.26
408.1) feature: master_threads2 类增加了几个接口

407) 2016.2.18
407.1) feature: xml/xml1/xml2 增加方法，允许将输入流中的内容作为 xml 节点的文本内容，
这对于当文本内容非常大时比较有用

406) 2016.2.17
406.1) feature: session/redis_session/HttpSession 会话类增加功能接口

405) 2016.2.13
405.1) compile: 使得预编译，优化 g++ 编译速度

404) 2016.2.6
404.1) bugfix: zlib_stream 类判断剩余空间的方法应与 string 类匹配

403) 2016.1.31
403.1) feature: string 类支持内存映射文件方式管理内存，从而可以支持更多的内存空间
403.2) samples: string/string5, 用于测试内存映射文件
403.3) feature: xml/xml1/xml2 支持使用 dbuf_guard 会话内存池来创建临时对象，
从而提升了内存使用效率

402) 2016.1.27
402.1) bugfix: charset_conv 类中的方法 update，当 m_addInvalid 为 false，应该
过滤掉无效的字符
402.2) performance: mime_state_parse.cpp 中的 mime_bound_body 函数优化了处理
大邮件的性能

401) 2016.1.22
401.1) feature: HttpServlet 类增加了请求/响应成员函数(req_/res_)，以便于将
读取 HTTP 请求数据体分离
401.2) bugfix: connect_manager 类少两个设置函数 set_check_inter/set_idle_ttl

400) 2016.1.15
400.1) feature: redis 库增加了出错日志输出，便于运行时进行信息调试

399) 2016.1.11
399.1) feature: fstream 类中增加了方法 remove 用于删除文件

398) 2016.1.6
398.1) feature: 增加类 db_guard 用于自动释放从数据库连接池中获取的连接对象

397) 2016.1.5
397.1) feature: db_handle/db_mysql 类在进行查询前优先释放上次的查询结果，以免使用
者忘记释放而造成内存泄露

396) 2016.1.4
396.1) feature: mime.cpp, mime_head.cpp 支持更多的 Content-Type 类型

395) 2016.1.3
395.1) bugfix: db_mysql.cpp 中调用  __mysql_open 时如果出错记日志时应判断
每个参数是否为 NULL

-----------------------------------------------------------------------
394) 2015.12.29
394.1) bugfix: redis_key 类中的 type 函数命令少一个 hash 类型

393) 2015.12.28
393.1) bugfix: 类 xml1, xml2 中的函数 getFirstElementByTag 内部没有判断 NULL
393.2) bugfix: 取消了 http_request 类中的 acl_assert(client_) 断言判断

392.1) 2015.12.25
392.1) bugfix: dbuf_guard 类应禁止引用拷贝，否则在调用 create 的参数中如果有
dbuf_guard 对象作为参数会有问题，如：
class myobj : public acl::dbuf_obj
{
public:
	myobj(acl::dbuf_guard& dbuf) : dbuf_(dbuf) {}
	~myobj(void) {}
};

acl::dbuf_guard dbuf;
myobj* obj = dbuf.create<myobj, acl::dbuf_guard>(dbuf);

虽然 myobj 构造函数接受一个引用，但依然会在 create 时形成引用拷贝隐患，从而
会造成 dbuf 内的缓冲区被二次释放，所以解决方式是禁止 dbuf_guard 类引用拷贝

391.1) 2015.12.22
391.1) compile: polarssl_io.cpp 中将 sys_read_ready 改名为 read_ready

390) 2015.12.20
390.1) feature: aio_handle 增加了几个设置方法，用来设置异步引擎的运行参数

389) 2015.12.18
389.1) bugfix: http_request 类的方法 request 在重置请求方法时存在问题
389.2) feature: http_header 类的方法 get_method 增加了参数允许存放字符串表示的请求方法

388) 2015.12.14
388.1) bugfix: xml1/xml2 类中的方法 reset 应该将 root_ 节点删除，因为调用
acl_xml_reset/acl_xml2_reset 后 xml 对象中 root 节点被释放，此时 root_ 节点
所引用的根节点已经不存在

387) 2015.12.9
387.1) bugfix: db_mysql 类中，在初始 mysql 连接时，因为 libmysqlclient 库内部
会通过 mysql_thread_init 初始化每个线程的线程局部变量，但却不会在线程退出前自
动释放这些线程局部变量，这在多线程环境下会造成内存泄露，因为在 db_mysql 类内部
增加了线程退出前调用 mysql_thread_end 来释放这些线程局部变量

386) 2015.12.7
386.1) feature: xml_node 类中增加接口 detach 用于将一个 xml 节点从 xml 对象
树中分离

385) 2015.12.3
385.1) feature: xml2 类新增构造函数以文件句柄为构造参数
385.2) bugfix: polarssl_io::read 中当 ssl_read 返回数据后，应该通过调用函数
ssl_get_bytes_avail 判断 SSL 缓冲区中是否还有数据，如果有，则应该设置
ACL_VSTREAM::sys_read_ready 标志位

384) 2015.12.2
384.1) 接口调整：redis 接口调整，尽量防止在使用变参时出错
384.2) feature: 类 xml2 新增构造函数，可以更方便地使用内存文件映射方式解析
和创建 xml 对象（目前仅支持 UNIX）

383) 2015.11.30
383.1) feature: 增加了 xml1.cpp/xml1.hpp 以便于支持第一个 xml 解析器
383.2) feature: 增加了 xml2.cpp/xml2.hpp 以便于支持第二个 xml 解析器

382) 2015.11.26
382.1) bugfix: redis_zset::zstore 在判断 aggregate 时有误

381) 2015.11.24
381.1) feature: http_request/http_request_pool/http_request_manager 类支持
SSL 通信方式

380) 2015.11.23
380.1) bugfix: zlib_stream 类在加载 zlib1.dll 库时不应该打开 deflateInit2，
而应该打开 deflateInit2_ 地址，因为 deflateInit2 只是一个宏定义，而
deflateInit2_ 才是动态库的函数地址

379) 2015.11.20
379.1) feature: url_coder 类继承于 dbuf_obj 从而纳入 dbuf_guard 管理
379.2) bugfix: dbuf_guard 类中在调用 dbuf_reset 时应该首先将所有管理的对象
进行析构
379.3) bugfix: dbuf_guard 类在创建数组容器时需要调用 dbuf_keep 以保留内存池
中的所在内存块

378） 2015.11.18
378.1） bugfix: istream::readtags 存在一处问题

377) 2015.11.16
377.1) feature: dbuf_guard 类增加了模板函数 create，可更加方便地创建任何继承
于 dbuf_obj 的子类对象 --- Thank @淡墨水痕

376) 2015.11.14
376.1) feature: dbuf_guard 类增加了更多方便操作的方法，同时使数组对象也在
内存池对象上创建
376.2) safety: dbuf_guard 类中增加了对 dbuf_obj 对象的安全保护

375) 2015.11.13
375.1) feature: 连接池模块简化接口设计，允许连接集群管理器在添加新的连接池时
设置超时时间，从而使连接池集群管理器针对不同的服务器地址采用不同的超时时间，
这样可以使连接池模块适应于异构网络环境中

374) 2015.11.12
374.1) feature: http_request_manager 的构造函数增加了连接 http 服务器的超时时间
及 IO 读写超时时间
374.2) bugfix: 修复了 dbuf_obj 构造函数中的 BUG，应该首先将 nrefer_ 初始化为 0

373) 2015.11.11
373.1) bugfix: mail_message 类中的 append_addrs 方法存在一处指针溢出的 BUG

372) 2015.11.10
372.1) bugfix: redis_command 类中有两处 build 函数在构建请求命令时应该支持二进制格式
372.2) feature: dbuf_obj 类增加了 nrefer_，便于 dbuf_guard 进行安全管理，以防止被
dbug_guard 类对象重复释放

371) 2015.11.7
371.1) feature: dbuf_pool.cpp 中增加了内存池管理类 dbuf_guard 及内存池对象类
dbuf_obj，以方便使用 dbuf_pool 内存池
371.2) feature: dbuf_pool 类重载的 new 允许调用者指定所分配的内存块的倍数

370) 2015.11.3
370.1) feature: url_coder 类内部采用 dbuf_pool 内存对象进行分配管理
370.2) feature: string 类增加了方法 equal 用来比较两个 string 对象里的内容

369) 2015.11.1
369.1) workaround: 整理 json_node 类

368) 2015.10.28
368.1) performance: http 模块的相关类（HttpCookie, http_header, HttpServlet,
HttpServletRequest, HttpServerResponse）通过引入会话内存池(dbuf_pool)进行内存
管理，从而大大提高了处理性能
368.2) feature: dbuf_pool::dbuf_reset 增加参数 reserve，从而允许应用在重置内存池
时可以保留部分已经分配的缓冲区

367) 2015.10.27
367.1) bugfix: HttpServletRequest 类中方法 readHeader 当调用方法
getContentLength 时返回 -1，则会造成下面调用 acl_mymalloc((size_t) len + 1)
时崩溃，现在针对 getContentLength 返回 -1时，直接返回

366) 2015.10.25
366.1) bugfix: db_mysql 类内部在出错重连时，没有使用初始连接时使用的字符集
366.2) 重构：重构了数据库连接池模块的代码，当使用 dbopen 时不再需要指定字符集

365) 2015.10.19
365.1) feature: redis_client_cluster/redis_client_pool/redis_client 支持连接
成功后使用连接密码进行身份验证，从而使 redis 的集群模块支持密码验证功能

364) 2015.10.8
364.1) feature: json 类增加了重载运行符[]接口，方便用户获得第一个匹配对象

363) 2015.10.7
363.1) feature: json 类添加了新方法 getFirstElementByTagName，该方法在遍历过程
中当匹配到一个符合的节点后便立即返回，因而效率比 getElementsByTagName 更高
363.2) performance: xml::getFirstElementByTag 使用 lib_acl 库中新加的函数
acl_xml_getFirstElementByTagName，执行效率更高

362) 2015.9.30
362.1) bugfix: string 类中的方法 strip 当其中参数 each 为 false 时分析方式有误
362.2) feature: string 类中的方法 strip 采用写时拷贝技术
362.3) feature: mail_attach 类增加了方法 set_filename

361) 2015.9.29
361.1) bugfix: string 类中的方法 strip 在当其中的参数 each 为 true 时分析方法有误

360) 2015.9.28
360.1) feature: json_node 类增加了节点类型的判断方法

359) 2015.9.25
359.1) feature: http 模块中的 HttpServlet 类增加了 doOther 虚接口，从而可以
支持其它未知的 HTTP 请求方法
359.2) feature: smtp 模块下组装邮件的功能完善
359.3) samples/mime/mail_builder: 示例功能完善

358) 2015.9.22
358.1) feature: json 解析器增加支持判断是否解析完毕的功能

357) 2015.9.21
357.1) bugfix（严重）: 连接池基础类 connect_pool 中的方法 check_idle 当参数
exclusive 为 false 时会造成提前解锁; 该 BUG 影响所有该类的子类。
357.2) safety: string 类中的宏 MCP 增加了安全性检测

356) 2015.9.18
356.1) feature: connect_pool/connect_manager 连接池及连接池管理类允许设置
无连接数上限

355) 2015.9.9
355.1) feature: smtp_client 类已经可以非常方便地发送邮件
355.2) samples/smtp_client: 测试邮件发送过程

354) 2015.9.7
354.1) bugfix: geo_member::set_coordinate 中设置经纬度的参数有误
354.2) bugfix: db_row::field_int64 之前使用的将字符串转为64位整数的方法在32位
机器上有问题，统一换成 acl_atoi64
354.3) feature: smtp 模块增加了邮件合成的功能
354.4) sample: mime_builder 例子用来测试邮件合成功能
354.5) bugfix: mime_stype_name 函数的下标起始位置不是从 0 开始的，所以需要将所给的
下标位置减去起始下标值方能得到数组的真正下标值

353) 2015.9.6
353.1) bugfix: redis_zset::zrangebyscore_get 其中的 argc 计数有误

352) 2015.9.2
352.1) feature: 添加 smtp_client 类用来发送电子邮件，同时支持 SSL 方式发送邮件

351）2015.8.31
351.1) compile: VC2010 工程中未包含 thread_queue 类的源文件和头文件
351.2) feature: locker 互斥类增加了 lock_guard 类以便于简化加锁/解锁操作

------------------------------------------------------------------------
350) 2015.8.26
350.1) feature: string 类在进行 base64 解码时，需要自动在尾部添加 \0 以防止使用者
缓冲区溢出

349) 2015.8.24
349.1) bugfix: redis_command/redis_key/redis_hash/redis_set/redis_zset 在
遍历过程中，可能服务端会返回 cursor 为 > 0 但结果集为空的情况，需要对这种情况进行处理

348) 2015.8.20
348.1) compile: zlib_stream 类内部使用了动态加载 zlib 库的方式。

347) 2015.8.19
347.1) feature: db_handle/db_mysql 支持事务提交接口

346) 2015.8.18
346.1) feature: http_client/http_request 类在读取压缩数据体时，会自动处理
临时处理结果为 0 的情况，以降低使用复杂度

345) 2015.8.17
345.1) http_client gzip 数据压缩传输测试通过

344) 2015.8.16
344.1) feature: http_client 类支持响应 gzip 压缩类型的数据
344.2) feature: HttpServletResponse 类中的输出流对象采用了统一了 http_client 类型

343) 2015.8.15
343.1) bugfix: redis_string::incoper 内部在区分 INCR 与 INCRBY, DECR 与 DECRBY
的方法有误

342) 2015.8.13
342.1) feature: http_ctype 类支持对象拷贝功能
342.2) feature: HttpServletRequest 类的方法 getContentType 增加了一个 http_ctype
类对象指针，允许用户可以获得更多的 Content-Type 中的信息
342.3) feature: HttpServlet::doRun 方法在第一次 IO 出错时才会调用 doError 方法
342.4) feature: 增加静态方式 log::debug_init 方便打调试日志记录接口

341) 2015.8.12
341.1) mysql_manager: mysql 连接池集群测试通过，增加了 mysql_conf 配置类，方便
添加 mysql 连接对象
341.2) feature: mysql_manager 支持设置连接池中每个连接的空闲生存周期

340) 2015.8.11
340.1) feature: db 模块增加了数据库连接池集群管理，涉及的修改有：
(1) db_handle 继承于 connect_client；db_pool 继承于 connect_pool;
(2) 修改 mysql_pool/sqlite_pool，使之实现了基类 connect_pool 中的虚方法
(3) 修改 db_mysql/db_mysql，使之实现了基类 connect_client 中的虚方法
(4) 增加了 mysql_manager/sqlite_manager，使之继承于 connect_manager

339) 2015.8.9
339.1) bugfix: redis_zset::zrange_get_with_scores 在取得结果时处理的顺序存在问题

338) 2015.8.6
338.1) feature: 延长了 xml/json 模块在遍历时产生的临时结点对象的生命周期

337) 2015.8.4
337.1) compile: samples/db 下的例子无法在 MACOS 上编译

336) 2015.8.3
336.1) samples/redis: 测试用例中针对出错地方增加了错误内容提示

335) 2015.8.2
335.1) feature: db_handle/db_mysql/db_sqlite 类中提供了静态方法用来设置动态库动态
加载的全路径
335.2) feature: mysql 模块功能在默认编译时被编译进 lib_acl_cpp 库中，
且 db_mysql 模块默认采用动态加载方式
335.3) samples/db/mysql_query: 完善了示例功能
335.4) samples: 增加了示例 samples/db/mysql_pool，用来测试多线程环境下的数据库
连接池操作

334) 2015.8.1
334.1) feature: 针对标准输入输出增加了两个流对象：stdin_stream, stdout_stream
334.2) sample: db/mysql_query 例子完善

333) 2015.7.31
333.1) feature: HttpServlet 类中的方法 doRun 内部在响应客户端请求时，会首先
根据客户端的请求头字段(Connection) 自动设置响应头中的 Connection 头字段

332) 2015.7.30
332.1) bugfix: redis_command::redirect() 函数内当 cluster->peek() 返回 NULL
时应该直接返回 NULL

331) 2015.7.25
331.1) feature: HttpServletRequest 类增加了直接提出 xml 和 json 对象的方法

330) 2015.7.22
330.1) bugfix: dbuf_pool 类对象必须动态创建，因此需要将析构函数设为私有方法

329) 2015.7.21
329.1) feature: db 模块的查询类 query 添加了 double/float 类型
329.2) perfomance: dbuf_pool 类对象也创建在内存池上，从而再次减少 malloc/free 调用

328) 2015.7.19
328.1) bugfix: redis_command.cpp 中的 run(redis_client_cluster*, size_t) 函数
中可能存在当 conn 对象被释放后再次非法引用的情形，现在将该对象的释放放在引用的代码之后

327) 2015.7.16
327.1) bugfix: redis_command.cpp 中的 run(redis_client_cluster*, size_t) 函数
中，当 conf->eof() 时，若 conn = peek_conn(xxx) 返回 NULL，则应直接返回 NULL，否则
会引起下面的空指针引用异常

326) 2015.7.15
326.1) bugfix: redis_script.cpp 中 eval_cmd 函数的 key 个数计算方式有误

325) 2015.7.13
325.1) sample: 增加示例 samples/redis/redis_geo 用来测试地理信息模块类 redis_geo

324) 2015.7.11-12
324.1) feature: 增加了 redis_geo 类，用于支持 redis 地理位置信息处理功能

323) 2015.7.6
323.1) feature: HttpServlet 类增加了自动判断是否需要与客户端保持长连接的方法

322) 2015.7.4
322.1) feature: http_client 类增加了 get_range 方法，用于数据断点续传过程中
322.2) feature: HttpServletRequest 类增加了 getRange 方法用于数据断点续传过程中

321) 2015.7.2
321.1) bugfix: redis_hash::hexists 判断返回值有误

320) 2015.7.1
320.1) feature: http_client 类增加了几个用于 HTTP 头部字段修改的方法

319) 2015.6.28
319.1) compile: 支持在 VC x64 环境下编译使用

318) 2015.6.25
318.1) bugfix: beanstalk::ignore_all 内部有内存泄露

317) 2015.6.22
317.1) feature: dbuf_pool 类增加了 dbuf_reset 方法，可以重复使用该类对象
317.2) performance: redis_command 类当每一个命令处理完毕后不再释放内存池对象，
而是复用之
317.3) bugfix: redis_zset 类有一处在调用 sizeof 时未 -1

316) 2015.6.17
316.1) feature: 增加了类 thread_queue 用来处理线程消息队列

315) 2015.6.16
315.1) feature: db_handle.cpp 中的 db_row 类增加了 field_double 方法
315.2) decprecate: 类 db_pool 中的 peek 方法被注为过期的，建议使用 peek_open 方法，
使用方式更为简单

314) 2015.6.15
314.1) bugfix: redis_key.cpp -> randmkey 请求命令组包有误

313) 2015.6.14
313.1) compile: 消除了在 MACOSX 上的一些编译错误

312) 2015.6.12
312.1) compile: 在 MAXOS 下编译带有自旋锁的代码报错

311) 2015.6.3
311.1) samples/http/http_servlet: 增加示例测试使用 redis 集群存储 session 功能

310) 2015.6.1
310.1) 重构了 session 类
310.2) feature: 新增 redis_session 类
310.3) bugfix: redis_client_cluster 中的前向类声明  redis_pool 应该为
redis_client_pool

309) 2015.5.25
309.1) feature: locker.cpp 中类 locker 增加了针对自旋锁的支持

308) 2015.5.18
308.1) bugfix: redis 模块中的一些使用变参的方法中有的地方漏掉了第一个变参

------------------------------------------------------------------------

307) 2015.5.6
307.1) bugfix: redis_command 类中的方法 get_client_addr 当采用集群模式时不能
取得当前所用连接的服务端地址

306) 2015.5.3-5.5
306.1) feature: 增加了分布式消息队列 disque 的客户端库模块

305) 2015.4.27
305.1) bugfix: redis_command.cpp 中的 run 方法在处理服务器返回的 ASK 响应后应该
向目标服务器先发送 ASKING 指令

304) 2015.4.25
304.1) bugfix: 类 aio_timer_callback 中的方法 set_time 中在给成员变量 present_
赋值时，在 32 位系统下会造成计算结果值的整形溢出，以前的问题的写法为：
present_ = ((unsigned long) now.tv_sec) * 1000000
		+ ((unsigned long) now.tv_usec);
现改成：
present_ = ((long long int) now.tv_sec) * 1000000
		+ ((long long int) now.tv_usec);
这样编译器在编译时才会强制将计算后的结果值按 64 位对待.

303) 2015.4.23
303.1) bugfix: samples/connect_manager，异步检测对象应该是局部的，不应与 monitor
绑定在一起，增加了 check_async 回调类

302) 2015.4.21
302.1) buffix: redis_client::get_redis_string 当数据长度为 0 时会出现异常,
从而兼容 redis 是允许数据值为空串的情况

301) 2015.4.19
301.1) feature: 完善了 redis_cluster 集群管理类

300) 2015.4.12
300.1) comment: 完善了 redis 模块的英文注释

299) 2015.4.8
299.1) comment: 给 redis 模块增加了一些注释

298) 2015.4.7
298.1) bugfix: redis_cluster 类中的 reset 方法与基类 redis_command 中的方法
重名，造成了命名污染，现将 redis_cluster 中的所有方法都加了前缀 cluster_
298.2) bugfix: acl::redis 类因为是虚继承了 redis_xxx 类，所以无法通过这些
类的构造函数将参数传递给基类 redis_command 的构造函数，必须在 acl::redis
的构造函数中显示地将参数传递给基类 redis_command 的构造函数
298.3) feature: acl::redis_cluster 类中的 cluster_nodes, cluster_slots,
cluster_slaves, cluster_info 方法返回组织好的结果集

297) 2015.4.6
297.1) feature: 增加了 redis_slot 类及 redis_node 类

296) 2015.4.5
296.1) performance: HttpServletResponse::write 当采用 chunk 传输时由原来的
多次调用系统 API write 方式改为只调用一次 writev，从而减少了系统调用次数

295) 2015.4.4
295.1) feature: connect_monitor 连接池自动检测类支持应用重载 IO 处理过程，从而
可以面向更复杂的通信协议处理情况

294) 2015.4.2
294.1) 类名调整：将类 redis_pool 重命名为 redis_client_pool, 将类 redis_cluster
重命名为 redis_client_cluster
294.2) feature: 新增加类 redis_cluster，支持官方新公布的 CLUSTER 指令集
294.3) feature: redis_client_cluster 类支持静态初始化哈希槽与服务结点的对应关系
294.4) samples: 新增加 redis CLUSTER 指令集的测试用例 redis_cluster

293) 2015.3.30
293.1) bugfix: redis_command.cpp 中最后三个 get_strings 函数在取得 rr 下标时有误

------------------------------------------------------------------------
292) 2015.3.27
292.1) feature: redis 客户端库提供了一个统一的类 redis，该类继承了所有的
命令 redis 命令类，只需使用这一个类便可以执行所有的 redis 命令
292.2) samples/redis: 增加了 redis, redis_cluster2 两个测试用例
292.3) workaround: 去掉了 redis 命令中变量名为数字的情况

291) 2015.3.25
291.1) bugfix: server_socket::open() 当用户输入的地址为 ip:0 时，需要重新调用
acl_getsocketname 来获得真正监听的地址

290) 2015.3.23
290.1) bugfix: redis_command::scan_keys 内部在使用指针参数 count 时有问题，
感谢 wangsquirrel@gmail.com 发现此 BUG

289) 2015.3.17
389.1) bugfix: http_header 类中的方法 set_method(const char* method) 需要对
method_s 进行赋值

288) 2015.3.2
288.1) feature: beanstalk 类增加了一些出错提示功能

287) 2015.3.1
287.1) feature: redis 客户端集群版增强了针对服务器掉线的容错功能
287.2) feature: 丰富了连接池公共类对象功能

286) 2015.2.28
286.1) feature: redis 客户端库针对集群方式增加了损坏结点自动删除功能
286.2) bugfix: connect_pool 类中的函数 put 当参数 delay_destroy_ 为 true
时，若 count_ > 0 返回时没有对互斥锁 lock_ 解锁，从而会造成其它使用该
连接池对象的线程调用 put 函数加锁时永远等待

285) 2015.2.26
285.1) feature: redis 客户端库完善了针对集群版本 redis3.0 的支持

284) 2015.2.14
284.1) workaround: 对 redis 模块进行重构，以便于更好地支持 redis3.0 中的
集群模式
284.2) feature: 基本上可以支持 redis 集群模式
284.3) samples/redis_cluster: 测试 redis 集群模式的例子

283) 2015.2.11
283.1) samples: 因为 acl_master 模式运行的服务器框架不支持 WIN32，所以现在
将所有 master_xxx 系列的示例在 WIN32 下强制采用 alone 运行模式
283.2) performance: redis_key::scan, redis_zset::zscan, redis_set::sscan,
redis_hahs:hscan 之前在遍历时总会先清理存储结果集的对象空间，外部在用时可能会造成二次
拷贝现象，影响一定性能，现在清除了内部的自动清理过程，将清理操作交给用户灵活处理

282) 2015.2.10
282.1) feature: redis_command 增加了几个方便调用的方法，使用户可以通过
redis_command 类对象直接调用 redis_result 类对象中的方法
------------------------------------------------------------------------
281) 2015.2.2
281.1) feature: http_client.cpp 增加了 sprint_header 方法，可以将 HTTP 响应头
输出至缓冲区内，以便于应用进行调试

280) 2015.2.1
280.1) samples: redis_connection, redis_hyperloglog, redis_transaction 三个
redis 客户端命令的测试例子测试通过

279) 2015.1.30
279.1) feature: http_header.cpp 中的 set_method 增加了 HEAD/OPTION 请求方法
279.2) samples: redis_zset_pool 例子可以通过 redis 有序集存储大块数据，方式
是将大数据切分成小块数据集合存储在 redis 有序集对象的成员中
279.2) redis_zset: redis 有序集功能模块基本测试通过

278) 2015.1.25
278.1) feature: 完成了 redis 客户端命令中 script 的所有功能

277) 2015.1.23
277.1) bugfix: master_threads2.cpp 中 run_once() 函数在 service_on_accept 调用
直接返回时没有释放流对象，导致描述字和内存泄漏
277.2) feature: redis 客户端库的 redis_key, redis_hash, redis_set, redis_zset
类方法增加了 scan 遍历方法
277.3) feature: 完成了 redis 客户端命令中 pubsub 的所有功能
277.4) feature: 完成了 redis 客户端命令中 server 的几乎全部功能

276) 2015.1.21
276.1) feature: 实现 了redis_zset 全部接口
276.2) samples: 新增例子 samples/redis/redis_pubsub 测试 redis_pubsub 类

275) 2015.1.20
275.1) feature: redis_zset 类实现了 10 个命令方法

274) 2015.1.19
274.1) bugfix: db_mysql.cpp 在 WIN32 下使用 mysql 库采用了动态加载的方式，在函数指针
前应增加 STDCALL 宏定义
274.2) redis: 重构 redis 客户端库

273) 2015.1.17-1.18
273.1) feature: 实现了 list/pubsub/connection/transaction redist 客户端命令
273.2) feature: redis 客户端库中的 redis_key 类增加了 migrate/move 支持

272) 2015.1.16
272.1) feature: redis 客户端连接池及连接池集群测试通过

271) 2015.1.15
271.1) bugfix: beanstalk 客户端库当采用超时方式获取消息时不应记录出错日志
271.2) feature: redis 客户端库的所有与 redis_string 相关的功能测试通过
271.3) feature: redis 客户端库的所有与 redis_hash/redis_key 相关的功能测试通过

270) 2015.1.7
270.1) feature: socket_stream 类增加了 get_tcp_non_blocking 方法用于判断当前
套接字是否是非阻塞模式（目前仅支持 UNIX 平台）

269) 2015.1.3
269.1) feature: 增加了 dbuf_pool 内存分配类，该类适合于频繁分配大小不一的小内存的情况
269.2) feature: 针对阿里云的 OSS，参考了其 JAVA SDK 设计了 C++ 接口

268.1) 2014.12.24
268.1) 代码整理: HttpServlet 类简化了 doRun 参数
269) 2015.1.1
269.1) compile: 整个工程可以使用 clang/clang++ 编译通过

------------------------------------------------------------------------
267) 2014.12.14
267.1) feature: locker 类增加了 try_lock 方法
267.2) feature: xml 类增加了几个方法

266) 2014.12.2
266.1) bugfix: polarssl_io 类在非阻塞模式下有可能会阻塞在 IO 上

265) 2014.12.1
265.1) bugfix: istream 类中的 xxx_peek 函数在读出错时没有判断 errno 为 ACL_EWOULDBLOCK
的情况，在非阻塞方式下，当读返回 -1 且 errno 为 ACL_EWOULDBLOCK 时并不表示读出错
265.2) feature: polarssl_io 类完善了非阻塞 IO 过程

264) 2014.11.29
264.1) feature: stream_setup 类现在可以支持 aio_stream 非阻塞流了
264.2) feature: polarssl_io 类增加了支持非阻塞 IO 的方法

263) 2014.11.25
263.1) feature: string 类增加了 find_blank_line/find_reset 方法，用来方便从
当前缓冲区中查找一个空行的位置
263.2) feature: string 类增加了 substr 方法，用来从当前缓冲区中提取数据
263.3) samples: 新 string/blank_line 示例，用来测试上面新增的方法
263.4) feature: master_threads2 类增加了 proc_exit_timer 虚函数，当子进程
需要退出时服务器模板将会回调该虚函数以决定子进程是否可以退出

262) 2014.11.19
262.1) bugfix: http_response 类中当调用 read_header 方法时，需要自动将
head_sent_ 置为 false，以便于同一连接的下一次会话时可以正确发送 HTTP 响应头

261) 2014.11.18
261.1) bugfix: fstream::open 方法在打开文件时先调用基类 stream::open_stream，
然后基类函数再调用 C 库 acl_vstream_fdopen 时没有说明打开流的类型，导致内部流对象
ACL_VSTREAM 的关闭回调函数设置有误
261.2) bugfix: snprintf.cpp 中函数 snprintf/vsnprintf 在调用 _vsnprintf_s 时
第三个参数应该为 _TRUNCATE，否则当缓冲区给的比较小时VC提供的 API 内部会产生断言

260) 2014.11.10
260.1) feature: master_threads2 类增加了 thread_on_handshake 方法，当服务端
调用完 thread_on_accept 后可以在子线程中调用 thread_on_handshake 方法，以
处理较长的任务

259) 2014.11.7
259.1) feature: json 类增加了构造布尔型和数值型的接口
259.2) samples: 增加了 json 测试用例 json/json7
------------------------------------------------------------------------

258) 2014.10.26
258.1) feature: 丰富和完善了 SQL 查询器 query 的接口
258.2) sample: 新增数据库查询示例 samples/db/mysql_query
258.3) feature: string 类的 format_append 函数增加了变参类型校验功能
258.4) bugfix: string 类中的 operator +=(long n) 的变参类型有误

257) 2014.10.25
257.1) feature: socket_stream 类增加了 TCP 套接字的设置/获取方法；server_socket
增加了设置服务器套接字延迟接收选项方法
257.2) feature: 增加了 query 数据库查询对象类，通过该类构建安全的 SQL 查询语句，并通过
db_handle 类对象查询该 query 对象，此设计借鉴了 java hiberate 的一些思想

256) 2014.9.12
256.1) compile: 消除了使用 Makefile.db 编译时的一些警告

255) 2014.9.11
255.1) bugfix: samples/win_dbservice 在异步调用 DB 服务前还没有打开异步消息处理句柄

254) 2014.9.6
254.1) compile: 消除了使用 VC 编译时的一些错误与警告
254.2) performance: 在调用 delete 前删除了无用的判空操作

253) 2014.8.27
253.1) feature: polarssl_conf 类支持 SSL 握手时对证书进行验证的方式，可以在
类初始化时设置证书验证方式
253.2) feature: stream_hook 类的 on_close 回调函数增加网络连接是否正常的参数，
子类可根据此参数决定待关闭连接的善后动作; stream 类在关闭前会首先判断网络连接
是否正常，并交连接状态通过 on_close 参数传递给子类实例

------------------------------------------------------------------------
252) 2014.8.21
252.1) feature: 支持 polarssl.1.2.11 和 polarssl.1.3.8 两个版本的 polarssl,
但 polarssl.1.3.8 版本对多线程支持存在 BUG，故默认使用 polarssl.1.2.11 版本
252.2) sample: 增加了 samples/https_client 多线程测试示例，用来测试
https_server 服务器

251) 2014.8.20
251.1) feature: 完善了 polarssl 与 stream 对象的整合功能
251.2) 接口调整：http_client 类中的 open 方法去掉了 use_ssl 方法，这样应用可以通过获得
http_client 对象的 stream 后使用 stream::setup_hook 方法使之具有 SSL 通信功能
251.3) stream: 当调用 setup_hook 时注册给 ACL_VSTREAM 对象中的 context 与其它
应用冲突，使用 ACL_VSTREAM 中 objs_table 来存放临时对象（其为一个哈希表）
251.4) sample: 增加了 samples/https_server，该程序为一个支持 HTTPS 协议的 WEB 服务

250) 2014.8.19
250.1) feature: 支持使用 polarssl 库进行 SSL 服务端传输
250.2) feature: stream 类中， 将 close 方法由原来的虚方法修改为非虚方法，其在 stream
基类对象中实现， 且可以调用 stream_hook 的 on_close 方法
250.3) sample: samples/ssl_server 新增的服务端 SSL 示例 

249) 2014.8.15
249.1) feature: stream 类的 set_ctx 方法增加是否允许覆盖旧对象的功能

248) 2014.7.31
248.1) compile: 在 FreeBSD9.2(64) 上编译通过

247) 2014.7.29
247.1) feature: socket_stream 类增加了 alive() 方法用来检测网络连接的存活态
247.2) feature: stream 类扩展了 set_ctx/get_ctx 方法，可以通过 key 设置/查找
其对应的 ctx 对象，同时增加了 del_ctx 方法用来删除 key 对应的 ctx 对象
247.3) samples: 增加了 socket/client, socket/server 两个网络测试用例，用来测试
网络关闭时第一次写依然会成功的情况

246) 2014.7.24
246.1) bugfix: http_request.cpp 中调用方法 write_head 时，若请求方法为 POST 方法，
则增加了有效的重试机制
246.2) feature: http_mime.cpp 还未分析 HTTP MIME 数据时若用户调用 get_nodes，则内部
不会设置 parsed_ 为 true 且会返回空结合集合

245) 2014.7.21
245.1) bugfix: header_token.cpp 的函数 header_token 当分析 WIN32 的路径时存在
问题，会过滤掉路径中的反斜杠 '\'

244) 2014.7.16
244.1) feature: 调用 string 类的左值赋值函数后，可以通过 length() 取得数据缓冲
区的长度同时会将多余空间填充为 \0 以保证使用时的安全性，这一点与 std::string
有所不同，std::string 返回 0 且也不会填充多余空间数据
245.2) samples: string3 示例专门用来测试 string 类进行左值赋值的情况

243) 2014.6.26
243.1) feature: aio_istream/istream 支持按行读数据时限制行数据最大长度以防止
本地缓冲区溢出
243.2) feature: string 类支持设定缓冲区最大长度，当超过此长度时会报警告

242) 2014.6.23
242.1) feature: string.cpp 类 string 支持左值赋值重载

------------------------------------------------------------------------
241) 2014.6.18
241.1) master_aio.cpp: 在析构函数中不应再调用 __handle->check()
241.2) master_aio.cpp: 因为 C 库中的接口有所改变，需要去掉 run_ctx(第四个)参数

240) 2014.6.12
240.1) bugfix: string 类中的 trim_left_space/trim_right_space 在移动数据后没有
将数据尾部赋 '\0'

239) 2014.5.27
239.1) bugfix: scan_dir 类中的 curr_path() 方法当返回全路径时有问题
239.2) feature: string 类增加了 scan_line/scan_move 等函数，方便从缓冲区中提取
数据，同时修改了 string::c_str(), string::length(), string::size()，使之能够
兼容 scan_xxx 函数的操作行为

238) 2014.5.26
238.1) sample: samples/scan_dir 例子用来测试新增加的类 acl::scan_dir

237) 2014.5.23
237.1) feature: string 类为了使用方便，去掉了多个方法返回值中的限定词 const
237.2) bugfix: scan_dir 类中的 curr_path 存在死循环过程

236) 2014.5.22
236.1) bufix: http_client 类的构造函数 http_client() 中没有对 buf_ 赋 NULL，结果
导致在 http_client::reset 中对 buf_ 进行 reset 操作时造成了非法指针引用

235) 2014.5.20
235.1) bugfix: connect_manager 连接池集群管理类当某个连接池有问题时，不能自动将失败的
连接池进行恢复，最后可能会导致所有连接池不可用
235.2) feature: connect_manager 增加了设置了用于连接池自动恢复的时来设置恢复时间间隔
的方法：set_retry_inter

234) 2014.5.15
234.1) feature: 增加了 stdlib/scan_dir 类，该类用于磁盘目录扫描
234.2) sample: 新增示例 samples/dircopy 用来拷贝目录结构，内部使用了 scan_dir 类

233) 2014.5.13
233.1) feature: string/http_client/http_request 类增加了按行读数据的方法

232) 2014.5.11
232.1) feature: string 类增加了 scan_line/trim_left_space/trim_right_space/
trim_space/trim_left_line/trim_right_line/trim_line 方法

231) 2014.5.8
231.1) interface: HttpServletResponse 类的 format/vformat 的返回值由 bool 改为 int

230) 2014.5.6
230.1) feature: fstream 类中的 fseek/ftell 被调用时，内部会自动重置 eof_ 是否结束状态

229) 2014.5.5
229.1) feature: fstream 类增加了 ftell 方法，用来获得当前文件指针在文件中的偏移位置

228) 2014.4.23
228.1) bugfix: connect_pool.cpp 少实现一个方法：set_retry_inter

227) 2014.3.28
227.1) feature: connect_client 类增加了设置/获取连接池对象的接口，由
connect_pool 在创建连接对象时设置，方便应用找到连接对象所归属的连接池对象

------------------------------------------------------------------------

226) 2014.3.27
226.1) 去掉了 master_threads 原来的实现，将其替换成 master_threads2，因为
lib_acl 底层库中 acl_threads_server.c 服务器模板功能更强大
227.2) feature: master_aio 类增加注册流关闭回调对象，这样当连接断开时，可以
调用 lib_acl 库中 acl_aio_server.c->acl_aio_server_on_close() 函数，减少
并发连接数计数及记录最后连接关闭的时间，从而能与 master_dispatch 服务模块
配合

225) 2014.3.21
225.1) bugfix: master_threads2.cpp，当上层框架直接调用 service_on_close 时，
没有释放流对象，造成了内存泄漏，此问题已经修复，但在 master_threads.cpp 此
问题依然存在(该类将来将会被丢弃)

224) 2014.3.14
224.1) bugfix: md5.cpp 其中在 WIN32 下使用 sprintf_s 函数时，传入的长度参数应为
3，否则 VC 会报错

223) 2014.3.13
223.1) feature: connect_manager 连接池集群管理器增加了后台检测功能，新增加的类
connect_monitor 为一个非阻塞线程，会在后台定期检测连接池集群中的所有服务器的端口是否
存活

222) 2014.2.27
222.1) bugfix: event_timer.cpp, 在 32 位机下会因 64 位整数转 32 位整数而
导致 32 位整数溢出问题，主要原因是 event_timer::set_time 中给 present_
赋值时指定了 unsinged long 限定，而 long 在 32 位机则是 32 位长度

221) 2014.2.6
221.1) feature: 借鉴了 glib 库中的一些宏定义，针对 gcc 或 vc 编译器增加了
一些编译属性开关

220) 2014.1.18
220.1) feature: db_pool 类增加了 peek_open 方法，可以在获取数据库对象时直接打开
数据库连接
220.2) comment: string::strip 的注释对 each 参数的解释不够清楚

219) 2014.1.27
219.1) 代码整理

------------------------------------------------------------------------
218) 2014.1.21
218.1) bugfix: HttpServletRequest.cpp, HttpServletRequest::readHeader 在解析
POST中的数据体时，需要判断请求头中 Content-Length 为 0 的情况

217) 2014.1.20
217.1) bugfix: http_request.cpp，当采用第一个构造函数(即 socket_stream* 流
作为构造函数的参数之一)时，socket_stream::get_peer(bool full) 的参数应为 true
以便于获得完整的地址(ip:port)，否则在重试时则只有IP而无PORT，导致无法连接成功

216) 2014.1.11
216.1) compile: 支持 vc2008 编译器
216.2) feature: 在使用高版本 vc（_MSC_VER >= 1500,即 VC9 以上版本） 编译器时，
不再使用 _CRT_SECURE_NO_WARNINGS 宏来避免编译器警告，而是使用 VC 建议的安全函数

215) 2014.1.8
215.1) feature: http_request 类添加了方法 set_timeout 可以设置网络超时及读写超时

214) 2014.1.6
214.1) bugfix: 新线程池服务器模板 master_threads2 类在调用 service_pre_jail
时应该通过 acl_threads_server_event 获得事件引擎 (原来写的是 acl_ioctl_server_event,
这个是旧的服务器模板获取事件引擎的方法)

213) 2014.1.5
213) security: ipc 通信机制中增加了随机数安全验证功能，以防止外来干扰

212) 2014.1.4
212.1) bugfix: queue_file.cpp，queue_file::create 函数内在尝试创建文件时
可能会因为文件系统出问题而进入循环过程，通过增加标志位避免该问题

211) 2013.12.29
211.1) feature: json 类支持将字符串对象添加至数组对象中
211.2) samples: json 下的测试用例继续完善

210) 2013.12.28
210.1) samples: 将所有的 json 测试用例移至 samples/json 目录下

209) 2013.12.25
209.1) bugfix: json.cpp 中 json_node::set_text 误把文本值赋予标签变量

208) 2013.12.22
208.1) feature: socket_stream 类支持 ssl 传输(与 polarssl 结合); 去掉了
ssl_stream 类

207) 2013.12.13
207.1) feature: master_threads2，新增加了服务器线程池模板

------------------------------------------------------------------------

206) 2013.12.7
206.1) samples/master_udp_threads: 该例子中的线程局部变量的静态用法 __thread
无法支持 solaris，改为动态方式使用线程局部变量方式

205) 2013.12.6
205.1) comment: 修正 connect_manager::init 原来错误的参数格式描述
205.2) bugfix: connect_pool::put 在归还连接给连接池时，为了让过期连接尽快回收，
需要调用 push_front，原来调用了 push_back

204) 2013.12.5
204.1) feature: Makefile 支持 solaris(x86) 编译

203) 2013.12.2
203.1) document: 消除了几个头文件中由 doxygen 检测出的错误注释

202) 2013.12.1
202.1) feature: 新增加 event 模块，将 master_timer 定时器类改名为 event_timer
类放于 event 模块中
202.2) feature: 在基类 master_base 中添加了方法 proc_set_timer 用于添加进程
级别的定时器，(同时移除了 master_threads 子类中的 proc_set_timer 方法)，这样
master_base 的所有子类 (master_threads, master_aio, master_proc, master_udp,
master_trigger) 都可以添加进程级别的定时器

201) 2013.11.29
201.1) feature: master 模块增加了定时器类 master_timer
201.2) feature: master_threads 模板支持新的定时器
201.3) workaround: stream 模块的异步流部分，将 aio_timer_callback 等类声明从
aio_handle 类中移除成为独立的类

200) 2013.11.26
200.1) feature: json.cpp,
200.1.1) json 类增加了以下功能函数：
a) 构造函数 json(const json_node&)，可以根据一个 json 对象的某一个 json
结点创建一个新的 json 对象
b) duplicate_node 根据一个 json 对象的某个 json 结点复制一个新的 json 结点
c) to_string 新的将 json 对象转换为字符串的函数
200.1.2) json_node 类增加了以下功能函数：
a) to_string 根据 json 结点生成 json 字符串的函数
b) set_tag 用来替换标签名
c) set_text 当 json 结点为叶结点时用来替换标签值
200.2) samples: 新增加了 json 测试用例 json3/json4

199) 2013.11.23
199.1) feature: http_header 类丰富了 set_url 及请求构造函数的参数类型，
允许 URL 参数中含有请求参数，且内部会自动解析 url 中的主机名及参数
199.2) feature: http_header 类添加了请求参数添加方法：add_int 及 add_format
199.3) feature: http_header add_param 允许参数值为空指针或空串
199.3) feature: http_header::set_host 仅是将主机字符串添加至成员变量 host_ 中
199.4) feature: http_header::set_url 中允许添加类似于 http://www.test.com 的
url(即末尾可以没有 '/')

198) 2013.11.21
198.1) feature: http_client 类增加了 chunked 传输方式；
198.2) feature: http_request 类增加流式写函数：write_head/write_body；
198.3) feature: http_response 类增加了流式写数据方式

197) 2013.11.19
197.1) workaround: 调整类 http_client 中的两个函数 get_respond_head  和
get_request_head 的返回值限制，去掉 const 限定词
197.2) bugfix: http_header.cpp，http_header::date_format 在 WIN32 编译出错

196) 2013.11.17
196.1) bugfix: json.cpp, json::getElementsByTags() 内部未对空指针做判断
196.2) samples: samples/json2, 用于测试级联提取数据的例子

195) 2013.11.13
195.1) bugfix: http_header.cpp, http_header::date_format 在 UNIX 平台下
gmtime 是线程不安全的，所以需要使用 gmtime_r

194) 2013.11.9
194.1) feature: HttpServletRequest 类增加了几个获取 HTTP 请求头参数的方法

193) 2013.11.8
193.1) feature: http_utils::get_addr 的 url 参数既可以是 HTTP 也可以是 HTTPS

192) 2013.11.7
192.1) bugfix: http_download.cpp 的构造函数中调用 ACL_SAFE_STRNCPY 时第三个
参数给出错误的尺寸大小（此 bug 由高版本的 gcc4.8.2 检测出）

------------------------------------------------------------------------

191) 2013.11.5
191.1) bugfix: http_header.cpp, http_header::build_common 添加 Content-Length
HTTP 头部字段时没有添加分隔符 ": "

190) 2013.11.1
190.1) feature: 当使用 GCC 进行编译时，针对所有具有变参的函数接口定义添加了
属性限定---__attribute__((format(printf, n, m)))，这样便于在编译期就能发现
因参数使用不当而导致的错误
190.2) bugfix: master_udp.cpp，当以 alone 方式运行时，没有将 socket_stream
赋给 ACL_VSTREAM::context，导致在 service_main 时又重新打开一次

189) 2013.10.31
189.1) bugfix: thread.cpp，当线程为分离方式创建时 thread::thread_run 在调用完
虚函数 run 后不得再引用线程对象的 return_arg_，否则会造成内存非法访问

188) 2013.10.20
188.1) feature: HttpServletResponse 类支持 Transfer-Encoding: chunked 传输方式

187) 2013.10.19
187.1) samples: 增加了测试用例 thread_client，一个多线程网络客户端程序

186) 2013.10.18
186.1) bugfix: db/db_mysql.cpp, 在打开 mysql 连接时设置字符集，判断是否设置
成功的方法有误

185) 2013.10.15
185.1) thread 类分离出一个基类: thread_job，从而使逻辑更为清晰

184) 2013.10.13
184.1) bugfix: master_udp.cpp, master_udp::service_main() 中的 socket_stream
是临时堆栈变量，如果被用户外部引用则可能造成内存非法访问

183) 2013.10.12
183.1) samples: 增加了 master_udp_threads，该例子将线程池与 master_udp 模板结合

182) 2013.10.11
182.1) feature: connect_manager/connect_pool 允许动态添加、删除连接池对象
182.2) feature: 增加了线程类(stdlib/thread)及线程池类(stdlib/thread_pool)
182.3) samples: 增加了测试用例 thread 用以测试线程类
182.4) samples: 增加了测试用例 thread_pool 用以测试线程池类

181) 2013.10.10
181.1) samples: 添加了 master_aio_proxy 用作纯 TCP 非阻塞代理

------------------------------------------------------------------------

180) 2013.10.3
180.1) feature: aio_stream 增加了 get_peer/get_local 用来获得网络连接流的本地
及远程地址

179) 2013.9.30
179.1) feature: master_udp 服务器模板增加了可在 proc_on_init() 虚函数中获得
本地绑定套接字流对象集合的函数功能: get_sstreams()
179.2) bugfix: memcache.cpp 当调用 open 函数连接 memcached 服务器失败时，用
valgrind 检查出记录错误日志时引用了一个未经初始化的变量

178) 2013.9.27
178.1) lib_acl 库中 ACL_EVENT_NOTIFY_RDWR/ACL_EVENT_NOTIFY_TIME 函数接口定义
的修改，与之相关的模块进行了修改
178.2) feature: master 服务器框架增加了 master_udp 服务模板类
178.3) samples: 增加了针对 UDP 的测试用例 udp_client 

177) 2013.9.22
177.1) 因为 lib_acl 基础库中的 ACL_VSTREAM 读写回调函数接口变更，调整了与之相关的
部分内部接口，主要影响到了 ssl_stream/ssl_aio_stream

176) 2013.9.13
176.1) compile: 增加了 Makefile.db 工程文件，使用该文件编译则需要 mysql/sqlite 库;
如果不需要数据库相关的功能，则使用 Makefile 工程文件进行编译

175) 2013.9.12
175.1) feature: connect_manager 类增加了根据键值字符串的哈希值获取连接池对象的
虚函数，从而有利于在分布式环境里使用连接池
175.2) feature: connect_manager/connect_pool 类增加了针对每个连接池有一个其
位于连接池集合中的下标索引

174) 2013.9.10
174.1) feature: http_request::request 中原来只能指定 GET/POST 两种请求方法，现在
可以指定多种请求方法
174.2) feature: http_header 允许设置自定义（即除 GET/POST/PUT/CONNECT/PURGE之个）
的请求头命令字

173) 2013.9.9
173.1) feature: memcache 类支持流式读写数据，从而可以支持大 value 的存取方式

172) 2013.9.7
172.1) master_threads 类在单独运行方式的使用场景接近于在 acl_master 框架下的运行场景

171) 2013.9.5
171.1) feature: master_threads/master_aio/master_proc 类支持在单独运行模式下监听多个地址
171.2) feature: acl_cpp_init.cpp 中添加了 WIN32 下关闭 DOS 窗口的函数
171.3) compile: acl_cpp_init.cpp 中 freopen 返回的文件句柄因为未被使用而使编译器报警

170) 2013.8.30
170.1) feature: http/memcache 模块增加了连接池管理类
170.2) connpool/http_request_pool/memcache_pool: 调整了构造函数，去掉了最后一个参数

169) 2013.8.22
169.1) bugfix: memcache 类中当连接异常中断重试时会因请求数据被清掉而出错，原因
是请求与响应共用同一个缓冲区所致，现将请求缓冲区与响应缓冲区分开

168) 2013.8.18
168.1) samples: 增加了测试 http_request_pool 的例子 samples/http_request_pool
168.2) samples: 增加了测试 memcache_pool 的例子 samples/memcache_pool

167) 2013.8.17
167.1) feature: 增加了 HTTP 客户端连接池类 http_request_pool；同时将 http_request
类变为 connect_client 的子类
167.2) feature: memcache 增加了连接池类 memcache_pool；同时将类 mem_cache 改为
memcache

166) 2013.8.13
166.1) mem_cache: 调整了构造函数接口，使之更容易使用
166.2) feature: 添加了通用的客户端连接池管理对象：connect_client, connect_pool,
connect_manager，这些类均为纯虚类，但子类只需要实现很少的几个虚函数便可获得功能丰富的
连接池管理功能

165) 2013.8.11
165.1) feature: db_pool 支持动态将空闲时间过期的数据库连接释放掉，从而减少
对后端数据库的压力

164) 2013.8.9
164.1) bugfix: db/db_mysql.c 在打开 mysql 时原来的实现中，如果需要设置字符集，
则会导致崩溃，原因是设置字符集必须是在连接打开之后设置，原来的做法是在连接打开
前设置的

163) 2013.7.29
163.1) bugfix: string::split/split2 内部在调用 acl_argv_split 后没有调用
acl_argv_free 释放动态分配的内存
 
162) 2013.7.1
162.1) 规整了所有的源文件

161) 2013.6.25
161.1) compile: 消除了在 gcc-4.6.3 下的一些编译警告

160) 2013.6.13
160.1) feature: 添加了 server_socket 类
160.2) socket_stream: 对 get_ip 类的函数做了一定调整
160.3) samples/benchmark: 增加了 client/server 两个用于测试 IO 压力的程序

159) 2013.6.6
159.1) feature: HttpServletRequest/http_client 添加调试输出 HTTP 请求头的函数

158) 2013.5.13
158.1) feature: master_thread 类增加了静态添加定时器功能

157) 2013.5.2
157.1) feature: 增加了针对文件进行异步 IO 操作的类：aio_fstream
157.2) samples: 增加了针对新增类 aio_fstream 的测试例子: fs_benchmark

156) 2013.4.17
156.1) bugfix: master_thread.cpp 在测试环境下运行时，master_threads::thread_run
函数增加了缓冲区是否有可读数据的判断

155) 2013.4.5
155.1) bugfix: ipc_service.cpp 中 thread_pool_main 函数应该调用 last_serror
而不应该调用 last_error
155.2) bugfix: 在 rpc_request::run 函数中发送了一个局部栈变量，而当主线程中
的 rpc_client::on_message 通过 IO 收到此变量时可能它已经在子线程中销毁了，
可能造成内存非法访问问题，所以现在把此变量的生命周期改成与 rpc_request 相同
从而防止 rpc_client::on_message 中引用了一个提前释放的变量

154) 2013.4.1
154.1) HttpServletRequest.cpp: HttpServletRequest::getSession中生成 COOKIE
及 SESSION 的优先级做了调整

153) 2013.3.28
153.1) feature: beanstalk 客户端连接增加了连接池类 beanstalk_pool

152) 2013.3.23
152.1) bugfix: HttpServletRequest::getPathInfo 方法中，在 CGI 模式下应该
先根据 SCRIPT_NAME 环境变量取得，如果取不到再根据 PATH_INFO 环境变量获取

151) 2013.3.14
151.1) feature: HttpServletRequest::getSession 增加了参数 sid
151.2) feature: memcache_session 类增加了一个构造函数

150) 2013.3.11
150.1) bugfix: rpc.cpp, rpc_request::cond_wait 调用过程中，如果函数
acl_pthread_cond_wait 或 acl_pthread_cond_timedwait 返回非 0 值，则应该
解锁，否则会造成 rpc_request::cond_signal 因为无法获得锁而阻塞

149) 2013.2.25
149.1) bugfix: ipc 模块，当 aio_handle 为 WIN32 窗口消息事件引擎时，不应
调用套接口的监听过程
149.2) feature: ipc 模块简化了接口
149.3) samples/gui_rpc: 更新了部分代码

148) 2013.2.24
148.1) 将 db_pool 类变成基类，增加了 mysql_pool 和 sqlite_pool 两个子类

147) 2013.2.8
147.1) feature: 添加了 url_coder 类，用于 url 的编码与解码
147.2) http/: 将 HttpCookie 类从 http_header 类的头文件中剥离形成单独的类

146) 2013.2.5
146.1) feature: beanstalk.cpp，当网络重连时，watch 及 use 命令会被自动调用

145) 2013.1.31
145.1) feature: beanstalk 类增加了几个方法
145.2) wizard: 模板生成中的模板增加了几个方法

145) 2013.1.27
145.1) feature: 增加了文件队列的操作库 queue/

144) 2013.1.26
144.1) beanstalk: 优化了接口实现方案

143) 2013.1.25
143.1) feature: 添加了针对 beanstalkd 客户端通讯协议的支持
143.2) samples: 添加了测试 beanstalk 客户端通讯库的例子

142) 2013.1.13
142.1) lib_acl_cpp: 将头文件进行了分类，使之更加模块化，也便于将头文件放在系统目录下

141) 2012.12.31
141.1) feature: master_threads.hpp 增加了 thread_on_timeout() 虚函数

140) 2012.12.28
140.1) bugfix: string.cpp 类中的 left()/right() 有误

139) 2012.12.17
139.1) bugfix: session.cpp, vbuf_new() 中的去掉了 assert() 语句

138) 2012.12.14
138.1) feature: socket_stream.cpp: get_peer()/get_local() 增加了一个控制参数，
允许用户获得 IP:PORT 或 IP 格式的地址
138.2) feature: socket_stream.cpp, 增加了两个函数 get_peer_ip/get_local_ip

137) 2012.12.10
137.1) performance: session 类增加了本地对象的缓存机制，提高了查询/添加/删除
的性能

136) 2012.12.7
136.1) feature: session 类增加了延迟方式修改数据，这样当针对某一 SID 号
做多次修改、添加操作时，只当最后 flush 后才真正连接后端的 cache 服务器，
从而大大提高了整体性能
136.2) string: 完善了一下构造函数
136.3) samples: samples/session 增加了对延迟修改 session 的测试示例

135) 2012.12.6
135.1) bugfix: db/db_mysql.cpp, 连接 mysql 时的地址有错

134) 2012.11.27
134.1) feature: 增加了单体模板类 singleton.hpp
134.2) samples: 增加了单例的测试示例 samples/singleton

133) 2012.11.8
133.1) class istream: 修改了 gets_peek/read_peek 的参数接口；增加了 readn_peek 函数

132) 2012.9.7
132.1) 为了避免一些不兼容性及编译问题，去掉了大部分类中的 noncopyable 继承关系

131) 2012.9.6
131.1) feature: 添加了 noncopyable 类，子类只需继承该类便可阻止类对象赋值
131.2) 大部分类均继承了 noncopyable 类，可以在编译期有效地阻止类对象直接赋值

130) 2012.8.21
130.1) feature: stream 类中添加了 set_rw_timeout/get_rw_timeout
130.2) socket_stream: 去掉了 unbind_vstream，因为基类 stream 有类似函数

129) 2012.8.18
129.1) samples/http_client: VC 工程文件中动态连接方式的连接库有误

*128*) 2012.8.17 1.1.1.2 release 版本正式发布！～

127) 2012.8.16
127.1) performance: rpc, ipc_service 内部的 ipc 消息连接流允许采用长连接方式，
从而提高了消息传递的效率

126) 2012.8.15
126.1) http_response.cpp: get_body() 当长度 < 0 且 HTTP 请求方法为 GET/CONNECT
时，则也应返回 true
126.2) samples: http_server 用来测试 rpc 通讯模式下半非阻塞方式的功能

125) 2012.8.14
125.1) doxygen 检查出一些头文件中注释不准确的地方
125.2) 准备发布正式版本了:)

124) 2012.8.13
124.1) feature: 因为 md5 算法经常会被使用，所以封装了一个 md5 算法类，见 md5.cpp
124.2) samples: md5 示例测试新增的 md5 功能类

123) 2012.8.2
123.1) aio_handle: 将定时器的接口进行了相应调整，使之更加明晰

122) 2012.7.30
122.1) feature: socket_stream 类增加了 unbind_stream 方法

121) 2012.7.26
121.1) bugfix: xml.cpp 的 xml 类中，多处存在内存泄露及内存非法释放的问题，
这些问题均由 valgrind 查出

120) 2012.7.25
120.1) bugfix: rpc.cpp 中如果 cond_signal 调用时间早于 cond_wait 时，则会
因为线程锁及线程条件变量未被初始化而出错，所以这两个变量应该在构造函数内
进行初始化；同时还增加了 cond_count_ 作为 cond_wait 是否应该等待的条件

119) 2012.7.20
119.1) feature: 增加了 http_utils，专门用于一些常用的工具类功能
119.2) feature: 增加了 http_download，专门用于支持断点续传方式的文件下载

118) 2012.7.19
118.1) feature: http_request/http_header 增加了对 Range 的支持

117) 2012.7.16
117.1) feature: http_request, 增加了方法：set_charset/read_body，从而可以
循环读取服务器返回的压缩数据，并进行解压，同时可以转换为本地字符集
117.2) bugfix: http_client, read_response_body(char* buf, size_t size) 中，
当在读响应头且自动启动了解压模块时，而该函数却不能进行解压处理(也不会调用
zlib_stream::unzip_finish 过程)，这会造成 zlib 库的内存泄露
117.3) bugfix: rpc.cpp, rpc_request::cond_wait 加锁/解锁顺序不对
117.4) feature: string.cpp, 增加了 split2 函数，用于返回 vector 格式数据

116.1) 2012.7.12
116.1) string 类中的 split 函数的返回值由原来的 std::list 改为 std::vector，
这样更便于用户使用

115) 2012.7.10
115.1) compile: 消除了例子中的几个编译问题

114) 2012.7.5
114.1) feature: rcp.hpp 增加了 cond_wait/cond_signal 方法，便于主线程向处于等待
状态的子线程发送消息

113) 2012.7.4
113.1) feature: socket_stream.h 增加了 ACL_SOCKET unbind_sock() 方法，将套接字
与流对象解绑，从而将流对象的释放与套接字的关闭分开

112) 2012.7.2
112.1) bugfix: aio_istream.cpp 中，函数 aio_istream::gets 和 aio_istream::read
当输入的超时时间为 timeout 为 0 时，则会延用之前设置的超时时间，应该是把超时时间
设置为 0
112.2) samples/rpc_download: 进一步优化，同时使用 valgrind 检查出库本身一些问题
112.3) samples/gui_rpc: 该例子采用基于 WIN32 窗口消息方式，实现阻塞式下载过程与
窗口消息结合的功能

111) 2012.7.1
111.1) bugfix: http_request.cpp/http_response.cpp 中的 get_body(char*, size_t)
有一处手误，返回值给的不对
111.2) samples: rpc_download 该例子以一个完整的 HTTP 下载为例，测试了 rpc 功能
模块的可用性

110) 2012.6.30
110.1) feature: rpc_request 类增加了两个有用的方法: rpc_signal/rpc_wakeup, 
从而可以在调用子类的 rpc_run 方法时，允许子类在子线程中边处理边向主线程发
消息，主线程收到消息后启用 rpc_request::rpc_wakeup 处理中间结果
110.2) rpc_request 的方法 rpc_callback 改为 rpc_onover，同时 rpc_onover 的
权限范围被限定为 protected，为了保证在 rpc_service 中可以访问，将 rpc_service
和 rpc_client 加为 rpc_request 的友元类

109) 2012.6.28
109.1) feature: 增加了 ipc/rpc.cpp，从而进一步扩展了 IPC 类，使非阻塞线程
与阻塞线程之间的通信更为方便

108) 2012.6.26
108.1) feature: http_header/HttpCookie 两个类中，在关设置的方法增加了本
对象的引用，以便于用户可以连续对该对象的设置操作
108.2) bugfix: HttpServletRequest::readHeader，有一处没有判断指针为 NULL
的问题

107) 2012.6.21
107.1) bugfix: samples/cgi_upload 在循环读数据时有内存越界问题
107.2) feature: src/http/http_header 增加了 set_request_mode 方法用于手工
设置是请求头还是响应头
107.3) HttpServletResponse: 在创建 http_header 时调用 set_request_mode
指定了响应头方式
107.4) samples/: cgi, cgi_upload 添加了单独服务运行方式，以方便进行调试
107.5) feature: HttpServletResponse 类增加了方法 setKeepAlive 以及
getHttpHeader()

106) 2012.6.20
106.1) http 模块中的一些接口重新优化了一下，涉及的文件有：HttpServlet,
HttpServletRequest, HttpServleResponse, HttpSession
106.2) session 类重新设计了一下，该类成为纯虚类，增加了 memcache_session
类，用来实现当缓存为 memcached 时的 session 功能，将来还可以再增加对redis
的支持
106.3) samples: cgi/cgi_upload/http_servlet/session 稍微修改一下，以适应上面的修改

105) 2012.6.19
105.1) bugfix: master_conf.c 中在 reset 函数中，在释放字符串类型的变量时，
如果该变量未被赋值，则不应释放
105.2) feature: master_base 增加了接口 daemon_mode 用来判断是否是由 acl_master
控制的后台服务器模式
105.3) bugfix: http_header::build_request 方法内部对 URL 编码方式有误，
不应对整个 URL 参数进行 URL 编码，而应该针对每一个参数分别进行 URL 编码
105.4) bugfix: http_request::get_cookie 第一次被调用时应该先调用一下
http_request::create_cookies

104) 2012.6.15
104.1) samples: 增加了 samples/http_request 测试用例

103) 2012.6.13
103.1) feature: 增加了 http_pipe 类，用于以管道流方式处理 HTTP 协议数据
103.2) feature: http_request/http_response 增加了一些功能函数
103.3) samples: 增加了 samples/http_response 测试用例

102) 2012.6.12
102.1) feature: session/HttpSession 增加了设置 session 过期的方法
102.2) 去掉了有些源程序中在 WIN32 平台下对 snprintf 的定义，因为其包含的
头文件 lib_acl.h 中已经定义过了

101) 2012.6.11
101.1) feature: session/HttpSession 增加了允许存取二进制属性对象的接口

100) 2012.6.8
100.1) feature: session 添加了 del 接口
100.2) feature: HttpServletRequest 类添加了 setCookie 函数
100.2) bugfix: HttpSession 在第一次添加 session 时如果浏览器没有 session
标识，则设置了 session 后立即取该值会因为没有那个 session cookie 而取不到
100.2) samples: 添加了 http_test, session 两个例子
99) 2012.6.7
99.1) feature: 将 session 单独形成一个类，使 HttpSession 继承 session 类
99.2) locker: 修改了相关的接口，使之更合理
99.3) HttpServlet: 增加了当未知请求方法时的处理虚函数 doUnkown

98) 2012.6.5
98.1) feature: http_request/http_response 两个类的功能进一步得到完善
98.2) http_header: 添加了 reset 方法，可以重置内部状态
98.3) featur: http_header->HttpCookie 添加了 setCookie 函数用来分析来自
于服务器响应的 Set-Cookie 中内容

97) 2012.6.3
97.1) feature: 增加了 master_conf 类用于读取配置文件，同时将 master_base 类中
有关配置的部分放置在 master_conf 中处理
97.2) compile: 在 AS6/CS6 上编译通过

96) 2012.6.1
96.1) feature: db_handle 增加了 escape_string 用于将数据库的字段中的特殊字符
进行转义以防止 SQL 注入攻击
96.2) feature: db_handle/db_pool 重新建立了二者实例对象之间的关联关系

95) 2012.5.31
95.1) feature: xml, 增加了 getFirstElementByTag/getFirstElementByTags，从而更
方便用户操作 xml 对象

94) 2012.5.28
94.1) bugfix: mime/internal/mime_state_parse.cpp: 因为之前增加了 body_data_end
做为某个 MIME 结点数据体的结尾，当邮件体不是 MULTIPART 格式时，body_data_end 也
应该赋值才对。

93) 2012.5.26
93.1) linux 平台下默认将对 polarssl 库的依赖去掉了

92) 2012.5.18: 1.1.1.0 BETA 版本发布
92.1) http 模块功能已经比较丰富了，基本可以替代传统的 CGI 方式，用户在使用
时可以象使用 java servlet 一样方便了，GOOD WORK!

91) 2012.5.17
91.1) 修改了 mime/ 相关模块，从而可以使 http_mime 类支持文件上传了

90) 2012.5.16
90.1) http/: 增加了 http_mime 类，支持文件上传功能

89) 2012.5.15
89.1) http/:  HttpServlet 类增加了对参数等的支持
89.2) http_client: 在调用第二个构建函数时，rw_timeout_ 没有赋初始值(valgrind
检查出该错误)

88) 2012.5.13
88.1) http/: 增加了针对 CGI 的部分支持

88) 2012.5.10
88.1) feature: 增加了 HttpServlet, HttpServletRequest, HttpServletResponse,
HttpSession 等类，可以用作 CGI 开发
88.2) 去掉了 HTTP_COOKIE 结构, 增加了 HttpCookie 类
88.3) 增加了 samples/http_servlet 例子

87) 2012.5.2
87.1) http_client: 增加了 get_ostream/get_istream 接口，去掉了冗余的 write
接口，用户可以直接调用 http_client::get_ostream().write 来达到写的目的

86) 2012.4.26
86.1) feature: xml.hpp 中增加了 xml_attr 类，同时给 xml_node 类增加了用
来遍历结点所有属性的功能

85) 2012.4.24
85.1) feature: json 增加了 get_json() 函数，xml 增加了 get_xml 函数
85.2) feature: json/xml 都增加了 first_child/next_child 用于某个结点遍历
子结点的函数，同时增加了 get_parent() 函数

84) 2012.4.22
84.1) feature: json/xml 均增加了一些非常有用的接口函数，从而更容易地创建
json/xml 对象，可以参考相关的例子

83) 2012.4.21
83.1) feature: json/xml 都增加了用于结点遍历的 first_node/next_node 接口
83.2) feature: master/ 框架，在 acl_cpp 库使用 acl 库中的 master 框架时，
用户的程序中不再需要包含 lib_acl.h 头文件，只需要包含 lib_acl.hpp 头文件
即可，这样使用户在使用 acl_cpp 库时可以不用再了解 acl 库的知识，同时在编译
时更为方便（只需要链接 lib_acl.a 库即可）

82) 2012.4.20
82.1) feature: 添加 json 库的封装及相关功能
82.2) samples: samples/json

81) 2012.4.17
81.1) feature: xml 库添加了创建 xml 对象序列号的功能

80) 2012.4.12
80.1) bugfix: master 框架下 master_proc, master_trigger 服务器模板需要
添加 acl_watchdog_pat() 过程通知 acl_master 进程子进程还正常; 在
master_base.hpp 中添加了一个新的成员变量：daemon_mode_ 来表明是单独运行
模式还是后台进程模式

79) 2012.4.11
79.1) compile: 调整了在 WIN32 下 VC2010 编译工程

78) 2012.4.3
78.1) feature: http_header 即可以作为 HTTP 请求头，又可作为 HTTP 响应头

77) 2012.4.2
77.1) feature: http_client 丰富了一些函数接口，使该类即可以用作请求端的
HTTP 客户端流，又可以用作响应端的 HTTP 客户端流

76) 2012.4.1
76.1) bugfix: string.cpp, 在CS4/AS4 上的 g++ 无法区分变参类型的接口，如
format(const char* fmt, ...); format(const char* fmt, va_list ap),
所以导致了 string.cpp 的 format, format_append 的错误匹配，所以增加了
vformat(const char* fmt, va_list ap)

75) 2012.3.18
75.1) Makefile: 在 samples/ 下增加了一个统一的 Makefile.in, 所有的示例的
Makefile 文件都大大简化
75.2) bugfix: string.cpp 类中的 parse_xxx() 使用了临时的栈变量，现在统一
改成了线程局部存储变量
75.3) feature: 增加了 db_service_mysql 类，从而增加了对 mysql 数据库服务
的支持
75.4) db_service: 将 db_service 定义为基类，增加了 db_service_sqlite 用于
支持 sqlite 数据库

74) 2012.3.16
74.1) bugfix: mem_cache.cpp 在 set 命令时有个BUG，已修复

73) 2012.3.13
73.1) Makefile: 指定了 mysql 头文件的路径为: include/mysql
73.2) feature: db_mysql.cpp 支持本地字符集

72) 2012.3.7
72.1) compile: 在编译动态库时可以指定链接路径，用法如下：
make shared rpath=xxx; 仅编译动态库
或 make rpath=xxx; 同时编译动态库及静态库存

71) 2012.2.18
71.1) 将根目录下的 mime 目录移到 src/mime/internal/ 目录下

70) 2012.2.15
70.1) src/stdlib/mem_cache.cpp: 实现了部分常用的 memcached 协议

69) 2012.2.14
69.1) src/ 目录重新规划了目录结构，从而显得更为清晰

68) 2012.1.19
68.1) feature: http_client/http_header, 允许接收来自于服务器的压缩数据并进行解压
68.2) samples: http_client2, 该例子用来测试 http_client 类

67) 2012.1.18
67.1) feature: log.hpp: 增加了接口 stdout_open 当未打开日志流时，通过此
函数用来将日志信息输出至标准输出
67.2) log.hpp: 将 open 函数的参数设置了缺省的值
67.3) feature: zlib_stream 增加了针对 HTTP 传输过程中解压 gzip 数据的支持

66) 2012.1.10 : 1.1.0.0 版本发布了!!!!!!!
66.1) feature: master_aio.cpp, 该库封装了 acl_master 服务器框架中的
单线程非阻塞模板
66.2) feature: master_proc.cpp, 该库封装了 acl_master 服务器框架中的
进程池模板
66.3) feature: master_trigger.cpp, 该库封装了 acl_master 服务器框架中的
触发器模板
66.3) samples: samples/master_aio, samples/master_proc, samples/master_trigger

65) 2012.1.8
65.1) feature: master_threads 类完善了一些接口调用

64) 2012.1.6
64.1) feature: master_threads.cpp, 该库封装了 acl_master 服务器框架中的多
线程处理模板
64.2) samples: samples/master_threads，测试用例

63) 2011.12.21
63.1) feature: db_handle.cpp，其中的 db_handle 类增加了三个函数，方便用户在
数据库查询后直接获得结果集：get_first_row()/0, get_rows()/2, get_rows()/0

62) 2011.12.7
62.1) feature: 增加了 db_mysql.cpp，该类从 db_handle 继续，从而使 db_handle
可以支持 mysql 了，但该类在 WIN32 使用时会有点问题，因为目前还没有找到合适的
libmysql.lib/libmysql.dll，所以在 WIN32 使用该类时，建议使用 acl_cpp 的静态库
62.2) feature: 增加了 db_pool.cpp，该类实现了数据库连接池的功能
62.3) samples: samples/mysql，用来测试新加的 db_mysql 类

61) 2011.10.5
61.1) feature: 从 glib 中摘取了一段代码 win_iconv.cpp 用于支持 win32 环境下
的字符集转换功能，这样在 win32 下 acl_cpp 库既可以使用 iconv.dll 进行字符集
的转换，同时也可以通过在 acl_cpp 的编译开关定义 USE_WIN_ICONV 使用 win32 原
生的字符集转换功能。感谢 glib 中 win_iconv.cpp 的作者使用 win32 的原生 API
模拟了 iconv 库的功能。

60) 2011.10.3
60.1) mime.cpp: save_mail, get_image, get_images 三个函数增加了几个默认参数

59) 2011.9.15
59.1) malloc.cpp, malloc.hpp：将针对 new, delete 的重载去掉，而作为条件编译保留

58) 2011.9.12
58.1) feature: 重载了 new, delete，这样便于调用 acl 库的内存池切片库

57) 2011.9.5
57.1) string: 将 push_back 调用做为二进制字符添加，这样象 mime_code 等类
中调用 push_back 时就不会出错了

56) 2011.9.4
56.1) 重新设计了 pipe_stream 基础类，将原来的 push 和 pop 合为一个函数
push_pop，其它相应的子类做相应修改
56.2) bugfix: 因为 string 类对二进制及纯字符做了存储区分，所以导致了
调用 push_back 等函数的调用会出错，其中 mime_code 类就因此而出错

55) 2011.9.3
55.1) feature: zlib_stream，支持 pipe_stream 方式
55.2) samples: samples/zlib 增加了支持 pipe_stream 的测试
55.3) bugfix: charset_conv 当源字符集为 utf-8 时，针对 utf-8 的前缀判断有
问题

54) 2011.9.2
54.1) feature: zlib，增加了对 zlib 库的封装，既支持流式压缩与解压缩，同时
又支持一次性压缩与解压缩，并且在 WIN32 平台下是动态加载 zlib.dll 的
54.2) samples: samples/zlib 为测试新的 zlib 库的例子

53) 2011.8.26
53.1) feature: mime 解析完毕后，允许从内存中转储邮件数据解析结果，原来在
转储解析结果时只能是从源文件中抽取数据；影响的类有 mime_node, mime_body
53.2) samples: mime 例子增加了针对 53.1) 新特性的测试用例

52) 2011.8.18
52.1) ipc_service 基类支持基于 WIN32 窗口消息方式的 IPC 通信，其它基于此
类的继承类 dns_service, http_service, db_service 均支持了 WIN32 窗口消息
的 IPC 通信方式; 当然，子类可以自行选择 IPC 通信方式是采用 IO 消息方式还
是 WIN32 窗口消息方式
52.2) samples: wn_dbservice 实例，用来检测 db_service 的功能以及 db_service
的 WIN32 消息的 IPC 通信功能
52.3) feature: 对于 iconv.dll, sqlite3.dll 调用的方式改为动态加载模式

51) 2011.8.14
51.1) 增加了 db_handle/db_sqlite 类，从而可以方便数据库的操作过程
51.2) 增加了 db_service 类，从而可以将数据库操作过程在子线程中处理，保证
了主线程仍然为非阻塞过程

50) 2011.7.22
50.1) final_tpl.hpp: 增加了类似于 java 中 final 功能的禁止继承的模板类

49) 2011.7.19
49.1) 修改了 acl::xml 中有关 XML 解析的方法，同时增加了一些注释，方便用户使用
49.2) feature: ssl_aio_stream/ssl_stream 允许来回切换流为 SSL 流或非 SSL 流

48) 2011.7.18
48.1) 增加了 WIN32 平台下的版本号资源

47) 2011.7.16
47.1) 消除了异步IO的回调类中的多重继承问题

46) 2011.7.3-7.6
46.1) feature: 增加了新类对象 ssl_aio_stream，该类支持基于 polarssl 的加密
传输，不过目前该类对象仅支持客户端连接流，该类是支持非阻塞IO的SSL加密流对象
46.2) bugfix: ssl_stream(基于 polarssl 的阻塞流) 类对象修改了几处可能的问题

45) 2011.6.29
45.1) aio_stream/aio_istream/aio_ostream: 在添加回调类对象时，内部会动态
分配内存块用来存储这些对象，这样在类对象的回调中如果用户即调用删除回调类
对象的函数，这些动态分配的内存区并不会被误删除，从而可以保证之后对这些存
储对象的访问不至于出现非法访问的问题

44) 2011.6.28
44.1) feature:
aio_stream 类: 增加了 del_close_callback/del_timeout_callback
				/disable_close_callback/disable_timeout_callback
aio_ostream 类: 增加了 del_write_callback/disable_write_callback
aio_istream 类: 增加了 del_read_callback/disable_read_callback

43) 2011.6.24
43.1) http_header: 去掉了类构造函数的两个无用的参数(domain 和 port)
43.2) http_request: 在类构造函数中添加了 domain, port 两个参数

42) 2011.6.23
42.1) 将 http_stream.c/http_stream.h 改名为 http_client.c/http_client.h

41) 2011.6.22
41.1) 修改了 Doxygen 报错的一些头文件中的注释

40) 2011.6.21
40.1) 为了与 VC 编辑器兼容，将所有的源文件和头文件都转成 DOS 方式，即回车
换行采用 \r\n，主要是 VIM 比较智能，它能根据文件的换行格式自动选取，而VC
就比较弱，虽然VC识别\n，但添加换行时只会添加\r\n

39) 2011.6.16
39.1) 修改了一下 VC 的工程文件
39.2) http_request, dns_result_callback 两个 类增加了 destroy 虚接口，
以便于在子类中进行销毁类对象
39.3) bugfix: aio_handle.cpp, aio_timer_callback::del_task 不应该在调用
tasks_.erase(it); 之后的循环外再次判断 it == tasks_.end()，因为 iterator
被删除后 it 也就没有任何意义了

38) 2011.6.15
38.1) 为了便于使用 VC 自带的比较弱知的 NEW 宏来检查内存泄漏，不得不把内部
所有的 new 都改成 NEW；在 acl_stafx.hpp 中添加了 WIN23 下的 NEW 宏定义
38.2) feature: 增加了类接口 aio_delay_free，这样子类只要继承该类，就可以
在异步引擎中被延迟释放；同时，将 aio_timer_callback 做为 aio_delay_free 的
子类；将 aio_handle 中的 delay_free_timer 改为 delay_free，从而使该功能成
为一个更为通用的功能

37) 2011.6.13
37.1) HttpClient 创建了 vc2010 下的工程

36) 2011.6.10
36.1) 调整了一下在 VC 开始环境的工程

35) 2011.6.9
35.1) feature: 增加了 http_service 类，可以方便进行HTTP请求处理过程
35.2) ipc_service: 优化了一些处理过程

34) 2011.6.1
34.1) feature: 异步定时器支持子类定时器可以设置多个定时消息事件

33) 2011.5.23
33.1) feature: win32 下支持 iconv 了

32) 2011.5.16
32.1) 将所有与定时器相关的精度由秒级提高到微秒级

31) 2011.5.13
31.1) bugfix: aio_ostream.cpp 中的类 aio_timer_writer::timer_callback()
中使用了一个无效的 iterator 进行判断
31.2) compile: 将 acl_stdafx.hpp 放在 src/ 目录下，以保持私有性
31.3) compile: 将VC链接时的警告去(/EDITANDCONTINUE, /OPT:ICF)，只需要
打开增量链接就可以了

30) 2011.5.12
30.1) feature: 增加了类 rfc822，用于解析对符合 rfc822 规范的邮件内容(如
邮件地址, 日期) 进行解析
30.2) samples: 增加了测试程序 samples/rfc822

29) 2011.5.6
29.1) feature: aio_stream 类增加了 get_astream() 接口可以获得 ACL_ASTREAM 对象

28) 2011.5.2
28.1) feature: xml.hpp, 增加了 get_xml_node() 函数
28.2) feature: stream.hpp, 增加了 get_vstream() 函数
28.3) feature: socket_stream.hpp, 增加了 open(ACL_VSTREAM*) 函数

27) 2011.4.21
27.1) mime/header_opts.cpp: 去掉了 header_opts_begin, header_opts_cleanup
两个函数，在内部增加了 acl_pthread_once, atexit 两个系统调用，可以保证内部
的全局静态对象仅被初始化一次，且当程序退出时会自动释放该对象
27.2) mime.cpp: mime::init(), mime::cleanup() 已经没有用处了，将来将会被去掉

26) 2011.4.15
26.1) xml: 增加了几个功能函数，方便取得 XML 对象中的相关属性值
26.2) acl_stdafx.hpp: 去掉了 *.hpp 包含

25) 2011.4.14
25.1) handlersocket: 增加了单独的 hsproto 类，专门用于协议处理

24) 2011.4.9
24.1) handlersocket, hsclient: 增加了因网络IO问题出错的重试功能
24.2) 修复了在高版本 gcc 上的编译错误

23) 2011.4.7-4.8
23.1) handlersocket: 优化了代码，并修复了一些问题，现在 handlersocket 主要由
hspool, hsclient, hstable, hsrow 四个类组成

22) 2011.3.31
22.1) bugfix: log.hpp 中的函数名可能会造成 VC2003 在函数重载解析后出错而导致
在运行时程序出现不可预知问题，所以将 log.hpp 中的函数名区分开，而不采用C++中
函数名的重载方式

21) 2011.3.28
21.1) aio_xxx: 增加了异步流的功能，并修改了延迟读的 BUG

20) 2011.3.25
20.1) aio_handle.cpp: 当异步句柄为 WIN GUI 消息时，允许用户绑定自定义的消息号

19) 2011.3.16-3.20
19.1) feature: 在异步流的基础上增加了 ipc_xxx 等相关功能类，这些类可以保证
在不同线程或不同进程之间进行异步通信
19.2) feature: 在 ipc_xxx 基础上增加了 ipc_manager 类，该类可以保证主线程为
非阻塞过程，而子线程是阻塞过程，子线程通过 ipc 方式与主线程进行通信
19.3) feature: 在 ipc_manager 的基础上增加了 DNS 异步查询的功能类，该类的特
点是主线程是非阻塞的，而查询子线程是阻塞的，查询子线程通过 ipc_xxx 方式将结
果通知主线程

18) 2011.3.14
18.1) feature: aio_ostream/aio_istream 增加了延迟写/读的功能，方便网络限速

17) 2011.3.13
17.1) aio_handle: 增加了针对 WIN32 界面消息的支持
17.2) aio_handle: 增加了定时器功能

16) 2011.3.10
16.1) aio_xxx: 基本上成熟，可以使用了:)
16.2) string.cpp: 增加了二进制流及文件流的区分功能

15) 2011.3.8
15.1) aio: 继续完善

14) 2011.3.1
14.1) 完善了非阻塞IO的函数库

13) 2011.2.26-27
13.1) feature: 添加了异步非阻塞流的支持，增加了如下几个文件：
aio_stream.cpp, aio_socket_stream.cpp, aio_ostream.cpp,
aio_istream.cpp, aio_listen_stream.cpp

12) 2011.2.25
12.1) 修改了所有头文件，减少了使用 #include 的包含数量

11) 2011.2.23
11.1) feature: rfc2047, 增加了编码函数
11.2) feature: mime_base64, mime_xxcode, mime_uucode, mime_quoted_printable
增加了静态编码及静态解码的函数
11.3) bugfix: mem_cache, 采用 rfc2047 编码来处理协议中键值的特殊字符

10) 2011.2.22
10.1) mem_cache: 对 key 键值进行了简单的编码处理，以免与 memcached 协议的
分隔符有冲突

9) 2011.2.19
9.1) bugfix: header_opts.cpp，内部使了一个线程不安全的静态变量

8) 2011.2.17
8.1) feature: mem_cache, 增加了更新存在键时间截的接口

7) 2011.2.14
7.1) feature: mem_cache 类封装了 libmemcached 的一些函数
7.2) samples: mem_cache/

6) 2011.2.12
6.1) feature: hsclient 该类增加了一些方便使用的函数接口

5) 2011.2.10
5.1) feature: 增加了对 handlersocket 的协议支持, hsclient.cpp

4) 2011.1.28
4.1) feature: mime_head.cpp, 增加了 header_values()/2, 用于获得对就相同名称
的多个字段的值集合

3) 2011.1.26
3.1) bugfix: mime.cpp, body_node(), 中查找邮件正文时如果不存在HTML格式的
正文时会有问题

2) 2011.1.14
2.1) bugfix: mime_state_parse.cpp, 当邮件为非 multipart 时，结点的
body_end 不对，应该是当前偏移量值 curr_off - 1 而不是 curr_off，因为
curr_off 指的是文件中的下一个要处理的位置。

1) 2011.1.11
1.1) acl_wrap1.0 release

