Advertisement
Guest User

Untitled

a guest
Apr 4th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <libpq-fe.h>
  6. #include <unistd.h>
  7. #define MAX 1000
  8. #define MEDIUM 200
  9. #define MIN 50
  10.  
  11. enum COUNTER_ARGS{
  12. CREATE_TABLE = 2
  13. };
  14.  
  15. void printTuples(PGresult *result){
  16. int m, n;
  17. int nRows = PQntuples(result);
  18. int nFields = PQnfields(result);
  19. printf(" Number of rows returned = %d\n", nRows);
  20. printf(" Number of fields returned = %d\n\n", nFields);
  21. for (m = 0; m < nRows; m++){
  22. for (n = 0; n < nFields; n++){
  23. printf("%16s = %24s;\n", PQfname(result, n), PQgetvalue(result, m, n));
  24. }
  25. printf("\n");
  26. }
  27. }
  28.  
  29. void doSQL(PGconn *conn, char *command){
  30. PGresult *result;
  31. printf("> %s\n", command);
  32. printf("\n_____________________________________\n");
  33. result = PQexec(conn, command);
  34. printf(" Status is : %s\n", PQresStatus(PQresultStatus(result)));
  35. printf(" Rows affected : %s\n", PQcmdTuples(result));
  36. printf(" Result message: %s\n", PQresultErrorMessage(result));
  37. switch (PQresultStatus(result)){
  38. case PGRES_TUPLES_OK:
  39. printTuples(result);
  40. break;
  41. }
  42. printf("_____________________________________\n\n");
  43. PQclear(result);
  44. }
  45.  
  46. char *getField(char *line, int num){
  47. char *tok;
  48. for (tok = strtok(line, ";"); tok && *tok; tok = strtok(NULL, ";\n")){
  49. if (!--num){
  50. return tok;
  51. }
  52. }
  53. return NULL;
  54. }
  55.  
  56. void dbExist(char *dbname, char *result){
  57. char command[MEDIUM] = { "\0" };
  58. sprintf(command, "psql -l | cut -d '|' -f1 | grep -w %s > .exist_test", dbname);
  59. system(command);
  60. FILE *test = fopen(".exist_test", "r");
  61. if (test != NULL){
  62. fseek(test, 0, SEEK_END);
  63. int length = ftell(test);
  64. if (length == 0){
  65. sprintf(result, "createdb %s 2>/dev/null", dbname);
  66. system(result);
  67. printf("\nDatabase \"%s\" was created.\n", dbname);
  68. }
  69. }
  70. fclose(test);
  71. system("rm .exist_test");
  72. }
  73.  
  74. void createConnection(int argc, char *dbname, char *result){
  75. char createdb[MIN] = { "\0" };
  76. char username[MIN] = { "\0" };
  77. char *password;
  78. printf("\tLog in\n");
  79. printf("______________________________\n");
  80. if (argc == 2){
  81. printf("DBname: ");
  82. scanf("%s", dbname);
  83. }
  84. printf("Username: ");
  85. scanf("%s", username);
  86. password = getpass("Password: ");
  87. printf("______________________________\n\n");
  88. dbExist(dbname, createdb);
  89. sprintf(result, "host=localhost port=5432 dbname=%s user=%s password=%s", dbname, username, password);
  90. }
  91.  
  92. bool showLog(PGconn *conn){
  93. if (PQstatus(conn) == CONNECTION_OK){
  94. printf("\nConnection made!\n");
  95. printf("______________________________\n");
  96. printf("PGDBNAME = %s\n",PQdb(conn));
  97. printf("PGUSER = %s\n",PQuser(conn));
  98. printf("PGPASSWORD = ");
  99. int passLength = strlen(PQpass(conn));
  100. while (passLength--){
  101. printf("*");
  102. };
  103. printf("\n");
  104. printf("PGHOST = %s\n",PQhost(conn));
  105. printf("PGPORT = %s\n",PQport(conn));
  106. printf("______________________________\n\n");
  107. return true;
  108. }
  109. else{
  110. printf("Connection failed!\n%s\n", PQerrorMessage(conn));
  111. return false;
  112. }
  113. }
  114.  
  115. void crTlName(char *source, char *result){
  116. strncat(result, source, strlen(source) - 4);
  117. }
  118.  
  119. void dropTl(char *tblName, char *result){
  120. sprintf(result, "DROP TABLE %s;", tblName);
  121. }
  122.  
  123. int countColumns(FILE *file){
  124. char line[MAX] = { "\0" };
  125. fseek(file, 0, 0);
  126. fgets(line, MAX, file);
  127. char *tmp = strdup(line);
  128. int i, counter = 1;
  129. for (i = 0; i < strlen(tmp); i++){
  130. if (tmp[i] == ';'){
  131. counter++;
  132. }
  133. }
  134. free(tmp);
  135. return counter;
  136. }
  137.  
  138. void createHeaders(FILE *file, char *result){
  139. char line[MAX] = { "\0" };
  140. char headers[MAX] = "(";
  141. fseek(file, 0, 0);
  142. fgets(line, MAX, file);
  143. char *tmp = strdup(line);
  144. int i = 1, counter = countColumns(file);
  145. while (counter--){
  146. tmp = strdup(line);
  147. strcat(headers, getField(tmp, i));
  148. strcat(headers, ", ");
  149. i++;
  150. }
  151. strncat(result, headers, strlen(headers) - 2);
  152. strcat(result, ")");
  153. free(tmp);
  154. }
  155.  
  156. void createTbl(FILE *file, char *tblName, char *result){
  157. char line[MAX] = { "\0" };
  158. char columns[MAX] = { "\0" };
  159. fgets(line, MAX, file);
  160. char *tmp = strdup(line);
  161. int i = 1, counter = countColumns(file);
  162. while (counter--){
  163. tmp = strdup(line);
  164. strcat(columns, "\t");
  165. strcat(columns, getField(tmp, i));
  166. strcat(columns, " VARCHAR(20),\n");
  167. i++;
  168. }
  169. sprintf(result, "CREATE TABLE %s(\n\tid SERIAL,\n", tblName);
  170. strncat(result, columns, strlen(columns) - 2);
  171. strcat(result, "\n);");
  172. free(tmp);
  173. }
  174.  
  175. void alterTbl(char *tblName, char *columnName, int size, char *result){
  176. sprintf(result, "ALTER TABLE %s ALTER COLUMN %s TYPE VARCHAR(%d);", tblName, columnName, size);
  177. }
  178.  
  179. void insert(PGconn *conn, FILE *file, char *tblName){
  180. char line[MAX] = { "\0" };
  181. char headers[MEDIUM] = { "\0" };
  182. createHeaders(file, headers);
  183. int i = 1, j = 0, counter = countColumns(file);
  184. fseek(file, 0, 0);
  185. char head[MEDIUM] = { "\0" };
  186. fgets(head, MEDIUM, file);
  187. int maxLength[counter + 1];
  188. for (i = 1; i <= (counter + 1); i++){
  189. maxLength[i] = 20;
  190. }
  191. while (fgets(line, MAX, file)){
  192. char insertTbl[MAX] = "INSERT INTO ";
  193. strcat(insertTbl, tblName);
  194. strcat(insertTbl, headers);
  195. strcat(insertTbl, " VALUES\n(");
  196. char *tmp;
  197. i = 1;
  198. j = counter;
  199. while (j--){
  200. tmp = strdup(line);
  201. strcat(insertTbl, "'");
  202. strcat(insertTbl, getField(tmp, i));
  203. tmp = strdup(line);
  204. if (strlen(getField(tmp, i)) > maxLength[i]){
  205. tmp = strdup(line);
  206. maxLength[i] = strlen(getField(tmp, i));
  207. char alterTblCommand[MEDIUM];
  208. tmp = strdup(head);
  209. alterTbl(tblName, (char*) getField(tmp, i), maxLength[i], alterTblCommand);
  210. doSQL(conn, alterTblCommand);
  211. }
  212. strcat(insertTbl, "'");
  213. if (j != 0) strcat(insertTbl, ",");
  214. i++;
  215. }
  216. strcat(insertTbl, ");");
  217. doSQL(conn, insertTbl);
  218. }
  219. }
  220.  
  221. void selectTbl(char *tblName, char *result){
  222. sprintf(result, "SELECT * FROM %s;", tblName);
  223. }
  224.  
  225. int sortBy(int orderBy){
  226. printf("Order by: 1-id | 2-name :: ");
  227. scanf("%d", &orderBy);
  228. printf("\n");
  229. return orderBy;
  230. }
  231.  
  232. int main(int argc, char *argv[]){
  233. FILE *file = fopen(argv[1], "r");
  234. char connectionInfo[MEDIUM] = { "\0" };
  235. createConnection(argc, argv[1], connectionInfo);
  236. PGconn *conn = PQconnectdb(connectionInfo);
  237. if (!showLog(conn)){
  238. return 1;
  239. };
  240. char tblName[MIN] = { "\0" };
  241. char dropTblCommand[MEDIUM] = { "\0" };
  242. char createTblCommand[MAX] = { "\0" };
  243. char selectTblCommand[MEDIUM] = { "\0" };
  244. int orderBy = 1;
  245. switch(argc){
  246. case CREATE_TABLE:
  247. crTlName(argv[1], tblName);
  248. dropTl(tblName, dropTblCommand);
  249. createTbl(file, tblName, createTblCommand);
  250. selectTbl(tblName, selectTblCommand);
  251. doSQL(conn, dropTblCommand);
  252. doSQL(conn, createTblCommand);
  253. insert(conn, file, tblName);
  254. doSQL(conn, selectTblCommand);
  255. break;
  256. default:
  257. orderBy = sortBy(orderBy);
  258. }
  259. PQfinish(conn);
  260. return 0;
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement