Qual versão do Harbour você está usando? Pergunto porque nas duas versões mais recentes (a de 31/12/2018 e a anterior) tive muito problema na hora de travar registros usando o LETO, então voltei a usar uma versão de Junho de 2017.
Jairo tem campo "MEMO" na estrutura do seu DBF ?
Estou usando a recente do GIT e o Elch fez diversas correções no rlock().
2019-03-07 19:30 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* include/srvleto.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
Olha esses dois FIXEs que ele fez relativo ao rlock.
2018-06-26 19:50 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
* source/client/leto1.c
+ add PRG functions LETO- _TABLELOCK, _TABLEUNLOCK for client side;
* universalize LETO- _RECLOCK, _RECUNLOCK to handle also non-LETO WA
+ leto_LockValidate()
automatic replace in Leto_DBEval() expression Harbour lock functions
with LETO variants -- validate made lock is unlocked:
rlock()/ dbrlock() => Leto_RecLock(); dbrunlock() => Leto_RecUnlock()
flock() => Leto_TableLock(); dbunlock() => Leto_TableUnlock()
* source/client/rddsys.prg
* add REQUESTs for LETO- _TABLELOCK, _TABLEUNLOCK
* Readme.txt
* a straying bracket :-(
2018-06-15 18:48 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
; ( maybe rare used ) bug fixes ! -- refresh server and client for news:
# support named ( LETO extension ) and OS none-named temporary tables
# server-side executable ( by stingified codeblocks <for> and <while> )
'record processing commands' with new header file "leto_std.ch"
# transactions: ignore-to-unlock until commit' mode for easy integration
to existing source with 'unlocks'
# RDDI_AUTOLOCK in conjunction with a timeout value to get lock success,
used in leto_DbEval() for shared opened tables -- whereas leto_DbEval()
is fast server side query [opt. data change] into a sum or resultset!
# performance for sequence: Rlock(); change data; DbUnlock()
spares a network package ( 'unlock' send together with data update )
Saudações,
Itamar M. Lins Jr.