Ejemplo n.º 1
0
GList *
seaf_repo_manager_get_virtual_repos_by_owner (SeafRepoManager *mgr,
                                              const char *owner,
                                              GError **error)
{
    GList *id_list = NULL, *ptr;
    GList *ret = NULL;
    char *sql;

    sql = "SELECT RepoOwner.repo_id FROM RepoOwner, VirtualRepo "
        "WHERE owner_id=? "
        "AND RepoOwner.repo_id = VirtualRepo.repo_id";

    if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, 
                                       collect_virtual_repo_ids, &id_list,
                                       1, "string", owner) < 0) {
        g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "DB error");
        return NULL;
    }

    char *repo_id;
    SeafRepo *repo;
    for (ptr = id_list; ptr; ptr = ptr->next) {
        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 ret;
}
Ejemplo n.º 2
0
GList *
seaf_share_manager_list_repo_shared_group (SeafShareManager *mgr,
                                           const char *from_email,
                                           const char *repo_id,
                                           GError **error)
{
    GList *shared_group = NULL;
    char *sql = "SELECT group_id, permission, repo_id FROM RepoGroup WHERE "
                "user_name=? AND repo_id=?";

    int ret = seaf_db_statement_foreach_row (mgr->seaf->db, sql,
                                             collect_repo_shared_group, &shared_group,
                                             2, "string", from_email, "string", repo_id);
    if (ret < 0) {
        seaf_warning ("Failed to list repo %s shared group from db.\n", repo_id);
        g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL,
                     "Failed to list repo shared group from db");
        while (shared_group) {
            g_object_unref (shared_group->data);
            shared_group = g_list_delete_link (shared_group, shared_group);
        }
        return NULL;
    }

    return shared_group;
}
Ejemplo n.º 3
0
gint64
seaf_quota_manager_get_user_usage (SeafQuotaManager *mgr, const char *user)
{
    char *sql;
    gint64 total = 0;

    sql = "SELECT size FROM "
        "RepoOwner o LEFT JOIN VirtualRepo v ON o.repo_id=v.repo_id, "
        "RepoSize WHERE "
        "owner_id=? AND o.repo_id=RepoSize.repo_id "
        "AND v.repo_id IS NULL";
    if (seaf_db_statement_foreach_row (mgr->session->db, sql,
                                       get_total_size, &total,
                                       1, "string", user) < 0)
        return -1;

    /* Add size of repos in trash. */
    /* sql = "SELECT size FROM RepoTrash WHERE owner_id = ?"; */
    /* if (seaf_db_statement_foreach_row (mgr->session->db, sql, */
    /*                                    get_total_size, &total, */
    /*                                    1, "string", user) < 0) */
    /*     return -1; */

    return total;
}
Ejemplo n.º 4
0
GHashTable *
seaf_share_manager_get_shared_sub_dirs (SeafShareManager *mgr,
                                        const char *repo_id,
                                        const char *path)
{
    GHashTable *sub_dirs = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                  g_free, NULL);
    char *pattern;
    if (strcmp (path, "/") == 0) {
        pattern = g_strdup_printf("%s%%", path);
    } else {
        pattern = g_strdup_printf ("%s/%%", path);
    }
    int ret = seaf_db_statement_foreach_row (mgr->seaf->db,
                                             "SELECT v.path FROM VirtualRepo v, SharedRepo s "
                                             "WHERE v.repo_id = s.repo_id and "
                                             "v.origin_repo = ? AND v.path LIKE ?",
                                             get_shared_sub_dirs, sub_dirs,
                                             2, "string", repo_id, "string", pattern);

    if (ret < 0) {
        g_free (pattern);
        seaf_warning ("Failed to get shared sub dirs from db.\n");
        g_hash_table_destroy (sub_dirs);
        return NULL;
    }

    ret = seaf_db_statement_foreach_row (mgr->seaf->db,
                                         "SELECT v.path FROM VirtualRepo v, RepoGroup r "
                                         "WHERE v.repo_id = r.repo_id and "
                                         "v.origin_repo = ? AND v.path LIKE ?",
                                         get_shared_sub_dirs, sub_dirs,
                                         2, "string", repo_id, "string", pattern);
    g_free (pattern);

    if (ret < 0) {
        seaf_warning ("Failed to get shared sub dirs from db.\n");
        g_hash_table_destroy (sub_dirs);
        return NULL;
    }

    return sub_dirs;
}
Ejemplo n.º 5
0
SeafVirtRepo *
seaf_repo_manager_get_virtual_repo_info (SeafRepoManager *mgr,
                                         const char *repo_id)
{
    char *sql;
    SeafVirtRepo *vinfo = NULL;

    sql = "SELECT repo_id, origin_repo, path, base_commit FROM VirtualRepo "
        "WHERE repo_id = ?";
    seaf_db_statement_foreach_row (seaf->db, sql, load_virtual_info, &vinfo,
                                   1, "string", repo_id);

    return vinfo;
}
Ejemplo n.º 6
0
gint64
seaf_quota_manager_get_org_usage (SeafQuotaManager *mgr, int org_id)
{
    char *sql;
    gint64 ret = 0;

    sql = "SELECT size FROM OrgRepo, RepoSize WHERE "
        "org_id=? AND OrgRepo.repo_id=RepoSize.repo_id";
    if (seaf_db_statement_foreach_row (mgr->session->db, sql,
                                       get_total_size, &ret,
                                       1, "int", org_id) < 0)
        return -1;

    return ret;
}
Ejemplo n.º 7
0
GList *
seaf_repo_manager_get_virtual_repo_ids_by_origin (SeafRepoManager *mgr,
                                                  const char *origin_repo)
{
    GList *ret = NULL;
    char *sql;

    sql = "SELECT repo_id FROM VirtualRepo WHERE origin_repo=?";
    if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, 
                                       collect_virtual_repo_ids, &ret,
                                       1, "string", origin_repo) < 0) {
        return NULL;
    }

    return g_list_reverse (ret);
}
Ejemplo n.º 8
0
GList *
seaf_branch_manager_get_branch_list (SeafBranchManager *mgr,
                                     const char *repo_id)
{
    GList *ret = NULL;
    char *sql;

    sql = "SELECT name, repo_id, commit_id FROM Branch WHERE repo_id=?";
    if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, 
                                       get_branches, &ret,
                                       1, "string", repo_id) < 0) {
        seaf_warning ("[branch mgr] DB error when get branch list.\n");
        return NULL;
    }

    return ret;
}
Ejemplo n.º 9
0
GList *
seaf_share_manager_list_shared_to (SeafShareManager *mgr,
                                   const char *owner,
                                   const char *repo_id)
{
    char *sql;
    GList *ret = NULL;

    sql = "SELECT to_email FROM SharedRepo WHERE "
        "from_email=? AND repo_id=?";
    if (seaf_db_statement_foreach_row (mgr->seaf->db, sql,
                                       collect_shared_to, &ret,
                                       2, "string", owner, "string", repo_id) < 0) {
        seaf_warning ("[share mgr] DB error when list shared to.\n");
        string_list_free (ret);
        return NULL;
    }

    return ret;
}
Ejemplo n.º 10
0
static SeafBranch *
real_get_branch (SeafBranchManager *mgr,
                 const char *repo_id,
                 const char *name)
{
    char commit_id[41];
    char *sql;

    commit_id[0] = 0;
    sql = "SELECT commit_id FROM Branch WHERE name=? AND repo_id=?";
    if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, 
                                       get_branch, commit_id,
                                       2, "string", name, "string", repo_id) < 0) {
        seaf_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);
}
Ejemplo n.º 11
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;

    if (start == -1 && limit == -1) {
        if (g_strcmp0 (type, "from_email") == 0) {
            sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                "to_email, permission, commit_id, s.size, "
                "VirtualRepo.origin_repo, VirtualRepo.path FROM "
                "SharedRepo LEFT JOIN VirtualRepo ON "
                "SharedRepo.repo_id=VirtualRepo.repo_id "
                "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch "
                "WHERE from_email=? AND "
                "SharedRepo.repo_id = Branch.repo_id AND "
                "Branch.name = 'master'";
        } else if (g_strcmp0 (type, "to_email") == 0) {
            sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                "from_email, permission, commit_id, s.size, "
                "VirtualRepo.origin_repo, VirtualRepo.path FROM "
                "SharedRepo LEFT JOIN VirtualRepo on SharedRepo.repo_id = VirtualRepo.repo_id "
                "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch "
                "WHERE to_email=? AND "
                "SharedRepo.repo_id = Branch.repo_id AND "
                "Branch.name = 'master'";
        } else {
            /* should never reach here */
            seaf_warning ("[share mgr] Wrong column type");
            return NULL;
        }

        if (seaf_db_statement_foreach_row (mgr->seaf->db, sql,
                                           collect_repos, &ret,
                                           1, "string", email) < 0) {
            seaf_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;
        }
    }
    else {
        if (g_strcmp0 (type, "from_email") == 0) {
            sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                "to_email, permission, commit_id, s.size, "
                "VirtualRepo.origin_repo, VirtualRepo.path FROM "
                "SharedRepo LEFT JOIN VirtualRepo ON "
                "SharedRepo.repo_id=VirtualRepo.repo_id "
                "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch "
                "WHERE from_email=? "
                "AND SharedRepo.repo_id = Branch.repo_id "
                "AND Branch.name = 'master' "
                "ORDER BY SharedRepo.repo_id "
                "LIMIT ? OFFSET ?";
        } else if (g_strcmp0 (type, "to_email") == 0) {
            sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, "
                "from_email, permission, commit_id, s.size, "
                "VirtualRepo.origin_repo, VirtualRepo.path FROM "
                "SharedRepo LEFT JOIN VirtualRepo on SharedRepo.repo_id = VirtualRepo.repo_id "
                "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, "
                "Branch WHERE to_email=? "
                "AND SharedRepo.repo_id = Branch.repo_id "
                "AND Branch.name = 'master' "
                "ORDER BY SharedRepo.repo_id "
                "LIMIT ? OFFSET ?";
        } else {
            /* should never reach here */
            seaf_warning ("[share mgr] Wrong column type");
            return NULL;
        }

        if (seaf_db_statement_foreach_row (mgr->seaf->db, sql,
                                           collect_repos, &ret,
                                           3, "string", email,
                                           "int", limit, "int", start) < 0) {
            seaf_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;
        }
    }

    seaf_fill_repo_obj_from_commit (&ret);

    return g_list_reverse (ret);
}