Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <libpq-fe.h>
- #include <string.h>
- #include <unistd.h>
- #include <limits.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include "csvparser.h"
- #define ClearScreen() printf("\033[H\033[J")
- #define BUFFER 256
- #define VARCHAR_LEN 20
- #define HTML_HEADER \
- "<!doctype html>\
- <html lang=\"en\">\
- <head>\
- <meta charset=\"utf-8\">\
- <title>Select output</title>\
- <meta name=\"description\" content=\"Select output\">\
- <meta name=\"author\" content=\"SitePoint\">\
- <style>\
- table {\
- border-collapse: collapse;\
- width: 100%;\
- text-align: center;\
- }\
- table, th {\
- border: 1px solid black;\
- }\
- </style>\
- </head>\
- <body>\
- <table>"
- #define HTML_FOOT \
- "</table>\
- </body>\
- </html>"
- PGconn *conn;
- char csvFileName[BUFFER];
- char databaseName[BUFFER];
- char *RemoveExt(char* mystr) {
- char *retstr;
- char *lastdot;
- if (mystr == NULL)
- return NULL;
- if ((retstr = malloc (strlen (mystr) + 1)) == NULL)
- return NULL;
- strcpy (retstr, mystr);
- lastdot = strrchr (retstr, '.');
- if (lastdot != NULL)
- *lastdot = '\0';
- return retstr;
- }
- void ConnectToDatabse()
- {
- char connectionString[BUFFER] = "";
- char login[32];
- fprintf(stderr, "%s", "Login: ");
- scanf("%s", login);
- char *password= getpass("Password:");
- sprintf(connectionString, "host=localhost port=5432 dbname=%s user=%s password=%s", databaseName, login, password);
- conn = PQconnectdb(connectionString);
- if(!(PQstatus(conn) == CONNECTION_OK))
- {
- printf("Connection failed: %s\n", PQerrorMessage(conn));
- exit(0);
- }
- }
- void doSQL(PGconn *conn, char *command)
- {
- PGresult *result;
- printf("%s\n", command);
- result = PQexec(conn, command);
- printf("status is : %s\n", PQresStatus(PQresultStatus(result)));
- printf("#rows affected: %s\n", PQcmdTuples(result));
- printf("result message: %s\n", PQresultErrorMessage(result));
- PQclear(result);
- }
- void DisplayMenu()
- {
- ClearScreen();
- printf("[ Baza danych: %s ]\n", databaseName);
- printf("[ Plik csv: %s ]\n\n", csvFileName);
- printf("[1] - Wczytaj csv. \n");
- printf("[2] - Stworz tabele. \n");
- printf("[3] - Dodaj rzad do tabeli. \n");
- printf("[4] - Drukuj do HTML. \n");
- printf("[x] - Zakoncz program. \n\n");
- printf("Wybierz opcje: ");
- }
- void PromptToContinue()
- {
- char c;
- printf("\nKontynuuj...");
- while(((c=getchar()) != '\n') && c != EOF);
- getchar();
- }
- void ExtendColumn(int lenght, const char *columnName)
- {
- printf("\n==> Rozszerzanie istniejącej kolumny...\n\n");
- char tempString[BUFFER];
- sprintf(tempString, "ALTER TABLE %s ALTER COLUMN %s TYPE VARCHAR(%i)", RemoveExt(csvFileName), columnName, lenght);
- doSQL(conn, tempString);
- printf("\n");
- }
- void CreateTable()
- {
- char commandString[2048] = "";
- char tempString[BUFFER] = "";
- char c;
- // DELETE OLD TABLE
- printf("\n=> Usuwanie starej tabeli...\n\n");
- sprintf(commandString, "DROP TABLE %s", RemoveExt(csvFileName));
- doSQL(conn, commandString);
- // CREATE NEW TABLE
- printf("\n=> Tworzenia nowej tabeli...\n\n");
- CsvParser *csvparser = CsvParser_new(csvFileName, ";", 1);
- CsvRow *row;
- const CsvRow *header = CsvParser_getHeader(csvparser);
- sprintf(commandString, "CREATE TABLE %s(", RemoveExt(csvFileName));
- const char **headerFields = CsvParser_getFields(header);
- for (int i = 0 ; i < CsvParser_getNumFields(header) ; i++)
- {
- if(i == 0) sprintf(tempString, "%s VARCHAR(%i) UNIQUE", headerFields[i],VARCHAR_LEN);
- else sprintf(tempString, "%s VARCHAR(%i)", headerFields[i],VARCHAR_LEN);
- if(i != CsvParser_getNumFields(header)-1 ) strcat(tempString, ",");
- strcat(commandString, tempString);
- }
- strcat(commandString, ");");
- doSQL(conn, commandString);
- // INSERT DATA
- printf("\n=> Dodawanie nowych pozycji do tabeli...\n\n");
- sprintf(commandString, "INSERT INTO %s(", RemoveExt(csvFileName));
- for (int i = 0 ; i < CsvParser_getNumFields(header) ; i++)
- {
- sprintf(tempString, "%s", headerFields[i]);
- if(i != CsvParser_getNumFields(header)-1 ) strcat(tempString, ",");
- strcat(commandString, tempString);
- }
- strcat(commandString, ") VALUES (");
- while ((row = CsvParser_getRow(csvparser))) {
- const char **rowFields = CsvParser_getFields(row);
- for (int i = 0 ; i < CsvParser_getNumFields(row) ; i++) {
- if(strlen(rowFields[i]) > VARCHAR_LEN) ExtendColumn((int)strlen(rowFields[i]), headerFields[i]);
- sprintf(tempString, "'%s'", rowFields[i]);
- if(i != CsvParser_getNumFields(row)-1 ) strcat(tempString, ",");
- strcat(commandString, tempString);
- }
- CsvParser_destroy_row(row);
- strcat(commandString, "),(");
- }
- commandString[strlen(commandString)-2] = 0;
- strcat(commandString, ";");
- doSQL(conn, commandString);
- CsvParser_destroy(csvparser);
- PromptToContinue();
- DisplayMenu();
- }
- void AddRow()
- {
- printf("\n");
- char commandString[2048] = "";
- char tempString[BUFFER] = "";
- char inputString[BUFFER] = "";
- CsvParser *csvparser = CsvParser_new(csvFileName, ";", 1);
- CsvRow *row;
- const CsvRow *header = CsvParser_getHeader(csvparser);
- const char **headerFields = CsvParser_getFields(header);
- sprintf(commandString, "INSERT INTO %s(", RemoveExt(csvFileName));
- for (int i = 0 ; i < CsvParser_getNumFields(header) ; i++)
- {
- sprintf(tempString, "%s", headerFields[i]);
- if(i != CsvParser_getNumFields(header)-1 ) strcat(tempString, ",");
- strcat(commandString, tempString);
- }
- strcat(commandString, ") VALUES (");
- for (int i = 0 ; i < CsvParser_getNumFields(header) ; i++)
- {
- printf("Podaj wartosc dla kolumny %s: ", headerFields[i]);
- scanf("%s", inputString);
- if(strlen(inputString) > VARCHAR_LEN) ExtendColumn((int)strlen(inputString), headerFields[i]);
- sprintf(tempString, "'%s'", inputString);
- if(i != CsvParser_getNumFields(header)-1 ) strcat(tempString, ",");
- strcat(commandString, tempString);
- }
- printf("\n=> Dodawanie nowej pozycji do tabeli...\n\n");
- strcat(commandString, ");");
- doSQL(conn, commandString);
- CsvParser_destroy(csvparser);
- PromptToContinue();
- DisplayMenu();
- }
- void GetCsv()
- {
- char filename[BUFFER];
- printf("Podaj nazwe pliku: ");
- scanf("%s", filename);
- while(access(filename, F_OK ))
- {
- printf("Taki plik nie istnieje.\n");
- printf("Podaj nazwe pliku: ");
- scanf("%s", filename);
- }
- strcpy(csvFileName, filename);
- DisplayMenu();
- }
- void PrintSelectToHtml(char* outputFileName, char *arguments[], int argumentsCount, int mode)
- {
- char html[4096] = HTML_HEADER;
- char tempString[BUFFER] = "";
- char commandString[BUFFER] = "";
- PGresult *result;
- for(int i = 0; i<argumentsCount; i++)
- {
- sprintf(commandString, "SELECT * FROM %s", arguments[i]);
- result = PQexec(conn, commandString);
- if (mode != 1)
- {
- printf("\n%s\n", commandString);
- printf("status is : %s\n", PQresStatus(PQresultStatus(result)));
- printf("#rows affected: %s\n", PQcmdTuples(result));
- printf("result message: %s\n", PQresultErrorMessage(result));
- }
- switch(PQresultStatus(result))
- {
- case PGRES_TUPLES_OK:
- {
- int m, n;
- int nrows = PQntuples(result);
- int nfields = PQnfields(result);
- strcat(html, "<tr>");
- for(n = 0; n < nfields; n++)
- {
- sprintf(tempString, "<th>%s</th>", PQfname(result, n));
- strcat(html, tempString);
- }
- strcat(html, "</tr>");
- for(m = 0; m < nrows; m++)
- {
- strcat(html, "<tr>");
- for(n = 0; n < nfields; n++)
- {
- sprintf(tempString, "<td>%s</td>", PQgetvalue(result, m, n));
- strcat(html, tempString);
- }
- strcat(html, "</tr>");
- }
- }
- }
- }
- strcat(html, HTML_FOOT);
- PQclear(result);
- if(mode != 1)
- {
- FILE *f = fopen(outputFileName, "w");
- fprintf(f, "%s", html);
- fclose(f);
- printf("Wynik zapytania zapisany w pliku %s.\n", outputFileName);
- PromptToContinue();
- }
- else printf("%s", html);
- }
- int main(int argc, char *argv[])
- {
- if(argc >= 2)
- {
- strcpy(databaseName, argv[1]);
- ConnectToDatabse();
- char tempString[BUFFER];
- sprintf(tempString, "%s.html", argv[1]);
- PrintSelectToHtml(tempString, argv+2, argc-1, 1);
- }
- else
- {
- strcpy(csvFileName, "brak");
- ClearScreen();
- printf("[ Connecting to database ] \n");
- fprintf(stderr, "%s", "Nazwa bazy: ");
- scanf("%s", databaseName);
- ConnectToDatabse();
- char c;
- DisplayMenu();
- while ((c = fgetc(stdin)) != 'x')
- {
- if(c == '1') GetCsv();
- else if (c == '2')
- {
- if(strcmp(csvFileName, "brak") == 0)
- {
- printf("Najpierw wybierz plik csv!\n");
- printf("Wybierz opcje: ");
- }
- else CreateTable();
- }
- else if (c == '3')
- {
- if(strcmp(csvFileName, "brak") == 0)
- {
- printf("Najpierw wybierz plik csv!\n");
- printf("Wybierz opcje: ");
- }
- else AddRow();
- }
- else if (c == '4')
- {
- char tableName[BUFFER];
- char outputFileName[BUFFER];
- printf("Podaj nazwe tabeli: ");
- scanf("%s", tableName);
- printf("Podaj nazwe pliku docelowego: ");
- scanf("%s", outputFileName);
- char *arguments[] = {tableName};
- PrintSelectToHtml(outputFileName, arguments, 1, 0);
- DisplayMenu();
- }
- }
- PQfinish(conn);
- return EXIT_SUCCESS;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement