1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-07-30 22:44:56 +00:00

Merge branch 'master' into cross_repo_copy

This commit is contained in:
cuihaikuo 2019-04-01 14:50:23 +08:00 committed by GitHub
commit cb3f31314a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 771 additions and 121 deletions

View File

@ -62,6 +62,18 @@ class ServerCtl(object):
shell(cmd)
if self.db == 'mysql':
self.add_ccnet_db_conf()
else:
self.add_ccnet_sqlite_db_conf()
def add_ccnet_sqlite_db_conf(self):
ccnet_conf = join(self.central_conf_dir, 'ccnet.conf')
ccnet_db_conf = '''\
[Database]
CREATE_TABLES = true
'''
with open(ccnet_conf, 'a+') as fp:
fp.write('\n')
fp.write(ccnet_db_conf)
def add_ccnet_db_conf(self):
ccnet_conf = join(self.central_conf_dir, 'ccnet.conf')
@ -74,6 +86,7 @@ USER = seafile
PASSWD = seafile
DB = ccnet
CONNECTION_CHARSET = utf8
CREATE_TABLES = true
'''
with open(ccnet_conf, 'a+') as fp:
fp.write('\n')
@ -93,6 +106,18 @@ CONNECTION_CHARSET = utf8
shell(cmd)
if self.db == 'mysql':
self.add_seafile_db_conf()
else:
self.add_seafile_sqlite_db_conf()
def add_seafile_sqlite_db_conf(self):
seafile_conf = join(self.central_conf_dir, 'seafile.conf')
seafile_db_conf = '''\
[database]
create_tables = true
'''
with open(seafile_conf, 'a+') as fp:
fp.write('\n')
fp.write(seafile_db_conf)
def add_seafile_db_conf(self):
seafile_conf = join(self.central_conf_dir, 'seafile.conf')
@ -105,6 +130,7 @@ user = seafile
password = seafile
db_name = seafile
connection_charset = utf8
create_tables = true
'''
with open(seafile_conf, 'a+') as fp:
fp.write('\n')

View File

@ -127,7 +127,7 @@ seaf_branch_manager_init (SeafBranchManager *mgr)
static int
open_db (SeafBranchManager *mgr)
{
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) == SEAF_DB_TYPE_MYSQL)
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) != SEAF_DB_TYPE_PGSQL)
return 0;
#ifndef SEAFILE_SERVER

View File

@ -61,7 +61,6 @@ mysql_db_start (SeafileSession *session)
char *host, *user, *passwd, *db, *unix_socket, *charset;
int port;
gboolean use_ssl = FALSE;
gboolean create_tables = TRUE;
int max_connections = 0;
GError *error = NULL;
@ -100,12 +99,6 @@ mysql_db_start (SeafileSession *session)
use_ssl = g_key_file_get_boolean (session->config,
"database", "use_ssl", NULL);
if (g_key_file_has_key (session->config, "database", "create_tables", NULL)) {
create_tables = g_key_file_get_boolean (session->config,
"database", "create_tables", NULL);
}
session->create_tables = create_tables;
charset = seaf_key_file_get_string (session->config,
"database", "connection_charset", NULL);
@ -201,6 +194,7 @@ load_database_config (SeafileSession *session)
char *type;
GError *error = NULL;
int ret = 0;
gboolean create_tables = FALSE;
type = seaf_key_file_get_string (session->config, "database", "type", &error);
/* Default to use sqlite if not set. */
@ -221,6 +215,12 @@ load_database_config (SeafileSession *session)
seaf_warning ("Unsupported db type %s.\n", type);
ret = -1;
}
if (ret == 0) {
if (g_key_file_has_key (session->config, "database", "create_tables", NULL))
create_tables = g_key_file_get_boolean (session->config,
"database", "create_tables", NULL);
session->create_tables = create_tables;
}
g_free (type);

View File

@ -84,6 +84,9 @@ static int readdir_root(SeafileSession *seaf,
users = g_hash_table_get_keys (user_hash);
for (p = users; p; p = p->next) {
email = p->data;
char *exclude = g_hash_table_lookup (seaf->excluded_users, email);
if (exclude)
continue;
filler (buf, email, NULL, 0);
}
g_list_free (users);

View File

@ -13,6 +13,9 @@
#include "log.h"
static int
read_excluded_users (SeafileSession *session);
SeafileSession *
seafile_session_new(const char *central_config_dir,
const char *seafile_dir,
@ -64,12 +67,19 @@ seafile_session_new(const char *central_config_dir,
session->tmp_file_dir = tmp_file_dir;
session->session = ccnet_session;
session->config = config;
session->excluded_users = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
if (load_database_config (session) < 0) {
seaf_warning ("Failed to load database config.\n");
goto onerror;
}
if (read_excluded_users (session) < 0) {
seaf_warning ("Failed to load excluded users.\n");
goto onerror;
}
session->fs_mgr = seaf_fs_manager_new (session, abs_seafile_dir);
if (!session->fs_mgr)
goto onerror;
@ -95,6 +105,34 @@ onerror:
return NULL;
}
static int
read_excluded_users (SeafileSession *session)
{
char *users;
int l, i;
char *hash_value;
users = seaf_key_file_get_string (session->config, "fuse", "excluded_users", NULL);
if (!users)
return 0;
char **parts = g_strsplit_set(users, " ,", 0);
l = g_strv_length(parts);
if (l > 0)
hash_value = g_new0(char, 1);
for (i = 0; i < l; i++) {
if (g_strcmp0(parts[i], "") == 0)
continue;
g_hash_table_insert (session->excluded_users, g_strdup(parts[i]), hash_value);
}
g_strfreev (parts);
g_free (users);
return 0;
}
int
seafile_session_init (SeafileSession *session)
{

View File

@ -35,6 +35,8 @@ struct _SeafileSession {
SeafCommitManager *commit_mgr;
SeafRepoManager *repo_mgr;
GHashTable *excluded_users;
gboolean create_tables;
};

View File

@ -628,6 +628,14 @@ def copy_scripts_and_libs():
except Exception, e:
error('failed to copy upgrade scripts: %s' % e)
# copy sql scripts
sql_scriptsdir = os.path.join(scripts_srcdir, 'sql')
dst_sql_scriptsdir = os.path.join(serverdir, 'sql')
try:
shutil.copytree(sql_scriptsdir, dst_sql_scriptsdir)
except Exception, e:
error('failed to copy sql scripts: %s' % e)
# copy runtime/seahub.conf
runtimedir = os.path.join(serverdir, 'runtime')
must_mkdir(runtimedir)

View File

@ -881,6 +881,41 @@ class CcnetConfigurator(AbstractConfigurator):
default=default,
validate=validate)
def do_syncdb(self):
print '----------------------------------------'
print 'Now creating ccnet database tables ...\n'
print '----------------------------------------'
try:
conn = MySQLdb.connect(host=db_config.mysql_host,
port=db_config.mysql_port,
user=db_config.seafile_mysql_user,
passwd=db_config.seafile_mysql_password,
db=db_config.ccnet_db_name)
except Exception, e:
if isinstance(e, MySQLdb.OperationalError):
Utils.error('Failed to connect to mysql database %s: %s' % (db_config.ccnet_db_name, e.args[1]))
else:
Utils.error('Failed to connect to mysql database %s: %s' % (db_config.ccnet_db_name, e))
cursor = conn.cursor()
sql_file = os.path.join(env_mgr.install_path, 'sql', 'mysql', 'ccnet.sql')
with open(sql_file, 'r') as fp:
content = fp.read()
sqls = [line.strip() for line in content.split(';') if line.strip()]
for sql in sqls:
try:
cursor.execute(sql)
except Exception, e:
if isinstance(e, MySQLdb.OperationalError):
Utils.error('Failed to init ccnet database: %s' % e.args[1])
else:
Utils.error('Failed to init ccnet database: %s' % e)
conn.commit()
class SeafileConfigurator(AbstractConfigurator):
def __init__(self):
@ -983,6 +1018,41 @@ class SeafileConfigurator(AbstractConfigurator):
with open(seafile_ini, 'w') as fp:
fp.write(self.seafile_dir)
def do_syncdb(self):
print '----------------------------------------'
print 'Now creating seafile database tables ...\n'
print '----------------------------------------'
try:
conn = MySQLdb.connect(host=db_config.mysql_host,
port=db_config.mysql_port,
user=db_config.seafile_mysql_user,
passwd=db_config.seafile_mysql_password,
db=db_config.seafile_db_name)
except Exception, e:
if isinstance(e, MySQLdb.OperationalError):
Utils.error('Failed to connect to mysql database %s: %s' % (db_config.seafile_db_name, e.args[1]))
else:
Utils.error('Failed to connect to mysql database %s: %s' % (db_config.seafile_db_name, e))
cursor = conn.cursor()
sql_file = os.path.join(env_mgr.install_path, 'sql', 'mysql', 'seafile.sql')
with open(sql_file, 'r') as fp:
content = fp.read()
sqls = [line.strip() for line in content.split(';') if line.strip()]
for sql in sqls:
try:
cursor.execute(sql)
except Exception, e:
if isinstance(e, MySQLdb.OperationalError):
Utils.error('Failed to init seafile database: %s' % e.args[1])
else:
Utils.error('Failed to init seafile database: %s' % e)
conn.commit()
class SeahubConfigurator(AbstractConfigurator):
def __init__(self):
AbstractConfigurator.__init__(self)
@ -1465,6 +1535,8 @@ def main():
gunicorn_config.generate()
seahub_config.generate()
ccnet_config.do_syncdb()
seafile_config.do_syncdb()
seahub_config.do_syncdb()
seahub_config.prepare_avatar_dir()
# db_config.create_seahub_admin()

View File

@ -663,12 +663,48 @@ function get_seahub_admin_passwd () {
# fi
# fi
echo "Creating seahub database now, it may take one minute, please wait... "
echo "Creating database now, it may take one minute, please wait... "
echo
cd ${TOPDIR}/ccnet && mkdir -m 0755 GroupMgr misc OrgMgr PeerMgr && cd -
ccnet_group_db=${TOPDIR}/ccnet/GroupMgr/groupmgr.db
ccnet_group_sql=${INSTALLPATH}/sql/sqlite/groupmgr.sql
if ! sqlite3 ${ccnet_group_db} ".read ${ccnet_group_sql}" 2>/dev/null 1>&2; then
echo "Failed to sync ccnet groupmgr database."
err_and_quit;
fi
ccnet_config_db=${TOPDIR}/ccnet/misc/config.db
ccnet_config_sql=${INSTALLPATH}/sql/sqlite/config.sql
if ! sqlite3 ${ccnet_config_db} ".read ${ccnet_config_sql}" 2>/dev/null 1>&2; then
echo "Failed to sync ccnet config database."
err_and_quit;
fi
ccnet_org_db=${TOPDIR}/ccnet/OrgMgr/orgmgr.db
ccnet_org_sql=${INSTALLPATH}/sql/sqlite/org.sql
if ! sqlite3 ${ccnet_org_db} ".read ${ccnet_org_sql}" 2>/dev/null 1>&2; then
echo "Failed to sync ccnet org database."
err_and_quit;
fi
ccnet_user_db=${TOPDIR}/ccnet/PeerMgr/usermgr.db
ccnet_user_sql=${INSTALLPATH}/sql/sqlite/user.sql
if ! sqlite3 ${ccnet_user_db} ".read ${ccnet_user_sql}" 2>/dev/null 1>&2; then
echo "Failed to sync ccnet user database."
err_and_quit;
fi
seafile_db=${TOPDIR}/seafile-data/seafile.db
seafile_sql=${INSTALLPATH}/sql/sqlite/seafile.sql
if ! sqlite3 ${seafile_db} ".read ${seafile_sql}" 2>/dev/null 1>&2; then
echo "Failed to sync seafile database."
err_and_quit;
fi
seahub_db=${TOPDIR}/seahub.db
seahub_sqls=${INSTALLPATH}/seahub/sql/sqlite3.sql
if ! sqlite3 ${seahub_db} ".read ${seahub_sqls}" 2>/dev/null 1>&2; then
echo "Failed to sync seahub database."
err_and_quit;

115
scripts/sql/mysql/ccnet.sql Normal file
View File

@ -0,0 +1,115 @@
CREATE TABLE `Group` (
`group_id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_name` varchar(255) DEFAULT NULL,
`creator_name` varchar(255) DEFAULT NULL,
`timestamp` bigint(20) DEFAULT NULL,
`type` varchar(32) DEFAULT NULL,
`parent_group_id` int(11) DEFAULT NULL,
PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `GroupUser` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` bigint(20) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
`is_staff` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `group_id` (`group_id`,`user_name`),
KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `GroupDNPair` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` int(11) DEFAULT NULL,
`dn` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `GroupStructure` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` int(11) DEFAULT NULL,
`path` varchar(1024) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `OrgGroup` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`org_id` int(11) DEFAULT NULL,
`group_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`group_id`),
KEY `group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Organization` (
`org_id` bigint(20) NOT NULL AUTO_INCREMENT,
`org_name` varchar(255) DEFAULT NULL,
`url_prefix` varchar(255) DEFAULT NULL,
`creator` varchar(255) DEFAULT NULL,
`ctime` bigint(20) DEFAULT NULL,
PRIMARY KEY (`org_id`),
UNIQUE KEY `url_prefix` (`url_prefix`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `OrgUser` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`org_id` int(11) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`is_staff` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`email`),
KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Binding` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`peer_id` char(41) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `peer_id` (`peer_id`),
KEY `email` (`email`(20))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `EmailUser` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`passwd` varchar(256) DEFAULT NULL,
`is_staff` tinyint(1) NOT NULL,
`is_active` tinyint(1) NOT NULL,
`ctime` bigint(20) DEFAULT NULL,
`reference_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `reference_id` (`reference_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `LDAPConfig` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`cfg_group` varchar(255) NOT NULL,
`cfg_key` varchar(255) NOT NULL,
`value` varchar(255) DEFAULT NULL,
`property` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `LDAPUsers` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`is_staff` tinyint(1) NOT NULL,
`is_active` tinyint(1) NOT NULL,
`extra_attrs` text,
`reference_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `reference_id` (`reference_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `UserRole` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`role` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -0,0 +1,228 @@
CREATE TABLE `Branch` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`repo_id` char(41) DEFAULT NULL,
`commit_id` char(41) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `GarbageRepos` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(36) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `InnerPubRepo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`permission` char(15) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `OrgQuota` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`org_id` int(11) DEFAULT NULL,
`quota` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `OrgUserQuota` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`org_id` int(11) DEFAULT NULL,
`user` varchar(255) DEFAULT NULL,
`quota` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Repo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoFileCount` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(36) DEFAULT NULL,
`file_count` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoGroup` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`group_id` int(11) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
`permission` char(15) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `group_id` (`group_id`,`repo_id`),
KEY `repo_id` (`repo_id`),
KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoHead` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`branch_name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoHistoryLimit` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`days` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoInfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(36) DEFAULT NULL,
`name` varchar(255) NOT NULL,
`update_time` bigint(20) DEFAULT NULL,
`version` int(11) DEFAULT NULL,
`is_encrypted` int(11) DEFAULT NULL,
`last_modifier` varchar(255) DEFAULT NULL,
`status` INTEGER DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoOwner` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`owner_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`),
KEY `owner_id` (`owner_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoSize` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`size` bigint(20) unsigned DEFAULT NULL,
`head_id` char(41) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoTokenPeerInfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`token` char(41) DEFAULT NULL,
`peer_id` char(41) DEFAULT NULL,
`peer_ip` varchar(41) DEFAULT NULL,
`peer_name` varchar(255) DEFAULT NULL,
`sync_time` bigint(20) DEFAULT NULL,
`client_ver` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `token` (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoTrash` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(36) DEFAULT NULL,
`repo_name` varchar(255) DEFAULT NULL,
`head_id` char(40) DEFAULT NULL,
`owner_id` varchar(255) DEFAULT NULL,
`size` bigint(20) DEFAULT NULL,
`org_id` int(11) DEFAULT NULL,
`del_time` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`),
KEY `owner_id` (`owner_id`),
KEY `org_id` (`org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoUserToken` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`token` char(41) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`,`token`),
KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `RepoValidSince` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`timestamp` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `SeafileConf` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`cfg_group` varchar(255) NOT NULL,
`cfg_key` varchar(255) NOT NULL,
`value` varchar(255) DEFAULT NULL,
`property` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `SharedRepo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`from_email` varchar(255) DEFAULT NULL,
`to_email` varchar(255) DEFAULT NULL,
`permission` char(15) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `repo_id` (`repo_id`),
KEY `from_email` (`from_email`),
KEY `to_email` (`to_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `SystemInfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`info_key` varchar(256) DEFAULT NULL,
`info_value` varchar(1024) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `UserQuota` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user` varchar(255) DEFAULT NULL,
`quota` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `UserShareQuota` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user` varchar(255) DEFAULT NULL,
`quota` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `VirtualRepo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(36) DEFAULT NULL,
`origin_repo` char(36) DEFAULT NULL,
`path` text,
`base_commit` char(40) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`),
KEY `origin_repo` (`origin_repo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `WebAP` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`repo_id` char(37) DEFAULT NULL,
`access_property` char(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `WebUploadTempFiles` (
`repo_id` char(40) NOT NULL,
`file_path` text NOT NULL,
`tmp_file_path` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -0,0 +1 @@
CREATE TABLE Config (key TEXT PRIMARY KEY, value TEXT);

View File

@ -0,0 +1,9 @@
CREATE TABLE `Group` (`group_id` INTEGER PRIMARY KEY AUTOINCREMENT, `group_name` VARCHAR(255), `creator_name` VARCHAR(255), `timestamp` BIGINT, `type` VARCHAR(32), `parent_group_id` INTEGER);
CREATE TABLE `GroupUser` (`group_id` INTEGER, `user_name` VARCHAR(255), `is_staff` tinyint);
CREATE UNIQUE INDEX groupid_username_indx on `GroupUser` (`group_id`, `user_name`);
CREATE INDEX username_indx on `GroupUser` (`user_name`);
CREATE TABLE GroupDNPair (group_id INTEGER, dn VARCHAR(255));
CREATE TABLE GroupStructure (group_id INTEGER PRIMARY KEY, path VARCHAR(1024));

View File

@ -0,0 +1,10 @@
CREATE TABLE OrgGroup (org_id INTEGER, group_id INTEGER);
CREATE INDEX groupid_indx on OrgGroup (group_id);
CREATE UNIQUE INDEX org_group_indx on OrgGroup (org_id, group_id);
CREATE TABLE Organization (org_id INTEGER PRIMARY KEY AUTOINCREMENT, org_name VARCHAR(255), url_prefix VARCHAR(255), creator VARCHAR(255), ctime BIGINT);
CREATE UNIQUE INDEX url_prefix_indx on Organization (url_prefix);
CREATE TABLE OrgUser (org_id INTEGER, email TEXT, is_staff bool NOT NULL);
CREATE INDEX email_indx on OrgUser (email);
CREATE UNIQUE INDEX orgid_email_indx on OrgUser (org_id, email);

View File

@ -0,0 +1,61 @@
CREATE TABLE Branch (name VARCHAR(10), repo_id CHAR(41), commit_id CHAR(41),PRIMARY KEY (repo_id, name));
CREATE TABLE Repo (repo_id CHAR(37) PRIMARY KEY);
CREATE TABLE RepoOwner (repo_id CHAR(37) PRIMARY KEY, owner_id TEXT);
CREATE INDEX OwnerIndex ON RepoOwner (owner_id);
CREATE TABLE RepoGroup (repo_id CHAR(37), group_id INTEGER, user_name TEXT, permission CHAR(15));
CREATE UNIQUE INDEX groupid_repoid_indx on RepoGroup (group_id, repo_id);
CREATE INDEX repogroup_repoid_index on RepoGroup (repo_id);
CREATE INDEX repogroup_username_indx on RepoGroup (user_name);
CREATE TABLE InnerPubRepo (repo_id CHAR(37) PRIMARY KEY,permission CHAR(15));
CREATE TABLE RepoUserToken (repo_id CHAR(37), email VARCHAR(255), token CHAR(41));
CREATE UNIQUE INDEX repo_token_indx on RepoUserToken (repo_id, token);
CREATE INDEX repo_token_email_indx on RepoUserToken (email);
CREATE TABLE RepoTokenPeerInfo (token CHAR(41) PRIMARY KEY, peer_id CHAR(41), peer_ip VARCHAR(41), peer_name VARCHAR(255), sync_time BIGINT, client_ver VARCHAR(20));
CREATE TABLE RepoHead (repo_id CHAR(37) PRIMARY KEY, branch_name VARCHAR(10));
CREATE TABLE RepoSize (repo_id CHAR(37) PRIMARY KEY,size BIGINT UNSIGNED,head_id CHAR(41));
CREATE TABLE RepoHistoryLimit (repo_id CHAR(37) PRIMARY KEY, days INTEGER);
CREATE TABLE RepoValidSince (repo_id CHAR(37) PRIMARY KEY, timestamp BIGINT);
CREATE TABLE WebAP (repo_id CHAR(37) PRIMARY KEY, access_property CHAR(10));
CREATE TABLE VirtualRepo (repo_id CHAR(36) PRIMARY KEY,origin_repo CHAR(36), path TEXT, base_commit CHAR(40));
CREATE INDEX virtualrepo_origin_repo_idx ON VirtualRepo (origin_repo);
CREATE TABLE GarbageRepos (repo_id CHAR(36) PRIMARY KEY);
CREATE TABLE RepoTrash (repo_id CHAR(36) PRIMARY KEY,repo_name VARCHAR(255), head_id CHAR(40), owner_id VARCHAR(255), size BIGINT UNSIGNED,org_id INTEGER, del_time BIGINT);
CREATE INDEX repotrash_owner_id_idx ON RepoTrash(owner_id);
CREATE INDEX repotrash_org_id_idx ON RepoTrash(org_id);
CREATE TABLE RepoFileCount (repo_id CHAR(36) PRIMARY KEY,file_count BIGINT UNSIGNED);
CREATE TABLE 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 UserQuota (user VARCHAR(255) PRIMARY KEY,quota BIGINT);
CREATE TABLE UserShareQuota (user VARCHAR(255) PRIMARY KEY,quota BIGINT);
CREATE TABLE OrgQuota (org_id INTEGER PRIMARY KEY,quota BIGINT);
CREATE TABLE OrgUserQuota (org_id INTEGER,user VARCHAR(255), quota BIGINT, PRIMARY KEY (org_id, user));
CREATE TABLE SeafileConf (cfg_group VARCHAR(255) NOT NULL,cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER);
CREATE TABLE SharedRepo (repo_id CHAR(37) , from_email VARCHAR(255), to_email VARCHAR(255), permission CHAR(15));
CREATE INDEX RepoIdIndex on SharedRepo (repo_id);
CREATE INDEX FromEmailIndex on SharedRepo (from_email);
CREATE INDEX ToEmailIndex on SharedRepo (to_email);
CREATE TABLE SystemInfo( info_key VARCHAR(256), info_value VARCHAR(1024));
CREATE TABLE WebUploadTempFiles (repo_id CHAR(40) NOT NULL, file_path TEXT NOT NULL, tmp_file_path TEXT NOT NULL);

View File

@ -0,0 +1,16 @@
CREATE TABLE Binding (email TEXT, peer_id TEXT);
CREATE UNIQUE INDEX peer_index on Binding (peer_id);
CREATE TABLE EmailUser (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,email TEXT, passwd TEXT, is_staff bool NOT NULL, is_active bool NOT NULL, ctime INTEGER, reference_id TEXT);
CREATE UNIQUE INDEX email_index on EmailUser (email);
CREATE UNIQUE INDEX reference_id_index on EmailUser (reference_id);
CREATE TABLE LDAPConfig (cfg_group VARCHAR(255) NOT NULL,cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER);
CREATE TABLE LDAPUsers (id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL, password TEXT NOT NULL, is_staff BOOL NOT NULL, is_active BOOL NOT NULL, extra_attrs TEXT, reference_id TEXT);
CREATE UNIQUE INDEX ldapusers_email_index on LDAPUsers(email);
CREATE UNIQUE INDEX ldapusers_reference_id_index on LDAPUsers(reference_id);
CREATE TABLE UserRole (email TEXT, role TEXT);
CREATE INDEX userrole_email_index on UserRole (email);
CREATE UNIQUE INDEX userrole_userrole_index on UserRole (email, role);

View File

@ -1111,7 +1111,6 @@ put_update_branch_cb (evhtp_request_t *req, void *arg)
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (seaf->repo_mgr, repo_id);
seaf_repo_manager_merge_virtual_repo (seaf->repo_mgr, repo_id, NULL);
schedule_repo_size_computation (seaf->size_sched, repo_id);

View File

@ -204,7 +204,6 @@ update_repo (void *vprocessor)
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (seaf->repo_mgr, repo_id);
seaf_repo_manager_merge_virtual_repo (seaf->repo_mgr, repo_id, NULL);
out:

View File

@ -337,7 +337,6 @@ update_repo (void *vprocessor)
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (seaf->repo_mgr, repo_id);
seaf_repo_manager_merge_virtual_repo (seaf->repo_mgr, repo_id, NULL);
out:

View File

@ -79,7 +79,7 @@ int
seaf_quota_manager_init (SeafQuotaManager *mgr)
{
if (!mgr->session->create_tables && seaf_db_type (mgr->session->db) == SEAF_DB_TYPE_MYSQL)
if (!mgr->session->create_tables && seaf_db_type (mgr->session->db) != SEAF_DB_TYPE_PGSQL)
return 0;
SeafDB *db = mgr->session->db;

View File

@ -1369,7 +1369,7 @@ create_tables_pgsql (SeafRepoManager *mgr)
static int
create_db_tables_if_not_exist (SeafRepoManager *mgr)
{
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) == SEAF_DB_TYPE_MYSQL)
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) != SEAF_DB_TYPE_PGSQL)
return 0;
SeafDB *db = mgr->seaf->db;

View File

@ -1495,7 +1495,8 @@ static char *
del_file_recursive(SeafRepo *repo,
const char *dir_id,
const char *to_path,
const char *filename)
const char *filename,
int *mode, int *deleted_num, char **desc_file)
{
SeafDir *olddir, *newdir;
SeafDirent *dent;
@ -1528,6 +1529,12 @@ del_file_recursive(SeafRepo *repo,
for (i = 0; i < file_num; i++) {
if (strcmp(old->name, file_names[i]) == 0) {
found_flag = 1;
if (deleted_num)
(*deleted_num)++;
if (mode)
*mode = old->mode;
if (desc_file && *desc_file==NULL)
*desc_file = g_strdup(old->name);
break;
}
}
@ -1543,6 +1550,13 @@ del_file_recursive(SeafRepo *repo,
if (strcmp(old->name, filename) != 0) {
new = seaf_dirent_dup (old);
newentries = g_list_prepend (newentries, new);
} else {
if (deleted_num)
(*deleted_num)++;
if (mode)
*mode = old->mode;
if (desc_file && *desc_file==NULL)
*desc_file = g_strdup(old->name);
}
}
}
@ -1572,7 +1586,8 @@ del_file_recursive(SeafRepo *repo,
if (strcmp(dent->name, to_path_dup) != 0)
continue;
id = del_file_recursive(repo, dent->id, remain, filename);
id = del_file_recursive(repo, dent->id, remain, filename,
mode, deleted_num, desc_file);
if (id != NULL) {
memcpy(dent->id, id, 40);
dent->id[40] = '\0';
@ -1604,13 +1619,15 @@ static char *
do_del_file(SeafRepo *repo,
const char *root_id,
const char *parent_dir,
const char *file_name)
const char *file_name,
int *mode, int *deleted_num, char **desc_file)
{
/* if parent_dir is a absolutely path, we will remove the first '/' */
if (*parent_dir == '/')
parent_dir = parent_dir + 1;
return del_file_recursive(repo, root_id, parent_dir, file_name);
return del_file_recursive(repo, root_id, parent_dir, file_name,
mode, deleted_num, desc_file);
}
int
@ -1623,15 +1640,14 @@ seaf_repo_manager_del_file (SeafRepoManager *mgr,
{
SeafRepo *repo = NULL;
SeafCommit *head_commit = NULL;
SeafDir *dir = NULL;
char *canon_path = NULL;
char **file_names;
char buf[SEAF_PATH_MAX];
char *root_id = NULL;
char *desc_file;
int i = 0;
char *desc_file = NULL;
int mode = 0;
int ret = 0;
int file_num = 0, empty_num = 0;
int deleted_num = 0;
GET_REPO_OR_FAIL(repo, repo_id);
GET_COMMIT_OR_FAIL(head_commit, repo->id, repo->version, repo->head->commit_id);
@ -1639,39 +1655,19 @@ seaf_repo_manager_del_file (SeafRepoManager *mgr,
if (!canon_path)
canon_path = get_canonical_path (parent_dir);
if (strchr(file_name, '\t')) {
file_names = g_strsplit (file_name, "\t", -1);
file_num = g_strv_length (file_names);
for (i = 0; i < file_num; i++) {
if (strcmp(file_names[i], "") == 0) {
empty_num++;
continue;
}
if (!check_file_exists(repo->store_id, repo->version,
head_commit->root_id, canon_path, file_names[i], &mode)) {
char *tmp_path;
if (strcmp(canon_path, "") == 0)
tmp_path = "/";
else
tmp_path = canon_path;
seaf_warning ("[del file] File \'%s\' dosen't exist in %s in repo %s.\n",
file_names[i], tmp_path, repo->id);
empty_num++;
continue;
}
desc_file = file_names[i];
}
file_num -= empty_num;
if (file_num <= 0)
goto out;
} else if (!check_file_exists(repo->store_id, repo->version,
head_commit->root_id, canon_path, file_name, &mode)) {
dir = seaf_fs_manager_get_seafdir_by_path (seaf->fs_mgr,
repo->store_id, repo->version,
head_commit->root_id, canon_path, NULL);
if (!dir) {
seaf_warning ("parent_dir %s doesn't exist in repo %s.\n",
canon_path, repo->store_id);
ret = -1;
goto out;
}
root_id = do_del_file (repo,
head_commit->root_id, canon_path, file_name);
head_commit->root_id, canon_path, file_name, &mode,
&deleted_num, &desc_file);
if (!root_id) {
seaf_warning ("[del file] Failed to del file from %s in repo %s.\n",
canon_path, repo->id);
@ -1680,15 +1676,23 @@ seaf_repo_manager_del_file (SeafRepoManager *mgr,
ret = -1;
goto out;
}
if (deleted_num == 0) {
seaf_warning ("[del file] Nothing to be deleted in dir %s in repo %.8s.\n ",
parent_dir, repo->id);
g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL,
"File doesn't exist");
ret = -1;
goto out;
}
/* Commit. */
if (file_num > 1) {
if (deleted_num > 1) {
snprintf(buf, SEAF_PATH_MAX, "Deleted \"%s\" and %d more files",
desc_file, file_num - 1);
desc_file, deleted_num - 1);
} else if (S_ISDIR(mode)) {
snprintf(buf, SEAF_PATH_MAX, "Removed directory \"%s\"", file_name);
snprintf(buf, SEAF_PATH_MAX, "Removed directory \"%s\"", desc_file);
} else {
snprintf(buf, SEAF_PATH_MAX, "Deleted \"%s\"", file_name);
snprintf(buf, SEAF_PATH_MAX, "Deleted \"%s\"", desc_file);
}
if (gen_new_commit (repo_id, head_commit, root_id,
@ -1697,8 +1701,6 @@ seaf_repo_manager_del_file (SeafRepoManager *mgr,
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (mgr, repo_id);
seaf_repo_manager_merge_virtual_repo (mgr, repo_id, NULL);
out:
@ -1706,10 +1708,11 @@ out:
seaf_repo_unref (repo);
if (head_commit)
seaf_commit_unref(head_commit);
if (file_num)
g_strfreev (file_names);
if (dir)
seaf_dir_free (dir);
g_free (root_id);
g_free (canon_path);
g_free (desc_file);
if (ret == 0) {
update_repo_size (repo_id);
@ -2662,7 +2665,8 @@ move_file_same_repo (const char *repo_id,
ret = -1;
goto out;
}
root_id = do_del_file (repo, root_id_after_put, src_path, filenames_str->str);
root_id = do_del_file (repo, root_id_after_put, src_path, filenames_str->str,
NULL, NULL, NULL);
if (!root_id) {
g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "move file failed");
@ -2976,7 +2980,6 @@ seaf_repo_manager_move_file (SeafRepoManager *mgr,
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (mgr, src_repo_id);
seaf_repo_manager_merge_virtual_repo (mgr, src_repo_id, NULL);
update_repo_size (dst_repo_id);
@ -3222,7 +3225,6 @@ seaf_repo_manager_move_multiple_files (SeafRepoManager *mgr,
goto out;
}
}
seaf_repo_manager_cleanup_virtual_repos (mgr, src_repo_id);
seaf_repo_manager_merge_virtual_repo (mgr, src_repo_id, NULL);
update_repo_size (dst_repo_id);
@ -3786,7 +3788,6 @@ seaf_repo_manager_rename_file (SeafRepoManager *mgr,
goto out;
}
seaf_repo_manager_cleanup_virtual_repos (mgr, repo_id);
seaf_repo_manager_merge_virtual_repo (mgr, repo_id, NULL);
out:

View File

@ -207,7 +207,7 @@ seafile_session_init (SeafileSession *session)
return -1;
}
if ((session->create_tables || seaf_db_type(session->db) != SEAF_DB_TYPE_MYSQL)
if ((session->create_tables || seaf_db_type(session->db) == SEAF_DB_TYPE_PGSQL)
&& seaf_cfg_manager_init (session->cfg_mgr) < 0) {
seaf_warning ("Failed to init config manager.\n");
return -1;
@ -444,7 +444,7 @@ schedule_create_system_default_repo (SeafileSession *session)
sql = "CREATE TABLE IF NOT EXISTS SystemInfo( "
"info_key VARCHAR(256), info_value VARCHAR(1024))";
if ((session->create_tables || db_type != SEAF_DB_TYPE_MYSQL)
if ((session->create_tables || db_type == SEAF_DB_TYPE_PGSQL)
&& seaf_db_query (session->db, sql) < 0)
return;

View File

@ -26,7 +26,7 @@ seaf_share_manager_new (SeafileSession *seaf)
int
seaf_share_manager_start (SeafShareManager *mgr)
{
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) == SEAF_DB_TYPE_MYSQL)
if (!mgr->seaf->create_tables && seaf_db_type (mgr->seaf->db) != SEAF_DB_TYPE_PGSQL)
return 0;
SeafDB *db = mgr->seaf->db;

View File

@ -607,7 +607,8 @@ seaf_repo_manager_merge_virtual_repo (SeafRepoManager *mgr,
*/
static void
handle_missing_virtual_repo (SeafRepoManager *mgr,
SeafRepo *repo, SeafCommit *head, SeafVirtRepo *vinfo)
SeafRepo *repo, SeafCommit *head, SeafVirtRepo *vinfo,
char **return_new_path)
{
SeafCommit *parent = NULL;
char *old_dir_id = NULL;
@ -655,9 +656,7 @@ handle_missing_virtual_repo (SeafRepoManager *mgr,
}
char de_id[41];
char *new_path;
char *new_name;
char **parts = NULL;
char *new_path, *new_name;
for (ptr = diff_res; ptr; ptr = ptr->next) {
de = ptr->data;
@ -672,17 +671,23 @@ handle_missing_virtual_repo (SeafRepoManager *mgr,
vinfo->repo_id, new_path);
set_virtual_repo_base_commit_path (vinfo->repo_id,
head->commit_id, new_path);
parts = g_strsplit(new_path, "/", 0);
new_name = parts[g_strv_length(parts) - 1];
seaf_repo_manager_edit_repo (vinfo->repo_id,
new_name,
"Changed library name",
NULL,
&error);
if (error) {
seaf_warning ("Failed to rename repo %s", de->new_name);
g_clear_error (&error);
if (return_new_path)
*return_new_path = g_strdup(new_path);
/* 'sub_path = NUll' means the virtual dir itself has been renamed,
* we need to make a new commit for the virtual repo
*/
if (sub_path == NULL) {
new_name = g_path_get_basename(new_path);
seaf_repo_manager_edit_repo (vinfo->repo_id,
new_name,
"Changed library name",
NULL,
&error);
if (error) {
seaf_warning ("Failed to rename repo %s", new_name);
g_clear_error (&error);
}
g_free(new_name);
}
is_renamed = TRUE;
g_free (new_path);
@ -691,7 +696,6 @@ handle_missing_virtual_repo (SeafRepoManager *mgr,
}
}
g_free (old_dir_id);
g_strfreev (parts);
if (is_renamed)
break;
@ -762,7 +766,7 @@ seaf_repo_manager_cleanup_virtual_repos (SeafRepoManager *mgr,
&error);
if (error) {
if (error->code == SEAF_ERR_PATH_NO_EXIST) {
handle_missing_virtual_repo (mgr, repo, head, vinfo);
handle_missing_virtual_repo (mgr, repo, head, vinfo, NULL);
}
g_clear_error (&error);
} else
@ -826,6 +830,31 @@ static void *merge_virtual_repo (void *vtask)
goto out;
}
orig_root = seaf_fs_manager_get_seafdir_id_by_path (seaf->fs_mgr,
orig_repo->store_id,
orig_repo->version,
orig_head->root_id,
vinfo->path,
NULL);
if (!orig_root) {
seaf_debug("Path %s not found in origin repo %.8s, delete or rename virtual repo %.8s\n",
vinfo->path, vinfo->origin_repo_id, repo_id);
char *new_path = NULL;
handle_missing_virtual_repo (mgr, orig_repo, orig_head, vinfo, &new_path);
if (new_path != NULL) {
orig_root = seaf_fs_manager_get_seafdir_id_by_path (seaf->fs_mgr,
orig_repo->store_id,
orig_repo->version,
orig_head->root_id,
new_path,
NULL);
g_free (new_path);
}
if (!orig_root)
goto out;
}
base = seaf_commit_manager_get_commit (seaf->commit_mgr,
orig_repo->id, orig_repo->version,
vinfo->base_commit);
@ -852,19 +881,6 @@ static void *merge_virtual_repo (void *vtask)
goto out;
}
orig_root = seaf_fs_manager_get_seafdir_id_by_path (seaf->fs_mgr,
orig_repo->store_id,
orig_repo->version,
orig_head->root_id,
vinfo->path,
NULL);
if (!orig_root) {
seaf_warning ("Cannot find seafdir for repo %.10s path %s.\n",
vinfo->origin_repo_id, vinfo->path);
ret = -1;
goto out;
}
if (strcmp (root, orig_root) == 0) {
/* Nothing to merge. */
seaf_debug ("Nothing to merge.\n");

View File

@ -266,15 +266,14 @@ parse_download_multi_data (DownloadObj *obj, const char *data)
SeafRepo *repo = obj->repo;
const char *tmp_parent_dir;
char *parent_dir;
gboolean is_root_dir;
json_t *name_array;
json_error_t jerror;
int i;
int len;
const char *file_name;
char *file_path;
SeafDirent *dirent;
GList *dirent_list = NULL;
SeafDir *dir;
GList *dirent_list = NULL, *p = NULL;
GError *error = NULL;
jobj = json_loadb (data, strlen(data), 0, &jerror);
@ -304,7 +303,27 @@ parse_download_multi_data (DownloadObj *obj, const char *data)
return -1;
}
parent_dir = format_dir_path (tmp_parent_dir);
is_root_dir = strcmp (parent_dir, "/") == 0;
dir = seaf_fs_manager_get_seafdir_by_path (seaf->fs_mgr, repo->store_id,
repo->version, repo->root_id, parent_dir, &error);
if (!dir) {
if (error) {
seaf_warning ("Failed to get dir %s repo %.8s: %s.\n",
parent_dir, repo->store_id, error->message);
g_clear_error(&error);
} else {
seaf_warning ("dir %s doesn't exist in repo %.8s.\n",
parent_dir, repo->store_id);
}
g_free (parent_dir);
json_decref (jobj);
return -1;
}
GHashTable *dirent_hash = g_hash_table_new(g_str_hash, g_str_equal);
for (p = dir->entries; p; p = p->next) {
SeafDirent *d = p->data;
g_hash_table_insert(dirent_hash, d->name, d);
}
for (i = 0; i < len; i++) {
file_name = json_string_value (json_array_get (name_array, i));
@ -317,25 +336,10 @@ parse_download_multi_data (DownloadObj *obj, const char *data)
break;
}
if (is_root_dir) {
file_path = g_strconcat (parent_dir, file_name, NULL);
} else {
file_path = g_strconcat (parent_dir, "/", file_name, NULL);
}
dirent = seaf_fs_manager_get_dirent_by_path (seaf->fs_mgr, repo->store_id,
repo->version, repo->root_id,
file_path, &error);
dirent = g_hash_table_lookup (dirent_hash, file_name);
if (!dirent) {
if (error) {
seaf_warning ("Failed to get dirent for %s: %s.\n",
file_path, error->message);
g_clear_error (&error);
} else {
seaf_warning ("Failed to get dirent for %s.\n",
file_path);
}
g_free (file_path);
seaf_warning ("Failed to get dirent for %s in dir %s in repo %.8s.\n",
file_name, parent_dir, repo->store_id);
if (dirent_list) {
g_list_free_full (dirent_list, (GDestroyNotify)seaf_dirent_free);
dirent_list = NULL;
@ -343,12 +347,13 @@ parse_download_multi_data (DownloadObj *obj, const char *data)
break;
}
g_free (file_path);
dirent_list = g_list_prepend (dirent_list, dirent);
dirent_list = g_list_prepend (dirent_list, seaf_dirent_dup(dirent));
}
g_hash_table_unref(dirent_hash);
g_free (parent_dir);
json_decref (jobj);
seaf_dir_free (dir);
if (!dirent_list) {
return -1;

View File

@ -16,3 +16,4 @@ PORT = 9999
#USER = seafile
#PASSWD = root
#DB = ccnet-db
#CREATE_TABLES=true

View File

@ -1,4 +1,5 @@
import pytest
import time
from seaserv import seafile_api as api
from seaserv import ccnet_api
@ -114,6 +115,8 @@ def test_share_dir_to_user(repo, permission):
assert api.del_file(repo.id, '/', 'dir1', USER) == 0
assert api.unshare_subdir_for_user(repo.id, '/dir2', USER, USER2) == 0
time.sleep(1)
assert api.get_shared_repo_by_path(repo.id, '/dir1', USER2) is None
assert api.get_shared_repo_by_path(repo.id, '/dir2', USER2) is None
@ -135,6 +138,8 @@ def test_share_dir_to_group(repo, group, permission):
assert api.del_file(repo.id, '/', 'dir1', USER) == 0
assert api.unshare_subdir_for_group(repo.id, '/dir2', USER, group.id) == 0
time.sleep(1)
assert api.check_permission(v_repo_id_1, USER2) is None
assert api.check_permission(v_repo_id_2, USER2) is None