Multi user sqlite via shared-cache mode?

Peter Haworth pete at lcsql.com
Wed Mar 12 10:54:01 EDT 2014


Thanks Bjornke, that's very useful.

Pete
lcSQL Software
On Mar 12, 2014 2:46 AM, "Björnke von Gierke" <bvg at mac.com> wrote:

> I do use sqlite in networked environment, by having written my own server
> & client in LC. It's pretty trivial, and there's no parallelity, because
> sqlite only ever 'sees' the server, which is exactly one sql client. Here's
> an early example that is missing most error checking (this is an older
> version and for the productive version I added lots of errors, logging,
> etc.):
>
>
> -- server
> on mouseUp
>    if the label of me = "start server" then
>       set the label of me to "stop server"
>       accept connections on port (field "port") with message
> "connectionAttempt"
>    else
>       set the label of me to "start server"
>       close socket (field "port")
>    end if
> end mouseUp
>
> on connectionAttempt theIP
>    read from socket theIP until return with message "gotMessage"
> end connectionAttempt
>
> on gotMessage theIP theProtocol
>    delete char -1 of theProtocol --return used as protocol delimiter
>    if theProtocol = "query" then
>       read from socket theIP until return with message "queryDB"
>    else if theProtocol = "write" then
>       read from socket theIP until return with message "writeDB"
>    -- else
>    -- never happens, unless public accessible
>    end if
> end gotMessage
>
> on queryDB theIP theQuery
>    delete char -1 of theQuery --return from the protocol
>    put field "database" into theDB --path to sqlite file
>    put revOpenDatabase("sqlite", theDB,,,) into connID
>    put unidecode(uniencode(theQuery),"utf8") into theQuery
>    put revDataFromQuery(comma,,connID,theQuery) into myResult
>    revCloseDatabase connID
>    put unidecode(uniencode(myResult,"utf8")) into myResult
>       if myresult = "" then --query empty
>          write "queryResult" & return & 0 & return to socket theIP
>          close socket theIP
>       else
>          write "queryResult" & return & length(myResult) & return &
> myResult to socket theIP --return not needed
>          close socket theIP
>       end if
> end queryDB
>
> on writeDB theIP myQuery
>    delete char -1 of myQuery --return from protocol
>    put field "database" into theDB --path to sqlite file
>    put revOpenDatabase("sqlite", theDB,,,) into connID
>    put unidecode(uniencode(myQuery),"utf8") into myQuery
>    revExecuteSQL connID,myQuery
>    put the result into myResult
>    revCloseDatabase connID --sets the result to ""
>    write "writeOK" & return to socket theIP
>    close socket theIP
> end writeDB
>
>
>
> --client
>
> function queryDB theQuery --theQuery is a sql statement, as understood by
> LC (no multiline, no ;)
>    replace return with "" in theQuery --just to make sure...
>    put the milliseconds into theIdent
>    put field "IP" & "|" & theIdent into theIP
>    open socket to theIP
>    write "query" & return & theQuery & return to socket theIP
>    read from socket theIP until return
>    put it into theMessage
>    delete char -1 of theMessage
>    if theMessage = "queryResult" then
>       read from socket theIP until return
>       put it into theAmount
>       delete char -1 of theAmount
>       if theAmount = 0 then
>          put "sqlempty: No entry found" into theResult
>       else
>          read from socket theIp for theAmount chars
>          put it into theResult --no return at end, do not delete char -1
>       end if
>    else
>       put  "error: Server can't query:" & return & theMessage into
> theResult
>    end if
>    close socket theIP
>    return theResult
> end queryDB
>
> function insertDB theCommand --any sql that's not SELECT
>    put the milliseconds into theIdent
>    put field "IP" & "|" & theIdent into theIP
>    open socket to theIP
>    write "write" & return & theCommand & return to socket theIP
>    read from socket theIP until return
>    put it into myReply
>    delete char -1 of myReply
>    if myReply = "writeOK" then
>       put "" into myReply
>    else
>       put  "error: Server wrong:" & return & myReply into myReply
>    end if
>    close socket theIP
>    return myReply
> end insertDB
>
>
> >> On Tue, Mar 11, 2014 at 7:41 AM, Michael Gruenthal
> >> <mgruenthal at mac.com>wrote:
> >>
> >>> I¹m interested in having a small (<20) number of users simultaneously
> >>> connected to an sqlite DB on a shared network drive as an alternative
> to
> >>> hosting on a server.
>
>
> --
>
> Use an alternative Dictionary viewer:
> http://bjoernke.com/bvgdocu/
>
> Chat with other RunRev developers:
> http://bjoernke.com/chatrev/
>
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode



More information about the use-livecode mailing list