33.13. C++ Ӧ��

ECPG ���� C++ Ӧ���ṩ�����޵�֧�֡���һ��������һЩ�Ҹ档

ecpgԤ����������һ���� C���������� C �Ķ�������Ƕ��ʽ SQL �����д�������ļ�����Ƕ��ʽ SQL ����ת���� C ���Կ飬�������ղ���һ��.c�ļ����� C++ ��ʹ��ʱ���������Ӧ������ C++ ���޷��ʹ�á�

����ͨ��ecpgԤ������ֻ��� C�����޷����� C++ ���Ե������﷨�ͱ����ʡ���ˣ�һЩд�� C++ Ӧ�ô����е�ʹ���� C++ �ض��������Ե�Ƕ��ʽ SQL ��������޷�����ȷ��Ԥ��������޷���Ԥ�ڹ�����

ʹ�� C++ Ӧ����Ƕ��ʽ SQL ����İ�ȫ�����ǰ� ECPG ����������һ�� C ģ���У�C++ Ӧ�ô�����������������ݿ⣬��Ҫ�����ʣ��� C++ ������������������� 33.13.2 节��

33.13.1. �������Ŀɼ�Χ

ecpgԤ����������� C �б����Ŀɼ�Χ���� C �����У������൱�򵥵ģ���Ϊ�����Ŀɼ�Χ�ǻ������ǵĴ����ġ������� C++ �У��������Ա�����Ĵ�����Dz�ͬ�ڶ�����Ĵ����ģ����ecpgԤ���������޷�������Ա�����Ŀɼ�Χ��

���磬�����������У�ecpgԤ�������޷�Ϊtest�����еı���dbname�ҵ��κ�������˽�����һ������

class TestCpp
{
    EXEC SQL BEGIN DECLARE SECTION;
    char dbname[1024];
    EXEC SQL END DECLARE SECTION;

  public:
    TestCpp();
    void test();
    ~TestCpp();
};

TestCpp::TestCpp()
{
    EXEC SQL CONNECT TO testdb1;
}

void Test::test()
{
    EXEC SQL SELECT current_database() INTO :dbname;
    printf("current_database = %s\n", dbname);
}

TestCpp::~TestCpp()
{
    EXEC SQL DISCONNECT ALL;
}

��δ��뽫����һ������Ĵ���

ecpg test_cpp.pgc
test_cpp.pgc:28: ERROR: variable "dbname" is not declared

Ϊ�˱������ֿɼ������⣬�����޸�test��������һ�����ر��������м�洢���������ַ���ֻ��һ�ֱȽϲ�ı�ͨ��������Ϊ���ô����ó�ª���ҽ��������ܡ�

void TestCpp::test()
{
    EXEC SQL BEGIN DECLARE SECTION;
    char tmp[1024];
    EXEC SQL END DECLARE SECTION;

    EXEC SQL SELECT current_database() INTO :tmp;
    strlcpy(dbname, tmp, sizeof(tmp));

    printf("current_database = %s\n", dbname);
}

33.13.2. ʹ���ⲿ C ģ��� C++ Ӧ�ÿ���

���������� C++ ��ecpgԤ����������Щ�������ƣ�������Ѿ�֪�������ӽ׶ΰ� C ����� C++ �������������� C++ Ӧ����ʹ�� ECPG ���Ա�ֱ���� C++ ������дһЩǶ��ʽ SQL ����Ҫ��á���һ����һ���򵥵�����������һ�ֽ�Ƕ��ʽ SQL ����� C++ Ӧ�ô����ж�����ȥ�ķ���������������У�Ӧ���� C++ ʵ�֣��� C �� ECPG ���������ӵ� PostgreSQL ��������

��Ҫ���������ļ���һ�� C �ļ���*.pgc����һ��ͷ�ļ���һ�� C++ �ļ���

test_mod.pgc

һ��ִ��Ƕ���� C �е� SQL ����������ģ�顣��Ԥ������ת����test_mod.c��

#include "test_mod.h"
#include <stdio.h>

void
db_connect()
{
    EXEC SQL CONNECT TO testdb1;
}

void
db_test()
{
    EXEC SQL BEGIN DECLARE SECTION;
    char dbname[1024];
    EXEC SQL END DECLARE SECTION;

    EXEC SQL SELECT current_database() INTO :dbname;
    printf("current_database = %s\n", dbname);
}

void
db_disconnect()
{
    EXEC SQL DISCONNECT ALL;
}

test_mod.h

�� C ģ�飨test_mod.pgc���к������ͷ�ļ�����ᱻtest_cpp.cpp����������ļ�������������Χ��һ��extern "C"�飬��Ϊ�����ӵ� C++ ģ�顣

#ifdef __cplusplus
extern "C" {
#endif

void db_connect();
void db_test();
void db_disconnect();

#ifdef __cplusplus
}
#endif

test_cpp.cpp

Ӧ�õ������룬����main����Լ���������е�һ�� C++ �ࡣ

#include "test_mod.h"

class TestCpp
{
  public:
    TestCpp();
    void test();
    ~TestCpp();
};

TestCpp::TestCpp()
{
    db_connect();
}

void
TestCpp::test()
{
    db_test();
}

TestCpp::~TestCpp()
{
    db_disconnect();
}

int
main(void)
{
    TestCpp *t = new TestCpp();

    t->test();
    return 0;
}

Ҫ������Ӧ�ã������²��账�?ͨ������ecpg��test_mod.pgcת��Ϊtest_mod.c�������� C ��������test_mod.c�����test_mod.o��

ecpg -o test_mod.c test_mod.pgc
cc -c test_mod.c -o test_mod.o

���ţ��� C++ ��������test_cpp.cpp�����test_cpp.o��

c++ -c test_cpp.cpp -o test_cpp.o

���ʹ�� C++ ������������Щ�����ļ���test_cpp.o��test_mod.o����Ϊһ����ִ���ļ���

c++ test_cpp.o test_mod.o -lecpg -o test_cpp