mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 13:58:55 +08:00 
			
		
		
		
	
							
								
								
									
										28
									
								
								src/cache.rs
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/cache.rs
									
									
									
									
									
								
							| @@ -46,6 +46,7 @@ impl Connection { | |||||||
|         self.cache.set_capacity(capacity) |         self.cache.set_capacity(capacity) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Remove/finalize all prepared statements currently in the cache. | ||||||
|     pub fn flush_prepared_statement_cache(&self) { |     pub fn flush_prepared_statement_cache(&self) { | ||||||
|         self.cache.flush() |         self.cache.flush() | ||||||
|     } |     } | ||||||
| @@ -124,7 +125,7 @@ impl StatementCache { | |||||||
|                   sql: &str) |                   sql: &str) | ||||||
|                   -> Result<CachedStatement<'conn>> { |                   -> Result<CachedStatement<'conn>> { | ||||||
|         let mut cache = self.0.borrow_mut(); |         let mut cache = self.0.borrow_mut(); | ||||||
|         let stmt = match cache.remove(sql) { |         let stmt = match cache.remove(sql.trim()) { | ||||||
|             Some(raw_stmt) => Ok(Statement::new(conn, raw_stmt)), |             Some(raw_stmt) => Ok(Statement::new(conn, raw_stmt)), | ||||||
|             None => conn.prepare(sql), |             None => conn.prepare(sql), | ||||||
|         }; |         }; | ||||||
| @@ -135,7 +136,7 @@ impl StatementCache { | |||||||
|     fn cache_stmt(&self, stmt: RawStatement) { |     fn cache_stmt(&self, stmt: RawStatement) { | ||||||
|         let mut cache = self.0.borrow_mut(); |         let mut cache = self.0.borrow_mut(); | ||||||
|         stmt.clear_bindings(); |         stmt.clear_bindings(); | ||||||
|         let sql = String::from_utf8_lossy(stmt.sql().to_bytes()).to_string(); |         let sql = String::from_utf8_lossy(stmt.sql().to_bytes()).trim().to_string(); | ||||||
|         cache.insert(sql, stmt); |         cache.insert(sql, stmt); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -285,4 +286,27 @@ mod test { | |||||||
|  |  | ||||||
|         conn.close().expect("connection not closed"); |         conn.close().expect("connection not closed"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[test] | ||||||
|  |     fn test_cache_key() { | ||||||
|  |         let db = Connection::open_in_memory().unwrap(); | ||||||
|  |         let cache = &db.cache; | ||||||
|  |         assert_eq!(0, cache.len()); | ||||||
|  |  | ||||||
|  |         //let sql = " PRAGMA schema_version; -- comment"; | ||||||
|  |         let sql = "PRAGMA schema_version; "; | ||||||
|  |         { | ||||||
|  |             let mut stmt = db.prepare_cached(sql).unwrap(); | ||||||
|  |             assert_eq!(0, cache.len()); | ||||||
|  |             assert_eq!(0, stmt.query_row(&[], |r| r.get::<i32, i64>(0)).unwrap()); | ||||||
|  |         } | ||||||
|  |         assert_eq!(1, cache.len()); | ||||||
|  |  | ||||||
|  |         { | ||||||
|  |             let mut stmt = db.prepare_cached(sql).unwrap(); | ||||||
|  |             assert_eq!(0, cache.len()); | ||||||
|  |             assert_eq!(0, stmt.query_row(&[], |r| r.get::<i32, i64>(0)).unwrap()); | ||||||
|  |         } | ||||||
|  |         assert_eq!(1, cache.len()); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user