/* * Takes the input line and creates 2 strings (fingerprint and name). * This function also accounts for bad input cases. */ void input(Table_T* table) { char fingerprint[FINGER_MAX]; char name[NAME_MAX]; char letter = getchar(); while (letter != EOF) { /*Badly formed line*/ if (isspace(letter) || letter == '\n') { letter = skip_line(letter); continue; } /*Create fingerprint*/ letter = record_fingerprint(letter, fingerprint); if (!isspace(letter)) { letter = skip_line(letter); continue; } /*Skip whitespace*/ while (isspace(letter)) { letter = getchar(); } /*Create name*/ letter = record_name(letter, name); if (letter != '\n') { letter = skip_line(letter); } letter = getchar(); /*Make name and fingerprint atoms*/ insert_atom(table, fingerprint, name); } }
int main(int argc, char* argv[]){ //variabili fd_set read_temp_set; fd_set write_temp_set; int error; int max_fd_set; timeout.tv_sec=60; timeout.tv_usec=0; char port[6]; char command [30]; int right=0; int max_try=3; // fase iniziale : connessione al server if(argc!=3){ printf("Errore nell'inserimento dei parametri, chiusura in corso...\n"); exit(1); } printf("Connessione in corso al server (indirizzo di ascolto %s, porta di ascolto %s)\n",argv[1],argv[2]); tcp_socket=socket(AF_INET,SOCK_STREAM,0); if(tcp_socket==-1){ perror("Errore creazione socket tcp"); exit(1); } udp_socket=socket(AF_INET,SOCK_DGRAM,0); if(udp_socket==-1){ perror("Errore creazione socket udp"); close(tcp_socket); exit(1); } max_fd_set=(tcp_socket>udp_socket)?tcp_socket:udp_socket; memset(&server,0, sizeof(server)); memset(&client,0, sizeof(client)); memset(&enemy, 0, sizeof(enemy)); memset(&work, 0, sizeof(work)); enemy.sin_family=AF_INET; work.sin_family=AF_INET; client.sin_family=AF_INET; server.sin_family=AF_INET; // per il server server.sin_port=htons(atoi(argv[2])); inet_pton(AF_INET, argv[1], &server.sin_addr.s_addr); error=connect(tcp_socket,(struct sockaddr*)&server,addrlen); if(error==-1){ perror("Impossibile connettersi al server"); close(tcp_socket); close(udp_socket); exit(1); } printf("Connessione con il server %s sulla porta %s avvenuta con successo.\n", argv[1], argv[2]); // segue l'inserimento del nome e della porta di ascolto udp error=record_name(client_name); while(error==-1){ if(max_try!=0){ printf("Riproviamo...\n"); error=record_name(client_name); max_try--; } else if(max_try==0){ printf("Problemi nell'inserimento del nome.Disconnessione...\n"); close(tcp_socket); close(udp_socket); exit(1); } } do{ printf("Per favore inserisci il numero di porta udp per il gioco:\n"); fgets(port,6,stdin); if(port[strlen(port)-1]!='\n') fflush(stdin); udp_port=atoi(port); if(udp_port<1024 || udp_port>=65535) printf("Porta upd inserita non valida...\n"); else right=1; }while(right==0); udp_port=htons(udp_port); error=record_udp_port(udp_port); if(error==-1){ printf("Problemi nell'inserimento della porta udp.Disconnessione...\n"); close(tcp_socket); close(udp_socket); exit(1); } // bind() per socket udp client.sin_port=udp_port; client.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP error=bind(udp_socket, (struct sockaddr*)&client, addrlen); if(error==-1){ perror("Errore nella bind della socket udp in ricezione(porta occupata)"); printf("Server in chiusura...\n"); close(tcp_socket); close(udp_socket); exit(1); } else printf("Porta udp registrata correttamente presso il server.\n"); // il client deve inserire le varie navi set_match(); show_commands(); // inizializzo i descrittori FD_ZERO(&master_read_set); FD_ZERO(&master_write_set); FD_SET(0, &master_read_set);//stdin FD_SET(tcp_socket, &master_read_set); FD_SET(udp_socket, &master_read_set); // comincia il corpo del client do{ read_temp_set=master_read_set; write_temp_set=master_write_set; if(shell==0){ if(started_match==0) printf(">"); else printf("#"); shell=1; } fflush(stdout); error=select(max_fd_set+1, &read_temp_set, &write_temp_set, NULL, &timeout); if(error==-1){ perror("Errore nella select"); close(tcp_socket); close(udp_socket); exit(1); } else if((error==0) && (started_match!=0)){ // non e' successo niente per 60s durante una partita printf("Inattivita' durante una partita.\n"); printf("Chiudo la partita con %s. \n",enemy_name); busy=0; started_match=0; tcp_senddim=4; tcp_message=malloc(4); *(int*)tcp_message=4; udp_message[0]=7;//TIPO messaggio FD_SET(tcp_socket, &master_write_set); FD_SET(udp_socket, &master_write_set); FD_CLR(tcp_socket, &master_read_set); } // altrimenti controlliamo i socket in lettura if(FD_ISSET(0, &read_temp_set)){ // leggo un comando da tastiera shell = 0; fgets(command,30, stdin); if(command[strlen(command)-1]!='\n') fflush(stdin); else command[strlen(command)-1]='\0'; manage_stdin_command(command); } if(FD_ISSET(tcp_socket, &read_temp_set)){ if(tcp_recv1==1){ msg_buffer=malloc(INTEGER); error=recv(tcp_socket,msg_buffer,INTEGER,0); if(error==0){ printf("Il server ha chiuso la connessione"); close_conn=1; break; } if(error==-1 || error<INTEGER){ perror("Errore nella recive"); close_conn=1; break; } tcp_recvdim=*(int*)msg_buffer; free(msg_buffer); tcp_recv1=0; } else{ msg_buffer=malloc(tcp_recvdim); error=recv(tcp_socket,msg_buffer,tcp_recvdim,0); if(error==0){ printf("Il server ha chiuso la connessione"); close_conn=1; break; } if(error==-1 || error<tcp_recvdim){ perror("Errore nella recive"); close_conn=1; break; } error=manage_tcp_command(msg_buffer); free(msg_buffer); if(error==-1){ printf("Errore nella recive"); close_conn=1; break; } tcp_recv1=1; shell=0; } } if(FD_ISSET(udp_socket, &read_temp_set)){ msg_buffer=malloc(12); error=recvfrom(udp_socket,msg_buffer,12,0,(struct sockaddr*)&work,&addrlen); if(error==-1){ perror("Errore nella recvfrom"); close_conn=1; break; } if((busy==1) && work.sin_addr.s_addr==enemy.sin_addr.s_addr){ shell=0; error=manage_udp_command((int*)msg_buffer); if(error==-1){ printf("Errore nella gestione del comando ricevuto dall'altro giocatore.\n"); close_conn=1; break; } free(msg_buffer); /***************************************************************/ } // altrimenti ho ricevuto un pacchetto da qualcun'altro } // controlliamo i socket in scrittura if(FD_ISSET(tcp_socket,&write_temp_set)){ if(tcp_send1==1){ msg_buffer=malloc(INTEGER); *(int*)msg_buffer=tcp_senddim; error=send(tcp_socket,msg_buffer,INTEGER,0); if(error==-1){ perror("Errore nella send"); close_conn=1; break; } free(msg_buffer); tcp_send1=0; } else{ error=send(tcp_socket,tcp_message,tcp_senddim,0); if(error==-1){ perror("Errore nella send"); close_conn=1; break; } if(*(int*)tcp_message==5) close_conn=1; free(tcp_message); tcp_send1=1; FD_CLR(tcp_socket, &master_write_set); FD_SET(tcp_socket, &master_read_set); } } if(FD_ISSET(udp_socket,&write_temp_set)){ error=sendto(udp_socket,(void*)&udp_message,12,0,(struct sockaddr*)&enemy,addrlen); if(error==-1){ perror("Errore nella sendto"); close_conn=1; break; } FD_CLR(udp_socket, &master_write_set); } }while(close_conn==0); close(tcp_socket); close(udp_socket); printf("\nBye bye!\n"); return 0; }
int main(int argc, char *argv[]) { QCoreApplication myApp(argc, argv); // check input args QStringList inputArgs = myApp.arguments(); if(inputArgs.size() < 2) { qDebug() << "Error: No dbf directory: "; qDebug() << "Pass the dbf directory as an argument: "; qDebug() << "./dbf2sqlite /my/dbfdir"; return -1; } // filter shapefile types QStringList dbfFilterList; dbfFilterList << "*.dbf"; // check for all files QDir dbfDir = inputArgs[1]; QStringList dbfDirList = dbfDir.entryList(dbfFilterList, QDir::Files); // get all file paths QString fileDbf; for(int i=0; i < dbfDirList.size(); i++) { if(dbfDirList[i].contains(".dbf")) { fileDbf = dbfDir.absoluteFilePath(dbfDirList[i]); } } // open the database file DBFHandle hDBF = DBFOpen(fileDbf.toLocal8Bit().data(),"rb"); if(hDBF == NULL) { qDebug() << "Error: Could not open dbf file"; return -1; } // set fields to keep based on data type QStringList listFieldsToKeep; QString dbFileName; if(ADMIN0) { dbFileName = "admin0.sqlite"; listFieldsToKeep << "ADMIN" // administrative name of country << "ADM0_A3"; // 3 letter abbreviatesion of admin name } if(ADMIN1) { dbFileName = "admin1.sqlite"; listFieldsToKeep << "OBJECTID" << "NAME_1" // Admin1 region name << "VARNAME_1" // Admin1 alt name (not very reliable) << "NL_NAME_1" // Admin1 region name in national language (not reliable) << "Postal"; // 2 Letter Postal Code (not reliable) } // get number of fields in db size_t numRecords = 0; numRecords = DBFGetRecordCount(hDBF); if(numRecords > 0) { qDebug() << "Info: DBF file has" << numRecords << "records"; } else { qDebug() << "Error: DBF file has no records!"; return -1; } // create sqlite database qDebug() << "Info: Creating SQLite Database..."; Kompex::SQLiteDatabase * pDatabase = new Kompex::SQLiteDatabase(dbFileName.toStdString(), SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,0); Kompex::SQLiteStatement * pStmt = new Kompex::SQLiteStatement(pDatabase); // create database schema (flat) if(ADMIN1) { qDebug() << "Info: Creating database schema for ADMIN1 profile"; pStmt->SqlStatement("CREATE TABLE IF NOT EXISTS data(" "regionid INTEGER PRIMARY KEY NOT NULL UNIQUE," "name TEXT NOT NULL," "code TEXT);"); // regionid <-> internel shape/record id [integer] size_t idx_objectid = DBFGetFieldIndex(hDBF,"OBJECTID"); // name <-> NAME_1 [text] size_t idx_name = DBFGetFieldIndex(hDBF,"NAME_1"); // code <-> Postal [text] size_t idx_code = DBFGetFieldIndex(hDBF,"Postal"); qDebug() << "Info: Writing records to database..."; pStmt->BeginTransaction(); for(size_t i=0; i < numRecords; i++) { QString record_id = QString::number(i+1); QString record_name(DBFReadStringAttribute(hDBF,i,idx_name)); QString record_code(DBFReadStringAttribute(hDBF,i,idx_code)); QString inStmt = "INSERT INTO data(regionid,name,code) VALUES(\"" + record_id + "\",\"" +record_name + "\",\"" + record_code + "\");"; pStmt->SqlStatement(inStmt.toUtf8().data()); // qDebug() << record_name; if(i % 1000 == 0) { qDebug() << "Info: Wrote" << i+1 << "/" << numRecords << "records"; } } pStmt->CommitTransaction(); qDebug() << "Info: Done!"; } // close dbf file DBFClose(hDBF); // clean up database delete pStmt; delete pDatabase; return 0; }