forked from elchs/LetoDBf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ChangeLog.txt
4182 lines (3518 loc) · 171 KB
/
ChangeLog.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
/* Encoding: UTF-8 (No BOM) Notation (in 5th position):
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2023-05-23 06:00 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* Readme.txt
* update a stronger note about binary distribution of LetoDBf
; the whole chapter for xHarbour users needs an update,
about how they can live without Viktor Szakats' hbmk2 ;-)
; still LZ4 compression not working for xHarbour, use LZ4_DUMMY
2023-05-22 17:31 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
; News: restore xHarbour compatibility - as far as i got yet because a few
Harbour extensions are not available in xHarbour: e.g. serialize a PHB_ITEM
(-> misses array transfer from server); hb_znet() for zLib network traffic
(-> must use LZ4 instead); no thread local storage, ...
New is that xHarbour now can use e.g. LETO_VAREXPRCREATE() for PRIV/PUBL
in server expressions.
* include/funcleto.h
- clean-up not there needed 4 HB_FT_* defines
* replace a provisory with a full PHB_LZ4NET struct definition
* include/letocl.h
* add HB_FT_DATETIME as 21, not known to harbour, there handled together
with HB_FT_TIME (8) with lenth 4 or 8
* enable LETO_VAR...() prototypes for xharbour
* source/client/leto1.c
* adds for HB_FT_DATETIME
esp. handling for the 'new field' in letoFieldInfo()
+ remove restictions for the Leto_Var() system - as hb_setGetForceOpt()
is unknown to xharbour so without fine-tuning and ever 'forced'.
; ToDo exclude arrays as not possible for xHb
* source/client/letocl.c
* HB_FT_DATETIME mods
* source/client/letomgmt.c
* changes for xharbour
* usage of new LZ4_DUMMY in Leto_ToggleZip(): this will just disable to
switch to encryption/ compression if dummy is used
* exclude Leto_Directory() as using an array
* disable LETO_GETLOCALIP() to spare windows libs at linkage
* source/client/rddsys.prg
* remove a request for HB_ZCOMPRESS, disable Leto_Detect(): this will us
spare to link two windows libs ( ifhlpapi, ws2-32 ) to executables
* source/common/common_c.c
* disableCPU load info for xharbour
* source/3rd/lz4/lib/lz4.h
* suppress deprecated warnings with __NO_LZ4_WARN__
* source/common/lz4net.c
* adding dummy functions for LZ4, activated by #define LZ4_DUMMY
; this is to use LetoDBf just without compression in case of
a C-compiler can't compile the real LZ4 or similar problems
* tests/test_mem.prg
* adding info abut the active client-mode by Leto_GetClientMode()
* test/test_var.prg
* mods to make it testable for xHarbour ( it misses arrays )
* tests/test_file.prg
refine test for working RTE send from server
* rddleto.lib.xbh
* test_mem.exe.xbp
; assumes the header files *.ch copied into xHB, at least i'm not sure ;-)
* make_b32.bat
* makefile.bc
+ makefile.gc
* .gc would be for MinGW's gcc in windows, ToDO much test work left over
* letodb.hbp
* letodbsvc.hbp
* rddleto.hbp
* rddletoaddon.hbp
* remove restriction for BCC to use LZ4 - handle it with care, i'm unsure,
test it with newer BCC >= 5.82
; BCC5.82 as any ! version of PellesC makes huge problems with LZ4 in
combination with xharbour: e.g. test_mem.exe crashes ! with GPF.
This does NOT happen with Harbour, haven't yet found the difference ...
2023-04-28 17:00 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
; news: preparing long wanted possibility of really LONG fieldnames ;-)
* ChangeLog.txt
; 2 typos in older commit
* include/funcleto.h
- clean-up not there needed 4 HB_FT_* defines
* replace a provisory with a full PHB_LZ4NET struct definition
* include/letocl.h
* remove LetoDbFreeTag(), rename LetoCloseAll() to LetoDbCloseAll()
* include/rddleto.h
* move include letocl down, add lockcheme defines and a new tabletype
- include/splice.h
* include/srvleto.h
; remove old experimental debris
* source/client/leto1.c
* refining WA cleanup during disconnect from server
; a simple SELF_CLOSE() left closed WA in inconsistent state,
esp. when continuing work with non-LETO WA or from other LETO server
; improve leto_doCLose() -> leto_doRelease(), new leto_findLastWA(),
changed leto_CloseAll() and leto_ConnectionClose(),
remove leto_doFreeTable() as no more needed
- remove outcommented unnecessary leto_ProdSupport()
! maximum fieldname length (!63!) fix in letocreate(), for DbEvil()
and leto_FIeldInValue()
; finally ! LetoDBf and my custom Harbour can handle such fields very
well and convenient, will soon publish harbour mod after more tests
! wrong memo _default_ type for SIXCDX, it should be fpt
; note that Leto_DbDriver() at client side can apply any combination
! wrongly reported lockcheme 3 if set at server
* extend rddInfo( RDD_DISCONNECT [, "//.../",, X] ) to get connection in
order: IP address // active WA // connection X // current connection
+ implement ( RDDI_EXECUTE, { "function-name or CB" [, xArgN] })
; its the equivalent of LETO_UDF() for RDDINFO()
; note: "function()" with brackets == "{|| function() }" is a CB not
using arguments, whereas "function" is a function call with arguments
+ add RDDI_STRICTSTRUCT, RDDI_MULTIKEY
* wholesome cleanup of letoInfo() of many redundant pConnection assigns,
now done once with at function begin
+ add handling of DBI_TABLETYPE and RDDI_TABLETYPE, needed to set a new
table type at server for extended fieldname length, needs a harbour mod
* source/client/letocl.c
* rename leto_ClearTagInfo() to letoDbClearTagInfos(), also now static
* rename leto_CloseAll() to letoDbCloseAll() to fit into namespace
! max field name length fix in leto_AddFields(), autoadapting if > 10
* some refinement in LetoUdf() to handle the result from server
* fix compiler warnings about types
* source/client/letomgmt.c
* letoClearCurrConn() is now inside leto_ConnectionClose()
* remove logic about returned value of a Leto_Udf(), this now all in
letocl.c
+ new prg level LETO_GETCLIENTMODE() to return human readable string
about what is happening under the hood
* source/server/letofunc.c
+ RDDI_TABLETYPE, RDDI_STRICTSTRUCT, RDDI_MULTIKEY for leto_RddInfo()
as counterparts for the client side
! fix RDDI_STRUCTORD to return value before a possible change
; note that set to .T. plus enable RDDI_AUTOOPEN makes DBFNTX open
production index with table opening alike DBFCDX
+ DBI_TABLETYPE counterside for leto_Info()
2023-04-28 13:13 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
; following is mainly work for the C-API, adding lastly missing indexes
functionality by moving partial RDD code into letocl.c, so resolving
the last ToDo's in leto1.c
It fixes also at server side the rarely used clearing/ destroying
of index orders - let the server do the work and reporting the result.
* ChangeLog.txt
* source/client/leto1.c
+ new leto_OrdKeyExpr() to centralize redundant code in:
letoOpen(), letoOrderList[Add|Clear|Delete](),
letoOrder[Create|Destroy]()
* move partial code into letocl.c
- outcomment internal leto_ProdSupport() as no more needed
! fix bug in letoOrderDestroy when wanted order was given numerical
* include/letocl.h
* don't export LetoDbFreeTag(), new function protos
* source/client/letocl.c
+ new functions, for chainlist: C-API <- RDD <- PRG
LetoDbOrderListAdd() <- LetoOrderListAdd <- ORDLISTADD(Bag)
LetoDbOrderDestroy() <- LetoOrderDestroy <- ORDDESTROY(xTag[,Bag])
LetoDbOrderListDelete() <- letoOrderListDelete <- ORDBAGCLEAR(Bag)
LetoDbOrderListClear() <- LetoOrderListClear <- ORDLISTCLEAR()
; to open only a specific TAG from a compound BAG (ORDLISTADD([,Tag])
is not supported
; the pTable pointer for RDD calling these functions is guaranteed, but
need to be hardened for C-API at many places - work to follow ...
+ new LetoDbOrder( ,x) to return Name/Key/Tag/Bag of current order
* change/extend misleading named LetoDbOrdFocus() to LetoDbOrdInfo()
* rework of LetoVarGetC(); it's a wrapper for LetoVarGet() with
data conversion for the ever literally received variable value
* source/server/letofunc.c
+ new help function leto_IndexesInfos(), used to return the resulting
index situation at server after clearing/ destroying orders
! fixes at server side for OrdDestroy(), OrdBagClear()
* tests/c-lang/bldc.sh
* removed -lgpm and -lhbzlib from lib list
; usage for gcc: bldc.sh test_xxx
* tests/c-lang/test_dbf.c
* adding tests for above
* tests/c-lang/test_var.c
* adding tests for that newly LetoVarGetC() etc
+ makefile.gcc
; for building the C-API lib in Linux with gcc: make -fmakefile.gcc
2023-04-28 13:07 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* source/client/leto1.c
* source/client/letocl.c
* source/server/letofunc.c
* letoLocate() fits for other server-modes, for < 3 no relations allowed
! LetoDbLocate() need to sync the record position from client to server,
this is important for DBSKIP's in between CONTINUE's and for the REST
condition
* cleanup and fix for LETO_DBEVAL()
; this eierlegende Wollmilchsau got complex ;-)
* source/server/leto_2.c
* 2 trailing spaces ..
2023-04-20 10:21 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* include/leto_std.ch
* fixing and changing rules for COUNT/ SUM / AVERAGE to use new variable
type at server/ arguments for leto_dbEval() as array
* source/client/letomgmn.c
! fix in LETO_VARINCR()/ LETO_VARDECR() to accept negative increment
* source/client/leto1.c
* source/server/letofunc.c
* changes in LETO_DBEVAL() to use of arrays for codeblock arguments
; the literal expressions are needed to build the CB at server
* source/server/letovars.c
+ implement the usage of connection specific server variables
; the var-group name 'my' is translated internally at server to 'my_x'
with x == connection; these cannot disturb others and represent
personal vars to the application
* default apply attribute LETO_VCREAT, LETO_VOWN to above private var
; this will delete them automatically after application ended
2023-04-20 10:00 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* source/client/leto1.c
! fix dbOrderInfo( DBOI_SKIPUNIQUE ) in letoOrderInfo()
returned .T. for any case
* change to HB_DATETIME ( extends HB_DATE ) in letoPutValue()
; this remains to only HB_IS_DATE for xHb users
+ implement harbour function: OrdkeyRelpos()
; it's a Harbour extension, working on (needed) active ! index order
; improved versus Harbour: it returns correct value after position change
e.g.: OrdkeyRelpos( 0,42 ) -> 0.5 -- and for EOF(): 1.0
! fix for DBOI_KEYADD/ DBOI_KEYDEL at client
+ add transmit of HB_SET_EXACT setting to server in Leto_Set()
* source/client/letocl.c
* remove a filename leading [unix alike] './' leto_BeautifyPath()
* better clearance in leto_ClearTagInfos()
* C-API: single compiler type warning in LetoDbPutField() for ulLen
fix when no table in LetoDbRecNo()
increment length in *pulLen with 2 in LetoVarGetC()
! missing hb_xfree() in LetoDbLocate()
trailing blank char in line
* source/server/letofunc.c
! fix to apply in leto_lockScheme() locking type 3
; was never applied, but instead Harbour default used
+ implement harbour function: OrdkeyRelpos(), server side
! fix for DBOI_KEYADD/ DBOI_KEYDEL at server
2023-04-10 02:42 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* include/srvleto.h
* source/client/letocl.c
* source/server/leto_2.c
* source/server/letoacc.c
* source/server/letofunc.c
* some left over compiler warnings about type/ signed mismatches
2023-04-09 23:01 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* include/cmdleto.h
* include/letostd.ch
* include/letocl.h
* source/client/leto1.c
* source/client/letocl.c
* source/server/leto_2.c
* source/server/letofunc.c
* tests/leto_dbf.prg
* utils/manager/console.prg
+ implementing server side LOCATE command
; note: __dbLocate() is not handled by leto_std.ch -> non optimized,
as it misses the possibility to handle literal FOR/ WHILE conditions
* moving static leto_RelOptimized() upwards in leto1.c
* adding a test for [non-]optimized LOCATE in leto_dbf.prg
2023-04-09 22:33 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* ChangeLog.txt
* include/srvleto.h
* source/common/common.c
* adding sys/time.h and time.h for unix's, suggested by A. Czajczynski
* source/server/leto_2.c
* fix!: add crompression/ encrytion in leto_SendAnswer2() for LZ4
for the first socket - and disabling it for the second one for zLib usage
; second socket (rare, commonly none) traffic is ever plain, maybe
work for future to be ever encrypted;
; very THANKS Aleksander for pointing at the right place
* add char [P|C|X] for log-file about traffic type (debug level 15-20)
* source/server/letofunc.c
* added null termination for filenames in leto_Open|Create -table & -index
; from fork by Aleksander Czajczynski - THANKS !
* add info in letodbf.log when server demands encryption
; application can't switch back to plain traffic with LETO_TOGGLEZIP(-1)
* tests/test_file.prg
+ add a test for RTE send from server, relies on executing an UDF at server
; it depends on working second socket, nothing happens without
; test needs UDF allowed at server - not needed for real case scenario
* source/client/leto1.c
* source/client/letocl.c
* letoRddInfo() param type 'unsigned int uiConnect' => 'HB_ULONG ulConnect'
to equal Harbour prototypes
* changed casting in Leto_KeyToStr()
; from old issue report by Aleksander Czajczynski, sorry for the delay
* fix for RDDI_REFRESHCOUNT, dito from Aleksander
* fix LetoDbCreateAlias() ALIAS with trailing file extension by Aleksander
* rddleto.hbp
* rddletoaddon.hbp
+ added outcommented switch to force single threaded/ socket communication
; LETO_NO_THREAD for special use scenario, means far! less performance
* source/client/letomgmn.c
* source/server/letofunc.c
* ensure in LETO_LOCKLOCK() delay value cannot get negative
* add to kill connections rarely hindering to lock server for backup when
zero delaytime given to veto against backup [ leto_LockLock( ,,0 ) ]
; works commonly in a break of a second when there were no-win apps ;-(
+ new function LetoMgKillUser() for above, plus
* modified leto_IsAnyWaiting() for above
2023-04-06 12:02 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
* source/3rd/lz4/lib/lz4.c
* source/server/letofunc.c
* 'void' missing in func declaration without argument; clang v16 warning
- remove unused var: uiOrder in leto_Ordfunc()
* make_b32.bat
* makefile.bc
* add a warning for xHarbour users in hurry without reading the Readme.txt
and without looking into these files ... ;-)
* /bin/letodb.ini
+ add Crypt_Traffic in default ini;
recommended to be set to 1 in case of server usage over non-local network
* source/server/errint.c
* source/server/leto_2.c
* add info about active index order in case of server crash
+ new leto_errServerCrash(),
used in hb_errInternal() to only close a specific connection,
not to crash the whole server in case of serious index integrity;
need to be tested in a real scenario ...
; response to older report by Mauricio about error 9201
2021-04-29 22:51 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
; missed the ChangeLog file itself
; THANKS to Aleksander Czajczynski; i'm pleased to have a look for
changes -- but will keep RDDI_REFRESHCOUNT default setting as
it means a significant (server side) overhead if *not* needed.
; Thanks Ash
2021-04-29 22:27 UTC+0100 Rolf 'elch' Beckmann (elchs @ iesy.net)
; technically have only-read-only access to Harbour groups .. ;(
* Readme.txt
* update note about HARDCOMMIT at server/ client side
2019-05-17 21:51 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/client/letomgmn.c
! fix for LETO_MGLOG(): accept values >= -1 [ -1 == server letodbf.log ]
thanks Ash for reporting
2019-05-09 15:25 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
; changes relate to the C-API and should not disturb the RDD activity,
except a serious change of record lock registration moved into letocl.c
* include/letocl.h
* include/rddleto.h
* add self defines to prevent double usage
* move _LETOTAGEXTRAINFO from rddleto.h into letocl.h
* add new C-API prototypes to letocl.h
* source/client/leto1.c
* add in letoFieldInfo() a query to server about DBS_BLOB_LEN;
it returns content length of a memo field
; formerly static funcs leto_[Add|Del]RecLock() moved into letocl.c, so
lock registration not only done in RDD methods letoLock()/letoUnlock()
* record lock registration now in LetoDbAppend()/ LetoDbRecLock(),
de-registration in LetoDbRecUnLock() *plus* for the update+unlock
shortcut in letoRawLock();
* source/client/letocl.c
; following change also effects the RDD
* move into from leto1.c: leto_AddRecLock()/ leto_DelRecLock() to be
covered also by the C-API;
same done for letoCreateAlias(() --> LetoDbCreateAlias() to be useable
from C-API in LetoDbCreateTable()/ LetoDbOpenTable()
* exclude usage of extra taginfo for C-API
* remove in leto_Recv() calls to hb_vmLock()/ hb_vmUnlock()
* add leto_strdup() & leto_strncpy to replace Harbour versions
* add a bunch of: if( pTable->uiUpdated ) to automatize record updates
send to server, beforehand only done by the overlaying RDD methods
* use in LetoDbRec[Un]Lock() the active RecNo if '0' is given in C-API
- LetoGetCmdItem(), LetoFindCmdItem(): dissolved using simple strchr()
* change: LetoDbGetField() callee is responsible to allocate enough
RAM for field content; amount is transmitted by reference to return
finally used; in case amount is not enough for full content, a
HB_FAILURE is returned and the buffer filled as much possible
+ DllMain() for C-API DLL in Windows
+ LetoDbAlias() to query the ALIAS of a table
LetoDbFieldPos() to convert field-name to field-pos [lastly needed]
LetoDbFieldNameLength() to determine RDD capability [actually fix 10]
LetoDbGetFieldLen() field content length of memofields
LetoDbFieldInfo() return comma separated: name, type, len, dec
LetoDbOrdCount()/ LetoDbOrdFocus() to handle index orders
LetoDb[Set|Clear]Relation() to handle *optimized* relations
- LetoDbBof()/ LetoDbEof --> replaced by:
+ LetoDbAreaFlags() covering BOF, EOF, FOUND
* source/client/letomgmn.c
! fix MinGw warning for 32bit Windows about two HB_PFS in
LETO_LOGREPLAY(); use HB_ULONG instead in format mask
* dissolve removed LetoGetCmdItem() in LETO_MGGETTIME()
* source/common/common_c.c
* exclude PRG functions for C-API
% tiny optimize for eprintf
* * source/server/letofunc.c
* new DBS_BLOB_LEN answer for client
* tests/c_lang/test1.c
* tests/c_lang/test_dbf.c
* new length param for LetoDbGetField()
* replace removed LetoGetCmdItem()
* apileto.hbp
2019-04-27 09:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/srvleto.h
* source/server/letoacc.c
* source/server/letofunc.c
* source/server/server.prg
! fix two since long existing, unnoted and happening 'on occasion':
# Leto_FileWrite() [ send internal also a pp3 param for server ]
# internal leto_InitGlobe() [ wrong search for a free struct ]
* move internal functions leto_DataPath()/ leto_DirMake() upwards
* make leto_Drop((), leto_Trans(), leto_Memo() and the part about
OrdDestroy() in leto_Ordfunc() respecting flag: ->bBeQuiet
[ indicates an UDF is calling them --> no network answer send ]
% resolve some DBFAREAP bindings to call SELF_INFO()/ use pTStru items
% optimize buffer usage (less times alloc/free) for leto_[De]CryptText()
% extend feedback for doubled TAGnames with BAGname [leto_IndexesInfo()]
+ leto_ActionProtocol(), leto_ActionReplay(), leto_ActionRequest() plus
help funtions for them: create, replay and handle out data-change log
; please note that the new function group is not used by default,
activated with a new config option and before using and relying!
on them in production environment best to intense! test them
+ leto_ActionAudit(), leto_ActionAuditFile(), leto_ActionAuditRequest()
to create and handle a human readable audit log about data changes
; a first suggest, form may change on welcomed other suggests
* include/funcleto.h
* source/client/leto1.c
* 3 compiler warnings
* harden LETO_SET() to verify SET() is linked into
* source/client/letocl.c
* source/server/leto_2.c
* add handling of LETO_CLIENT_SHUTOFF to quit application when shutdown
by console
% close all SHARED and EXCLUSIVE ( but no temporary ) tables,
if user is given no complain timeout for Leto_LockLock(,,0)
; a careful ! acting admin can then do administrative tasks
% add in leto_BackupStart() a tiny delay in recepting inkey, to avoid
a just too late typed ESC to complain against backup-mode, then
leading to an unwanted QUIT of application
* fix: LetoFileWrite() to send a third param to server
* source/client/rddsys.prg
* add request for SET
* source/server/letoacc.c
* source/client/letomgmn.c
+ LETO_LOGTOGGLE() to start a new data-change log
+ LETO_LOGREPLAY( cFile, cExcludeAction, ... );
+ LETO_LOGREQUEST( nOffSet, nToggle, bAuditOnOff )
a) request for ( a block of ) data-change log
b) 3rd param true/ false to start/ stop audit data-change log
* add boolean third param to Leto_MgLog() to erase log after fetching
* source/server/server.prg
+ new config option 'DATA_LOGFILE' to activate data-change log;
* utils/backup/srv_linux.ini
* utils/backup/srv_win.ini
* utils/backup/letobackup.prg
* modify to use the new-style Leto_LockLock() with complain-timeout
and multiple tries to lock the server
+ utils/manager/replicat.hpb
+ utils/manager/replicat.prg
* experimental test application to replicate data-change log to another
or the same server (intended to be used together with a data-snapshot)
* Readme.txt
* documenting news
2019-04-09 14:14 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
; * rebuild server AND client (lib & apps) to use changes about backup-mode
* source/client/leto1.c
* missing NetErr() flag for a failed DbAppend()
* source/client/letocl.c
% refinements for topic backup-mode:
when one client refuse to go into backup-mode, immediate stop trying
to lock the server for all clients;
display configurable content in the backup-box send by server;
send optimized feedback to server in internal leto_InfoLocks()
! missing hb_xfree() for pSavedLocks, done now in leto_ReleaseWAEnv()
! add exit(0) after hb_vmQuit() to avoid crash
* include/srvleto.h
* source/server/leto_2.c
* source/server/letoacc.c
* source/server/letofunc.c
* source/server/server.prg
* changed config option BACKUP_INFO: logical --> max 255-char string;
it now contain a comma <,> seperated list of textlines to be shown in
backup-box at client, default: BACK-UP,WAITING,ESC-> GO ,ESC->QUIT
; the last two lines used to differ the refuse-able backup-request
; a string < 3 char, i.e.: 'no' to activate old style leto_LockLock()
* transfer BACKUP_INFO string to clients
* unlock clients when server is shut down ;-)
* prevent server against simultaneous locking from multiple clients
+ new internal leto_IsAnyRefused() to clear bHaveUrgentTask flag
% optimized call for 'locks' option in leto_Admin()
2019-04-06 13:44 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* utils/manager/console.prg
* add third argument to leto_LockLock() call
; generally console waits SRV_TIMEOUT (21 s) for response from server
to decide if server is down --> quit.
Based on that value, console waits 15 s for successful lock locking,
where clients are given 10 s to reject a locking request.
2019-04-06 11:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
source/server/letoacc.c
* source/server/letofunc.c
! fix an left over hb_xfree() from last upload in leto_CreateTable()
* create note-file: 'backup.tsk' for 3rd-party during active backup
* add a possible timespan that a client can reject a backup
% narrow user mutex, so a connection can log-off during server lock-try
* source/client/letocl.c
* source/client/letomgmn.c
* add a possible reject-timespan in backup-note
2019-04-04 23:24 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
% HB_BOOL ==> void leto_TableUnlock(); [ called by leto_CloseArea() ]
leto_RecUnlock( ..., pArea ); [ called by leto_Unlock() ]
; nice cleanup after above changes
+ erase old production [ same named ] index along creating a new table
* include/letocl.h
* minor few debug feedback about delayed error
2019-04-02 19:04 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/client/rddsys.prg
+ new optional options for '.ini' files used for automatic login:
"LockRetry" == delay between repeated tries to login to locked server;
"LockWait" == seconds in sum to wait for server unlocking,
where: "LockWait" = 0 == infinite, < 0 == do not retry and QUIT
* source/server/server.prg
* source/server/letofunc.c
* let the server behave as beforehand for 'lock LOCKING' by setting in
'letodb.ini': BACKUP_INFO = 0
! fix and improve precision of waiting for successful locking server by
using a timer
- remove old and problematic UDF LETO_RECLOCKLIST()
* utils/manager/console.prg
* wait for a server lock shorter as console wait for a server response
* rddleto.hbp
* rddletoaddon.hbp
- revert last changes to add -mt
2019-04-01 21:21 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
! fix wrong mutex call in leto_ServerTryLock()
* add feedback ( in server letodbf.log ) which client is single thread
* rddleto.hbp
* rddletoaddon.hbp
* add '-mt' multithread switch ( even it should not change something )
2019-03-31 17:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
; * rebuild server AND client (lib & apps) to use changes about backup-mode
* include/letocl.h
* include/rddleto.h
* include/rddleto.ch
* source/client/leto1.c
* source/client/letocl.c
! wrong cause reported for a refused connection to a locked server, it
should be: LETO_ERR_LOCKED
* create a missing TAG name at client side as else server does, needed
to register index attribute (temporary...) in new leto_AddTagInfo()
* store original given filter expression *before* optimization, needed
to re-create a filter for a closed table after backup-mode.
* in case of server is running in Windows, in backup-mode close all
exclusive opened table, but not temporary nor such with temporary
index order which could not be rebuild ( e.g. partially orders )
+ LetoDBf extensions: DBOI_TEMPORARY return .T. for temporary index,
DBOI_INTERNAL returns internal flags as integer ( experimental )
+ try to implement DBOI_PARTIAL --> .T. for index with not all records
! fix for old memory leak *when* DbSetFilter() was used only with text
expression, without CB; note: using "SET FILTER TO" fill in both
* source/server/leto_2.c
* source/server/letoacc.c
* source/server/letofunc.c
% hack to force temporary index order into seperate file, esp. out of
a production index by applying a generated temporary filename
( create and [ immediate delete ] a temp file similar the RDD does )
* clean up in leto_CreateIndex() about lpdbOrdCondInfo
% improved strategy for 'lock locking': send a note to all clients and
wait that all have responded to be in backup-mode in given timespan.
If not, send 'backup-end' note to all -- else apply the final lock.
Also lock the server against new connections, as such new client not
in backup-mode will run into 'not allowed' actions very probably not
covered by client application, so better to refuse a new connection.
; suggest: prepare applications to handle LETO_ERR_LOCKED during
Leto_Connect() by e.g. offering a loop to re-try to connect
! fix a crash for auto-locking leto_dbEval(), wrongly checked for a
non-existent JOIN-array length
+ tests/test_filt.prg
* adding a 'RELATION TO' test
- utils/backup/readme.txt
- utils/backup/readme_rus.txt
+ utils/backup/srv_linux.ini
+ utils/backup/srv_win.ini
* utils/backup/letobackup.hbp
* utils/backup/letobackup.prg
* utils/manager/console.prg
% show alert message for 'Lock locking' as long as its tried
; you may not even see the alert box as fast it perhaps happens ;-)
; note that 'Lock server' is about locking against new connections,
a subitem of 'Lock locking' and not choose-able after 'Lock locking'
2019-03-26 22:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/client/letomgmn.c
! tiny fix for new leto_ProcessRun() when called without an active WA,
aka when positioned at WA '0' or none opened
2019-03-26 14:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
; * rebuild server AND client to use changes about topic backup, aka
* server locking -- also the console got a new menu entry: 'Lock locking'
* source/client/letomgmn.c
* source/server/letofunc.c
* source/server/server.prg
+ nResult := leto_ProcessRun( cCommand,, [@cStdOut], [@cStdErr] )
as a hb_ProcessRun(), but running at server at DataPath work-directory
and storing outputs into cStdout/ cStderr if passed by [@] reference
; note that it *maybe* need a OS dependend prefixe, like
for Windows: 'cmd /C "cCommand"'
for Unix: '/bin/bash -c "cCommand"'
* include/funcleto.h
* include/letocl.h
* include/srvleto.h
* source/client/letocl.c
* source/server/letoacc.c
* source/server/letofunc.c
* use #define's instead fixed value for locking control 'error' number
% refine the delay needed to wait, that all applications have restored
their locks before proceeding: now three messages are send to client,
sparing the uncertain fixed delay
* rename leto_TryLock() to leto_ServerTryLock()
2019-03-25 00:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* ChangeLog.txt
! wrong filename: srvleto.h; correct file funcleto.h was uploaded
* include/letocl.h
* source/client/leto1.c
* source/client/letocl.c
+ add backup-mode: a message appears as long the server is locked
for locking; user can decide to quit the application
; during this time existings locks are unlocked and afterwards
restored. To give restoring locks precedence over new ones,
and so ensure that they can be re-locked, clients will wait 12
seconds before proceeding after locking was turned off.
In case the locks can not be restored, the app quits.
* fetch more than 2047 FIELD at client side, don't try at server
* increase possible FIELD name length to HB_SYMBOL_NAME_LEN (63)
* formatting
* source/client/letomgmn.c
! warning about a shadowed variable
* source/client/rddsys.prg
* do not 'quit' during auto-login in case of an access error,
e.g. a needed PW was not given
* source/server/letoacc.c
! server un-locking was ok, feedback wrong about success in leto_Admin()
* source/server/letofunc.c
! respect locked server in UDF LETO_TABLELOCK()
- remove old, experimental and unfinished code about copying tables
internal at server using extended Linux capabilities
+ add backup info send to clients over second socket when server is
locked/ unlocked for locking -- deactivate-able default is ON;
if the locking user log-out, the lock is removed
* improved concept for SQL JOINs, esp. for problematic RIGHT and
FULL joins, move main logic for INNER into leto_dbEvalJoinFor()
; results look promising but still hidden problems for multiple joins
would be not unlikely
* source/server/server.prg
+ new letodb.ini option: BACKUP_INFO = 0 to deactivate backup-mode
info is send to clients
+ three more REQUESTs
* utils/manager/console.prg
+ new menu option for lock locking;
console can unlock any time a lock and never will be locked itself,
detected by its executable name: console[.exe]
2019-03-07 19:30 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/funcleto.h
% make LETO_SENDRECV_BUFFSIZE define-able by user, use: ( x * 8192 ) - 1
* source/server/leto_win.c
! fix buffer overflow in LETO_SERVICEINSTALL(): wrong used hb_strncpy(),
initialize szPath to be terminated in any case
* source/server/leto_lnx.c
* file missing in upload from 2019-02-26
* source/server/letofunc.c
! (wrong) warning of 'possible' uninitalized variable in leto_InitUS()
* add date of server executable to startup feedback
* more work on joins in leto_dbEvalJoinAdd()/ leto_dbEvalJoinPreSkip(),
remove now obsolete leto_dbEvalJoinPostSkip() in leto_dbEval()
2019-02-28 18:29 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/leto_2.c
* formatting/ cleaning
* source/server/letofunc.c
* add configured max users to startup-feedback
* add logic for combined RIGHT JOINs, plus more work about JOINs
* source/server/server.prg
! an EXIT missing in the CASE switch in method New() for config
; Thanks to Ash for his patience to report
* utils/manager/console.prg
* add in ActionDecode() text for DbEval()
slightly modify column lengths in connections browse
; full display of all columns need 170 char wide window
2019-02-26 12:09 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* bin/leto.sh
% do not try to start server if already running
* source/client/leto1.c
* validate JOIN string at server, return all joined WA as string to
add all fields of all WA for mask '*' in LETO_DBEVAL()
* check for Leto_DbEval() if connection is still up
* source/server/letofunc.c
! fix an ugly bug in thread2():
after a socket problem the reference to the socket-handle was deleted
* move assignment/ clearance of sockets into global HB_GC_LOCKU() mutex
* perform the JOINing before evaluating the FOR/WHILE in leto_dbEval(),
as the conditions should be able to refer to joined WAs.
* not deactivate demanded locking in case of joined WA, as the found
records, even if not need to lock, are positions for the second
pass-through
* source/server/leto_lnx.c
% not manually closing the hNull file handle, it is done by dup2()
; now all first three system handles point to /dev/null,
and stdin as read-only
2019-02-17 18:19 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
% collect in 'letodbf.log' notes about possible double used index TAG,
after leto_IndexesInfo() detected misorder
* one more fix about the FULL join, plus new join-type 'EMPTY' ;-)
* include/rddleto.ch
* include/srvleto.h
* source/client/leto1.c
* source/server/letofunc.c
+ new RDDI_DBEVALTIMEOUT [ 120s ] timeout value for a single request,
actually used in Leto_DbEval to limit/stop a runaway request
2019-02-15 21:12 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
* more still uncommented work about a planned Leto_DbEval() extension
* using directly the WA record number not with SELF_RECNO() to avoid
for special occasion possible pending relations being refreshed
2019-02-14 11:33 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
* will comment on that future topic later, just to save changes ...
2019-02-11 20:11 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/srvleto.h
* source/server/leto_2.c
* source/server/letofunc.c
! fix if same! table is opened > 64K times ( HB_USHORT -> HB_ULONG )
! fix if max configured user exceeded in Leto_UDF()/ seperate thread
! add mutex re-using for pUStru in leto_InitUS()
* source/server/server.prg
* lower limit of MAX_USERS to >= 9
; it have influence on digit-length of letodbf_xxx.log file-name,
so instead 1000 better to use 999
2019-02-04 10:01 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/letocl.h
* source/client/letocl.c
* source/server/leto_2.c
* source/server/letofunc.c
* source/server/server.prg
! fix two overlooked 'hb_parc( 2 )' in internal LetoToggleZip() instead
of using 2nd function param
* re-use letodb.ini option: Crypt_Traffic = 1 [ default '0' ]
; If activated, client is informed network encryption must be used,
then even its initial 'Intro' request is send encrypted.
This is nearly the same as manually using Leto_ToggleZip() with a
password, where here the used password is a 31-byte random key,
!plus! it will block any connection not using LETO encryption.
; please also rebuild 'console' if want to use
* new boolean param [encrypt] for LETO_CREATEDATA()/ leto_SrvSetPort()
* ensure LETO_SENDMESSAGE() can be executed only by server executable
* harden server-stop request in Leto_SendMessage() by adding an encoded
keyword to the request, verified in leto_StopServer()
* Readme.txt
2019-01-26 22:36 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/rddleto.ch
* source/client/letocl.c
+ new RDDI_BUFREFRESHTIME for RddInfo(), smilar 5th of LETO_CONNECT()
* add respect of DBI_AUTOREFRESH in letoPutValue() for field updates:
when a field update happend after cache timed-out, it will be refreshed
automatic to server even without a DbCommit()/ DbUnlock()
* source/server/letofunc.c
! change from 2019-01-05 09:49:
"refresh given EOF flag after table hotbuffer timeout with a SKIP(0)"
still didn't worked, fixed by performing SELF_GOTO() in leto_GotoIf()
to refresh EOF flag when set
* Readme.txt
+ new RDDI_BUFREFRESHTIME
* missing comment on RddInfo( RDDI_DBEVALCOMPAT ) for LetoDbEval()
* note that as integer created Leto_Var() keeps to be without decimals
2019-01-25 12:19 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/phpclient/letocl.php
* tests/php/testleto1.php
! restoring basic PHP access-ability to LetoDBf server
; tested with Nginx 1.14/ PHP 7.2 [-fpm] fastCGI module.
Note that *no* argument can be transfered to the UDF function,
and *no* returned result can be directly recieved;
Basic idea is to use the Leto_Var*() system for information exchange,
as both sides can access it.
Further is missing the whole workarea environment at PHP side, so a
PHP access to LetoDBf is very limited and inconvenient manually.
2019-01-23 19:23 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* Readme.txt
* remove one illegal char; typo
* source/server/server.prg
! immedediate return in Leto_SetEnv() if no active WA;
avoid RTE if a WA with saved states is closed before Leto_ClearEnv(),
* formatting
2019-01-23 17:01 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/server.prg
; facelifting for old inherited leto_SetEnv() and leto_ClearEnv():
* switch single statics into one thread-local hash-array, which stores
values per ALIAS as sub-hash
* leto_SetEnv() save states before its first change for active WA;
all possible states for one WA if no param given
* leto_ClearEnv() no more need any param, a single call will restore
all saved states for all WA
* Readme.txt
* about above, some more notes for chapter: 9. Server-side functions
2019-01-20 20:01 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/server.prg
* remove REQUEST: HB_DISKSPACE,
add: AADD, BLANK, DOW, DOY, VALTYPE, WEEK
* add on enquiry full set of Harbour hash functions for usage in UDF;
linked into server by usage: hbmk2 letodb -prgflag=-D_STREAMFLEX_=1
* include/rddleto.h
* source/client/leto1.c
* simplify/ translate LETO_GETCURRENTCONNECTION(); optional param for
LETO_SETCURRENTCONNECTION() to return active connection before change
* change param of internal leto_getConnection() to 'const char *'
+ add RDDI_CONNECT and RDDI_DISCONNECT for RddInfo()
It connects to LetoDBf server exactly like Leto_Connect(),
but executed by pure Harbour PRG functions, example:
#include "dbinfo.ch"
...
IF ASCAN( RddList(), "LETO" ) > 0 /* verify LETO available */
RddSetDefault( "LETO" ) /* set as default driver */
nConnection := RddInfo( RDDI_CONNECT, { "LETO", cAddress, ... } )
ENDIF
* include/letocl.h
* source/client/letocl.c
* source/client/letomgmn.c
* new centralized leto_Connect() used by LETO_CONNECT()/ RDDI_CONNECT,
as result its also available for the C-API
* Readme.txt
* typos and news
2019-01-17 13:42 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/letofunc.c
! fix a reported server crash in leto_GroupBy() if an expression
is used instead of a field for grouping;
! add missing blocks destroy in UDF LETO_DBTOTAL()
* use hb_vmDestroyBlockOrMacro() instead of hb_itemRelease()
2019-01-15 23:39 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* Readme.txt
* improve some hints how to work *without* recommended 'letodb.hbc'
- readme_rus.txt
- readme_pt_br.txt
* these both help files got very very outdated, sorry!,
they were inherited from origin LetoDB when LetoDBf started at GitHub
; does someone like to translate the new Readme.txt into a witespread
language like Russian, Spanish, French etc -- welcome !!,
but best to inform beforhand the developer to coordinate your effort
* make_b32.bat
* make_vc.bat
* add a note at top in these Windows batch files to avoid them,
and as ever possible to use best hbmk2 build tool of Harbour
2019-01-14 11:30 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/server/leto_2.c
* debug feedback in leto_SendAnswer2() in case of no hSocketErr
* source/client/leto1.c
! no unlock shortcut in letoRawLock() for non established hSocketErr
; in case of missing second socket server will send 2 ACKs, one for
data update and one for unlock, where client expects only one answer
; this should be the long searched error reported from Marek
2019-01-11 19:01 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/letocl.h
* source/client/letocl.c
* source/client/letomgmn.c
* source/server/letofunc.c
! fix in LETO_VARDECR(), default: 1.0 missing if non amount given
! mem access err in LetoFileExist(), bug fixes about path handling
in LETO_SETPATH(), leto_SetPathDefault(), leto_FilePathClean()
; at one hand a ':' is Linux separator for multiple paths, and