Advertisement
Guest User

Untitled

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