FLOCK() und RLOCK() wirken ja immer auf die Datei und nicht auf die einzelnen Workareas.
Hat jemand einen guten Vorschlag, wie man eine einfache und robuste Lösung für SafeLock() und SafeUnlock() bauen kann – idealerweise so, dass sowohl FLOCK() als auch RLOCK() sauber abgebildet werden und man im eigenen Prozess Mehrfachaufrufe erkennt und korrekt wieder freigibt?
Ich denke z. B. an so etwas in der Art (Pseudocode):
STATIC hLocks := {}
FUNCTION SafeFlock( cFile )
IF hLocks[ cFile ] == .T.
RETURN { "success"=>.T., "alreadyLocked"=>.T. }
ENDIF
IF FLOCK()
hLocks[ cFile ] := .T.
RETURN { "success"=>.T., "alreadyLocked"=>.F. }
ELSEIF NETERR()
RETURN { "success"=>.F., "error"=>"E_NET" }
ELSE
RETURN { "success"=>.F., "error"=>"E_LOCK" }
ENDIF
ENDFUNC
FUNCTION SafeRlock()
IF DBRLOCK()
RETURN { "success"=>.T. }
ELSEIF NETERR()
RETURN { "success"=>.F., "error"=>"E_NET" }
ELSE
RETURN { "success"=>.F., "error"=>"E_RLOCK" }
ENDIF
ENDFUNC
FUNCTION SafeUnlock( cFile )
DBUNLOCK()
UNLOCK()
hLocks[ cFile ] := .F.
RETURN { "success"=>.T. }
ENDFUNC
Hat jemand von euch schon Best Practices, wie man so etwas noch robuster gestalten kann (z. B. bei Workarea-Wechsel oder wenn ein USE schiefgeht)?