From 7367f1e9b147196570f07bc9f77c870c86dab606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E8=B5=AB=E7=84=B6?= Date: Tue, 18 Jun 2024 14:56:44 +0800 Subject: [PATCH 1/2] Add column type to RepoInfo --- lib/repo.vala | 1 + scripts/sql/mysql/seafile.sql | 4 ++- scripts/sql/sqlite/seafile.sql | 3 +- server/http-server.c | 25 ++++++++++++-- server/repo-mgr.c | 62 ++++++++++++++++++++++------------ server/repo-mgr.h | 1 + server/share-mgr.c | 18 ++++++---- 7 files changed, 81 insertions(+), 33 deletions(-) diff --git a/lib/repo.vala b/lib/repo.vala index 616da33e..e730ef29 100644 --- a/lib/repo.vala +++ b/lib/repo.vala @@ -41,6 +41,7 @@ public class Repo : Object { public string head_cmmt_id { get; set; } public string root { get; set; } public int status { get; set; } + public string repo_type { get; set; } // To be compatible with obsoleted SharedRepo object public string repo_id { get; set; } diff --git a/scripts/sql/mysql/seafile.sql b/scripts/sql/mysql/seafile.sql index ba545fbe..59fab22c 100644 --- a/scripts/sql/mysql/seafile.sql +++ b/scripts/sql/mysql/seafile.sql @@ -178,7 +178,9 @@ CREATE TABLE IF NOT EXISTS RepoInfo (id BIGINT NOT NULL PRIMARY KEY AUTO_INCREME is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, - UNIQUE INDEX(repo_id) + type VARCHAR(10), + UNIQUE INDEX(repo_id), + INDEX (type) ) ENGINE=INNODB; CREATE TABLE IF NOT EXISTS RepoOwner ( diff --git a/scripts/sql/sqlite/seafile.sql b/scripts/sql/sqlite/seafile.sql index 83bc1a10..7656ea67 100644 --- a/scripts/sql/sqlite/seafile.sql +++ b/scripts/sql/sqlite/seafile.sql @@ -42,7 +42,8 @@ CREATE TABLE IF NOT EXISTS FolderGroupPerm (repo_id CHAR(36) NOT NULL, path TEXT CREATE INDEX IF NOT EXISTS folder_group_perm_idx ON FolderGroupPerm(repo_id); CREATE TABLE IF NOT EXISTS FolderPermTimestamp (repo_id CHAR(36) PRIMARY KEY, timestamp INTEGER); CREATE TABLE IF NOT EXISTS WebUploadTempFiles (repo_id CHAR(40) NOT NULL, file_path TEXT NOT NULL, tmp_file_path TEXT NOT NULL); -CREATE TABLE IF NOT EXISTS RepoInfo (repo_id CHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL, update_time INTEGER, version INTEGER, is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0); +CREATE TABLE IF NOT EXISTS RepoInfo (repo_id CHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL, update_time INTEGER, version INTEGER, is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, type VARCHAR(10)); +CREATE INDEX IF NOT EXISTS RepoInfoTypeIndex on RepoInfo (type); CREATE TABLE IF NOT EXISTS RepoStorageId (repo_id CHAR(40) NOT NULL, storage_id VARCHAR(255) NOT NULL); CREATE TABLE IF NOT EXISTS UserQuota (user VARCHAR(255) PRIMARY KEY, quota BIGINT); CREATE TABLE IF NOT EXISTS UserShareQuota (user VARCHAR(255) PRIMARY KEY, quota BIGINT); diff --git a/server/http-server.c b/server/http-server.c index 77c137b6..a5eb38d5 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -2482,6 +2482,7 @@ fill_obj_from_seafilerepo (SeafileRepo *srepo, GHashTable *table) char *repo_name = NULL; char *permission = NULL; char *owner = NULL; + char *type = NULL; gint64 last_modify = 0; json_t *obj = NULL; @@ -2492,10 +2493,15 @@ fill_obj_from_seafilerepo (SeafileRepo *srepo, GHashTable *table) "last_modify", &last_modify, "permission", &permission, "user", &owner, + "repo_type", &type, NULL); if (!repo_id) goto out; + if (type) { + g_free (repo_id); + goto out; + } //the repo_id will be free when the table is destroyed. if (g_hash_table_lookup (table, repo_id)) { g_free (repo_id); @@ -2516,6 +2522,7 @@ fill_obj_from_seafilerepo (SeafileRepo *srepo, GHashTable *table) g_free (repo_name); g_free (permission); g_free (owner); + g_free (type); return obj; } @@ -2532,6 +2539,7 @@ filter_group_repos (GList *repos) char *permission = NULL; char *permission_prev = NULL; char *repo_id = NULL; + char *type = NULL; table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, @@ -2541,7 +2549,15 @@ filter_group_repos (GList *repos) srepo = iter->data; g_object_get (srepo, "id", &repo_id, "permission", &permission, + "repo_type", &type, NULL); + if (type) { + g_free (repo_id); + g_free (permission); + g_free (type); + g_object_unref (srepo); + continue; + } srepo_tmp = g_hash_table_lookup (table, repo_id); if (srepo_tmp) { g_object_get (srepo_tmp, "permission", &permission_prev, @@ -2557,10 +2573,11 @@ filter_group_repos (GList *repos) } else { g_hash_table_insert (table, g_strdup (repo_id), srepo); } + g_free (repo_id); + g_free (permission); + g_free (type); } - g_free (repo_id); - g_free (permission); return table; } @@ -2627,6 +2644,10 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) for (iter = repos; iter; iter = iter->next) { repo = iter->data; + if (repo->type) { + seaf_repo_unref (repo); + continue; + } if (!repo->is_corrupted) { if (!g_hash_table_lookup (obtained_repos, repo->id)) { diff --git a/server/repo-mgr.c b/server/repo-mgr.c index 08aa7b3d..606b7424 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -92,6 +92,7 @@ seaf_repo_free (SeafRepo *repo) g_free (repo->last_modifier); g_free (repo->pwd_hash_algo); g_free (repo->pwd_hash_params); + g_free (repo->type); g_free (repo); } @@ -680,6 +681,7 @@ create_repo_fill_size (SeafDBRow *row, void *data) const char *vrepo_id = seaf_db_row_get_column_text (row, 3); gint64 file_count = seaf_db_row_get_column_int64 (row, 7); int status = seaf_db_row_get_column_int(row, 8); + const char *type = seaf_db_row_get_column_text (row, 9); *repo = seaf_repo_new (repo_id, NULL, NULL); if (!*repo) @@ -712,6 +714,9 @@ create_repo_fill_size (SeafDBRow *row, void *data) } else { memcpy ((*repo)->store_id, repo_id, 36); } + if (type) { + (*repo)->type = g_strdup(type); + } return TRUE; } @@ -724,7 +729,7 @@ get_repo_from_db (SeafRepoManager *mgr, const char *id, gboolean *db_err) if (seaf_db_type(mgr->seaf->db) != SEAF_DB_TYPE_PGSQL) sql = "SELECT r.repo_id, s.size, b.commit_id, " - "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count, i.status FROM " + "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count, i.status, i.type FROM " "Repo r LEFT JOIN Branch b ON r.repo_id = b.repo_id " "LEFT JOIN RepoSize s ON r.repo_id = s.repo_id " "LEFT JOIN VirtualRepo v ON r.repo_id = v.repo_id " @@ -1083,7 +1088,8 @@ create_tables_mysql (SeafRepoManager *mgr) sql = "CREATE TABLE IF NOT EXISTS RepoInfo (id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, " "repo_id CHAR(36), " "name VARCHAR(255) NOT NULL, update_time BIGINT, version INTEGER, " - "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, UNIQUE INDEX(repo_id)) ENGINE=INNODB"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, type VARCHAR(10), " + "UNIQUE INDEX(repo_id), INDEX(type)) ENGINE=INNODB"; if (seaf_db_query (db, sql) < 0) return -1; @@ -2248,6 +2254,7 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) gboolean is_encrypted = seaf_db_row_get_column_int (row, 6) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 7); int status = seaf_db_row_get_column_int (row, 8); + const char *type = seaf_db_row_get_column_text (row, 9); repo = seaf_repo_new (repo_id, NULL, NULL); if (!repo) @@ -2259,8 +2266,8 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) } repo->size = size; - if (seaf_db_row_get_column_count (row) == 10) { - gint64 file_count = seaf_db_row_get_column_int64 (row, 9); + if (seaf_db_row_get_column_count (row) == 11) { + gint64 file_count = seaf_db_row_get_column_int64 (row, 10); repo->file_count = file_count; } head = seaf_branch_new ("master", repo_id, commit_id); @@ -2273,6 +2280,9 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) repo->last_modifier = g_strdup (last_modifier); repo->status = status; } + if (type) { + repo->type = g_strdup(type); + } out: *prepos = g_list_prepend (*prepos, repo); @@ -2297,7 +2307,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, if (start == -1 && limit == -1) { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT o.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -2325,7 +2335,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, } else { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT o.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -2412,7 +2422,7 @@ seaf_repo_manager_get_repos_by_id_prefix (SeafRepoManager *mgr, if (start == -1 && limit == -1) { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id " @@ -2437,7 +2447,7 @@ seaf_repo_manager_get_repos_by_id_prefix (SeafRepoManager *mgr, } else { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id " @@ -2482,7 +2492,7 @@ seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name) switch (seaf_db_type(seaf->db)) { case SEAF_DB_TYPE_MYSQL: sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, fc.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, fc.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount fc ON i.repo_id = fc.repo_id " @@ -2506,7 +2516,7 @@ seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name) break; case SEAF_DB_TYPE_SQLITE: sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, fc.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, fc.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount fc ON i.repo_id = fc.repo_id " @@ -2559,7 +2569,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con switch (seaf_db_type(mgr->seaf->db)) { case SEAF_DB_TYPE_MYSQL: g_string_append (sql, "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, f.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, f.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id " @@ -2577,7 +2587,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con break; case SEAF_DB_TYPE_SQLITE: g_string_append (sql, "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, f.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, f.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id " @@ -2605,7 +2615,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con switch (seaf_db_type(mgr->seaf->db)) { case SEAF_DB_TYPE_MYSQL: g_string_append (sql, "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, f.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, f.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id " @@ -2623,7 +2633,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con break; case SEAF_DB_TYPE_SQLITE: g_string_append (sql, "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier, i.status, f.file_count FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.type, f.file_count FROM " "RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id " "LEFT JOIN Branch b ON i.repo_id = b.repo_id " "LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id " @@ -3298,6 +3308,7 @@ get_group_repos_cb (SeafDBRow *row, void *data) gboolean is_encrypted = seaf_db_row_get_column_int (row, 12) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 13); int status = seaf_db_row_get_column_int (row, 14); + const char *type = seaf_db_row_get_column_text (row, 15); char *user_name_l = g_ascii_strdown (user_name, -1); @@ -3319,7 +3330,7 @@ get_group_repos_cb (SeafDBRow *row, void *data) if (vrepo_id) { const char *origin_repo_id = seaf_db_row_get_column_text (row, 7); const char *origin_path = seaf_db_row_get_column_text (row, 8); - const char *origin_repo_name = seaf_db_row_get_column_text (row, 15); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 16); g_object_set (srepo, "store_id", origin_repo_id, "origin_repo_id", origin_repo_id, "origin_repo_name", origin_repo_name, @@ -3336,6 +3347,9 @@ get_group_repos_cb (SeafDBRow *row, void *data) "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); } + if (type) { + g_object_set (srepo, "repo_type", type, NULL); + } *p_list = g_list_prepend (*p_list, srepo); } @@ -3411,7 +3425,7 @@ seaf_repo_manager_get_repos_by_group (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i2.name " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, i2.name " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " "LEFT JOIN RepoInfo i ON RepoGroup.repo_id = i.repo_id " @@ -3449,7 +3463,7 @@ seaf_repo_manager_get_group_repos_by_owner (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i2.name " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, i2.name " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " "LEFT JOIN RepoInfo i ON RepoGroup.repo_id = i.repo_id " @@ -3600,6 +3614,7 @@ collect_public_repos (SeafDBRow *row, void *data) gboolean is_encrypted = seaf_db_row_get_column_int (row, 11) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 12); int status = seaf_db_row_get_column_int (row, 13); + const char *type = seaf_db_row_get_column_text (row, 14); char *owner_l = g_ascii_strdown (owner, -1); @@ -3636,6 +3651,9 @@ collect_public_repos (SeafDBRow *row, void *data) "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); } + if (type) { + g_object_set (srepo, "repo_type", type, NULL); + } *ret = g_list_prepend (*ret, srepo); } @@ -3652,7 +3670,7 @@ seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr, gboolean *db_err) sql = "SELECT InnerPubRepo.repo_id, VirtualRepo.repo_id, " "owner_id, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -3696,7 +3714,7 @@ seaf_repo_manager_list_inner_pub_repos_by_owner (SeafRepoManager *mgr, sql = "SELECT InnerPubRepo.repo_id, VirtualRepo.repo_id, " "owner_id, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -4575,7 +4593,7 @@ seaf_get_group_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i2.name " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, i2.name " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " "LEFT JOIN RepoInfo i ON RepoGroup.repo_id = i.repo_id " @@ -4589,7 +4607,7 @@ seaf_get_group_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT OrgGroupRepo.repo_id, v.repo_id, " "group_id, owner, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i2.name " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, i2.name " "FROM OrgGroupRepo LEFT JOIN VirtualRepo v ON " "OrgGroupRepo.repo_id = v.repo_id " "LEFT JOIN RepoInfo i ON OrgRepoGroup.repo_id = i.repo_id " @@ -4648,7 +4666,7 @@ seaf_get_group_repos_by_user (SeafRepoManager *mgr, g_string_printf (sql, "SELECT g.repo_id, v.repo_id, " "group_id, %s, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i2.name " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, i2.name " "FROM %s g LEFT JOIN VirtualRepo v ON " "g.repo_id = v.repo_id " "LEFT JOIN RepoInfo i ON g.repo_id = i.repo_id " diff --git a/server/repo-mgr.h b/server/repo-mgr.h index ec0a2365..7237c47c 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -42,6 +42,7 @@ struct _SeafRepo { gint64 last_modify; gint64 size; gint64 file_count; + gchar *type; int status; diff --git a/server/share-mgr.c b/server/share-mgr.c index 370b9dad..b818e511 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -189,7 +189,8 @@ collect_repos (SeafDBRow *row, void *data) gboolean is_encrypted = seaf_db_row_get_column_int (row, 11) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 12); int status = seaf_db_row_get_column_int (row, 13); - const char *origin_repo_name = seaf_db_row_get_column_text (row, 14); + const char *type = seaf_db_row_get_column_text (row, 14); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 15); char *email_l = g_ascii_strdown (email, -1); @@ -226,6 +227,9 @@ collect_repos (SeafDBRow *row, void *data) "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); } + if (type) { + g_object_set (repo, "repo_type", type, NULL); + } *p_repos = g_list_prepend (*p_repos, repo); } @@ -303,7 +307,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "to_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -318,7 +322,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -353,7 +357,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "to_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -369,7 +373,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -813,7 +817,7 @@ seaf_get_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -827,7 +831,7 @@ seaf_get_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, i.type, " "i2.name FROM " "OrgSharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " From eaebe8426a5c14a96bc479f8b8d1201bb0d5a5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E8=B5=AB=E7=84=B6?= Date: Tue, 18 Jun 2024 15:31:11 +0800 Subject: [PATCH 2/2] Go fileserver check repo type --- fileserver/share/share.go | 41 ++++++++++++++++++++++++++------------- fileserver/sync_api.go | 12 ++++++++++++ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/fileserver/share/share.go b/fileserver/share/share.go index 8a77963b..56cefc78 100644 --- a/fileserver/share/share.go +++ b/fileserver/share/share.go @@ -412,6 +412,7 @@ type SharedRepo struct { Permission string `json:"permission"` Type string `json:"type"` Owner string `json:"owner"` + RepoType string `json:"-"` } // GetReposByOwner get repos by owner @@ -419,7 +420,7 @@ func GetReposByOwner(email string) ([]*SharedRepo, error) { var repos []*SharedRepo query := "SELECT o.repo_id, b.commit_id, i.name, " + - "i.version, i.update_time, i.last_modifier FROM " + + "i.version, i.update_time, i.last_modifier, i.type FROM " + "RepoOwner o LEFT JOIN Branch b ON o.repo_id = b.repo_id " + "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " + "LEFT JOIN VirtualRepo v ON o.repo_id = v.repo_id " + @@ -443,10 +444,10 @@ func GetReposByOwner(email string) ([]*SharedRepo, error) { for rows.Next() { repo := new(SharedRepo) - var repoName, lastModifier sql.NullString + var repoName, lastModifier, repoType sql.NullString if err := rows.Scan(&repo.ID, &repo.HeadCommitID, &repoName, &repo.Version, &repo.MTime, - &lastModifier); err == nil { + &lastModifier, &repoType); err == nil { if repo.HeadCommitID == "" { continue @@ -458,6 +459,9 @@ func GetReposByOwner(email string) ([]*SharedRepo, error) { continue } repo.Name = repoName.String + if repoType.Valid { + repo.RepoType = repoType.String + } repos = append(repos, repo) } } @@ -473,7 +477,7 @@ func GetReposByOwner(email string) ([]*SharedRepo, error) { func ListInnerPubRepos() ([]*SharedRepo, error) { query := "SELECT InnerPubRepo.repo_id, " + "owner_id, permission, commit_id, i.name, " + - "i.update_time, i.version " + + "i.update_time, i.version, i.type " + "FROM InnerPubRepo " + "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id, RepoOwner, Branch " + "WHERE InnerPubRepo.repo_id=RepoOwner.repo_id AND " + @@ -495,10 +499,10 @@ func ListInnerPubRepos() ([]*SharedRepo, error) { var repos []*SharedRepo for rows.Next() { repo := new(SharedRepo) - var repoName sql.NullString + var repoName, repoType sql.NullString if err := rows.Scan(&repo.ID, &repo.Owner, &repo.Permission, &repo.HeadCommitID, &repoName, - &repo.MTime, &repo.Version); err == nil { + &repo.MTime, &repo.Version, &repoType); err == nil { if !repoName.Valid { continue @@ -507,6 +511,9 @@ func ListInnerPubRepos() ([]*SharedRepo, error) { continue } repo.Name = repoName.String + if repoType.Valid { + repo.RepoType = repoType.String + } repos = append(repos, repo) } } @@ -525,7 +532,7 @@ func ListShareRepos(email, columnType string) ([]*SharedRepo, error) { if columnType == "from_email" { query = "SELECT sh.repo_id, to_email, " + "permission, commit_id, " + - "i.name, i.update_time, i.version FROM " + + "i.name, i.update_time, i.version, i.type FROM " + "SharedRepo sh LEFT JOIN RepoInfo i ON sh.repo_id = i.repo_id, Branch b " + "WHERE from_email=? AND " + "sh.repo_id = b.repo_id AND " + @@ -534,7 +541,7 @@ func ListShareRepos(email, columnType string) ([]*SharedRepo, error) { } else if columnType == "to_email" { query = "SELECT sh.repo_id, from_email, " + "permission, commit_id, " + - "i.name, i.update_time, i.version FROM " + + "i.name, i.update_time, i.version, i.type FROM " + "SharedRepo sh LEFT JOIN RepoInfo i ON sh.repo_id = i.repo_id, Branch b " + "WHERE to_email=? AND " + "sh.repo_id = b.repo_id AND " + @@ -561,10 +568,10 @@ func ListShareRepos(email, columnType string) ([]*SharedRepo, error) { for rows.Next() { repo := new(SharedRepo) - var repoName sql.NullString + var repoName, repoType sql.NullString if err := rows.Scan(&repo.ID, &repo.Owner, &repo.Permission, &repo.HeadCommitID, - &repoName, &repo.MTime, &repo.Version); err == nil { + &repoName, &repo.MTime, &repo.Version, &repoType); err == nil { if !repoName.Valid { continue @@ -573,6 +580,9 @@ func ListShareRepos(email, columnType string) ([]*SharedRepo, error) { continue } repo.Name = repoName.String + if repoType.Valid { + repo.RepoType = repoType.String + } repos = append(repos, repo) } @@ -599,7 +609,7 @@ func GetGroupReposByUser(user string, orgID int) ([]*SharedRepo, error) { if orgID < 0 { sqlBuilder.WriteString("SELECT g.repo_id, " + "user_name, permission, commit_id, " + - "i.name, i.update_time, i.version " + + "i.name, i.update_time, i.version, i.type " + "FROM RepoGroup g " + "LEFT JOIN RepoInfo i ON g.repo_id = i.repo_id, " + "Branch b WHERE g.repo_id = b.repo_id AND " + @@ -607,7 +617,7 @@ func GetGroupReposByUser(user string, orgID int) ([]*SharedRepo, error) { } else { sqlBuilder.WriteString("SELECT g.repo_id, " + "owner, permission, commit_id, " + - "i.name, i.update_time, i.version " + + "i.name, i.update_time, i.version, i.type " + "FROM OrgGroupRepo g " + "LEFT JOIN RepoInfo i ON g.repo_id = i.repo_id, " + "Branch b WHERE g.repo_id = b.repo_id AND " + @@ -631,10 +641,13 @@ func GetGroupReposByUser(user string, orgID int) ([]*SharedRepo, error) { var repos []*SharedRepo for rows.Next() { gRepo := new(SharedRepo) + var repoType sql.NullString if err := rows.Scan(&gRepo.ID, &gRepo.Owner, &gRepo.Permission, &gRepo.HeadCommitID, - &gRepo.Name, &gRepo.MTime, &gRepo.Version); err == nil { - + &gRepo.Name, &gRepo.MTime, &gRepo.Version, &repoType); err == nil { + if repoType.Valid { + gRepo.RepoType = repoType.String + } repos = append(repos, gRepo) } } diff --git a/fileserver/sync_api.go b/fileserver/sync_api.go index dd6c7883..209e20cc 100644 --- a/fileserver/sync_api.go +++ b/fileserver/sync_api.go @@ -352,6 +352,9 @@ func getAccessibleRepoListCB(rsp http.ResponseWriter, r *http.Request) *appError var repoObjects []*share.SharedRepo for _, repo := range repos { + if repo.RepoType != "" { + continue + } if _, ok := obtainedRepos[repo.ID]; !ok { obtainedRepos[repo.ID] = repo.ID } @@ -370,6 +373,9 @@ func getAccessibleRepoListCB(rsp http.ResponseWriter, r *http.Request) *appError if _, ok := obtainedRepos[sRepo.ID]; ok { continue } + if sRepo.RepoType != "" { + continue + } sRepo.Type = "srepo" sRepo.Owner = strings.ToLower(sRepo.Owner) repoObjects = append(repoObjects, sRepo) @@ -402,6 +408,9 @@ func getAccessibleRepoListCB(rsp http.ResponseWriter, r *http.Request) *appError if _, ok := obtainedRepos[sRepo.ID]; ok { continue } + if sRepo.RepoType != "" { + continue + } sRepo.Type = "grepo" sRepo.Owner = "Organization" @@ -428,6 +437,9 @@ func filterGroupRepos(repos []*share.SharedRepo) map[string]*share.SharedRepo { table := make(map[string]*share.SharedRepo) for _, repo := range repos { + if repo.RepoType != "" { + continue + } if repoPrev, ok := table[repo.ID]; ok { if repo.Permission == "rw" && repoPrev.Permission == "r" { table[repo.ID] = repo