Exemple #1
0
GList *
seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr,
                                      const char *email)
{
    GList *id_list = NULL, *ptr;
    GList *ret = NULL;
    char sql[256];

    snprintf (sql, 256, "SELECT repo_id FROM RepoOwner WHERE owner_id='%s'",
              email);

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      collect_repo_id, &id_list) < 0)
        return NULL;

    for (ptr = id_list; ptr; ptr = ptr->next) {
        char *repo_id = ptr->data;
        SeafRepo *repo = seaf_repo_manager_get_repo (mgr, repo_id);
        if (repo != NULL)
            ret = g_list_prepend (ret, repo);
    }

    string_list_free (id_list);

    return ret;
}
Exemple #2
0
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit)
{
    GList *id_list = NULL, *ptr;
    GList *ret = NULL;
    SeafRepo *repo;
    char sql[256];

    if (start == -1 && limit == -1)
        snprintf (sql, 256, "SELECT repo_id FROM Repo");
    else
        snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit);

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      collect_repo_id, &id_list) < 0)
        return NULL;

    for (ptr = id_list; ptr; ptr = ptr->next) {
        char *repo_id = ptr->data;
        repo = seaf_repo_manager_get_repo (mgr, repo_id);
        if (repo != NULL)
            ret = g_list_prepend (ret, repo);
    }

    string_list_free (id_list);
    return g_list_reverse (ret);
}
Exemple #3
0
GList *
seaf_repo_manager_list_garbage_repos (SeafRepoManager *mgr)
{
    GList *repo_ids = NULL;

    seaf_db_foreach_selected_row (seaf->db,
                                  "SELECT repo_id FROM GarbageRepos",
                                  get_garbage_repo_id, &repo_ids);

    return repo_ids;
}
Exemple #4
0
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr,
                                 int start, int limit,
                                 gboolean ignore_errors,
                                 gboolean *error)
{
    char sql[256];
    GList *id_list = NULL, *ptr;
    GList *ret = NULL;
    SeafRepo *repo;

    *error = FALSE;

    if (start == -1 && limit == -1)
        snprintf (sql, 256, "SELECT repo_id FROM Repo");
    else
        snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit);

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_repo_id, &id_list) < 0)
        goto error;

    for (ptr = id_list; ptr; ptr = ptr->next) {
        char *repo_id = ptr->data;
        repo = seaf_repo_manager_get_repo (mgr, repo_id);
        if (!repo) {
            /* In GC, we should be more conservative.
             * No matter a repo is really corrupted or it's a temp error,
             * we return error here.
             */
            g_warning ("Failed to get repo %.8s.\n", repo_id);
            if (!ignore_errors)
                goto error;
            else
                continue;
        }
        ret = g_list_prepend (ret, repo);
    }

    string_list_free (id_list);
    return ret;

error:
    *error = TRUE;
    string_list_free (id_list);
    for (ptr = ret; ptr; ptr = ptr->next) {
        repo = ptr->data;
        seaf_repo_unref (repo);
    }
    return NULL;
}
Exemple #5
0
GList *
seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr)
{
    GList *ret = NULL;
    char sql[256];

    snprintf (sql, 256, "SELECT repo_id FROM Repo");

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_repo_id, &ret) < 0)
        return NULL;

    return ret;
}
Exemple #6
0
SeafVirtRepo *
seaf_repo_manager_get_virtual_repo_info (SeafRepoManager *mgr,
        const char *repo_id)
{
    char sql[256];
    SeafVirtRepo *vinfo = NULL;

    snprintf (sql, 256,
              "SELECT origin_repo, path, base_commit FROM VirtualRepo "
              "WHERE repo_id = '%s'", repo_id);
    seaf_db_foreach_selected_row (seaf->db, sql, load_virtual_info, &vinfo);

    return vinfo;
}
Exemple #7
0
static SeafRepo *
load_repo (SeafRepoManager *manager, const char *repo_id)
{
    char sql[256];
    int n;

    SeafRepo *repo = seaf_repo_new(repo_id, NULL, NULL);
    if (!repo) {
        g_warning ("[repo mgr] failed to alloc repo.\n");
        return NULL;
    }

    repo->manager = manager;

    snprintf(sql, 256, "SELECT branch_name FROM RepoHead WHERE repo_id='%s'",
             repo->id);
    n = seaf_db_foreach_selected_row (seaf->db, sql, load_branch_cb, repo);
    if (n < 0) {
        g_warning ("Error read branch for repo %s.\n", repo->id);
        seaf_repo_free (repo);
        return NULL;
    } else if (n == 0) {
        g_warning ("Repo %.8s is corrupted.\n", repo->id);
        seaf_repo_free (repo);
        return NULL;
    }

    if (repo->is_corrupted) {
        g_warning ("Repo %.8s is corrupted.\n", repo->id);
        seaf_repo_free (repo);
        return NULL;
    }

#if 0
    if (pthread_rwlock_wrlock (&manager->priv->lock) < 0) {
        g_warning ("[repo mgr] failed to lock repo cache.\n");
        seaf_repo_free (repo);
        return NULL;
    }
    avl_insert (manager->priv->repo_tree, repo);
    /* Don't need to increase ref count, since the ref count of
     * a new repo object is already 1.
     */
    pthread_rwlock_unlock (&manager->priv->lock);
#endif

    return repo;
}
Exemple #8
0
gint64
seaf_quota_manager_get_org_usage (SeafQuotaManager *mgr, int org_id)
{
    char sql[256];
    gint64 ret = 0;

    snprintf (sql, sizeof(sql), 
              "SELECT size FROM OrgRepo, RepoSize WHERE "
              "org_id=%d AND OrgRepo.repo_id=RepoSize.repo_id",
              org_id);
    if (seaf_db_foreach_selected_row (mgr->session->db, sql,
                                      get_total_size, &ret) < 0)
        return -1;

    return ret;
}
Exemple #9
0
gint64
seaf_quota_manager_get_user_usage (SeafQuotaManager *mgr, const char *user)
{
    char sql[256];
    gint64 ret = 0;

    snprintf (sql, sizeof(sql), 
              "SELECT size FROM RepoOwner, RepoSize WHERE "
              "owner_id='%s' AND RepoOwner.repo_id=RepoSize.repo_id",
              user);
    if (seaf_db_foreach_selected_row (mgr->session->db, sql,
                                      get_total_size, &ret) < 0)
        return -1;

    return ret;
}
Exemple #10
0
gint64
get_org_quota_usage (SeafileSession *seaf, int org_id)
{
    char sql[256];
    gint64 ret = 0;

    snprintf (sql, sizeof(sql), 
              "SELECT size FROM OrgRepo, RepoSize WHERE "
              "org_id=%d AND OrgRepo.repo_id=RepoSize.repo_id",
              org_id);
    if (seaf_db_foreach_selected_row (seaf->db, sql,
                                      get_total_size, &ret) < 0)
        return -1;

    return ret;
}
Exemple #11
0
gint64
get_user_quota_usage (SeafileSession *seaf, const char *email)
{
    char sql[256];
    gint64 ret = 0;

    snprintf (sql, sizeof(sql), 
              "SELECT size FROM RepoOwner, RepoSize WHERE "
              "owner_id='%s' AND RepoOwner.repo_id=RepoSize.repo_id",
              email);
    if (seaf_db_foreach_selected_row (seaf->db, sql,
                                      get_total_size, &ret) < 0)
        return -1;

    return ret;
}
Exemple #12
0
GList *
seaf_repo_manager_get_virtual_repo_ids_by_origin (SeafRepoManager *mgr,
        const char *origin_repo)
{
    GList *ret = NULL;
    char sql[256];

    snprintf (sql, 256,
              "SELECT repo_id FROM VirtualRepo WHERE origin_repo='%s'",
              origin_repo);
    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_virtual_repo_ids, &ret) < 0) {
        return NULL;
    }

    return g_list_reverse (ret);
}
Exemple #13
0
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit)
{
    GList *ret = NULL;
    char sql[256];

    if (start == -1 && limit == -1)
        snprintf (sql, 256, "SELECT repo_id FROM Repo");
    else
        snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit);

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      collect_repos, &ret) < 0)
        return NULL;

    return g_list_reverse (ret);
}
Exemple #14
0
GList *
seaf_branch_manager_get_branch_list (SeafBranchManager *mgr,
                                     const char *repo_id)
{
    GList *ret = NULL;
    char sql[256];

    snprintf (sql, sizeof(sql),
              "SELECT name, repo_id, commit_id FROM Branch WHERE repo_id='%s'",
              repo_id);
    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      get_branches, &ret) < 0) {
        g_warning ("[branch mgr] DB error when get branch list.\n");
        return NULL;
    }

    return ret;
}
Exemple #15
0
char *
get_origin_repo_id (SeafRepoManager *mgr, const char *repo_id)
{
    char sql[256];
    char origin_repo_id[37];

    memset (origin_repo_id, 0, 37);

    snprintf (sql, 256,
              "SELECT origin_repo FROM VirtualRepo "
              "WHERE repo_id = '%s'", repo_id);
    seaf_db_foreach_selected_row (seaf->db, sql, load_virtual_info, origin_repo_id);

    if (origin_repo_id[0] != 0)
        return g_strdup(origin_repo_id);
    else
        return NULL;
}
Exemple #16
0
GList *
seaf_share_manager_list_shared_to (SeafShareManager *mgr,
                                   const char *owner,
                                   const char *repo_id)
{
    char sql[512];
    GList *ret = NULL;

    snprintf (sql, sizeof(sql),
              "SELECT to_email FROM SharedRepo WHERE "
              "from_email='%s' AND repo_id='%s'",
              owner, repo_id);
    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_shared_to, &ret) < 0) {
        g_warning ("[share mgr] DB error when list shared to.\n");
        string_list_free (ret);
        return NULL;
    }

    return ret;
}
Exemple #17
0
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr,
                                 int start, int limit,
                                 gboolean *error)
{
    char sql[256];
    GList *id_list = NULL, *ptr;
    GList *ret = NULL;
    SeafRepo *repo;

    *error = FALSE;

    if (start == -1 && limit == -1)
        snprintf (sql, 256, "SELECT repo_id FROM Repo");
    else
        snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit);

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      collect_repo_id, &id_list) < 0)
        goto error;

    for (ptr = id_list; ptr; ptr = ptr->next) {
        char *repo_id = ptr->data;
        repo = seaf_repo_manager_get_repo_ex (mgr, repo_id);
        if (repo)
            ret = g_list_prepend (ret, repo);
    }

    string_list_free (id_list);
    return ret;

error:
    *error = TRUE;
    string_list_free (id_list);
    for (ptr = ret; ptr; ptr = ptr->next) {
        repo = ptr->data;
        seaf_repo_unref (repo);
    }
    return NULL;
}
Exemple #18
0
static SeafBranch *
real_get_branch (SeafBranchManager *mgr,
                 const char *repo_id,
                 const char *name)
{
    char commit_id[41];
    char sql[256];

    commit_id[0] = 0;
    snprintf (sql, sizeof(sql),
              "SELECT commit_id FROM Branch WHERE name='%s' AND repo_id='%s'",
              name, repo_id);
    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, 
                                      get_branch, commit_id) < 0) {
        g_warning ("[branch mgr] DB error when get branch %s.\n", name);
        return NULL;
    }

    if (commit_id[0] == 0)
        return NULL;

    return seaf_branch_new (name, repo_id, commit_id);
}
Exemple #19
0
int
seaf_repo_manager_get_repo_history_limit (SeafRepoManager *mgr,
        const char *repo_id)
{
    SeafVirtRepo *vinfo;
    const char *r_repo_id = repo_id;
    char sql[256];
    int per_repo_days = -1;

    vinfo = seaf_repo_manager_get_virtual_repo_info (mgr, repo_id);
    if (vinfo)
        r_repo_id = vinfo->origin_repo_id;

    snprintf (sql, sizeof(sql),
              "SELECT days FROM RepoHistoryLimit WHERE repo_id='%s'",
              r_repo_id);
    seaf_virtual_repo_info_free (vinfo);

    /* We don't use seaf_db_get_int() because we need to differ DB error
     * from not exist.
     * We can't just return global config value if DB error occured,
     * since the global value may be smaller than per repo one.
     * This can lead to data lose in GC.
     */
    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      get_limit, &per_repo_days) < 0) {
        seaf_warning ("DB error.\n");
        return -1;
    }

    /* If per repo value is not set, return the global one. */
    if (per_repo_days < 0)
        return mgr->seaf->keep_history_days;

    return per_repo_days;
}
Exemple #20
0
GList*
seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email,
                                     const char *type, int start, int limit)
{
    GList *ret = NULL, *p;
    char sql[512];

    if (start == -1 && limit == -1) {
        if (g_strcmp0 (type, "from_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                      "to_email, permission, commit_id FROM "
                      "SharedRepo LEFT JOIN VirtualRepo ON "
                      "SharedRepo.repo_id=VirtualRepo.repo_id, Branch "
                      "WHERE from_email='%s' AND "
                      "SharedRepo.repo_id = Branch.repo_id AND "
                      "Branch.name = 'master'",
                      email);
        } else if (g_strcmp0 (type, "to_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, NULL, "
                      "from_email, permission, commit_id FROM "
                      "SharedRepo, Branch "
                      "WHERE to_email='%s' AND "
                      "SharedRepo.repo_id = Branch.repo_id AND "
                      "Branch.name = 'master'",
                      email);
        } else {
            /* should never reach here */
            g_warning ("[share mgr] Wrong column type");
            return NULL;
        }
    }
    else {
        if (g_strcmp0 (type, "from_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                      "to_email, permission, commit_id FROM "
                      "SharedRepo LEFT JOIN VirtualRepo ON "
                      "SharedRepo.repo_id=VirtualRepo.repo_id, Branch "
                      "WHERE from_email='%s' "
                      "AND SharedRepo.repo_id = Branch.repo_id "
                      "AND Branch.name = 'master' "
                      "ORDER BY SharedRepo.repo_id "
                      "LIMIT %d OFFSET %d",
                      email, limit, start);
        } else if (g_strcmp0 (type, "to_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, NULL, "
                      "from_email, permission, commit_id FROM "
                      "SharedRepo, Branch WHERE "
                      "to_email='%s' "
                      "AND SharedRepo.repo_id = Branch.repo_id "
                      "AND Branch.name = 'master' "
                      "ORDER BY SharedRepo.repo_id "
                      "LIMIT %d OFFSET %d",
                      email, limit, start);
        } else {
            /* should never reach here */
            g_warning ("[share mgr] Wrong column type");
            return NULL;
        }
    }

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_repos, &ret) < 0) {
        g_warning ("[share mgr] DB error when get shared repo id and email "
                   "for %s.\n", email);
        for (p = ret; p; p = p->next)
            g_object_unref (p->data);
        g_list_free (ret);
        return NULL;
    }

    return g_list_reverse (ret);
}
Exemple #21
0
GList*
seaf_share_manager_list_org_share_repos (SeafShareManager *mgr,
                                         int org_id,
                                         const char *email,
                                         const char *type,
                                         int start, int limit)
{
    GList *ret = NULL, *p;
    char sql[512];

    if (start == -1 && limit == -1) {
        if (g_strcmp0 (type, "from_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, to_email, permission FROM "
                      "SharedRepo, OrgRepo "
                      "WHERE from_email='%s' AND "
                      "OrgRepo.org_id=%d AND "
                      "SharedRepo.repo_id=OrgRepo.repo_id",
                      email, org_id);
        } else if (g_strcmp0 (type, "to_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, from_email, permission FROM "
                      "SharedRepo, OrgRepo "
                      "WHERE to_email='%s' AND "
                      "OrgRepo.org_id=%d AND "
                      "SharedRepo.repo_id=OrgRepo.repo_id",
                      email, org_id);
        } else {
            /* should never reach here */
            g_warning ("[share mgr] Wrong column type");
            return NULL;
        }
    }
    else {
        if (g_strcmp0 (type, "from_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, to_email, permission FROM "
                      "SharedRepo, OrgRepo WHERE "
                      "from_email='%s' AND "
                      "OrgRepo.org_id=%d AND "
                      "SharedRepo.repo_id=OrgRepo.repo_id "
                      "ORDER BY SharedRepo.repo_id "
                      "LIMIT %d OFFSET %d",
                      email, org_id, limit, start);
        } else if (g_strcmp0 (type, "to_email") == 0) {
            snprintf (sql, sizeof(sql),
                      "SELECT SharedRepo.repo_id, from_email, permission FROM "
                      "SharedRepo, OrgRepo WHERE "
                      "to_email='%s' AND "
                      "OrgRepo.org_id=%d AND "
                      "SharedRepo.repo_id=OrgRepo.repo_id "
                      "ORDER BY SharedRepo.repo_id "
                      "LIMIT %d OFFSET %d",
                      email, org_id, limit, start);
        } else {
            /* should never reach here */
            g_warning ("[share mgr] Wrong column type");
            return NULL;
        }
    }

    if (seaf_db_foreach_selected_row (mgr->seaf->db, sql,
                                      collect_repos, &ret) < 0) {
        g_warning ("[share mgr] DB error when get shared repo id and email "
                   "for %s.\n", email);
        for (p = ret; p; p = p->next)
            g_object_unref (p->data);
        g_list_free (ret);
        return NULL;
    }

    fill_in_repo_info (ret);

    return g_list_reverse (ret);
}