Хорошая библиотека коннектора C/C++ для [закрытого] PostgreSQL

Самый простой путь состоит в том, чтобы преобразовать Ваш unsigned long с в unsigned long long с, сделать Ваше умножение и сравнить результат с 0x100000000LL.

Вы, вероятно, найдете, что это более эффективно, чем выполнение подразделения, поскольку Вы сделали в своем примере.

, О, и это будет работать и в C и в C++ (поскольку Вы отметили вопрос с обоими).

Просто взгляд на glibc руководство . Существует упоминание о прерывании целочисленного переполнения (FPE_INTOVF_TRAP) как часть SIGFPE. Это было бы идеально кроме противных битов в руководстве:

FPE_INTOVF_TRAP Целочисленное переполнение (невозможный в программе C, если Вы не включаете захват переполнения определенным для аппаратных средств способом).

Определенный позор действительно.

32
задан Milen A. Radev 17 July 2009 в 11:49
поделиться

3 ответа

libpq ++ - очень хороший соединитель для PostgreSQL

SQLAPI ++ - это библиотека C ++ для доступа к нескольким базам данных SQL (Oracle, SQL Server, DB2, Sybase, Informix, InterBase, SQLBase, MySQL, PostgreSQL и ODBC, SQLite).

Коннектор абстрактных баз данных - это библиотека C / C ++ для подключения к нескольким базам данных (MySQL, mSQL, PostgreSQL, Interbase, Informix, BDE, ODBC). Он работает в Linux, UNIX, BeOS и Windows, а динамический загрузчик драйверов для ОС ELF находится в стадии разработки

Navicat - хороший инструмент с графическим интерфейсом для PostgrSQL

29
ответ дан 27 November 2019 в 20:49
поделиться

Взгляните на SOCI. Библиотека с открытым исходным кодом под лицензией Boost Software License (одна из самых неограничительных лицензий).

Эта библиотека разработана специально для C ++ с учетом идеи общего программирования и безопасности типов.

Сайт SOCI

12115] С уважением,
Ованес

15
ответ дан 27 November 2019 в 20:49
поделиться

Я написал оболочку для libpq для наших нужд. Я долгое время был Zeoslib ( http://sourceforge.net/projects/zeoslib/ ), но они были полны проблем в последний раз, когда я их использовал, не поддерживали кешированные наборы данных и работали просто медленно.

libpq работает очень, очень быстро.

Я просто загружаю версию Postgres для Windows, копирую все библиотеки DLL в каталог lib и экспортирую вызовы, включаю .h и соответствующие ссылки.

Я понимаю, что это очень низкий уровень но я не могу достаточно подчеркнуть увеличение производительности, которое я получаю в результате.

Наше приложение представляет собой бизнес-приложение бухгалтерского / ERP-типа с довольно большой установочной базой, некоторые с довольно значительной одновременной базой множества пользователей (60, 100 подключений) ... Это нам очень пригодилось ... Вы можете ответить, если хотите получить более подробную информацию о том, как мы упаковываем libpq и обрабатываем кэшированные обновления.

UPDATE:  

Из запроса, вот шаги, чтобы обернуть libpq или использовать его непосредственно под окнами.

Во-первых, для установки уровня, В наши дни я использую Embarcadero RAD XE, поэтому следующие команды являются инструментами командной строки, которые поставляются с RAD XE. Вам также необходимо убедиться, что ваши инструменты командной строки находятся в переменной среды PATH, если еще не были. Если вы используете Visual Studio, вам придется разработать эквивалентные команды. По сути, я создаю файл .lib из .DLL

TEST.C - это минималистичный тестовый код, который я написал, чтобы убедиться, что я понял, как использовать libpq, а также чтобы проверить свой успех.

1.  Put all the DLLs into a directory and copy the include directory.  

Вам не нужно установить PostgreSQL с помощью сборки MSI для получения этих DLL, хотя это тоже сработает. Я скопировал библиотеки DLL из бинарной сборки. Файл. H-файлы также были взяты из двоичной сборки. Итак, мой каталог выглядит так:

  include\
     libpq-fe.h
     postgres_ext.h
  libeay32.dll
  libiconv-2.dll
  libintl-8.dll
  libpq.dll
  ssleay32.dll
  zlib1.dll



2.  Create an import library against LIBPQ.DLL as follows:
    implib -c -a libpq.lib libpq.dll

теперь должен иметь файл libpq.lib в том же каталоге, что и ваши DLL.

3.  build the test program (or any program) as follows:
    bcc32 test.c -l libpq.lib

test.c

#include <stdio.h>
#include "include/libpq-fe.h"


char *db       = "mydatabasename";
char *dbserver = "hostname";
char *uname    = "username";
char *pass     = "password";

char *SQL      = "select * from public.auditlog;";
// char *SQL      = "select userid, stationid from public.auditlog";

char     buff[200];
PGconn   *dbconn;
PGresult *res;

void main(void)
{
int nFields, i, j;

  printf("Attempting to Connect to Database Server:\n");
  printf("Database: %s\n", db);
  printf("Server  : %s\n", dbserver);

  sprintf(buff, "dbname=%s host=%s port=5432 user=%s password=%s",
                 db, dbserver, uname, pass);

  dbconn = PQconnectdb(buff);

  if( PQstatus(dbconn) != CONNECTION_OK )
    printf("Connection Failed: %s\n", PQerrorMessage(dbconn) );
  else
  {
    printf("Connected Successfully!\n");

    sprintf(buff, "BEGIN; DECLARE my_portal CURSOR FOR %s", SQL);

    res = PQexec(dbconn, buff);
    if( PQresultStatus(res) != PGRES_COMMAND_OK )
    {
      printf("Error executing SQL!: %s\n", PQerrorMessage(dbconn) );
      PQclear(res);
    }
    else
    {
      PQclear(res);
      res = PQexec(dbconn, "FETCH ALL in my_portal" );

      if( PQresultStatus(res) != PGRES_TUPLES_OK )
      {
        printf("ERROR, Fetch All Failed: %s", PQerrorMessage(dbconn) );
        PQclear(res);
      }
      else
      {
        nFields = PQnfields(res);

        // Print out the field names
        for(i=0; i<nFields; i++ )
          printf("%-15s", PQfname(res, i) );

        printf("\n");

        // Print out the rows
        for(i=0; i<PQntuples(res); i++)
        {
          for(j=0; j<nFields; j++)
            printf("%-15s", PQgetvalue(res, i, j) );

          printf("\n");
        }

        res = PQexec(dbconn, "END" );
        PQclear(res);
      }
    }

  }


  PQfinish(dbconn);
}

Теперь, чтобы получить доступ к системе PostgreSQL, я просто копирую файл libpq.lib в любой новый проект RAD-XE и добавьте в него libpq.lib. Я заключил libpq в транспортный драйвер базы данных, который как бы отделяет мой код доступа к базе данных.

На следующем снимке экрана показан проект RAD-XE под названием ptidb, который, в свою очередь, использует libpq для обеспечения поддержки PostgreSQL. Я также поддерживаю SQLite, за исключением SQLite. Я просто компилирую базу данных напрямую.

Затем я просто отправляю библиотеки DLL, перечисленные выше, вместе с моим конечным продуктом, проверяя, чтобы библиотеки DLL оказались в том же каталоге, что и мой продукт.

Это должен заставить вас идти. Если вас также интересует упаковка C ++, которую я делаю, дайте мне знать, и я опубликую еще одно обновление с некоторыми из них.

enter image description here

7
ответ дан 27 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: