Advertisement
Guest User

Untitled

a guest
Aug 19th, 2016
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. // its own header
  2. #include "db_info_load.h"
  3.  
  4. // stl
  5. #include <sstream>
  6.  
  7. // mw
  8. #include "../../../common/src/ibpp/_ibpp.h"
  9.  
  10. using namespace IBPP;
  11.  
  12. namespace DOGenerator
  13. {
  14.     using std::string;
  15.  
  16.     DbResult DbInfoLoad::get(const std::string& server, short port,
  17.             const std::string& db, const std::string& user,
  18.             const std::string& password, const std::string& tableName)
  19.     {
  20.         DbResult result;
  21.  
  22.         // form a full server address
  23.         std::ostringstream serverAddress;
  24.         serverAddress << server;
  25.  
  26.         if (port)
  27.             serverAddress << "/" << port;
  28.  
  29.         // create database
  30.         Database database = DatabaseFactory(serverAddress.str(), db, user, password, "", "UNICODE_FSS", "");
  31.  
  32.  
  33.         database->Connect();
  34.  
  35.         // create transaction
  36.         Transaction tr = TransactionFactory(database, IBPP::amWrite, IBPP::ilConcurrency, IBPP::lrWait);
  37.  
  38.         // create statement
  39.         Statement st = StatementFactory(database, tr);
  40.  
  41.         string sql1 = // get all fields from table
  42.             " SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE"
  43.             " FROM RDB$RELATIONS RL "
  44.             " LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME "
  45.             " LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE "
  46.             " WHERE (RL.RDB$VIEW_BLR IS NULL) "
  47.             " ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME ";
  48.  
  49. //       TODO: better sql query
  50.  
  51.         tr->Start();
  52.         st->Prepare(sql1);
  53.         st->Execute();
  54.  
  55.         string tName;
  56.         string fieldName;
  57.         int fieldType = -1;
  58.  
  59.         while (st->Fetch())
  60.         {
  61.             st->Get(1, tName);
  62.             st->Get(2, fieldName);
  63.             st->Get(3, fieldType);
  64.            
  65.  
  66.             if (tName != tableName)
  67.                 continue;
  68.  
  69.             result.push_back(DbField(fieldName, fieldType, ""));
  70.         }
  71.  
  72.         tr->Commit();
  73.  
  74.  
  75.         string sql2 = // get foreign/unique/primary keys
  76.             " SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE, TRIM(RC.RDB$CONSTRAINT_TYPE)"
  77.                 " FROM RDB$RELATIONS RL "
  78.                 " LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME "
  79.                 " LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE "
  80.                 " LEFT OUTER JOIN RDB$INDEX_SEGMENTS ISS ON ISS.RDB$FIELD_NAME = FR.RDB$FIELD_NAME"
  81.                 " INNER JOIN RDB$RELATION_CONSTRAINTS RC ON RC.RDB$CONSTRAINT_NAME = ISS.RDB$INDEX_NAME "
  82.                 " WHERE (RL.RDB$VIEW_BLR IS NULL) "
  83.                 " ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME ";
  84.  
  85.  
  86. //       TODO: better sql query
  87.  
  88.         tr->Start();
  89.         st->Prepare(sql2);
  90.         st->Execute();
  91.  
  92.         tName;
  93.         fieldName;
  94.         fieldType = -1;
  95.         string keyType;
  96.  
  97.         while (st->Fetch())
  98.         {
  99.             st->Get(1, tName);
  100.             st->Get(2, fieldName);
  101.             st->Get(4, keyType);
  102.            
  103.             if (tName != tableName)
  104.                 continue;
  105.            
  106.             for (unsigned i = 0; i<result.size(); i++)
  107.                 if (result[i].name==fieldName && result[i].fieldType != "FOREIGN KEY") // Unique, Check don't matter
  108.                     result[i].fieldType = keyType;
  109.         }
  110.  
  111.         tr->Commit();
  112.         database->Disconnect();
  113.  
  114.         return result;
  115.     }
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement