Самый простой путь состоит в том, чтобы преобразовать Ваш unsigned long
с в unsigned long long
с, сделать Ваше умножение и сравнить результат с 0x100000000LL.
Вы, вероятно, найдете, что это более эффективно, чем выполнение подразделения, поскольку Вы сделали в своем примере.
, О, и это будет работать и в C и в C++ (поскольку Вы отметили вопрос с обоими).
Просто взгляд на glibc руководство . Существует упоминание о прерывании целочисленного переполнения (FPE_INTOVF_TRAP
) как часть SIGFPE
. Это было бы идеально кроме противных битов в руководстве:
FPE_INTOVF_TRAP
Целочисленное переполнение (невозможный в программе C, если Вы не включаете захват переполнения определенным для аппаратных средств способом).
Определенный позор действительно.
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
Взгляните на SOCI. Библиотека с открытым исходным кодом под лицензией Boost Software License (одна из самых неограничительных лицензий).
Эта библиотека разработана специально для C ++ с учетом идеи общего программирования и безопасности типов.
12115] С уважением,
Ованес
Я написал оболочку для 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 ++, которую я делаю, дайте мне знать, и я опубликую еще одно обновление с некоторыми из них.