void create_database(MYSQL *conn, gchar *database){ gchar* query = NULL; if((db == NULL && source_db == NULL) || (db != NULL && source_db != NULL && !g_ascii_strcasecmp(db, source_db))){ const gchar* filename= g_strdup_printf("%s-schema-create.sql", db ? db : database); const gchar* filenamegz= g_strdup_printf("%s-schema-create.sql.gz", db ? db : database); const gchar* filepath= g_strdup_printf("%s/%s-schema-create.sql", directory, db ? db : database); const gchar* filepathgz= g_strdup_printf("%s/%s-schema-create.sql.gz", directory, db ? db : database); if (g_file_test (filepath, G_FILE_TEST_EXISTS)){ restore_data(conn, database, NULL, filename, TRUE, FALSE); }else if (g_file_test (filepathgz, G_FILE_TEST_EXISTS)){ restore_data(conn, database, NULL, filenamegz, TRUE, FALSE); }else{ query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database); mysql_query(conn, query); } }else{ query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database); mysql_query(conn, query); } g_free(query); return; }
void restore_schema_post(MYSQL *conn){ GError *error= NULL; GDir* dir= g_dir_open(directory, 0, &error); gchar** split_file= NULL; gchar* database=NULL; //gchar* table=NULL; if (error) { g_critical("cannot open directory %s, %s\n", directory, error->message); errors++; return; } const gchar* filename= NULL; while((filename= g_dir_read_name(dir))) { if (!source_db || g_str_has_prefix(filename, source_db)){ if (g_strrstr(filename, "-schema-post.sql")) { split_file= g_strsplit(filename, "-schema-post.sql", 0); database= split_file[0]; //table= split_file[0]; //NULL g_message("Restoring routines and events for `%s`", db ? db : database); restore_data(conn, database, NULL, filename, TRUE, TRUE); } } } g_strfreev(split_file); g_dir_close(dir); }
void *process_queue(struct thread_data *td) { struct configuration *conf= td->conf; g_mutex_lock(init_mutex); MYSQL *thrconn= mysql_init(NULL); g_mutex_unlock(init_mutex); mysql_options(thrconn, MYSQL_READ_DEFAULT_GROUP, "myloader"); if (compress_protocol) mysql_options(thrconn, MYSQL_OPT_COMPRESS, NULL); if (!mysql_real_connect(thrconn, hostname, username, password, NULL, port, socket_path, 0)) { g_critical("Failed to connect to MySQL server: %s", mysql_error(thrconn)); exit(EXIT_FAILURE); } if (!enable_binlog) mysql_query(thrconn, "SET SQL_LOG_BIN=0"); mysql_query(thrconn, "/*!40101 SET NAMES binary*/"); mysql_query(thrconn, "SET autocommit=0"); g_async_queue_push(conf->ready, GINT_TO_POINTER(1)); struct job* job= NULL; struct restore_job* rj= NULL; for(;;) { job= (struct job*)g_async_queue_pop(conf->queue); switch (job->type) { case JOB_RESTORE: rj= (struct restore_job *)job->job_data; g_message("Thread %d restoring `%s`.`%s` part %d", td->thread_id, rj->database, rj->table, rj->part); restore_data(thrconn, rj->database, rj->table, rj->filename, FALSE); if (rj->database) g_free(rj->database); if (rj->table) g_free(rj->table); if (rj->filename) g_free(rj->filename); g_free(rj); g_free(job); break; case JOB_SHUTDOWN: g_message("Thread %d shutting down", td->thread_id); if (thrconn) mysql_close(thrconn); g_free(job); mysql_thread_end(); return NULL; break; default: g_critical("Something very bad happened!"); exit(EXIT_FAILURE); } } if (thrconn) mysql_close(thrconn); mysql_thread_end(); return NULL; }
void system_init(void) { #if defined(EEPROM) //检测24cxx存储芯片是否正常 while (at24xx_check()){ #if defined (BEEP) //蜂鸣器响 BEEP_TOGGLE(); #endif #if defined (DEBUG) send_data(DEBUG_UART, "24cxx check fail!!\r\n", strlen("24cxx check fail!!\r\n")); #endif Delay(100); } //恢复数据 restore_data(); #endif }
/* ** prototype function to be executed by the thread, ** This will handle connection for each client. */ void *connection_handler(void *socket_desc) { //Get the socket descriptor int i; int sock = *(int*)socket_desc; int read_size; unsigned char client_message[SOCK_BUF_SIZE]; unsigned char *temp; while( (read_size = recv(sock , client_message , SOCK_BUF_SIZE , 0)) > 0 ) { client_message[read_size] = '\0'; temp = stringProcess(client_message,&read_size); if(read_size >= 8 && temp != NULL){ restore_data(temp,read_size); #ifdef DEBUG_TIME printf("Received Valid String:%s \n",client_message); #endif //*(client_message) = '\0'; } else { #ifdef DEBUG_TIME printf("Invalid string:"); for(i = 0;*(client_message + i) != '\0';++i) { printf("%x ",*(client_message + i)); } printf("\n"); #endif //*(client_message) = '\0'; } read_size = 0;//clear read size } if(read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if(read_size == -1) { perror("recv failed"); } //Free the socket pointer free(socket_desc); return 0; }
void add_schema(const gchar* filename, MYSQL *conn) { // 0 is database, 1 is table with -schema on the end gchar** split_file= g_strsplit(filename, ".", 0); gchar* database= split_file[0]; // Remove the -schema from the table name gchar** split_table= g_strsplit(split_file[1], "-", 0); gchar* table= split_table[0]; gchar* query= g_strdup_printf("SHOW CREATE DATABASE `%s`", db ? db : database); if (mysql_query(conn, query)) { g_free(query); g_message("Creating database `%s`", db ? db : database); query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database); mysql_query(conn, query); } else { MYSQL_RES *result= mysql_store_result(conn); // In drizzle the query succeeds with no rows my_ulonglong row_count= mysql_num_rows(result); mysql_free_result(result); if (row_count == 0) { // TODO: Move this to a function, it is the same as above g_free(query); g_message("Creating database `%s`", db ? db : database); query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database); mysql_query(conn, query); } } g_free(query); if (overwrite_tables) { g_message("Dropping table (if exists) `%s`.`%s`", db ? db : database, table); query= g_strdup_printf("DROP TABLE IF EXISTS `%s`.`%s`", db ? db : database, table); mysql_query(conn, query); g_free(query); } g_message("Creating table `%s`.`%s`", db ? db : database, table); restore_data(conn, database, table, filename, TRUE); g_strfreev(split_table); g_strfreev(split_file); return; }
// This is a thread started by srt_server_init(). It handles all the incoming // segments from the client. The design of seghanlder is an infinite loop that calls snp_recvseg(). If // snp_recvseg() fails then the overlay connection is closed and the thread is terminated. Depending // on the state of the connection when a segment is received (based on the incoming segment) various // actions are taken. See the client FSM for more details. // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // void* seghandler(void* arg) { seg_t* seg = (seg_t*) malloc(sizeof(seg_t)); seg_t* ack = (seg_t*) malloc(sizeof(seg_t)); // memset(&seg, 0, sizeof(seg)); svr_tcb_t* tp = (svr_tcb_t*) malloc(sizeof(svr_tcb_t)); while (1) { // Find the right server tp = NULL; if (snp_recvseg(tcp_socknum,seg) != 1) { printf("Can't receive data in server, ready to close\n"); close(tcp_socknum); pthread_exit(NULL); } // Get socketfd by port int sockfd = -1; for (int i = 0; i < MAX_TRANSPORT_CONNECTIONS; ++i) { if (svr_tcb_table[i] != NULL && svr_tcb_table[i] -> svr_portNum == seg->header.dest_port) { // Get the right tcb based on dest port sockfd = i; /*get socket number in srt for client port*/ // tp -> client_port = seg.header.src_port; tp = svr_tcb_table[i]; } } printf("Server sockfd =%d,Received seg header type =%d\n",sockfd,seg->header.type); if (!tp){ printf("Server: Can't get server_tcp for the seg\n"); continue; } printf("seghandler sockfd=%d , state=%d \n", sockfd, tp->state); switch(tp->state) { case CLOSED: printf("Server: sockfd=%d received seg in CLOSED\n", sockfd); break; case LISTENING: { if(seg->header.type == SYN) { pthread_mutex_lock(tp -> bufMutex); tp->client_portNum = seg->header.src_port; tp->state=CONNECTED; printf("Server:sockfd = %d Got SYN from client\n", sockfd); // Set tcb expect_seqNum tp -> expect_seqNum = seg->header.seq_num; pthread_mutex_unlock(tp -> bufMutex); // memset(&ack,0, sizeof(ack)); // Received SYN and send SYNACK back ack->header.type = SYNACK; ack->header.src_port = tp -> svr_portNum; ack->header.dest_port = tp -> client_portNum; ack->header.length = 0; snp_sendseg(tcp_socknum, ack); printf("Server:sockfd = %d Sent SYNACK to client\n", sockfd); } else printf("Server: Listening received SYN\n"); break; } case CONNECTED: { switch (seg->header.type) { printf("Server: tp %d: receive %d\n", sockfd, seg->header.type); case SYN: { // Received SYN and send SYNACK back // seg_t ack; // memset(&ack,0, sizeof(ack)); pthread_mutex_lock(tp -> bufMutex); tp -> expect_seqNum = seg->header.seq_num; pthread_mutex_unlock(tp -> bufMutex); ack->header.type = SYNACK; ack->header.src_port = tp -> svr_portNum; ack->header.dest_port = tp -> client_portNum; ack->header.length = 0; snp_sendseg(tcp_socknum, ack); break; } case DATA: { // tp -> expect_seqNum will be updated if right; Otherwise, same old expect_seqNum if (seg -> header.seq_num == tp -> expect_seqNum){ // Update tp -> expect_seqNum and store data in tp -> recvBuf restore_data(tp, seg); } // Send ack back anayway ack->header.type = DATAACK; ack->header.src_port = tp -> svr_portNum; ack->header.dest_port = tp -> client_portNum; ack->header.length = 0; ack->header.ack_num = tp -> expect_seqNum; // Send the new expect_seqNum(added by data length) if the expect_seqNum is right snp_sendseg(tcp_socknum, ack); break; } case FIN: { time_t timer = time(NULL); printf("Server: tp %d: receive FIN %s", sockfd, ctime(&timer)); // send FINACK // seg_t ack; // memset(&ack,0, sizeof(ack)); ack->header.type = FINACK; ack->header.src_port = tp -> svr_portNum; ack->header.dest_port = tp -> client_portNum; ack->header.length = 0; snp_sendseg(tcp_socknum, ack); tp->state = CLOSEWAIT; // start a thread for CLOSE_WAIT_TIMEOUT; If time expires, Set tp state as CLOSED pthread_t closetimer; pthread_create(&closetimer,NULL,closewait, (void*)tp); break; } default: break; } break; } case CLOSEWAIT: // receive FIN if (seg->header.type == FIN) { // send FINACK // seg_t ack; // memset(&ack,0, sizeof(ack)); ack->header.type = FINACK; ack->header.src_port = tp -> svr_portNum; ack->header.dest_port = tp -> client_portNum; ack->header.length = 0; snp_sendseg(tcp_socknum, ack); printf("Server: sent FINACK in closewait\n"); } else { printf("Server: Received not fin in CLOSEWAIT\n"); } break; default: printf("Server: sockfd= %d: wrong state\n", sockfd); break; } } }
string finger_group(string group) { int i, j; string msg; object link; mixed tmp1, tmp2, tmp3, tmp4, tmp5; string *group2; groups = master()->query_groups(); if (!group || undefinedp(groups[group])) return "Finger: There is no such group.\n"; /* * special case: filter root members out of admin group */ // if (group == "admin") // groups["admin"] = filter_array(groups["admin"], "filter_root", this_object()); group2 = groups[group]; j = group2 ? sizeof(group2) : 0; msg = LINE1; if (j == 0) { msg += "[" + capitalize(mud_name()) + "] No members of " + capitalize(group) + " group (" + ctime(time()) + ").\n"; } else { msg += "[" + capitalize(mud_name()) + "] " + j + (j == 1 ? " user" : " users") + " " + "in " + capitalize(group) + " group (" + ctime(time()) + ").\n"; msg += LINE2; msg += sprintf("%-12s%-20s%-14s%-28s", "Login", "Real Name", "Domain", "On\n"); msg += LINE2; group2 = sort_array(group2, "do_alpha", this_object()); for (i = 0; i < j; i++) { tmp1 = group2[i]; /* logid id */ link = find_player(tmp1); if (link) link = link->query_link(); else link = restore_data(tmp1); if (!link) continue; /* no such user */ tmp2 = (string)link->RNAME; /* real name */ tmp3 = DOMAIN_D->query_domain(link); if ((tmp3 == 0) || (tmp3 == "")) tmp3 = "None"; tmp4 = find_player(tmp1); if (!tmp4 || !filter_users(tmp4)) tmp5 = "Last "; else tmp5 = "Since "; if (!link->query("last_on")) tmp5 += "(Unavailable)"; else tmp5 += ctime((int)link->query("last_on")); msg += sprintf("%-12s%-20s%-14s%28s", capitalize((string)tmp1), capitalize(extract((string)tmp2, 0, 18)), capitalize((string)tmp3), (string)tmp5 + "\n"); if (!find_player(tmp1)) { link->remove(); } } } return msg + LINE1; }
string finger_user(string who) { object link, body; mixed tmp1, tmp2, tmp3, tmp4, tmp5; string msg; mapping mail_stat; int hibernate; link = restore_data(who); if (link) body = restore_body(who); if (!link || !body) { if (sscanf(who, "(%s)", who)) return finger_group(who); return "Finger: There is no such user.\n"; } msg = LINE1; // Line 1: Fingerguy the Utter Novice (Chaotic Neutral) if (link->query("wizard")) { string al, title = body->getenv( "TITLE" ); al = body->query("al_title"); if (!al || al=="") { msg += body->query_title() + "\n"; } else { if (!title) title = "$N the New Wizard ($A)"; title = replace_string(title, "$N", body->query("cap_name")); title = replace_string(title, "$A", al); msg += title + "\n"; } } else msg += body->query_title() + "\n"; // Line 2: Male Human Mage [Level 5] // or: Male Human Necromancer [Lesser Power of Prime] msg += capitalize(body->query("gender")); msg += " "+capitalize(body->query("race")); mail_stat = link->query("Class"); if (mail_stat) { tmp1 = (values(mail_stat))[0]; msg += ( " " + capitalize(tmp1) ); } if (wizardp(TP)) { if (link->query("wizard")) { if (member_group(body->query("name"), "ambassador")) { tmp1 = "Ambassador"; tmp2 = body->query("ambassador"); if ((tmp2 != 0) && (tmp2 != "")) tmp1 = tmp1 + " of " + capitalize(tmp2); } else { tmp1 = DOMAIN_D->query_domain(link); tmp2 = DOMAIN_D->query_domain_level(link); if ((tmp1 == 0) || (tmp1 == "")) tmp1 = "Domainless "+tmp2; else tmp1 = tmp2 + " of " + tmp1 + " Domain"; } } else { tmp1 = "Level " + link->query("level"); } tmp1 = " [" + tmp1 + "]\n"; msg += tmp1; } else msg += "\n"; // Line 3: Gang allegience: The Machiavellian Menagerie // or: The Admin (Leader) tmp1 = "Gang allegience: "; tmp2 = body->query("gang"); if (tmp2) { mail_stat = GANG_D->get_list_map(); if (mail_stat[tmp2] == body->query("name")) tmp1 += "Leader of "+cap_all_words(tmp2); else tmp1 += "Member of "+cap_all_words(tmp2); } else { tmp1 += "none"; } msg += tmp1 + "\n"; // Line 4 : Married to Whoever tmp1 = body->query("spouse"); if (tmp1) { tmp1 = capitalize(tmp1); msg += "Married to "+tmp1+"\n"; } // Line 5 : A cool line to make it all very pretty. msg += LINE2; // Line 6: In Real Life: Matthew A. Titmus // or: In Real Life: ? tmp2 = "In Real Life: "; if (tmp3 = (string)link->RNAME) tmp2 += extract(tmp3, 0, 22); else tmp2 += "?"; msg += "Status: "; if (member_group(body->query("name"), "root")) msg += "Administrator\n"; else if (member_group(body->query("name"), "adminaccess")) msg += "Elder\n"; else if (member_group(body->query("name"), "ambassador")) msg += "Ambassador\n"; else if (link->query("wizard")) msg += "Immortal\n"; else msg += "Player\n"; if (body->query("email_visible")) tmp1 = "[Public]"; else tmp1 = "[Private]"; if (adminp(TP) || body->query("name")==TP->query("name")) { tmp1 = (string)link->query("email")+" "+tmp1; } else { if (body->query("email_visible")) { tmp1 = (string)link->query("email"); } else { tmp1 = "[Private]"; } } if (tmp1) msg += "Email address: " + tmp1 + "\n"; tmp1 = (string)link->query("URL"); if (tmp1) msg += "URL: " + tmp1 + "\n"; hibernate = (int)link->query("hibernate"); if (hibernate && time() < hibernate) msg += "\n\t[In hibernation until " + ctime(hibernate) + "]\n\n"; tmp1 = find_player(who); if (tmp1) { if (!filter_users(tmp1)) tmp1 = 0; } if (!link->query("last_on")) msg += (tmp1 ? "On since: " : "Last on: ") + "Unavailable"; else msg += ((tmp1 && !tmp1->query("npc")) ? "On since: " : "Last on: ") + ctime((int)link->query("last_on")) ; if (wizardp(TP)) msg += ( " from " + (string)link->query("ip") + " \n" ); else msg += "\n"; if (tmp1) { tmp1 = query_idle_string(tmp1, 1); if (strlen(tmp1) > 0) msg += tmp1 + "\n"; } mail_stat = (mapping)MAILBOX_D->mail_status(who); if (mail_stat["unread"]) msg += sprintf("%s has not read %d of their %d piece%s of mail.\n", capitalize(who), mail_stat["unread"], mail_stat["total"], (mail_stat["total"] == 1 ? "" : "s")); else { msg += "No unread mail" ; if(this_player()) { if (adminp(getuid(this_player()))) { // msg += " ("+mail_stat["total"]+" pieces)" ; msg += sprintf(" (%d piece%s)", mail_stat["total"], (mail_stat["total"] == 1 ? "" : "s")); } } msg += ".\n" ; } if (link->query("wizard")) { tmp1 = user_path(who) + ".project"; if (file_size(tmp1) >= 0) msg += "Project: " + read_file(tmp1); tmp1 = user_path(who) + ".plan"; if (file_size(tmp1) >= 0) { msg += "Plan:\n" + read_file(tmp1); } else { msg += "No Plan.\n"; } } else { if (body->query("session")) tmp1 = iwrap("Session: "+body->query("session")); else tmp1 = "No Session.\n"; msg += tmp1; } msg += LINE1; if (!find_player(who) || !interactive(find_player(who))) { link->remove(); // Some names like .foo weren't getting away. if(link) destruct(link); if(link) log_file("fingerdest",sprintf("Connection of %s not "+ "dested by finger daemon, on %s.\n", link->query("name"), ctime(time()))); if(body) destruct(body); if(body) log_file("fingerdest",sprintf("Connection of %s not "+ "dested by finger daemon, on %s.\n", body->query("name"), ctime(time()))); } return "\n" + msg + "\n"; }