SeafileSession * seafile_session_new(const char *seafile_dir, CcnetClient *ccnet_session) { char *abs_seafile_dir; char *tmp_file_dir; char *config_file_path; GKeyFile *config; SeafileSession *session = NULL; if (!ccnet_session) return NULL; abs_seafile_dir = ccnet_expand_path (seafile_dir); tmp_file_dir = g_build_filename (abs_seafile_dir, "tmpfiles", NULL); config_file_path = g_build_filename (abs_seafile_dir, "seafile.conf", NULL); if (checkdir_with_mkdir (abs_seafile_dir) < 0) { g_warning ("Config dir %s does not exist and is unable to create\n", abs_seafile_dir); goto onerror; } if (checkdir_with_mkdir (tmp_file_dir) < 0) { g_warning ("Temp file dir %s does not exist and is unable to create\n", tmp_file_dir); goto onerror; } GError *error = NULL; config = g_key_file_new (); if (!g_key_file_load_from_file (config, config_file_path, G_KEY_FILE_NONE, &error)) { g_warning ("Failed to load config file.\n"); g_key_file_free (config); goto onerror; } session = g_new0(SeafileSession, 1); session->seaf_dir = abs_seafile_dir; session->tmp_file_dir = tmp_file_dir; session->session = ccnet_session; session->config = config; if (load_database_config (session) < 0) { g_warning ("Failed to load database config.\n"); goto onerror; } if (load_thread_pool_config (session) < 0) { g_warning ("Failed to load thread pool config.\n"); goto onerror; } session->fs_mgr = seaf_fs_manager_new (session, abs_seafile_dir); if (!session->fs_mgr) goto onerror; session->block_mgr = seaf_block_manager_new (session, abs_seafile_dir); if (!session->block_mgr) goto onerror; session->commit_mgr = seaf_commit_manager_new (session); if (!session->commit_mgr) goto onerror; session->repo_mgr = seaf_repo_manager_new (session); if (!session->repo_mgr) goto onerror; session->branch_mgr = seaf_branch_manager_new (session); if (!session->branch_mgr) goto onerror; session->cs_mgr = seaf_cs_manager_new (session); if (!session->cs_mgr) goto onerror; session->share_mgr = seaf_share_manager_new (session); if (!session->share_mgr) goto onerror; session->web_at_mgr = seaf_web_at_manager_new (session); if (!session->web_at_mgr) goto onerror; session->token_mgr = seaf_token_manager_new (session); if (!session->token_mgr) goto onerror; session->passwd_mgr = seaf_passwd_manager_new (session); if (!session->passwd_mgr) goto onerror; session->quota_mgr = seaf_quota_manager_new (session); if (!session->quota_mgr) goto onerror; session->listen_mgr = seaf_listen_manager_new (session); if (!session->listen_mgr) goto onerror; session->job_mgr = ccnet_job_manager_new (session->sync_thread_pool_size); ccnet_session->job_mgr = ccnet_job_manager_new (session->rpc_thread_pool_size); session->size_sched = size_scheduler_new (session); session->ev_mgr = cevent_manager_new (); if (!session->ev_mgr) goto onerror; session->mq_mgr = seaf_mq_manager_new (session); if (!session->mq_mgr) goto onerror; return session; onerror: free (abs_seafile_dir); g_free (tmp_file_dir); g_free (config_file_path); g_free (session); return NULL; }
SeafileSession * seafile_session_new(const char *seafile_dir, const char *worktree_dir, struct _CcnetClient *ccnet_session) { char *abs_seafile_dir; char *abs_worktree_dir; char *tmp_file_dir; char *db_path; char *deleted_store; sqlite3 *config_db; SeafileSession *session = NULL; #ifndef SEAF_TOOL if (!ccnet_session) return NULL; #endif abs_worktree_dir = ccnet_expand_path (worktree_dir); abs_seafile_dir = ccnet_expand_path (seafile_dir); tmp_file_dir = g_build_filename (abs_seafile_dir, "tmpfiles", NULL); db_path = g_build_filename (abs_seafile_dir, "config.db", NULL); deleted_store = g_build_filename (abs_seafile_dir, "deleted_store", NULL); if (checkdir_with_mkdir (abs_seafile_dir) < 0) { seaf_warning ("Config dir %s does not exist and is unable to create\n", abs_seafile_dir); goto onerror; } if (checkdir_with_mkdir (abs_worktree_dir) < 0) { seaf_warning ("Worktree %s does not exist and is unable to create\n", abs_worktree_dir); goto onerror; } if (checkdir_with_mkdir (tmp_file_dir) < 0) { seaf_warning ("Temp file dir %s does not exist and is unable to create\n", tmp_file_dir); goto onerror; } if (create_deleted_store_dirs (deleted_store) < 0) goto onerror; config_db = seafile_session_config_open_db (db_path); if (!config_db) { seaf_warning ("Failed to open config db.\n"); goto onerror; } session = g_object_new (SEAFILE_TYPE_SESSION, NULL); session->seaf_dir = abs_seafile_dir; session->tmp_file_dir = tmp_file_dir; session->worktree_dir = abs_worktree_dir; session->session = ccnet_session; session->config_db = config_db; session->deleted_store = deleted_store; session->fs_mgr = seaf_fs_manager_new (session, abs_seafile_dir); if (!session->fs_mgr) goto onerror; session->block_mgr = seaf_block_manager_new (session, abs_seafile_dir); if (!session->block_mgr) goto onerror; session->commit_mgr = seaf_commit_manager_new (session); if (!session->commit_mgr) goto onerror; session->repo_mgr = seaf_repo_manager_new (session); if (!session->repo_mgr) goto onerror; session->branch_mgr = seaf_branch_manager_new (session); if (!session->branch_mgr) goto onerror; session->transfer_mgr = seaf_transfer_manager_new (session); if (!session->transfer_mgr) goto onerror; session->clone_mgr = seaf_clone_manager_new (session); if (!session->clone_mgr) goto onerror; session->sync_mgr = seaf_sync_manager_new (session); if (!session->sync_mgr) goto onerror; session->wt_monitor = seaf_wt_monitor_new (session); if (!session->wt_monitor) goto onerror; session->http_tx_mgr = http_tx_manager_new (session); if (!session->http_tx_mgr) goto onerror; session->filelock_mgr = seaf_filelock_manager_new (session); if (!session->filelock_mgr) goto onerror; session->job_mgr = ccnet_job_manager_new (MAX_THREADS); ccnet_session->job_mgr = ccnet_job_manager_new (MAX_THREADS); session->ev_mgr = cevent_manager_new (); if (!session->ev_mgr) goto onerror; session->mq_mgr = seaf_mq_manager_new (session); if (!session->mq_mgr) goto onerror; return session; onerror: free (abs_seafile_dir); free (abs_worktree_dir); g_free (tmp_file_dir); g_free (db_path); g_free (deleted_store); g_free (session); return NULL; }