как вставить несколько двоичных строк с помощью PQputCopyData libpq - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь вставить несколько двоичных строк с помощью PQputCopyData, в моем случае две строки, вот мой код, он не работает, вставляя две строки. Я не знаю, как я могу структурировать свой буфер для вставки нескольких строк. Не могли бы вы помочь, пожалуйста?

В моей таблице два идентификатора столбца: целое число и имя: текст

Сообщения об ошибках: «ОШИБКА: количество полей строки равно 0, ожидается 2 КОНТЕКСТ: КОПИРОВАТЬ t, строка 2 "

 res = PQexec(conn, "create table if not exists t(id int, name text);");
 PQclear(res);

 /* Binary COPY demo */
  char header[12] = "PGCOPY\n\377\r\n\0";
  int flag = 0;
  int extension = 0;
  char buffer[100];
  memcpy(buffer, header, 11);
  memcpy(&buffer[11], (void *)&flag, 4);
  memcpy(&buffer[15], (void *)&extension, 4);
  short fieldnum = 2;
  memcpy(&buffer[19], myhton((char *)&fieldnum, 2), 2);  

  // Here i insert the first row
  int size = 4;
  memcpy(&buffer[21], myhton((char *)&size, 4), 4);
  int id = 10;
  memcpy(&buffer[25], (void *)&id, 4);
  size = 10;
  memcpy(&buffer[29], myhton((char *)&size, 4), 4);
  memcpy(&buffer[33], "bbbbbccccc", 10);

  // here i insert the second row
  size = 4;
  memcpy(&buffer[43], myhton((char *)&size, 4), 4);
  int id1 = 14;
  memcpy(&buffer[47], (void *)&id1, 4);
  size = 5;
  memcpy(&buffer[51], myhton((char *)&size, 4), 4);
  memcpy(&buffer[55], "dddee", 5);

  short negative = -1;
  memcpy(&buffer[60], myhton((char *)&negative, 2), 2);


  res = PQexec(conn, "COPY t FROM STDIN (FORMAT binary);");
  if (PQresultStatus(res) != PGRES_COPY_IN) {
    cout << "Not in COPY_IN mode";
    PQclear(res);
  } else {
    PQclear(res);
    cout << "Enter COPY_IN mode" << endl;
    int copyRes = PQputCopyData(conn, buffer, 62);
    if (copyRes == 1) {
      if (PQputCopyEnd(conn, NULL) == 1) {
        res = PQgetResult(conn);
        if (PQresultStatus(res) == PGRES_COMMAND_OK) {
          cout << "Insert a record successfully" << endl;
        } else {
          cout << PQerrorMessage(conn) << endl;
        }
        PQclear(res);
      } else {
        cout << PQerrorMessage(conn) << endl;
      }
    } else if (copyRes == 0) {
      cout << "Send no data, connection is in nonblocking mode" << endl;
    } else if (copyRes == -1) {
      cout << "Error occur: " << PQerrorMessage(conn) << endl;
    }
  }


...