Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<libpq-fe.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<stdbool.h>
- #include<string.h>
- #include<string.h>
- void sprawdz_czy_istnieje(char *name, char *wynik)
- {
- char komenda[300] = {"\0"};
- sprintf(komenda,"psql -l | cut -d '|' -f1 | grep -w %s > .test",name);
- system(komenda);
- FILE *plik = fopen(".test","r");
- if(plik != NULL)
- {
- fseek(plik,0,SEEK_END);
- int dlugosc = ftell(plik);
- if(dlugosc == 0)
- {
- sprintf(wynik,"createdb %s 2>/dev/null",name);
- system(wynik);
- printf("Baza danych %s utworzona. \n",name);
- }
- }
- fclose(plik);
- system("rm .test");
- }
- void stworz_polaczenie_info(int argc,char *name,char *wynik)
- {
- char createdb[100] = {"\0"};
- char user[100] = {"\0"};
- char *haslo;
- printf("Logowanie\n");
- if(argc == 2)
- {
- printf("Nazwa bazy danych: \n");
- scanf("%s",name);
- }
- printf("Uzytkownik: \n");
- scanf("%s",user);
- haslo = getpass("Haslo: ");
- sprawdz_czy_istnieje(name,createdb);
- sprintf(wynik,"host=localhost port=5432 dbname=%s user=%s password=%s",name,user,haslo);
- }
- bool pokaz(PGconn *polaczenie)
- {
- if(PQstatus(polaczenie) == CONNECTION_OK)
- {
- printf("Polaczono.\n");
- printf("Nazwa bazy danych: %s\n",PQdb(polaczenie));
- printf("Uzytkownik: %s\n", PQuser(polaczenie));
- printf("Haslo: ");
- int haslo_dl = strlen(PQpass(polaczenie));
- while(haslo_dl--){ printf("*"); }
- printf("\n");
- return true;
- }
- else
- {
- printf("Nie polaczono.\n%s\n",PQerrorMessage(polaczenie));
- return false;
- }
- }
- void utworz_tabele_nazwa(char *zrodlo,char *wynik)
- {
- strncat(wynik,zrodlo,strlen(zrodlo) - 4);
- }
- void drop(char *tabela_nazwa,char *wynik)
- {
- sprintf(wynik,"DROP TABLE %s;",tabela_nazwa);
- }
- char *pole(char *linie, int nr)
- {
- char *podzial;
- for(podzial = strtok(linie,";");podzial && *podzial;podzial = strtok(NULL,";\n"))
- {
- if(!--nr) return podzial;
- }
- return NULL;
- }
- int zlicz_kolumny(FILE *file)
- {
- char linie[1000] = {"\0"};
- fseek(file,0,0);
- fgets(linie,1000,file);
- char *pom = strdup(linie);
- int i,licznik = 1;
- for(i=0; i<strlen(pom);i++)
- {
- if(pom[i] == ';') licznik++;
- }
- free(pom);
- return licznik;
- }
- void utworz_tabele(FILE *file,char *tabela_nazwa,char *wynik)
- {
- char linia[1000] = {"\0"};
- char kolumna[1000] = {"\0"};
- fgets(linia,1000,file);
- char *pom = strdup(linia);
- int i = 1, licznik = zlicz_kolumny(file);
- while(licznik--)
- {
- pom = strdup(linia);
- strcat(kolumna,"\t");
- strcat(kolumna,pole(pom,i));
- strcat(kolumna," VARCHAR(20),\n");
- i++;
- }
- sprintf(wynik,"CREATE TABLE %s(\n\tid SERIAL,\n",tabela_nazwa);
- sprintf(wynik,kolumna,strlen(kolumna)-2);
- strcat(wynik,"\n);");
- free(pom);
- }
- void wybierz_tabele(char *tabela_nazwa,char *wynik)
- {
- sprintf(wynik,"SELECT * FROM %s;",tabela_nazwa);
- }
- void drukuj_T(PGresult * wynik)
- {
- int i,j;
- int rzedy = PQntuples(wynik);
- int pola = PQnfields(wynik);
- printf("Zwrocone rzedy: %d\n",rzedy);
- printf("Zwrocone pola: %d\n",pola);
- for(i=0;i<rzedy;i++)
- {
- for(j=0;j<pola;j++)
- {
- printf("%10s = %10s\n",PQfname(wynik,j),PQgetvalue(wynik,i,j));
- }
- printf("\n");
- }
- }
- void SQL(PGconn *polaczenie,char *komenda)
- {
- PGresult *wynik;
- printf("> %s\n",komenda);
- wynik = PQexec(polaczenie,komenda);
- printf("Status: %s\n",PQresStatus(PQresultStatus(wynik)));
- printf("Zmienione: %s\n",PQcmdTuples(wynik));
- printf("Komunikat: %s\n",PQresultErrorMessage(wynik));
- switch(PQresultStatus(wynik))
- {
- case PGRES_TUPLES_OK:
- drukuj_T(wynik);
- break;
- }
- PQclear(wynik);
- }
- void utworz_naglowki(FILE *file, char *wynik)
- {
- char linie[1000] = {"\0"};
- char naglowki[1000] = "(";
- fseek(file,0,0);
- fgets(linie,1000,file);
- char *pom = strdup(linie);
- int i = 1,licznik = zlicz_kolumny(file);
- while(licznik--)
- {
- pom = strdup(linie);
- strcat(naglowki,pole(pom,i));
- strcat(naglowki,", ");
- i++;
- }
- strncat(wynik,naglowki,strlen(naglowki)-2);
- strcat(wynik,")");
- free(pom);
- }
- void alter_tab(char *tabela_nazwa,char *kolumna_nazwa,int rozmiar,char *wynik)
- {
- sprintf(wynik,"ALTER TABLE %s ALTER COLUMN %s TYPE VARCHAR(%d);", tabela_nazwa,kolumna_nazwa,rozmiar);
- }
- void wstaw_tab(PGconn *polaczenie,FILE *file,char *tabela_nazwa)
- {
- char linie[1000] = {"\0"};
- char naglowki[300] = {"\0"};
- utworz_naglowki(file,naglowki);
- int i=1,j=0,licznik=zlicz_kolumny(file);
- fseek(file,0,0);
- char nagl[300] = {"\0"};
- fgets(nagl,300,file);
- int maxdl[licznik+1];
- for(i=1;i<=licznik+1;i++)
- {
- maxdl[i] = 20;
- }
- while(fgets(linie,1000,file))
- {
- char wstaw[1000] = "INSERT INTO ";
- strcat(wstaw,tabela_nazwa);
- strcat(wstaw,naglowki);
- strcat(wstaw," VALUES\n(");
- char *pom;
- i=1;
- j=licznik;
- while(j--)
- {
- pom = strdup(linie);
- strcat(wstaw,"'");
- strcat(wstaw,pole(pom,i));
- pom = strdup(linie);
- if(strlen(pole(pom,i)) > maxdl[i])
- {
- pom = strdup(linie);
- maxdl[i] = strlen(pole(pom,i));
- char alter_tabela[300];
- pom = strdup(nagl);
- alter_tab(tabela_nazwa,(char*)pole(pom,i), maxdl[i],alter_tabela);
- SQL(polaczenie,alter_tabela);
- }
- strcat(wstaw,"'");
- if(j !=0) strcat(wstaw,",");
- i++;
- }
- strcat(wstaw,");");
- SQL(polaczenie,wstaw);
- }
- }
- int main(int argc,char *argv[1])
- {
- FILE *file = fopen(argv[1],"r");
- char polaczenie_info[300] ={"\0"};
- stworz_polaczenie_info(argc,argv[1],polaczenie_info);
- PGconn * polaczenie = PQconnectdb(polaczenie_info);
- if(!pokaz(polaczenie)) return 1;
- char tabela_nazwa[100] = {"\0"};
- char drop_tabela[300] = {"\0"};
- char create_tabela[500] = {"\0"};
- char select_tabela[300] = {"\0"};
- switch(argc)
- {
- case 0:
- break;
- case 1:
- break;
- case 2:
- utworz_tabele_nazwa(argv[1],tabela_nazwa);
- drop(tabela_nazwa,drop_tabela);
- utworz_tabele(file,tabela_nazwa,create_tabela);
- wybierz_tabele(tabela_nazwa,select_tabela);
- SQL(polaczenie,drop_tabela);
- SQL(polaczenie,create_tabela);
- wstaw_tab(polaczenie,file,tabela_nazwa);
- SQL(polaczenie,select_tabela);
- break;
- }
- PQfinish(polaczenie);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement