diff options
| author | Teddy Wing | 2021-05-30 00:13:47 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2021-05-30 00:14:27 +0200 | 
| commit | 768b67c966e9a78864b450b6051974d096f1d412 (patch) | |
| tree | 7da6f88c3f0b39a2a614db9e9a28502a5084a425 | |
| parent | 8130bc32fa81821e5511500f2f64bd964c58f3db (diff) | |
| download | reflectub-768b67c966e9a78864b450b6051974d096f1d412.tar.bz2 | |
database: Add a way to get a single repo
| -rw-r--r-- | src/database.rs | 65 | ||||
| -rw-r--r-- | src/github.rs | 14 | ||||
| -rw-r--r-- | src/main.rs | 11 | 
3 files changed, 78 insertions, 12 deletions
| diff --git a/src/database.rs b/src/database.rs index 7ce2c52..a49675f 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,8 +1,17 @@ -use sqlx::{self, ConnectOptions, Connection, Executor}; +use sqlx::{self, ConnectOptions, Connection, Executor, Row}; -use crate::github::Repo; +use crate::github::Repo as GithubRepo; +#[derive(Debug)] +pub struct Repo { +    id: Option<i64>, +    name: Option<String>, +    updated_at: Option<String>, +} + + +#[derive(Debug)]  pub struct Db {      connection: sqlx::SqliteConnection,  } @@ -43,15 +52,63 @@ impl Db {          Ok(())      } -    pub fn repo_insert(repo: &Repo) -> Result<(), Box<dyn std::error::Error>> { +    pub async fn repo_get( +        &mut self, +        id: i64, +    ) -> Result<Repo, Box<dyn std::error::Error>> { +        let mut tx = self.connection.begin().await?; + +        let row = sqlx::query("SELECT id, name FROM repositories where id = ?") +            .bind(id) +            .fetch_one(&mut tx) +            .await?; + +        tx.commit().await?; + +        if row.is_empty() { +            return Err("not found".into()); +        } + +        Ok( +            Repo { +                id: Some(row.get(0)), +                name: Some(row.get(1)), +                updated_at: None, +            } +        ) +    } + +    pub async fn repo_insert( +        &mut self, +        repos: &[GithubRepo], +    ) -> Result<(), Box<dyn std::error::Error>> { +        let mut tx = self.connection.begin().await?; + +        for repo in repos { +            sqlx::query(r#" +                INSERT INTO repositories +                    (id, name, updated_at) +                    VALUES +                    (?, ?, ?) +            "#) +                .bind(repo.id) +                .bind(&repo.name) +                .bind(&repo.updated_at) +                .execute(&mut tx) +                .await?; +        } + +        tx.commit().await?; +          Ok(())      }      pub fn repo_is_updated() -> Result<bool, Box<dyn std::error::Error>> { +        // select id from repositories where updated_at > datetime("2020-07-13T17:57:56Z");          Ok(false)      } -    pub fn repo_update(repo: &Repo) -> Result<(), Box<dyn std::error::Error>> { +    pub fn repo_update(repo: &GithubRepo) -> Result<(), Box<dyn std::error::Error>> {          Ok(())      }  } diff --git a/src/github.rs b/src/github.rs index ec00420..8c853da 100644 --- a/src/github.rs +++ b/src/github.rs @@ -11,13 +11,13 @@ const USER_AGENT: &'static str = concat!(  #[derive(Debug, Deserialize)]  pub struct Repo { -    id: usize, -    name: String, -    description: Option<String>, -    fork: bool, -    git_url: String, -    default_branch: String, -    updated_at: String,  // TODO: Maybe parse to date? +    pub id: i64, +    pub name: String, +    pub description: Option<String>, +    pub fork: bool, +    pub git_url: String, +    pub default_branch: String, +    pub updated_at: String,  // TODO: Maybe parse to date?  } diff --git a/src/main.rs b/src/main.rs index acbcd23..9734804 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,5 +22,14 @@ async fn main() {      let mut db = database::Db::connect("test.db").await.unwrap(); -    db.create().await.unwrap(); +    // db.create().await.unwrap(); + +    // If repo !exists +    //   insert +    //   mirror +    // Else +    //   Update updated_at +    //   fetch + +    dbg!(db.repo_get(2).await.unwrap());  } | 
