static SeafRepo * load_repo (SeafRepoManager *manager, const char *repo_id) { SeafRepo *repo; SeafBranch *branch; SeafVirtRepo *vinfo = NULL; repo = seaf_repo_new(repo_id, NULL, NULL); if (!repo) { g_warning ("[repo mgr] failed to alloc repo.\n"); return NULL; } repo->manager = manager; branch = seaf_branch_manager_get_branch (seaf->branch_mgr, repo_id, "master"); if (!branch) { g_warning ("Failed to get master branch of repo %.8s.\n", repo_id); repo->is_corrupted = TRUE; } else { load_repo_commit (manager, repo, branch); seaf_branch_unref (branch); } if (repo->is_corrupted) { g_warning ("Repo %.8s is corrupted.\n", repo->id); seaf_repo_free (repo); return NULL; } vinfo = seaf_repo_manager_get_virtual_repo_info (manager, repo_id); if (vinfo) { repo->is_virtual = TRUE; memcpy (repo->store_id, vinfo->origin_repo_id, 36); } else { repo->is_virtual = FALSE; memcpy (repo->store_id, repo->id, 36); } seaf_virtual_repo_info_free (vinfo); #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; }
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; }
void seaf_repo_unref (SeafRepo *repo) { if (!repo) return; if (g_atomic_int_dec_and_test (&repo->ref_cnt)) seaf_repo_free (repo); }
static SeafRepo * load_repo (SeafRepoManager *manager, const char *repo_id, gboolean ret_corrupt) { SeafRepo *repo; SeafBranch *branch; SeafVirtRepo *vinfo = NULL; repo = seaf_repo_new(repo_id, NULL, NULL); if (!repo) { seaf_warning ("[repo mgr] failed to alloc repo.\n"); return NULL; } repo->manager = manager; branch = seaf_branch_manager_get_branch (seaf->branch_mgr, repo_id, "master"); if (!branch) { g_warning ("Failed to get master branch of repo %.8s.\n", repo_id); repo->is_corrupted = TRUE; } else { load_repo_commit (manager, repo, branch); seaf_branch_unref (branch); } if (repo->is_corrupted) { if (!ret_corrupt) { seaf_repo_free (repo); return NULL; } return repo; } vinfo = seaf_repo_manager_get_virtual_repo_info (manager, repo_id); if (vinfo) { repo->is_virtual = TRUE; memcpy (repo->store_id, vinfo->origin_repo_id, 36); } else { repo->is_virtual = FALSE; memcpy (repo->store_id, repo->id, 36); } seaf_virtual_repo_info_free (vinfo); return repo; }
static SeafRepo * load_repo (SeafRepoManager *manager, const char *repo_id) { SeafRepo *repo; SeafBranch *branch; repo = seaf_repo_new(repo_id, NULL, NULL); if (!repo) { seaf_warning ("[repo mgr] failed to alloc repo.\n"); return NULL; } repo->manager = manager; branch = seaf_branch_manager_get_branch (seaf->branch_mgr, repo_id, "master"); if (!branch) { seaf_warning ("Failed to get master branch of repo %.8s.\n", repo_id); repo->is_corrupted = TRUE; } else { load_repo_commit (manager, repo, branch); seaf_branch_unref (branch); } if (repo->is_corrupted) { seaf_warning ("Repo %.8s is corrupted.\n", repo->id); seaf_repo_free (repo); return NULL; } char *origin_repo_id = get_origin_repo_id (manager, repo->id); if (origin_repo_id) memcpy (repo->store_id, origin_repo_id, 36); else memcpy (repo->store_id, repo->id, 36); g_free (origin_repo_id); return repo; }