1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
/*
* PROGRAM: Object oriented API samples.
* MODULE: 01.create.cpp
* DESCRIPTION: A sample of creating new database and new table in it.
* Run second time (when database already exists) to see
* how FbException is caught and handled by this code.
*
* Example for the following interfaces:
* IMaster - main inteface to access all the rest
* IStatus - returns the status of executed command
* IProvider - main interface to access DB / service
* IAttachment - database attachment interface
* ITransaction - transaction interface
* IUtil - helper calls here and there
* IXpbBuilder - build various parameters blocks
*
* Run something like this to build: c++ 01.create.cpp -lfbclient
*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
*
* Software distributed under the License is distributed AS IS,
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
* See the License for the specific language governing rights
* and limitations under the License.
*
* The Original Code was created by Alexander Peshkoff
* for the Firebird Open Source RDBMS project.
*
* Copyright (c) 2013 Alexander Peshkoff <peshkoff@mail.ru>
* and all contributors signed below.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#include "ifaceExamples.h"
// Here we get access to master interface. This is main interface of firebird,
// and the only one for getting which there is special function in our API.
static IMaster* master = fb_get_master_interface();
int main()
{
int rc = 0;
// set default password if none specified in environment
setenv("ISC_USER", "sysdba", 0);
setenv("ISC_PASSWORD", "masterkey", 0);
// Declare pointers to required interfaces
// IStatus is used to return wide error description to user
// IProvider is needed to start to work with database (or service)
// Status vector, main dispatcher and utility interfaces are returned by IMaster functions
// No error return may happen - these functions always succeed
IStatus* st = master->getStatus();
IProvider* prov = master->getDispatcher();
IUtil* utl = master->getUtilInterface();
// IAttachment and ITransaction contain methods to work with database attachment
// and transactions
IAttachment* att = NULL;
ITransaction* tra = NULL;
// IXpbBuilder is used to access various parameters blocks used in API
IXpbBuilder* dpb = NULL;
try
{
// Status wrapper - will be used later in all calls where status interface is needed
// With ThrowStatusWrapper passed as status interface FbException will be thrown on error
ThrowStatusWrapper status(st);
// create DPB - use non-default page size 4Kb
dpb = utl->getXpbBuilder(&status, IXpbBuilder::DPB, NULL, 0);
dpb->insertInt(&status, isc_dpb_page_size, 4 * 1024);
// create empty database
att = prov->createDatabase(&status, "fbtests.fdb", dpb->getBufferLength(&status),
dpb->getBuffer(&status));
printf("Database fbtests.fdb created\n");
// detach from database
att->detach(&status);
att = NULL;
// attach it once again
att = prov->attachDatabase(&status, "fbtests.fdb", 0, NULL);
printf("Re-attached database fbtests.fdb\n");
// start transaction
tra = att->startTransaction(&status, 0, NULL);
// create table
att->execute(&status, tra, 0, "create table dates_table (d1 date)", SAMPLES_DIALECT,
NULL, NULL, NULL, NULL); // Input parameters and output data not used
// commit transaction retaining
tra->commitRetaining(&status);
printf("Table dates_table created\n");
// insert a record into dates_table
att->execute(&status, tra, 0, "insert into dates_table values (CURRENT_DATE)", SAMPLES_DIALECT,
NULL, NULL, NULL, NULL); // Input parameters and output data not used
// commit transaction (will close interface)
tra->commit(&status);
tra = NULL;
printf("Record inserted into dates_table\n");
// detach from database (will close interface)
att->detach(&status);
att = NULL;
}
catch (const FbException& error)
{
// handle error
rc = 1;
char buf[256];
utl->formatStatus(buf, sizeof(buf), error.getStatus());
fprintf(stderr, "%s\n", buf);
}
// release interfaces after error caught
if (tra)
tra->release();
if (att)
att->release();
if (dpb)
dpb->dispose();
st->dispose();
prov->release();
return rc;
}
|