Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // its own header
- #include "db_info_load.h"
- // stl
- #include <sstream>
- // mw
- #include "../../../common/src/ibpp/_ibpp.h"
- using namespace IBPP;
- namespace DOGenerator
- {
- using std::string;
- DbResult DbInfoLoad::get(const std::string& server, short port,
- const std::string& db, const std::string& user,
- const std::string& password, const std::string& tableName)
- {
- DbResult result;
- // form a full server address
- std::ostringstream serverAddress;
- serverAddress << server;
- if (port)
- serverAddress << "/" << port;
- // create database
- Database database = DatabaseFactory(serverAddress.str(), db, user, password, "", "UNICODE_FSS", "");
- database->Connect();
- // create transaction
- Transaction tr = TransactionFactory(database, IBPP::amWrite, IBPP::ilConcurrency, IBPP::lrWait);
- // create statement
- Statement st = StatementFactory(database, tr);
- string sql1 = // get all fields from table
- " SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE"
- " FROM RDB$RELATIONS RL "
- " LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME "
- " LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE "
- " WHERE (RL.RDB$VIEW_BLR IS NULL) "
- " ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME ";
- // TODO: better sql query
- tr->Start();
- st->Prepare(sql1);
- st->Execute();
- string tName;
- string fieldName;
- int fieldType = -1;
- while (st->Fetch())
- {
- st->Get(1, tName);
- st->Get(2, fieldName);
- st->Get(3, fieldType);
- if (tName != tableName)
- continue;
- result.push_back(DbField(fieldName, fieldType, ""));
- }
- tr->Commit();
- string sql2 = // get foreign/unique/primary keys
- " SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE, TRIM(RC.RDB$CONSTRAINT_TYPE)"
- " FROM RDB$RELATIONS RL "
- " LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME "
- " LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE "
- " LEFT OUTER JOIN RDB$INDEX_SEGMENTS ISS ON ISS.RDB$FIELD_NAME = FR.RDB$FIELD_NAME"
- " INNER JOIN RDB$RELATION_CONSTRAINTS RC ON RC.RDB$CONSTRAINT_NAME = ISS.RDB$INDEX_NAME "
- " WHERE (RL.RDB$VIEW_BLR IS NULL) "
- " ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME ";
- // TODO: better sql query
- tr->Start();
- st->Prepare(sql2);
- st->Execute();
- tName;
- fieldName;
- fieldType = -1;
- string keyType;
- while (st->Fetch())
- {
- st->Get(1, tName);
- st->Get(2, fieldName);
- st->Get(4, keyType);
- if (tName != tableName)
- continue;
- for (unsigned i = 0; i<result.size(); i++)
- if (result[i].name==fieldName && result[i].fieldType != "FOREIGN KEY") // Unique, Check don't matter
- result[i].fieldType = keyType;
- }
- tr->Commit();
- database->Disconnect();
- return result;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement