1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-09-06 09:50:20 +00:00

Support dm8 database

This commit is contained in:
杨赫然
2023-10-10 15:05:32 +08:00
parent 7bb8866889
commit e5e577b282
18 changed files with 1249 additions and 49 deletions

View File

@@ -380,7 +380,7 @@ seaf_repo_manager_add_repo (SeafRepoManager *manager,
static int
add_deleted_repo_record (SeafRepoManager *mgr, const char *repo_id)
{
if (seaf_db_type(seaf->db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(seaf->db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(seaf->db) == SEAF_DB_TYPE_DM) {
gboolean exists, err;
exists = seaf_db_statement_exists (seaf->db,
@@ -803,7 +803,7 @@ seaf_repo_manager_repo_exists (SeafRepoManager *manager, const gchar *id)
static int
save_branch_repo_map (SeafRepoManager *manager, SeafBranch *branch)
{
if (seaf_db_type(seaf->db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(seaf->db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(seaf->db) == SEAF_DB_TYPE_DM) {
gboolean exists, err;
int rc;
@@ -1240,6 +1240,160 @@ create_tables_sqlite (SeafRepoManager *mgr)
return 0;
}
static int
create_tables_dm (SeafRepoManager *mgr)
{
SeafDB *db = mgr->seaf->db;
char *sql;
sql = "CREATE TABLE IF NOT EXISTS Repo (repo_id VARCHAR(37) PRIMARY KEY)";
if (seaf_db_query (db, sql) < 0)
return -1;
/* Owner */
sql = "CREATE TABLE IF NOT EXISTS RepoOwner ("
"repo_id VARCHAR(37) PRIMARY KEY, "
"owner_id VARCHAR(255))";
if (seaf_db_query (db, sql) < 0)
return -1;
/* Group repo */
sql = "CREATE TABLE IF NOT EXISTS RepoGroup (repo_id VARCHAR(37), "
"group_id INTEGER, user_name VARCHAR(255), permission VARCHAR(15))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE UNIQUE INDEX IF NOT EXISTS groupid_repoid_indx on "
"RepoGroup (group_id, repo_id)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS repogroup_repoid_index on "
"RepoGroup (repo_id)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS repogroup_username_indx on "
"RepoGroup (user_name)";
if (seaf_db_query (db, sql) < 0)
return -1;
/* Public repo */
sql = "CREATE TABLE IF NOT EXISTS InnerPubRepo ("
"repo_id VARCHAR(37) PRIMARY KEY,"
"permission VARCHAR(15))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoUserToken ("
"repo_id VARCHAR(37), "
"email VARCHAR(255), "
"token VARCHAR(41))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE UNIQUE INDEX IF NOT EXISTS repo_token_indx on "
"RepoUserToken (repo_id, token)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS repo_token_email_indx on "
"RepoUserToken (email)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoTokenPeerInfo ("
"token VARCHAR(41) PRIMARY KEY, "
"peer_id VARCHAR(41), "
"peer_ip VARCHAR(50), "
"peer_name VARCHAR(255), "
"sync_time BIGINT, "
"client_ver VARCHAR(20))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoHead ("
"repo_id VARCHAR(37) PRIMARY KEY, branch_name VARCHAR(10))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoSize ("
"repo_id VARCHAR(37) PRIMARY KEY,"
"size BIGINT,"
"head_id VARCHAR(41))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoHistoryLimit ("
"repo_id VARCHAR(37) PRIMARY KEY, days INTEGER)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoValidSince ("
"repo_id VARCHAR(37) PRIMARY KEY, timestamp BIGINT)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS WebAP (repo_id VARCHAR(37) PRIMARY KEY, "
"access_property VARCHAR(10))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS VirtualRepo (repo_id VARCHAR(36) PRIMARY KEY,"
"origin_repo VARCHAR(36), path TEXT, base_commit VARCHAR(40))";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS virtualrepo_origin_repo_idx "
"ON VirtualRepo (origin_repo)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS GarbageRepos (repo_id VARCHAR(36) PRIMARY KEY)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoTrash (repo_id VARCHAR(36) PRIMARY KEY,"
"repo_name VARCHAR(255), head_id VARCHAR(40), owner_id VARCHAR(255), size BIGINT,"
"org_id INTEGER, del_time BIGINT)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS repotrash_owner_id_idx ON RepoTrash(owner_id)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS repotrash_org_id_idx ON RepoTrash(org_id)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoFileCount ("
"repo_id VARCHAR(36) PRIMARY KEY,"
"file_count BIGINT)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS RepoInfo (repo_id VARCHAR(36) PRIMARY KEY, "
"name VARCHAR(255) NOT NULL, update_time INTEGER, version INTEGER, "
"is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE TABLE IF NOT EXISTS WebUploadTempFiles (repo_id VARCHAR(40) NOT NULL, "
"file_path TEXT NOT NULL, tmp_file_path TEXT NOT NULL)";
if (seaf_db_query (db, sql) < 0)
return -1;
sql = "CREATE INDEX IF NOT EXISTS webuploadtempfiles_repo_id_idx ON WebUploadTempFiles(repo_id)";
if (seaf_db_query (db, sql) < 0)
return -1;
return 0;
}
/* static int */
/* create_tables_pgsql (SeafRepoManager *mgr) */
/* { */
@@ -1402,6 +1556,8 @@ create_db_tables_if_not_exist (SeafRepoManager *mgr)
return create_tables_mysql (mgr);
else if (db_type == SEAF_DB_TYPE_SQLITE)
return create_tables_sqlite (mgr);
else if (db_type == SEAF_DB_TYPE_DM)
return create_tables_dm (mgr);
/* else if (db_type == SEAF_DB_TYPE_PGSQL) */
/* return create_tables_pgsql (mgr); */
@@ -1745,7 +1901,7 @@ seaf_repo_manager_delete_repo_tokens_by_peer_id (SeafRepoManager *mgr,
g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_INTERNAL, "DB error");
goto out;
}
} else if (db_type == SEAF_DB_TYPE_SQLITE) {
} else if (db_type == SEAF_DB_TYPE_SQLITE || db_type == SEAF_DB_TYPE_DM) {
GString *sql = g_string_new ("");
GList *iter;
int i = 0;
@@ -1922,7 +2078,7 @@ seaf_repo_manager_set_repo_history_limit (SeafRepoManager *mgr,
return 0;
}
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(db) == SEAF_DB_TYPE_DM) {
gboolean exists, err;
int rc;
@@ -2004,7 +2160,7 @@ seaf_repo_manager_set_repo_valid_since (SeafRepoManager *mgr,
{
SeafDB *db = mgr->seaf->db;
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(db) == SEAF_DB_TYPE_DM) {
gboolean exists, err;
int rc;
@@ -2086,7 +2242,7 @@ seaf_repo_manager_set_repo_owner (SeafRepoManager *mgr,
if (g_strcmp0 (orig_owner, email) == 0)
goto out;
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(db) == SEAF_DB_TYPE_DM) {
gboolean err;
snprintf(sql, sizeof(sql),
"SELECT repo_id FROM RepoOwner WHERE repo_id=?");
@@ -2463,6 +2619,21 @@ seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name)
char *db_patt = g_strdup_printf ("%%%s%%", name);
switch (seaf_db_type(seaf->db)) {
case SEAF_DB_TYPE_DM:
g_free (db_patt);
db_patt = g_strdup(name);
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 "
"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 "
"LEFT JOIN Repo r ON i.repo_id = r.repo_id "
"LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id "
"WHERE REGEXP_LIKE(i.name, ?, 'i') AND "
"r.repo_id IS NOT NULL AND "
"v.repo_id IS NULL "
"ORDER BY i.update_time DESC, i.repo_id";
break;
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 "
@@ -2540,6 +2711,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con
if (start == -1 && limit == -1) {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_DM:
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 "
@@ -2586,6 +2758,7 @@ seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, con
0);
} else {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_DM:
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 "
@@ -3518,7 +3691,7 @@ seaf_repo_manager_set_inner_pub_repo (SeafRepoManager *mgr,
SeafDB *db = mgr->seaf->db;
char sql[256];
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL) {
if (seaf_db_type(db) == SEAF_DB_TYPE_PGSQL || seaf_db_type(db) == SEAF_DB_TYPE_DM) {
gboolean err;
snprintf(sql, sizeof(sql),
"SELECT repo_id FROM InnerPubRepo WHERE repo_id=?");