mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:03:02 +01:00
141 lines
3.9 KiB
C++
141 lines
3.9 KiB
C++
/*
|
|
* PROGRAM: Object oriented API samples.
|
|
* MODULE: 06.fb_message.cpp
|
|
* DESCRIPTION: A sample of using static messages.
|
|
* Prints user-defined tables with comments.
|
|
*
|
|
* Example for the following interface:
|
|
* IDecFloat16 - support for IEEE-754 64-bit decimal float numbers
|
|
*
|
|
* Example for the following macro:
|
|
*
|
|
* FB_MESSAGE - defines static messages
|
|
* C++ specific sample!
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (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.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Initial Developer of the Original Code is Adriano dos Santos Fernandes.
|
|
* Portions created by the Initial Developer are Copyright (C) 2011 the Initial Developer.
|
|
* All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Alexander Peshkov
|
|
*
|
|
*/
|
|
|
|
#include "ifaceExamples.h"
|
|
#include <firebird/Message.h>
|
|
|
|
static IMaster* master = fb_get_master_interface();
|
|
static IDecFloat16* idf16 = NULL;
|
|
|
|
int main()
|
|
{
|
|
int rc = 0;
|
|
|
|
setenv("ISC_USER", "sysdba", 0);
|
|
setenv("ISC_PASSWORD", "masterkey", 0);
|
|
|
|
ThrowStatusWrapper status(master->getStatus());
|
|
IProvider* prov = master->getDispatcher();
|
|
|
|
IAttachment* att = NULL;
|
|
ITransaction* tra = NULL;
|
|
IResultSet* rs = NULL;
|
|
|
|
const char* dbName = "employee";
|
|
|
|
try
|
|
{
|
|
idf16 = master->getUtilInterface()->getDecFloat16(&status);
|
|
|
|
att = prov->attachDatabase(&status, dbName, 0, NULL);
|
|
tra = att->startTransaction(&status, 0, NULL);
|
|
|
|
// Comment some tables
|
|
att->execute(&status, tra, 0, "comment on table employee is 'Employees'",
|
|
SAMPLES_DIALECT, NULL, NULL, NULL, NULL);
|
|
att->execute(&status, tra, 0, "comment on table customer is 'Customers'",
|
|
SAMPLES_DIALECT, NULL, NULL, NULL, NULL);
|
|
att->execute(&status, tra, 0, "comment on table country is 'Countries and national currencies'",
|
|
SAMPLES_DIALECT, NULL, NULL, NULL, NULL);
|
|
tra->commitRetaining(&status);
|
|
|
|
// Print tables list
|
|
FB_MESSAGE(Input, ThrowStatusWrapper,
|
|
(FB_INTEGER, systemFlag)
|
|
) input(&status, master);
|
|
|
|
FB_MESSAGE(Output, ThrowStatusWrapper,
|
|
(FB_SMALLINT, relationId)
|
|
(FB_VARCHAR(31), relationName)
|
|
(FB_VARCHAR(100), description)
|
|
(FB_DECFLOAT16, df16)
|
|
) output(&status, master);
|
|
|
|
input.clear();
|
|
input->systemFlag = 0;
|
|
|
|
rs = att->openCursor(&status, tra, 0,
|
|
"select rdb$relation_id, rdb$relation_name, rdb$description,"
|
|
" cast (rdb$relation_id as decfloat(16)) * 0.05 as df16"
|
|
" from rdb$relations"
|
|
" where rdb$system_flag = ?"
|
|
" order by rdb$relation_id",
|
|
SAMPLES_DIALECT, input.getMetadata(), input.getData(), output.getMetadata(), NULL, 0);
|
|
|
|
printf(" ID Name/comment\n");
|
|
while (rs->fetchNext(&status, output.getData()) == IStatus::RESULT_OK)
|
|
{
|
|
unsigned lRelName = output->relationNameNull ? 0 : output->relationName.length;
|
|
unsigned lDesc = output->descriptionNull ? 0 : output->description.length;
|
|
char t16[IDecFloat16::STRING_SIZE];
|
|
idf16->toString(&status, &output->df16, sizeof(t16), t16);
|
|
|
|
printf("%4d %*.*s%c%*.*s (%s)\n", output->relationId,
|
|
lRelName, lRelName, output->relationName.str,
|
|
lDesc ? '/' : ' ',
|
|
lDesc, lDesc, output->description.str,
|
|
t16);
|
|
}
|
|
|
|
rs->close(&status);
|
|
rs = NULL;
|
|
|
|
tra->commit(&status);
|
|
tra = NULL;
|
|
|
|
att->detach(&status);
|
|
att = NULL;
|
|
}
|
|
catch (const FbException& error)
|
|
{
|
|
// handle error
|
|
rc = 1;
|
|
|
|
char buf[256];
|
|
master->getUtilInterface()->formatStatus(buf, sizeof(buf), error.getStatus());
|
|
fprintf(stderr, "%s\n", buf);
|
|
}
|
|
|
|
// release interfaces after error caught
|
|
if (rs)
|
|
rs->release();
|
|
if (tra)
|
|
tra->release();
|
|
if (att)
|
|
att->release();
|
|
|
|
// generic cleanup
|
|
prov->release();
|
|
status.dispose();
|
|
}
|