2013-02-23 6 views
1

Я пытаюсь создать соединение с libpq с C. Если я создаю это соединение с PQconnectdb, все будет хорошо, но если я создам его с помощью функции PQconnectdbParams, с тем же параметры, которые хранятся по-другому (см. libpq reference), я получаю ошибку ошибки сегментации без какого-либо другого сообщения. Может ли кто-нибудь помочь мне в этом вопросе?Проблема при попытке подключения к postgres из C

вы можете увидеть мой код ниже:


int main(int argc, char *argv[]) { 
     char **keywords; 
     char **values; 
     char *line = malloc(50); 
     char *prop, *tmp, *val; 
     int i = 0, j = 0; 
     FILE *creds = fopen("/path/to/file.props", "r"); 
     if (creds == NULL) { 
      LOG("%s", "error: cannot open credentials file.\n"); 
      exit(1); 
     } 

     keywords = malloc(5 * sizeof(*keywords)); 
     values = malloc(5 * sizeof(*values)); 
     while (fgets(line, LINE_SIZE, creds) != NULL) { 
       if (line[strlen(line) - 1] == '\n') 
         line[strlen(line) - 1] = '\0'; 
       prop = line; 
       while(*(prop++) != '=') { 
         i++; 
       } 
       tmp = prop; 
       prop = malloc(i + 1); 
       strncpy(prop, line, i); 
       prop[i] = '\0'; 
       keywords[j] = prop; 
       val = malloc(strlen(line) - strlen(prop) + 1); 
       strcpy(val, tmp); 
       values[j++] = val; 
       i = 0; 
     } 
printf("%s %s %s %s %s\n", keywords[0], keywords[1], keywords[2], keywords[3], keywords[4]); //that lines prints ok 
printf("%s %s %s %s %s\n", values[0], values[1], values[2], values[3], values[4]); // 
     PGconn *conn = PQconnectdbParams(keywords, values, 0); 

     if (PQstatus(conn) != CONNECTION_OK) { 

       fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); 
       PQfinish(conn); 
       exit(1); 

     } 
} 
+0

Вы проверили с помощью GDB? где он указывает код? Можете ли вы использовать 'strtok_r()' и 'strdup()' вместо этого? какая ОС? – SparKot

ответ

3

Док для PQconnectdbParams говорит:

Эта функция открывает новое соединение с базой данных, используя параметры , взятых из двух NULL завершающих массивов.

Но в вашем коде это выглядит как keywordsvalues и массивы не нуль. Он выделяет 5 указателей для 5 параметров, но он должен выделить 6 указателей для 5 параметров плюс указатель NULL.

+0

Ясный, как солнечный свет. Только нужно обратить внимание на детали. Спасибо, что просветил меня. :) – artaxerxe