From fdc647b28866f9fde903340be0b830aad53b4a55 Mon Sep 17 00:00:00 2001 From: Milan Toman Date: Tue, 9 Jul 2019 14:50:23 +0200 Subject: [PATCH] Delete html response now reflects number of affected rows --- README.md | 8 +- db/test.db | Bin 12288 -> 12288 bytes modules/sqlite.py | 200 +++++++++++++++++++++++++++++++++++++----- templates/delete.html | 4 + 4 files changed, 188 insertions(+), 24 deletions(-) create mode 100644 templates/delete.html diff --git a/README.md b/README.md index fb664cb..aa03da9 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Simple, lightweight, universal SQLite API, based on cherrypy. 6. row deletes 7. row modifies +------------------------------------------------------------------------------- + ## REST API https://www.restapitutorial.com/ @@ -30,9 +32,11 @@ https://cherrypy.org/ - validate number of fields and types - error handling and tracebacks - SELECT - - *STRUCTURE:* http://server/{operation}/\[{db}/\[{table}\]\]/\[?json\] + - **STRUCTURE:** http://server/{operation}/{db}/{table}/?json=true + - operation, db, table, json are optional - SELECT {fields} FROM {table} WHERE {condition} {operator} {value} - - the whole where cluase is optional, but needs to be implemented + - TODO: conditions and filters + - the whole where cluase is optional, but needs to be implemented - DELETE - DELETE FROM {table} WHERE {condition} {operator} {value} - MODIFY / ALTER diff --git a/db/test.db b/db/test.db index bfbe8c48bdf58621204ebe3509f615f48633114f..9711e8506a2980812e9c4d3d08489bdd9099a7bf 100644 GIT binary patch delta 92 zcmZojXh@hK&8R$4#+gxhW5N=C17`lS4E*o;Z}Fey?}Nicejwz1g$-^j+`-GlcxYo` W86%_a#6lfL`-z3to6pJ{3jhGnWg$2K delta 64 zcmZojXh@hK&B!@X#+i|GW5N=CK34u64E*o;Z}FeyKghphv!KE&filter=<> + + Args: + *vpath* vpath - I don't quite understand this one, + is it internal, or just a dummy? + + Sets: + *cherrypy.request.params:* list(), various variable parameters + for processing + + Returns: + *vpath:* list(), list of path elements + + Raises: + *N/A* + + ''' + if len(vpath) == 2: + cherrypy.request.params['table'] = vpath.pop() + cherrypy.request.params['db'] = vpath.pop() + self.error = False + return self + else: + self.error = 'Param error' + return vpath + + def sqlite_delete_values(self, db, table, item, value): + ''' Calling the actual data from DB + + Connect to DB, execute a query and return data + + Args: + *db:* str(), database file name + ***kwargs:* dict(), additional arguments to specify the + table and filters to retrieve the data by + + Sets: + *N/A* + + Returns: + *result:* tuple(), rows from table, or DB schema as a tuple + + Raises: + *N/A* + + ''' + db_file = f"{config._ROOT}/{config._DB_PATH}/{db}" + try: + conn = sqlite3.connect(db_file) + c = conn.cursor() + query = f"DELETE FROM {table} WHERE {item} = '{value}'" + c.execute(query) + result = c.rowcount + conn.commit() + conn.close() + self.error = False + self.statement = query + except Exception as e: + self.error = e + print(e) + result = False + return result + @cherrypy.expose - def index(self): - return 'INSERT' + def index(self, **kwargs): + ''' Extending the expose - index method + + Returns html / json output + + Args: + ***kwargs:* dict(), arguments needed for SELECT / SCHEMA + schema= or + db= AND table= OPTINALLY + values=, filter= + + Sets: + *N/A* + + Returns: + *result:* str(), rhtml code to be rendered, or JSON + + Raises: + *N/A* + + ''' + self.html = '' + self.json = {} + url = cherrypy.url() + try: + db = kwargs['db'] + table = kwargs['table'] + value = kwargs['value'] + item = kwargs['item'] + print(f"(delete from {db}/{table} where {item} = '{value}'") + result = self.sqlite_delete_values(db, table, item, value) + self.html = htmlize.read_html('delete','/templates/') + self.html = self.html.format( + _rows_affected=result, + _statement=self.statement + ) + self.json.update({ + "result":{"response": result}, + "status": self.error + }) + except Exception as e: + print(str(e)) + #e = "ERROR: check DB / TABLE / VALUES" + result = htmlize.read_html('error', '/templates/') + self.html = self.html.format(_error=self.error) + if 'json' in kwargs.keys(): + return json.dumps(str(self.json)) + else: + return self.html diff --git a/templates/delete.html b/templates/delete.html new file mode 100644 index 0000000..9a7d634 --- /dev/null +++ b/templates/delete.html @@ -0,0 +1,4 @@ +

DELETE

+

{_statement}

+
+

Rows affected: {_rows_affected}