11#![ feature( proc_macro_hygiene, decl_macro) ]
22#[ macro_use] extern crate rocket;
33#[ macro_use] extern crate serde_derive;
4+ use log:: { info, debug, error} ;
45use std:: sync:: Mutex ;
56use std:: thread;
67use rocket:: State ;
@@ -158,7 +159,6 @@ impl SQLiteManager {
158159 fn get_update_hook ( & self , sender : mpsc:: SyncSender < ChannelMessage > ) -> Box < dyn FnMut ( rusqlite:: Action , & str , & str , i64 ) + Send > {
159160 Box :: new ( move |_act, _db_name, table_name, _rowid| {
160161 if table_name == "triples" {
161- // println!("got {:?} {} {} {}", act, db_name, table_name, rowid);
162162 match sender. try_send ( ChannelMessage :: Refresh ) {
163163 Ok ( _) => return ,
164164 Err ( mpsc:: TrySendError :: Full ( _e) ) => return ,
@@ -178,11 +178,10 @@ impl SQLiteManager {
178178 }
179179
180180 fn get_triples ( & self ) -> Result < Vec < ( String , String , String ) > > {
181- println ! ( "triggered" ) ;
181+ debug ! ( "triggered" ) ;
182182 let mut stmt = self . conn . prepare ( "SELECT subject, predicate, object FROM triples" ) ?;
183183
184184 let triples: Vec < ( String , String , String ) > = stmt. query_map ( NO_PARAMS , |row| {
185- //println!("row {:?}", row.columns());
186185 let s: String = row. get ( 0 ) ?;
187186 let p: String = row. get ( 1 ) ?;
188187 let o: String = row. get ( 2 ) ?;
@@ -221,10 +220,10 @@ impl SQLiteManager {
221220 fn update ( & mut self ) -> Result < ( ) > {
222221 // try to see if there are any new views
223222 if !self . changed {
224- println ! ( "triggered but no change" ) ;
223+ debug ! ( "triggered but no change" ) ;
225224 return Ok ( ( ) ) ;
226225 } else {
227- println ! ( "changing row" ) ;
226+ debug ! ( "changing row" ) ;
228227 }
229228
230229 // TODO: return true if the input changed
@@ -233,10 +232,10 @@ impl SQLiteManager {
233232 for view in self . views . iter ( ) {
234233 tx. execute ( & view. get_delete_tab ( ) , NO_PARAMS ) ?;
235234 //tx.execute(format!("DELETE FROM view_{};", view.name()).as_str(), NO_PARAMS)?;
236- println ! ( "insert: {}" , view. get_insert_sql( ) ) ;
235+ debug ! ( "insert: {}" , view. get_insert_sql( ) ) ;
237236 let mut stmt = tx. prepare ( & view. get_insert_sql ( ) ) ?;
238237 let tuples: Vec < Vec < String > > = view. contents_string ( ) ?;
239- println ! ( "got {} for {}" , tuples. len( ) , view. name( ) ) ;
238+ info ! ( "got {} for {}" , tuples. len( ) , view. name( ) ) ;
240239 for tup in tuples {
241240 stmt. execute ( & tup) ?;
242241 }
@@ -256,7 +255,12 @@ impl SQLiteManager {
256255 let res = self . recv . recv ( ) ;
257256 match res {
258257 Ok ( ChannelMessage :: ViewDef ( vdef, tx) ) => { self . add_view ( vdef. name , & vdef. query ) ?; tx. send ( ( ) ) . unwrap ( ) ; } ,
259- Ok ( ChannelMessage :: TripleAdd ( trips, tx) ) => { self . add_triples ( trips) ?; tx. send ( ( ) ) . unwrap ( ) ; } ,
258+ Ok ( ChannelMessage :: TripleAdd ( trips, tx) ) => {
259+ self . add_triples ( trips) ?;
260+ if let Some ( c) = tx {
261+ c. send ( ( ) ) . unwrap ( ) ;
262+ }
263+ } ,
260264 Ok ( ChannelMessage :: Refresh ) => self . update ( ) ?,
261265 Err ( e) => return Err ( ReasonableError :: ChannelRecv ( e) ) ,
262266 } ;
@@ -273,7 +277,7 @@ struct TableResponse {
273277#[ derive( Debug ) ]
274278enum ChannelMessage {
275279 ViewDef ( ViewDef , mpsc:: Sender < ( ) > ) ,
276- TripleAdd ( Vec < JsonTriple > , mpsc:: Sender < ( ) > ) ,
280+ TripleAdd ( Vec < JsonTriple > , Option < mpsc:: Sender < ( ) > > ) ,
277281 Refresh ,
278282}
279283
@@ -289,7 +293,6 @@ struct ViewChannel(mpsc::SyncSender<ChannelMessage>);
289293type DbConn = Mutex < rusqlite:: Connection > ;
290294type RdfConn = Mutex < MemoryStore > ;
291295
292-
293296#[ get( "/view/<name>" , format = "json" ) ]
294297fn getview ( name : String , conn : State < DbConn > , _store : State < RdfConn > , _tx : State < ViewChannel > ) -> Json < TableResponse > {
295298 let mut rows: Vec < Vec < String > > = Vec :: new ( ) ;
@@ -304,7 +307,7 @@ fn getview(name: String, conn: State<DbConn>, _store: State<RdfConn>, _tx: State
304307 header = row. column_names ( ) . iter ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
305308 Ok ( ( ) )
306309 } ) . unwrap ( ) . count ( ) ;
307- println ! ( "rows {}" , rows. len( ) ) ;
310+ info ! ( "rows {}" , rows. len( ) ) ;
308311 Json ( TableResponse { header, rows} )
309312}
310313
@@ -317,17 +320,23 @@ fn makeview(data: Json<ViewDef>, _conn: State<DbConn>, _store: State<RdfConn>, t
317320}
318321
319322#[ post( "/add" , data = "<data>" , format = "json" ) ]
320- fn addtriples ( data : Json < Vec < JsonTriple > > , _conn : State < DbConn > , _store : State < RdfConn > , tx : State < ViewChannel > ) -> Json < ( ) > {
323+ fn addtriples ( data : Json < Vec < JsonTriple > > , tx : State < ViewChannel > ) -> Json < ( ) > {
321324 let ( send, recv) = mpsc:: channel ( ) ;
322- tx. 0 . send ( ChannelMessage :: TripleAdd ( data. 0 , send) ) . expect ( "add triples" ) ;
325+ tx. 0 . send ( ChannelMessage :: TripleAdd ( data. 0 , Some ( send) ) ) . expect ( "add triples" ) ;
323326 recv. recv ( ) . unwrap ( ) ;
324327 Json ( ( ) )
325328}
326329
330+ #[ post( "/addnb" , data = "<data>" , format = "json" ) ]
331+ fn addtriples_nonblock ( data : Json < Vec < JsonTriple > > , tx : State < ViewChannel > ) -> Json < ( ) > {
332+ tx. 0 . send ( ChannelMessage :: TripleAdd ( data. 0 , None ) ) . expect ( "add triples" ) ;
333+ Json ( ( ) )
334+ }
335+
327336#[ post( "/query" , data = "<data>" , format = "json" ) ]
328337fn doquery ( data : Json < String > , _conn : State < DbConn > , store : State < RdfConn > , _tx : State < ViewChannel > ) -> Result < Json < Vec < Vec < String > > > > {
329338 let sparql = format ! ( "{}{}" , qfmt, data. 0 ) ;
330- println ! ( "do query {}" , sparql) ;
339+ info ! ( "do query {}" , sparql) ;
331340 let q = store. lock ( ) . expect ( "rdf lock" ) . prepare_query ( & sparql, QueryOptions :: default ( ) ) ?;
332341 let res = q. exec ( ) ?;
333342 let mut rows: Vec < Vec < String > > = Vec :: new ( ) ;
@@ -340,7 +349,6 @@ fn doquery(data: Json<String>, _conn: State<DbConn>, store: State<RdfConn>, _tx:
340349 for col in & vars {
341350 row. push ( vals. get ( col. as_str ( ) ) . unwrap ( ) . clone ( ) . to_string ( ) ) ;
342351 }
343- println ! ( "row {:?}" , row) ;
344352 rows. push ( row) ;
345353 }
346354 } ,
@@ -373,7 +381,7 @@ fn rocket(filename: &str) {
373381 . manage ( Mutex :: new ( conn) )
374382 . manage ( Mutex :: new ( store) )
375383 . manage ( ViewChannel ( tx) )
376- . mount ( "/" , routes ! [ getview, makeview, addtriples, doquery] )
384+ . mount ( "/" , routes ! [ getview, makeview, addtriples, addtriples_nonblock , doquery] )
377385 . launch ( ) ;
378386 } ) ;
379387
0 commit comments