19 #define TIMEOUT 1000*60*2 // save every 2 minutes
20 #define LOOPS 30 // wait 30*TIMEOUT (1 hour) till shutdown
66 static bool in_reaction =
false;
91 if (strcmp(command,
"shutdown") == 0)
do_shutdown =
true;
92 else if (strcmp(command,
"ping") == 0) {}
93 else if (strcmp(command,
"save") == 0) {
94 fprintf(stdout,
"arb_db_server: save requested (savemode is \"%s\")\n", savemode);
109 if (param[0]) error =
GB_save(gb_main, param, savemode);
110 else error =
"No savename specified";
113 printf(
"arb_db_server: save returns '%s'\n", error);
125 if (!error && err2) error =
GBS_global_string(
"could not write result (reason: %s)", err2);
126 if (error) fprintf(stderr,
"arb_db_server: failed to react to command '%s' (reason: %s)\n", command, error);
151 fprintf(stdout,
"arb_db_server: shutdown requested (waiting for %i clients)\n", clients);
156 fputs(
"arb_db_server: all clients left, performing shutdown\n", stdout);
191 fprintf(stderr,
"server_main_loop returns with '%s'\n", error);
215 if (strcmp(command,
"save") == 0) {
231 if (strcmp(result,
"ok") != 0) {
243 fputs(
"arb_db_server 2.0 -- ARB-database server\n", stdout);
244 fputs(
"options:\n", stdout);
245 fputs(
" -h show this help\n", stdout);
246 fputs(
" -A use ASCII-DB-version\n", stdout);
247 fputs(
" -Ccmd execute command 'cmd' on running server\n", stdout);
248 fputs(
" known command are:\n", stdout);
249 fputs(
" ping test if server is up (crash or failure if not)\n", stdout);
250 fputs(
" save save the database (use -d to change name)\n", stdout);
251 fputs(
" shutdown shutdown running arb_db_server\n", stdout);
259 const char *cmd =
NULp;
262 while (argc>1 && !error) {
263 const char *arg = argv[1];
265 char sw_char = arg[1];
267 case 'h': help =
true;
break;
268 case 'C': cmd = arg+2;
break;
269 case 'A': savemode =
"a";
break;
290 fprintf(stderr,
"Error in arb_db_server: %s\n", error);
305 #include <sys/wait.h>
308 inline bool server_is_down(
const char *tcp) {
315 static int entry_changed_cb_called = 0;
316 static void entry_changed_cb() {
317 entry_changed_cb_called++;
320 void TEST_SLOW_dbserver() {
334 #if !defined(DEBUG_SERVER)
338 pid_t child_pid = fork();
341 int max_wait = (60*1000)/25;
344 down = server_is_down(tcp);
387 const char *test_entry =
"/tmp/TEST_SLOW_dbserver";
388 const char *test_content =
"hello world!";
454 #if defined(TEST_AUTO_UPDATE)
455 TEST_COPY_FILE(savename, expected);
456 #else // !defined(TEST_AUTO_UPDATE)
471 while (child_pid != wait(
NULp)) {}
474 #if !defined(DEBUG_SERVER)
483 #define socket_disappeared(sock) (GB_time_of_file(sock) == 0)
GB_ERROR GB_begin_transaction(GBDATA *gbd)
GB_ERROR GBK_system(const char *system_command)
GBDATA * GB_open(const char *path, const char *opent)
GB_ERROR GB_commit_transaction(GBDATA *gbd)
GB_ERROR GB_save(GBDATA *gb, const char *path, const char *savetype)
GB_ERROR GB_write_string(GBDATA *gbd, const char *s)
GBDATA * GB_searchOrCreate_string(GBDATA *gb_container, const char *fieldpath, const char *default_value)
GB_ERROR GB_add_callback(GBDATA *gbd, GB_CB_TYPE type, const DatabaseCallback &dbcb)
GBDATA * GB_nextEntry(GBDATA *entry)
bool GBCMS_accept_calls(GBDATA *gbd, bool wait_extra_time)
GBDATA * get_result_entry(GBDATA *gb_main)
static GB_ERROR run_command(const arb_params ¶ms, const char *command)
GBDATA * get_command_entry(GBDATA *gb_main)
static GB_ERROR check_socket_available(const arb_params ¶ms)
char * ARB_strdup(const char *str)
GBDATA * dbserver_container(GBDATA *gb_main)
const char * GBS_global_string(const char *templat,...)
static const char * savemode
int GB_unlink(const char *path)
void GBCMS_shutdown(GBDATA *gbd)
arb_params * arb_trace_argv(int *argc, const char **argv)
void free_arb_params(arb_params *params)
GB_ERROR GB_await_error()
int ARB_main(int argc, char *argv[])
#define TEST_EXPECT(cond)
void arb_print_server_params()
static void react_to_command(GBDATA *gb_main)
static bool command_triggered
static GB_ERROR run_server(const arb_params ¶ms)
#define TEST_REJECT_NULL(n)
static void error(const char *msg)
GB_CSTR GB_path_in_ARBHOME(const char *relative_path)
static GB_ERROR server_main_loop(GBDATA *gb_main)
long GB_read_clients(GBDATA *gbd)
#define TEST_EXPECT_ZERO_OR_SHOW_ERRNO(iocond)
GB_ERROR GBCMS_open(const char *path, long timeout, GBDATA *gb_main)
void ARB_sleep(int amount, TimeUnit tu)
fputs(TRACE_PREFIX, stderr)
GBDATA * get_param_entry(GBDATA *gb_main)
void GB_touch(GBDATA *gbd)
#define TEST_EXPECT_FILES_EQUAL(f1, f2)
char * GB_read_string(GBDATA *gbd)
GBDATA * dbserver_entry(GBDATA *gb_main, const char *entry)
uint32_t GBS_checksum(const char *seq, int ignore_case, const char *exclude)
#define TEST_EXPECT_NO_ERROR(call)
bool GB_is_regularfile(const char *path)
GB_ERROR init_data(GBDATA *gb_main)
GB_transaction ta(gb_var)
GB_CSTR GB_read_char_pntr(GBDATA *gbd)
GBDATA * GB_search(GBDATA *gbd, const char *fieldpath, GB_TYPES create)
#define TEST_EXPECT_EQUAL(expr, want)
bool served(GBDATA *gb_main)
char * GBS_global_string_copy(const char *templat,...)
void GB_close(GBDATA *gbd)