1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-05-02 13:23:59 +00:00
seafile-server/common/seaf-utils.c

262 lines
6.8 KiB
C
Raw Normal View History

2016-08-10 06:53:33 +00:00
#include "common.h"
#include "log.h"
#include "seafile-session.h"
#include "seaf-utils.h"
#include "seaf-db.h"
#include "utils.h"
2016-08-10 06:53:33 +00:00
#include <stdlib.h>
#include <string.h>
#include <ccnet.h>
#include <searpc-named-pipe-transport.h>
2016-08-10 06:53:33 +00:00
char *
seafile_session_get_tmp_file_path (SeafileSession *session,
const char *basename,
char path[])
{
int path_len;
path_len = strlen (session->tmp_file_dir);
memcpy (path, session->tmp_file_dir, path_len + 1);
path[path_len] = '/';
strcpy (path + path_len + 1, basename);
return path;
}
#define SQLITE_DB_NAME "seafile.db"
#define DEFAULT_MAX_CONNECTIONS 100
static int
sqlite_db_start (SeafileSession *session)
{
char *db_path;
int max_connections = 0;
max_connections = g_key_file_get_integer (session->config,
"database", "max_connections",
NULL);
if (max_connections <= 0)
max_connections = DEFAULT_MAX_CONNECTIONS;
db_path = g_build_filename (session->seaf_dir, SQLITE_DB_NAME, NULL);
session->db = seaf_db_new_sqlite (db_path, max_connections);
if (!session->db) {
seaf_warning ("Failed to start sqlite db.\n");
return -1;
}
return 0;
}
#ifdef HAVE_MYSQL
2016-08-10 06:53:33 +00:00
#define MYSQL_DEFAULT_PORT 3306
static int
mysql_db_start (SeafileSession *session)
{
char *host, *user, *passwd, *db, *unix_socket, *charset;
int port;
gboolean use_ssl = FALSE;
int max_connections = 0;
GError *error = NULL;
host = seaf_key_file_get_string (session->config, "database", "host", &error);
2016-08-10 06:53:33 +00:00
if (!host) {
seaf_warning ("DB host not set in config.\n");
return -1;
}
port = g_key_file_get_integer (session->config, "database", "port", &error);
if (error) {
port = MYSQL_DEFAULT_PORT;
}
user = seaf_key_file_get_string (session->config, "database", "user", &error);
2016-08-10 06:53:33 +00:00
if (!user) {
seaf_warning ("DB user not set in config.\n");
return -1;
}
passwd = seaf_key_file_get_string (session->config, "database", "password", &error);
2016-08-10 06:53:33 +00:00
if (!passwd) {
seaf_warning ("DB passwd not set in config.\n");
return -1;
}
db = seaf_key_file_get_string (session->config, "database", "db_name", &error);
2016-08-10 06:53:33 +00:00
if (!db) {
seaf_warning ("DB name not set in config.\n");
return -1;
}
unix_socket = seaf_key_file_get_string (session->config,
2016-08-10 06:53:33 +00:00
"database", "unix_socket", NULL);
use_ssl = g_key_file_get_boolean (session->config,
"database", "use_ssl", NULL);
charset = seaf_key_file_get_string (session->config,
2016-08-10 06:53:33 +00:00
"database", "connection_charset", NULL);
max_connections = g_key_file_get_integer (session->config,
"database", "max_connections",
NULL);
if (max_connections <= 0)
max_connections = DEFAULT_MAX_CONNECTIONS;
session->db = seaf_db_new_mysql (host, port, user, passwd, db, unix_socket, use_ssl, charset, max_connections);
if (!session->db) {
seaf_warning ("Failed to start mysql db.\n");
return -1;
}
g_free (host);
g_free (user);
g_free (passwd);
g_free (db);
g_free (unix_socket);
g_free (charset);
if (error)
g_clear_error (&error);
return 0;
}
#endif
#ifdef HAVE_POSTGRESQL
2016-08-10 06:53:33 +00:00
static int
pgsql_db_start (SeafileSession *session)
{
char *host, *user, *passwd, *db, *unix_socket;
2017-01-16 07:56:51 +00:00
unsigned int port;
2016-08-10 06:53:33 +00:00
GError *error = NULL;
host = seaf_key_file_get_string (session->config, "database", "host", &error);
2016-08-10 06:53:33 +00:00
if (!host) {
seaf_warning ("DB host not set in config.\n");
return -1;
}
user = seaf_key_file_get_string (session->config, "database", "user", &error);
2016-08-10 06:53:33 +00:00
if (!user) {
seaf_warning ("DB user not set in config.\n");
return -1;
}
passwd = seaf_key_file_get_string (session->config, "database", "password", &error);
2016-08-10 06:53:33 +00:00
if (!passwd) {
seaf_warning ("DB passwd not set in config.\n");
return -1;
}
db = seaf_key_file_get_string (session->config, "database", "db_name", &error);
2016-08-10 06:53:33 +00:00
if (!db) {
seaf_warning ("DB name not set in config.\n");
return -1;
}
2017-01-16 07:56:51 +00:00
port = g_key_file_get_integer (session->config,
"database", "port", &error);
if (error) {
port = 0;
g_clear_error (&error);
}
2016-08-10 06:53:33 +00:00
unix_socket = seaf_key_file_get_string (session->config,
2016-08-10 06:53:33 +00:00
"database", "unix_socket", &error);
2017-01-16 07:56:51 +00:00
session->db = seaf_db_new_pgsql (host, port, user, passwd, db, unix_socket,
2016-08-20 06:58:51 +00:00
DEFAULT_MAX_CONNECTIONS);
2016-08-10 06:53:33 +00:00
if (!session->db) {
seaf_warning ("Failed to start pgsql db.\n");
return -1;
}
g_free (host);
g_free (user);
g_free (passwd);
g_free (db);
g_free (unix_socket);
return 0;
}
#endif
2016-08-10 06:53:33 +00:00
int
load_database_config (SeafileSession *session)
{
char *type;
GError *error = NULL;
int ret = 0;
2019-03-27 08:14:00 +00:00
gboolean create_tables = FALSE;
2016-08-10 06:53:33 +00:00
type = seaf_key_file_get_string (session->config, "database", "type", &error);
2016-08-10 06:53:33 +00:00
/* Default to use sqlite if not set. */
if (!type || strcasecmp (type, "sqlite") == 0) {
ret = sqlite_db_start (session);
}
#ifdef HAVE_MYSQL
else if (strcasecmp (type, "mysql") == 0) {
2016-08-10 06:53:33 +00:00
ret = mysql_db_start (session);
}
#endif
#ifdef HAVE_POSTGRESQL
else if (strcasecmp (type, "pgsql") == 0) {
2016-08-10 06:53:33 +00:00
ret = pgsql_db_start (session);
}
#endif
else {
2016-08-10 06:53:33 +00:00
seaf_warning ("Unsupported db type %s.\n", type);
ret = -1;
}
2019-03-27 08:14:00 +00:00
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;
}
2016-08-10 06:53:33 +00:00
g_free (type);
return ret;
}
2019-06-28 05:30:31 +00:00
SearpcClient *
create_ccnet_rpc_client ()
2019-06-28 05:30:31 +00:00
{
SearpcNamedPipeClient *transport = NULL;
2019-06-28 05:30:31 +00:00
char *pipe_path = NULL;
pipe_path = g_build_path ("/", seaf->ccnet_dir, CCNET_RPC_PIPE_NAME, NULL);
transport = searpc_create_named_pipe_client(pipe_path);
2019-06-28 05:30:31 +00:00
g_free(pipe_path);
if (!transport)
return NULL;
2019-06-28 05:30:31 +00:00
if (searpc_named_pipe_client_connect(transport) < 0) {
2019-06-28 05:30:31 +00:00
seaf_warning ("Named pipe client failed to connect.\n");
g_free (transport);
return NULL;
2019-06-28 05:30:31 +00:00
}
return searpc_client_with_named_pipe_transport (transport, "ccnet-threaded-rpcserver");
}
void
release_ccnet_rpc_client (SearpcClient *client)
{
if (!client)
return;
searpc_free_client_with_pipe_transport (client);
2019-06-28 05:30:31 +00:00
}