Package: webdb
webdb provides a simple JSON based database interface for
client side data access in web applications.ContentsWhat is webdb?How does it work?RequestsIsolating UsersHandling Date and TimeFilesWhat is webdb?webdb is an adapter between you client side application
(most probably written in JS in a browser) and your
databases on the server. It can be used to access file,
SQL, NoSQL and any other database you want using simple
HTTP GET and POSTs.How does it work?webdb is a cherrypy application that should be mounted under
a protected path. Typical would be/database. All the
authentication stuff must be handled by cherrypy.
The application accesses the database using and instance ofwebdb.adapters.AbstractDBMS. This instance will dispatch
the right database (one might use several databases) and
handle the request.RequestsRequests are HTTP GET requests for pulling and HTTP POST for
pushing data. The query is always encoded in JSON objects:webdbrequest
        .database : string
        .request
                .table : string
                .operation : string
                .parameters: objectwebdbrequest.databaseString name of the database. This name will be used
to dispatch the right database adapter.webdbrequest.request.tableString name of the table to access.webdbrequest.request.operationString name of the operation. It is one ofINSERT,UPDATE,DELETE,SELECTwebdbrequest.request.parametersIs a JSON object containing the parameters of the
query. The structure depends on the operation:INSERTThe parameter is just a map of key value pairs that
will be attempted to put:.parameters: {string: value}UPDATEThe parameter is an object containing
asetand awhereblock:.parameters
        .where: {string: value}
        .set: {string: value}All key value pairs inwherewill be
interpreted asANDjoined conditions,
all key value pairs insetwill be
interpreted as substitutions for the current
values.DELETEThe parameter is a map{string: value}that will be interpreted asANDjoined
conditions:.parameters: {string: value}SELECTThe parameter is an object containing
awhereand awhatblock:.parameters
        .where: {string: value}
        .what: listwherewill be interpreted as inUPDATE,whatis the list of columns to fetch.valueis one of the following types:
string, integer, float, boolean, date, time, datetime.SeeHandling Date and Time.The server will return data depending on what the adapter
returns. If the adapter returns an exception, the server
will set the HTTP status to 404, the content-type totext/plainand return a (maybe) useful text.
If the server returns a structured result (for instance the
result of a SQL SELECT) it will set the HTTP status to 200
and the content-type toapplication/jsonand return the
json encoded data.
If the server returns nothing but the query did succeed it
will set the HTTP status to 204 and return nothing.Isolating UsersThere might be several users accessing the same
database/table/whatever. To isolate access to this shared
data theinjectoperation can be used. TheAbstractDBMShas an attributeinjectthat should be
a nested function returning the attribute value to inject
and an attributeinject_asthat should be set to the
name of the table column that should be inserted.A typical application might set the username in the session
and inject the username in the query:dbms = AbstractDBMS(
                inject = lambda: cherrypy.session["username"],
                inject_as = "username")Note: This will not actually work. One cannot
instantiateAbstractDBMS, as it is abstract. This sample
is just meant to be a hint how one can implement injections.Handling Date and TimeDate and time are handled as JSON objects with a magic
attribute (the__type__)time
        .__type__ = "time"
        .hour: int
        .minute: int
        .second: int
        .microsecond: int
        .utcoffset: int

date
        .__type__ = "date"
        .year: int
        .month: int
        .day: int

datetime
        .__type__ = "datetime"
        .year: int
        .month: int
        .day: int
        .hour: int
        .minute: int
        .second: int
        .microsecond: int
        .utcoffset: intSee also:utcoffsetpython date and time representationOne can omit some attributes, they will be filled with zeros
automatically.Fileswebdbis also capable of serving files. This can be done
by creating awebdb.interface.file.FileInterfaceinstance and providing it with
awebdb.files.dispatcher.AbstractFileDispatcher.There are already three implementations:UserFileDispatcherAllows full access to a private directory for all
users.QuotaUserFileDispatcherAllows full access to a private directory for all
users. Rejects to write once the quota is exceeded.SQLFileDispatcherAllows access to files according to a database.