29 #include <platform/types.hh>
42 #include <cppdb/frontend.h>
46 namespace schema_generator {
51 using std::stringstream;
59 using cppdb::statement;
65 table_name_(table_name)
71 table_name_(table_name),
72 primary_key_(primary_key)
80 primary_key_(src.primary_key_),
81 columns_(src.columns_),
82 foreign_keys_(src.foreign_keys_),
83 constraints_(src.constraints_),
84 indices_(src.indices_)
91 this->
columns_.insert(
columns_.end(), key_columns.begin(), key_columns.end() );
96 (
int(*)(
int)) std::tolower);
108 for (
Size i=1; i <= key_cols.size(); ++i ) {
110 this->
columns_.push_back(key_cols[i]);
146 stringstream schema_string;
147 schema_string <<
"CREATE TABLE IF NOT EXISTS " <<
table_name_ <<
"(\n\t";
151 schema_string <<
",\n\t";
153 schema_string << it->print(db_session);
157 schema_string <<
",\n\t" <<
foreign_keys_[i].print(db_session);
162 if ( keys.size() > 0 ) {
163 switch(db_session->get_db_mode()) {
171 if ( !(keys.size()==1 && keys.begin()->auto_increment()) ) {
182 schema_string <<
",\n\t" <<
constraints_[i]->print(db_session);
185 schema_string <<
");\n";
188 schema_string <<
indices_[i].print(table_name_, db_session);
189 schema_string <<
"\n";
192 return schema_string.str();
197 stringstream init_string;
199 if ( it->auto_increment() && it->auto_increment_base() != 0 ) {
200 switch(db_session->get_db_mode()){
206 init_string <<
"ALTER SEQUENCE " <<
table_name_ <<
"_" << it->name() <<
"_seq" <<
" MINVALUE " << it->auto_increment_base() <<
";\n";
210 init_string <<
"ALTER TABLE " <<
table_name_ <<
" AUTO_INCREMENT = " << it->auto_increment_base() <<
";\n";
217 init_string <<
"INSERT INTO sqlite_sequence SELECT \"" <<
table_name_ <<
"\", " << it->auto_increment_base() - 1 <<
" WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE NAME = \"" <<
table_name_ <<
"\");\n";
226 return init_string.str();
246 catch(cppdb::cppdb_error & except)
248 TR.
Debug <<
"Error writing schema, retrying:\n" << except.what() << std::endl;
252 catch(cppdb::cppdb_error & except)
255 <<
"ERROR writing schema after retry.\n"
256 <<
print(db_session) << std::endl;
257 TR.
Error << except.what() << std::endl;
264 std::string schema_statement,
265 std::string init_statements)
const
267 cppdb::transaction guard(*db_session);
271 TR.
Debug <<
"Table with init statement exists, skipping declaration: " <<
table_name_ << std::endl;
280 TR.
Trace << schema_statement << std::endl;
282 stmt = (*db_session) << schema_statement;
286 if ( init_statements !=
"" ) {
288 TR.
Trace << init_statements << std::endl;
290 stmt = (*db_session) << init_statements;
#define utility_exit_with_message(m)
Exit with file + line + message.
std::string print(utility::sql_database::sessionOP db_session) const
utility::pointer::shared_ptr< Constraint > ConstraintOP
bool contains(T const &t) const
Check if vector contains a given element.
utility::vector1< ForeignKey > foreign_keys_
std::string table_init_statements(utility::sql_database::sessionOP db_session) const
void add_constraint(ConstraintOP constraint)
void write(utility::sql_database::sessionOP db_session)
static THREAD_LOCAL basic::Tracer TR("basic.database.schema_generator.Schema")
utility::pointer::shared_ptr< MessageListener > MessageListenerOP
std::string name_from_database_mode(DatabaseMode::e database_mode)
std::string print(utility::sql_database::sessionOP db_session) const
utility::keys::lookup::end< KeyType > const end
void add_foreign_key(ForeignKey key)
PrimaryKey class for the schema generator framework.
utility::vector1< ConstraintOP > constraints_
Index class for the schema generator framework.
table definition for the schema generator framework
bool table_exists(sessionOP db_session, string const &table_name)
Fstring::size_type index(Fstring const &s, Fstring const &ss)
First Index Position of a Substring in an Fstring.
Schema(std::string table_name)
void send_data_to_head_node(std::string const &MPI_ONLY(data))
ForeignKey class for the schema generator framework.
Program exit functions and macros.
string request_data_from_head_node(listener_tags MPI_ONLY(listener_tag), string const &MPI_ONLY(data))
used for message passing to the MPIWorkPoolJobDistributor. This function will ask the head node for d...
utility::keys::lookup::key< KeyType > const key
Columns const & columns() const
#define utility_exit()
Macro function wrappers for utility::exit.
std::string table_schema_statements(utility::sql_database::sessionOP db_session) const
super::const_iterator const_iterator
void add_index(Index index)
void add_column(Column column)
void check_table_and_perform_write(utility::sql_database::sessionOP db_session, std::string schema_statement, std::string init_statements) const
Column class for the schema generator framework.
utility::vector1< Index > indices_
Class for handling user debug/warnings/errors. Use instance of this class instead of 'std::cout' for ...
pointer::shared_ptr< session > sessionOP