Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add column type to RepoInfo #660

Merged
merged 2 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 27 additions & 14 deletions fileserver/share/share.go
Original file line number Diff line number Diff line change
Expand Up @@ -412,14 +412,15 @@ type SharedRepo struct {
Permission string `json:"permission"`
Type string `json:"type"`
Owner string `json:"owner"`
RepoType string `json:"-"`
}

// GetReposByOwner get repos by owner
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 " +
Expand All @@ -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
Expand All @@ -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)
}
}
Expand All @@ -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 " +
Expand All @@ -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
Expand All @@ -507,6 +511,9 @@ func ListInnerPubRepos() ([]*SharedRepo, error) {
continue
}
repo.Name = repoName.String
if repoType.Valid {
repo.RepoType = repoType.String
}
repos = append(repos, repo)
}
}
Expand All @@ -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 " +
Expand All @@ -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 " +
Expand All @@ -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
Expand All @@ -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)
}
Expand All @@ -599,15 +609,15 @@ 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 " +
"b.name = 'master' AND group_id IN (")
} 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 " +
Expand All @@ -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)
}
}
Expand Down
12 changes: 12 additions & 0 deletions fileserver/sync_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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)
Expand Down Expand Up @@ -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"
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/repo.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
4 changes: 3 additions & 1 deletion scripts/sql/mysql/seafile.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
3 changes: 2 additions & 1 deletion scripts/sql/sqlite/seafile.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
25 changes: 23 additions & 2 deletions server/http-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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;
}

Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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;
}

Expand Down Expand Up @@ -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)) {
Expand Down
Loading
Loading