12 #include <PT_server_prototypes.h>
34 #define TIME_OUT 1000*60*60*24
173 bool authorized = strcmp(passwd,
"47@#34543df43%&3667gh") == 0;
175 if (!authorized)
return 1;
178 fprintf(stderr,
"\nARB_PT_SERVER: received shutdown message\n");
200 const char *found = strchr(str, sep);
202 if (found>str && found[-1] ==
'\\') {
203 found = strchr(found+1, sep);
213 int len = behindEnd-
start;
217 memcpy(destBuf, start, len);
223 #define MAX_INAME_LEN 30
224 #define MAX_ONAME_LEN 30
225 #define MAX_GNAME_LEN 1024
234 const char *sep1 = strchr(map_str,
';');
235 const char *sep2 = sep1 ? strchr(sep1+1,
';') :
NULp;
245 listOfGenes.push_back(
gene_struct(iname, oname, unesc));
249 err =
"buffer overflow (some name too long)";
281 for (gene_struct_list::const_iterator gs =
all_gene_structs.begin(); gs != end; ++gs) {
283 fprintf(stderr,
" Duplicated internal entry for '%s'\n", gs->get_internal_gene_name());
287 fprintf(stderr,
" Duplicated entry for '%s/%s'\n", gs->get_arb_species_name(), gs->get_arb_gene_name());
293 if (list_size == 0) {
294 error =
"name map is empty";
298 error =
GBS_global_string(
"detected %zi duplicated 'species/gene' combinations in name mapping", dups);
314 "ARB POS_TREE SERVER v%i (C)1993-2021 The ARB-project. Written by O.Strunk, J.Boehnel, R.Westram\n"
316 "- opening connection...\n",
322 const int MAX_STARTUP_SEC = 100;
323 const int RETRY_AFTER_SEC = 5;
324 for (
int i = 0; i<MAX_STARTUP_SEC; i += RETRY_AFTER_SEC) {
328 printf(
" Cannot bind to socket (retry in %i seconds)\n", RETRY_AFTER_SEC);
333 if (!so) error =
"can't bind to socket";
337 struct stat arbdb_stat;
338 if (stat(arbdb_name, &arbdb_stat)) {
343 const char *update_reason =
NULp;
347 if (stat(pt_name, &pt_stat)) {
350 else if (arbdb_stat.st_mtime > pt_stat.st_mtime) {
351 update_reason =
GBS_global_string(
"'%s' has been modified more recently than '%s'", arbdb_name, pt_name);
353 else if (pt_stat.st_size == 0) {
359 printf(
"- updating postree (Reason: %s)\n", update_reason);
379 free(quotedDatabaseArg);
384 fputs(
"- init internal structs...\n", stdout);
386 void *reserved_for_mmap =
NULp;
388 if (size_of_file > 0) {
389 reserved_for_mmap = malloc(size_of_file);
390 if (!reserved_for_mmap) {
391 error =
GBS_global_string(
"cannot reserve enough memory to map postree (needed=%li)", size_of_file);
396 free(reserved_for_mmap);
405 time_t now; time(&now);
410 printf(
"ok, server is running.\n");
456 const char *socket_name = params->
tcp;
468 if (strcmp(command,
"-build_clean") == 0) {
477 if (!error && dbstate>0) {
479 fputs(
"Warning: database already has been prepared for ptserver\n", stdout);
486 if (!error && dbstate == 0) {
504 else if (strcmp(command,
"-build") == 0) {
508 if (!error && dbstate != 1) {
509 error =
"database has not been prepared for ptserver";
515 ULONG ARM_size_kb = 0;
522 fputs(
"Warning: cannot detect size of mapfile (have none).\n"
523 " Ptserver will probably use too much memory.\n",
537 else if (strcmp(command,
"-QUERY") == 0) {
542 #if defined(CALCULATE_STATS_ON_QUERY)
544 puts(
"[index loaded - calculating statistic]");
546 puts(
"[statistic done]");
563 if (strcmp(command,
"-look") == 0) { start = !running; }
564 else if (strcmp(command,
"-boot") == 0) { kill = running; start =
true; }
565 else if (strcmp(command,
"-kill") == 0) { kill = running; }
571 fputs(
"There is another active server. Sending shutdown message..\n", stderr);
574 "%s: Warning: Problem connecting to the running %s\n"
575 " You might need to kill it manually to ensure proper operation\n",
599 if (msgerror) fprintf(stderr,
"Error: %s\n", msgerror);
600 free(quotedErrorMsg);
612 const char *exename = argv[0];
618 aisc_core_on_error = 0;
625 (argc >= 2 && strcmp(argv[1],
"--help") == 0))
627 fprintf(stderr,
"Syntax: %s [-look/-build/-kill/-QUERY/-boot] -Dfile.arb -TSocketid\n", exename);
637 fprintf(stderr,
"%s: Error: No command specified on command line", exename);
644 fprintf(stderr,
"%s: Error: %s\n", exename, error);
648 time_t now; time(&now);
struct probe_input_data * data
GB_ERROR GBK_system(const char *system_command)
bool copy_to_buf(const char *start, const char *behindEnd, int MAXLEN, char *destBuf)
static int get_DB_state(GBDATA *gb_main, ARB_ERROR &error)
static __ATTR__USERESULT ARB_ERROR run_command(const char *exename, const char *command, const arb_params *params)
#define PT_SERVER_VERSION
GB_ERROR preserve() const
int server_shutdown(PT_main *, aisc_string passwd)
Hs_struct * open_aisc_server(const char *path, int timeout, int fork)
void aisc_server_shutdown(Hs_struct *&hs)
int aisc_close(aisc_com *link, AISC_Object &object)
GB_ERROR GB_end_transaction(GBDATA *gbd, GB_ERROR error)
int main(int argc, char **argv)
std::set< const gene_struct *, ltByInternalName > gene_struct_index_internal
GB_ERROR PT_prepare_data(GBDATA *gb_main)
GB_ERROR GB_IO_error(const char *action, const char *filename)
char * ARB_strdup(const char *str)
std::list< gene_struct > gene_struct_list
NOT4PERL long * GBT_readOrCreate_int(GBDATA *gb_container, const char *fieldpath, long default_value)
const char * GBS_global_string(const char *templat,...)
int aisc_nput(aisc_com *link, int o_type, const AISC_Object &object,...)
static __ATTR__USERESULT ARB_ERROR parse_names_into_gene_struct(const char *map_str, gene_struct_list &listOfGenes)
void GBS_free_hash(GB_HASH *hs)
int ARB_main(int argc, char *argv[])
ARB_ERROR enter_stage_1_build_tree(PT_main *, const char *tname, ULONG ARM_size_kb)
probe_statistic_struct stat
long GB_size_of_file(const char *path)
GB_ERROR GB_push_transaction(GBDATA *gbd)
struct probe_struct_global psg
GB_ERROR GB_incur_error_if(bool error_may_occur)
arb_params * arb_trace_argv(int *argc, const char **argv)
static GB_ERROR PT_init_map()
static HelixNrInfo * start
gene_struct_index_arb gene_struct_arb2internal
void free_arb_params(arb_params *params)
GB_ERROR GB_await_error()
const char * GBS_read_arb_tcp(const char *env)
std::set< const gene_struct *, ltByArbName > gene_struct_index_arb
GB_ERROR PT_init_input_data()
GB_ERROR GB_install_pid(int mode)
static bool psg_initialized
GB_ERROR GB_save_as(GBDATA *gbd, const char *path, const char *savetype)
gene_struct_index_internal gene_struct_internal2arb
static gene_struct_list all_gene_structs
static void error(const char *msg)
ARB_ERROR probe_read_data_base(const char *name, bool readOnly)
GB_CSTR GB_mapfile(GBDATA *gb_main)
GBDATA * GB_searchOrCreate_int(GBDATA *gb_container, const char *fieldpath, long default_value)
void PT_build_species_hash()
const char * GBS_readable_timediff(size_t seconds)
void ARB_sleep(int amount, TimeUnit tu)
int aisc_broadcast(Hs_struct *hs, int message_type, const char *message)
GB_ERROR GB_write_int(GBDATA *gbd, long i)
char * GBS_unescape_string(const char *str, const char *escaped_chars, char escape_char)
#define AISC_MAGIC_NUMBER
#define make_valgrinded_call(command)
fputs(TRACE_PREFIX, stderr)
const char * find_sep(const char *str, char sep)
GB_ERROR cleanup_ptserver_database(GBDATA *gb_main)
char * GBK_singlequote(const char *arg)
static GB_ERROR set_DB_state(GBDATA *gb_main, int dbstate)
static __ATTR__USERESULT ARB_ERROR start_pt_server(const char *socket_name, const char *arbdb_name, const char *pt_name, const char *exename)
aisc_com * aisc_open(const char *path, AISC_Object &main_obj, long magic, GB_ERROR *error)
#define __ATTR__USERESULT
GBDATA * GBT_find_or_create(GBDATA *father, const char *key, long delete_level)
bool GB_is_regularfile(const char *path)
void PT_dump_tree_statistics(const char *indexfilename)
char * GBT_get_default_alignment(GBDATA *gb_main)
GB_ERROR GB_no_transaction(GBDATA *gbd) __ATTR__USERESULT
void GBS_add_ptserver_logentry(const char *entry)
GB_transaction ta(gb_var)
GB_CSTR GB_read_char_pntr(GBDATA *gbd)
ARB_ERROR enter_stage_2_load_tree(PT_main *, const char *tname)
static ARB_ERROR pt_init_main_struct(PT_main *, const char *filename)
Hs_struct * aisc_accept_calls(Hs_struct *hs)
GBDATA * GB_entry(GBDATA *father, const char *key)
bool GB_supports_mapfile(void)
char * GBS_global_string_copy(const char *templat,...)
void GB_close(GBDATA *gbd)
int broadcast(PT_main *main, int)