Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <libpq-fe.h>
- #include <termios.h>
- #define MAX 1000
- struct kolumny {
- char column[100];
- };
- void dropTable(char file[], PGconn *connection);
- void createTable(char file[], char linia[], struct kolumny tab[], PGconn *connection);
- void alterTable(char file[],char linia[], struct kolumny tab[], int ilosc, int wartosci[], PGconn *connection);
- void insertInto(char file[], char linia[], struct kolumny tab[],int ilosc, int wartosci[], PGconn *connection);
- int dlugosc(char linia[]);
- void nazwa(char file[]);
- int iloscKolumn(char linia[]);
- int main(int argc, char *argv[]) {
- char user[32];
- printf("Podaj login: ");
- scanf("%s",user);
- char *password;
- password = getpass("Podaj hasło: ");
- char login[200] = "host=localhost port=5432 dbname=lkarczewski user=";
- strcat(login,user);
- strcat(login," password=");
- strcat(login,password);
- if (argc == 2) {
- PGconn *connection = PQconnectdb(login);
- printf("Nawiązywanie połączenia...\n");
- if (PQstatus(connection) == CONNECTION_OK) {
- printf("Połączono\n");
- FILE *file = fopen(argv[1], "r");
- if (file) {
- nazwa(argv[1]);
- char linia[MAX];
- fgets(linia, MAX, file);
- dropTable(argv[1], connection);
- int ilosc = iloscKolumn(linia);
- struct kolumny tab[ilosc];
- int wartosci[ilosc];
- int i;
- for(i=0; i<ilosc; i++)
- wartosci[i] = 20;
- printf("Tworzę tabelę...\n");
- createTable(argv[1], linia, tab, connection);
- printf("Dodaję rekordy...\n");
- int nr_linii = 1;
- while (fgets(linia, MAX, file)) {
- insertInto(argv[1],linia,tab,ilosc,wartosci,connection);
- nr_linii++;
- }
- fclose(file);
- }
- else printf("Podany plik nie istnieje\n");
- PQfinish(connection);
- }
- else printf("Błąd połączenia\n");
- }
- else if (argc > 2) {
- PGconn *connection = PQconnectdb(login);
- if (PQstatus(connection) == CONNECTION_OK) {
- char strona[30] = "";
- strcat(strona,argv[argc-1]);
- FILE *html = fopen(strona,"w");
- if(html) {
- fprintf(html,"<!DOCTYPE html>\n<head>\n\n\t<title>Projekt1</title>\n\t<meta charset=\"UTF-8\"/>\n\t<style>\n\t\ttable{margin:10px auto;font-family:Trebuchet MS;}\n\t\tth {\n\t\t\tbackground-color: rgb(230, 40, 40);\n\t\t\tcolor: white;\n\t\t\tfont-weight: normal;\n\t\t\tpadding: 20px 30px;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\ttd {\n\t\t\tbackground-color: rgb(232, 238, 238);\n\t\t\tcolor: rgb(111, 111, 111);\n\t\t\tpadding: 20px 30px;\n\t\t}\n\t</style>\n</head>\n<body>");
- int i;
- for (i = 2; i < argc; i++) {
- char *select = malloc((strlen(argv[i]) + 20) * sizeof (char));
- sprintf(select, "SELECT * FROM %s;", argv[i]);
- PGresult *result = PQexec(connection, select);
- if (PQresultStatus(result) == PGRES_TUPLES_OK) {
- int l = 1;
- int n = 0, m = 0;
- int nrows = PQntuples(result);
- int nfields = PQnfields(result);
- fprintf(html,"\n\t<table>");
- fprintf(html,"\n\t\t<tr>");
- for (n = 0; n < nfields; n++)
- fprintf(html,"\n\t\t\t<th>%s</th>", PQfname(result, n));
- fprintf(html,"\n\t\t</tr>");
- for (m = 0; m < nrows; m++) {
- fprintf(html,"\n\t\t<tr>");
- for (n = 0; n < nfields; n++)
- fprintf(html,"\n\t\t\t<td>%s</td>", PQgetvalue(result, m, n));
- fprintf(html,"\n\t\t</tr>");
- }
- fprintf(html,"\n\t</table>");
- }
- PQclear(result);
- }
- fprintf(html,"</body>\n</html>");
- PQfinish(connection);
- fclose(html);
- }
- else
- printf("Błąd połączenia\n");
- }
- else
- printf("Niewystarczająca ilość argumentów\n");
- }
- return 0;
- }
- void dropTable(char file[], PGconn *connection) {
- char *drop = malloc((strlen(file) + 20) * sizeof (char));
- strcpy(drop, "DROP TABLE IF EXISTS ");
- strcat(drop, file);
- strcat(drop, ";");
- PQexec(connection, drop);
- free(drop);
- }
- void createTable(char file[], char linia[], struct kolumny tab[], PGconn *connection){
- int i;
- int k=1;
- int p = iloscKolumn(linia);
- int dl = dlugosc(linia);
- char *create = malloc((dl * p + strlen(file) + 50) * sizeof (char));
- strcpy(create, "CREATE TABLE ");
- strcat(create, file);
- strcat(create, "(");
- strcat(create, linia);
- strcpy(tab[0].column,linia);
- strcat(create, " VARCHAR(20) UNIQUE");
- for (i = strlen(linia) + 1; i < dl; i += strlen(linia + i) + 1,k++) {
- strcpy(tab[k].column,linia+i);
- strcat(create, ",");
- strcat(create, linia + i);
- strcat(create, " VARCHAR(20) DEFAULT NULL");
- }
- strcat(create, ");");
- PQexec(connection, create);
- printf("Utworzono tabelę\n");
- free(create);
- }
- void alterTable(char file[],char linia[], struct kolumny tab[], int ilosc, int wartosci[], PGconn *connection) {
- char *alter = malloc((strlen(file) + 100) * sizeof (char));
- char d[100];
- if(strlen(linia) > wartosci[ilosc]) {
- strcat(alter, "ALTER TABLE ");
- strcat(alter, file);
- strcat(alter, " ALTER COLUMN ");
- strcat(alter, tab[ilosc].column);
- strcat(alter, " TYPE VARCHAR(");
- sprintf(d,"%zu",strlen(linia)+1);
- strcat(alter, d);
- strcat(alter, ");");
- wartosci[ilosc] = strlen(linia)+1;
- PQexec(connection,alter);
- }
- free(alter);
- }
- void insertInto(char file[], char linia[], struct kolumny tab[],int ilosc, int wartosci[], PGconn *connection) {
- int i,k=1;
- int p = iloscKolumn(linia);
- int dl = dlugosc(linia);
- char *insert = malloc((dl+10 * p + strlen(file) + 50) * sizeof (char));
- strcpy(insert, "INSERT INTO ");
- alterTable(file,linia,tab,ilosc,wartosci,connection);
- strcat(insert, file);
- strcat(insert, " VALUES(");
- strcat(insert, "'");
- strcat(insert, linia);
- strcat(insert, "'");
- for (i = strlen(linia) + 1; (i < dl); i += strlen(linia + i) + 1,k++) {
- alterTable(file,linia+i,tab,k,wartosci,connection);
- strcat(insert, ",");
- strcat(insert, "'");
- strcat(insert, linia + i);
- strcat(insert, "'");
- }
- strcat(insert, ");");
- PQexec(connection, insert);
- printf("Dodano rekord\n");
- free(insert);
- }
- int dlugosc(char linia[]) {
- int i;
- for (i = 0; linia[i]; i++) {
- if (linia[i] == ';' || linia[i] == '\n')
- linia[i] = 0;
- }
- return i;
- }
- void nazwa(char file[]) {
- file[strlen(file) - 4] = 0;
- }
- int iloscKolumn(char linia[]) {
- int i;
- int kolumna = 1;
- for (i = 0; linia[i]; i++) {
- if (linia[i] == ';')
- kolumna++;
- }
- return kolumna;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement