Guest User

Untitled

a guest
Mar 29th, 2018
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.02 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<libpq-fe.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<stdbool.h>
  6. #include<string.h>
  7. #include<string.h>
  8.  
  9. void sprawdz_czy_istnieje(char *name, char *wynik)
  10. {
  11. char komenda[300] = {"\0"};
  12. sprintf(komenda,"psql -l | cut -d '|' -f1 | grep -w %s > .test",name);
  13. system(komenda);
  14. FILE *plik = fopen(".test","r");
  15. if(plik != NULL)
  16. {
  17. fseek(plik,0,SEEK_END);
  18. int dlugosc = ftell(plik);
  19. if(dlugosc == 0)
  20. {
  21. sprintf(wynik,"createdb %s 2>/dev/null",name);
  22. system(wynik);
  23. printf("Baza danych %s utworzona. \n",name);
  24. }
  25. }
  26. fclose(plik);
  27. system("rm .test");
  28. }
  29.  
  30. void stworz_polaczenie_info(int argc,char *name,char *wynik)
  31. {
  32. char createdb[100] = {"\0"};
  33. char user[100] = {"\0"};
  34. char *haslo;
  35. sprintf(wynik,"createdb %s 2>/dev/null",name);
  36. system(wynik);
  37. printf("Logowanie\n");
  38. printf("Uzytkownik: \n");
  39. scanf("%s",user);
  40. haslo = getpass("Haslo: ");
  41. sprawdz_czy_istnieje(name,createdb);
  42. sprintf(wynik,"host=localhost port=5432 dbname=%s user=%s password=%s",name,user,haslo);
  43. }
  44.  
  45. bool pokaz(PGconn *polaczenie)
  46. {
  47. if(PQstatus(polaczenie) == CONNECTION_OK)
  48. {
  49. printf("Polaczono.\n");
  50. printf("Nazwa bazy danych: %s\n",PQdb(polaczenie));
  51. printf("Uzytkownik: %s\n", PQuser(polaczenie));
  52. printf("Haslo: ");
  53. int haslo_dl = strlen(PQpass(polaczenie));
  54. while(haslo_dl--){ printf("*"); }
  55. printf("\n");
  56. return true;
  57. }
  58. else
  59. {
  60. printf("Nie polaczono.\n%s\n",PQerrorMessage(polaczenie));
  61. return false;
  62. }
  63. }
  64.  
  65. void utworz_tabele_nazwa(char *zrodlo,char *wynik)
  66. {
  67. strncat(wynik,zrodlo,strlen(zrodlo));
  68. }
  69.  
  70. void drop(char *tabela_nazwa,char *wynik)
  71. {
  72. sprintf(wynik,"DROP TABLE %s;",tabela_nazwa);
  73. }
  74.  
  75. char *pole(char *linie, int nr)
  76. {
  77. char *podzial;
  78. for(podzial = strtok(linie,";");podzial && *podzial;podzial = strtok(NULL,";\n"))
  79. {
  80. if(!--nr) return podzial;
  81. }
  82. return NULL;
  83. }
  84.  
  85. int zlicz_kolumny(FILE *file)
  86. {
  87. char linie[1000] = {"\0"};
  88. fseek(file,0,0);
  89. fgets(linie,1000,file);
  90. char *pom = strdup(linie);
  91. int i,licznik = 1;
  92. for(i=0; i<strlen(pom);i++)
  93. {
  94. if(pom[i] == ';') licznik++;
  95. }
  96. free(pom);
  97. return licznik;
  98. }
  99.  
  100. void utworz_tabele(FILE *file,char *tabela_nazwa,char *wynik)
  101. {
  102. char linia[1000] = {"\0"};
  103. char kolumna[1000] = {"\0"};
  104. fgets(linia,1000,file);
  105. char *pom = strdup(linia);
  106. int i = 1, licznik = zlicz_kolumny(file);
  107. while(licznik--)
  108. {
  109. pom = strdup(linia);
  110. strcat(kolumna,"\t");
  111. strcat(kolumna,pole(pom,i));
  112. strcat(kolumna," VARCHAR(20),\n");
  113. i++;
  114. }
  115. sprintf(wynik,"CREATE TABLE %s (\n\tid SERIAL,\n",tabela_nazwa);
  116. strncat(wynik,kolumna,strlen(kolumna)-2);
  117. strcat(wynik,"\n);");
  118. free(pom);
  119. }
  120.  
  121. void wybierz_tabele(char *tabela_nazwa,char *wynik)
  122. {
  123. sprintf(wynik,"SELECT * FROM %s;",tabela_nazwa);
  124. }
  125.  
  126. void drukuj_T(PGresult * wynik)
  127. {
  128. int i,j;
  129. int rzedy = PQntuples(wynik);
  130. int pola = PQnfields(wynik);
  131. printf("Zwrocone rzedy: %d\n",rzedy);
  132. printf("Zwrocone pola: %d\n",pola);
  133. for(i=0;i<rzedy;i++)
  134. {
  135. for(j=0;j<pola;j++)
  136. {
  137. printf("%16s = %24s\n",PQfname(wynik,j),PQgetvalue(wynik,i,j));
  138. }
  139. printf("\n");
  140. }
  141. }
  142.  
  143. void SQL(PGconn *polaczenie,char *komenda)
  144. {
  145. PGresult *wynik;
  146. printf("> %s\n",komenda);
  147. wynik = PQexec(polaczenie,komenda);
  148. printf("Status: %s\n",PQresStatus(PQresultStatus(wynik)));
  149. printf("Zmienione: %s\n",PQcmdTuples(wynik));
  150. printf("Komunikat: %s\n",PQresultErrorMessage(wynik));
  151. switch(PQresultStatus(wynik))
  152. {
  153. case PGRES_TUPLES_OK:
  154. drukuj_T(wynik);
  155. break;
  156. }
  157. PQclear(wynik);
  158. }
  159.  
  160. void utworz_naglowki(FILE *file, char *wynik)
  161. {
  162. char linie[1000] = {"\0"};
  163. char naglowki[1000] = "(";
  164. fseek(file,0,0);
  165. fgets(linie,1000,file);
  166. char *pom = strdup(linie);
  167. int i = 1,licznik = zlicz_kolumny(file);
  168. while(licznik--)
  169. {
  170. pom = strdup(linie);
  171. strcat(naglowki,pole(pom,i));
  172. strcat(naglowki,", ");
  173. i++;
  174. }
  175. strncat(wynik,naglowki,strlen(naglowki)-2);
  176. strcat(wynik,")");
  177. free(pom);
  178. }
  179.  
  180. void alter_tab(char *tabela_nazwa,char *kolumna_nazwa,int rozmiar,char *wynik)
  181. {
  182. sprintf(wynik,"ALTER TABLE %s ALTER COLUMN %s TYPE VARCHAR(%d);", tabela_nazwa,kolumna_nazwa,rozmiar);
  183. }
  184.  
  185. void wstaw_tab(PGconn *polaczenie,FILE *file,char *tabela_nazwa)
  186. {
  187. char linie[1000] = {"\0"};
  188. char naglowki[300] = {"\0"};
  189. utworz_naglowki(file,naglowki);
  190. int i=1,j=0,licznik=zlicz_kolumny(file);
  191. fseek(file,0,0);
  192. char nagl[300] = {"\0"};
  193. fgets(nagl,300,file);
  194. int maxdl[licznik+1];
  195. for(i=1;i<=(licznik+1);i++)
  196. {
  197. maxdl[i] = 20;
  198. }
  199. while(fgets(linie,1000,file))
  200. {
  201. char wstaw[1000] = "INSERT INTO ";
  202. strcat(wstaw,tabela_nazwa);
  203. strcat(wstaw,naglowki);
  204. strcat(wstaw," VALUES\n(");
  205. char *pom;
  206. i=1;
  207. j=licznik;
  208. while(j--)
  209. {
  210. pom = strdup(linie);
  211. strcat(wstaw,"'");
  212. strcat(wstaw,pole(pom,i));
  213. pom = strdup(linie);
  214. if(strlen(pole(pom,i)) > maxdl[i])
  215. {
  216. pom = strdup(linie);
  217. maxdl[i] = strlen(pole(pom,i));
  218. char alter_tabela[300];
  219. pom = strdup(nagl);
  220. alter_tab(tabela_nazwa,(char*)pole(pom,i), maxdl[i],alter_tabela);
  221. SQL(polaczenie,alter_tabela);
  222. }
  223. strcat(wstaw,"'");
  224. if(j !=0) strcat(wstaw,",");
  225. i++;
  226. }
  227. strcat(wstaw,");");
  228. SQL(polaczenie,wstaw);
  229. }
  230. }
  231.  
  232. int main(int argc,char *argv[1])
  233. {
  234. FILE *file = fopen(argv[1],"r");
  235. argv[1][strlen(argv[1])-4] = 0;
  236. char polaczenie_info[300] ={"\0"};
  237. stworz_polaczenie_info(argc,argv[1],polaczenie_info);
  238. PGconn * polaczenie = PQconnectdb(polaczenie_info);
  239. if(!pokaz(polaczenie)) return 1;
  240. char tabela_nazwa[100] = {"\0"};
  241. char drop_tabela[300] = {"\0"};
  242. char create_tabela[500] = {"\0"};
  243. char select_tabela[300] = {"\0"};
  244.  
  245. switch(argc)
  246. {
  247. case 0:
  248. break;
  249. case 1:
  250. break;
  251. case 2:
  252. utworz_tabele_nazwa(argv[1],tabela_nazwa);
  253. drop(tabela_nazwa,drop_tabela);
  254. utworz_tabele(file,argv[1],create_tabela);
  255. wybierz_tabele(tabela_nazwa,select_tabela);
  256. SQL(polaczenie,drop_tabela);
  257. SQL(polaczenie,create_tabela);
  258. wstaw_tab(polaczenie,file,tabela_nazwa);
  259. SQL(polaczenie,select_tabela);
  260. break;
  261. }
  262. PQfinish(polaczenie);
  263. }
Add Comment
Please, Sign In to add comment