You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 regels
3.2 KiB

  1. extern crate clap;
  2. extern crate r2d2;
  3. extern crate r2d2_sqlite;
  4. extern crate rusqlite;
  5. extern crate simple_error;
  6. use clap::{App, SubCommand};
  7. use r2d2::Pool;
  8. use r2d2_sqlite::SqliteConnectionManager;
  9. use rusqlite::params;
  10. use serde_json::{Map, Value};
  11. use serde_rusqlite::from_row;
  12. use serde_rusqlite::Result as SRResult;
  13. use simple_error::*;
  14. fn main() -> Result<(), SimpleError> {
  15. let matches = App::new("Rust DB Play")
  16. .version("1.0")
  17. .author("Jonathan Altman <jonathan@async.io>")
  18. .about("Test out Rust database result serialization")
  19. .subcommand(SubCommand::with_name("sqlite").about("Test on sqlite"))
  20. .subcommand(SubCommand::with_name("postgres").about("Test on postgres"))
  21. .get_matches();
  22. return match matches.subcommand_name() {
  23. Some("sqlite") => test_sqlite(),
  24. Some("postgres") => test_postgres(),
  25. None => bail!("No database specified"),
  26. _ => bail!("Unknown database specified"),
  27. };
  28. }
  29. fn test_postgres() -> Result<(), SimpleError> {
  30. println!("Postgres: Not implemented yet");
  31. return Ok(());
  32. }
  33. fn test_sqlite() -> Result<(), SimpleError> {
  34. let (pool, table_name) = setup_sqlite().unwrap();
  35. return match test_sqlite_json(pool, &table_name) {
  36. Ok(()) => Ok(()),
  37. // @TODO (2019-11-19, Jonathan) Extract sqlite error here
  38. Err(_) => bail!("Error in testing sqlite"),
  39. };
  40. }
  41. fn setup_sqlite() -> SRResult<(Pool<SqliteConnectionManager>, String)> {
  42. fn setup_pool() -> Pool<SqliteConnectionManager> {
  43. let manager = SqliteConnectionManager::memory();
  44. let pool = Pool::new(manager).unwrap();
  45. pool
  46. }
  47. fn setup_db_structure(pool: &Pool<SqliteConnectionManager>, table_name: &str) -> SRResult<()> {
  48. let conn = pool.get().unwrap();
  49. conn.execute(
  50. format!(
  51. "CREATE TABLE {} (
  52. id INTEGER PRIMARY KEY,
  53. name TEXT NOT NULL,
  54. time_created TEXT NOT NULL,
  55. data BLOB,
  56. data_null BLOB
  57. )",
  58. table_name
  59. )
  60. .as_str(),
  61. params![],
  62. )?;
  63. conn.execute(
  64. "INSERT INTO person (name, time_created, data, data_null)
  65. VALUES (?1, ?2, ?3, ?4)",
  66. params![
  67. "Steven".to_string(),
  68. time::get_time(),
  69. "This is some text".to_string(),
  70. None as Option<Vec<u8>>
  71. ],
  72. )?;
  73. Ok(())
  74. }
  75. const TABLE_NAME: &str = "person";
  76. let pool = setup_pool();
  77. setup_db_structure(&pool, TABLE_NAME)?;
  78. Ok((pool, TABLE_NAME.to_string()))
  79. }
  80. fn test_sqlite_json(pool: Pool<SqliteConnectionManager>, table_name: &String) -> SRResult<()> {
  81. let conn = pool.get().unwrap();
  82. let mut stmt = conn.prepare(&format!("SELECT * FROM {}", table_name))?;
  83. let result_iter = stmt.query_map(params![], |row| {
  84. Ok(from_row::<Map<String, Value>>(row).unwrap())
  85. })?;
  86. for cur_result in result_iter {
  87. println!(
  88. "Found row {:?}",
  89. serde_json::to_string(&cur_result.unwrap()).unwrap()
  90. );
  91. }
  92. Ok(())
  93. }