Thanks for the example José. I was thinking of a more general method that would work when I do not control all of the clients.
Your example would only work when all clients are aware of and use the locking logic. On Fri, Aug 16, 2019 at 3:39 PM Jose Isaias Cabrera <jic...@outlook.com> wrote: > > 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 > _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users