test user, on Thursday, August 15, 2019 07:35 PM, wrote... > The reason for the notification is to minimize time spent waiting.
I will tell you what I did with 10 PMs working with a shared windows drive with an SQLite DB. But, take it with a grain of salt, unless you have high-blood pressure, which if it is so, may suggest a salt substitute? :-) Before every write to the DB, I would call a function that would check if someone was writing to the DB: while (SharedDBBlocked(false)) std.c.time.msleep(500); // waits 1/2 second This is what SharedDBBlocked did... char[] SharedDBBlocked(bool ShowMsgBox) { char[] ttdir = std.path.getDirName(sqldb); // = r"L:\Data\OpenJobsTool\AllOpenProjs.db"; ttdir = ttdir ~ "\\" ~ "dbLockedBy.txt"; // checks for a file in the same spot where the sharedDB is char[] who = null; if (std.file.exists(ttdir)) // someone is writing to the DB { try { who = cast(char[]) ttdir.read(); } catch (FileException e) { return who; } if (who == pm["FirstName"]) // The PMs lack of patience (3-10 seconds). Long story. { if (DeleteFile(ttdir, eStr)) info.text = ttdir[std.string.rfind(ttdir,r"\") .. $] ~ " file deleted."; return null; } else { char[] t = who ~ " is writing to the SharedDB. Waiting for release..."; error.text = t; if (ShowMsgBox) msgBox(t); return who; } } return who; } Once this was DB was release, you would call for, LockDBForDataWriting(); to take control of the DB. This is what it contains... char[] LockDBForDataWriting() { while (SharedDBBlocked(false)) //check again to make sure... std.c.time.msleep(1500); error.text = ""; char[] ttdir = std.path.getDirName(sqldba); // = r"L:\Data\OpenJobsTool\AllOpenProjs.db"; ttdir = ttdir ~ "\\dbLockedBy.txt"; char[] t = "";; if (!std.file.exists(ttdir)) { try { ttdir.write(pm["FirstName"]); t = pm["FirstName"]; } catch (FileException e) { ttdir.write(GetUserName()); t = GetUserName(); } } return t; } Once you have control, do some work on the DB... string q = "INSERT ...; "; try { wdb.execute(q); } catch (DBIException dbe) { UnLockDBForDataWriting(); msgBox("ERR605: Could not ...:" ~ dbe.toString()); return 1; } UnLockDBForDataWriting(); return 0; And that is it. Of course, this is a primitive and slow way of doing it, but these were inpatient PMs, and it worked for a long time. If your writters are not human, the wait times could be lowered and it would be made faster. Just FYI. Thanks. josé _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users