-
Notifications
You must be signed in to change notification settings - Fork 940
/
Copy pathchanges.txt
2558 lines (1944 loc) · 109 KB
/
changes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
修改历史列表:
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 库的方式。