Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ProtocolFeatures.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/features/ProtocolFeatures.cc
11 /// @brief report protocol level features to features statistics scientific benchmark
12 /// @author Matthew O'Meara
13 
14 // Unit Headers
16 
17 // Project Headers
18 #include <basic/options/keys/parser.OptionKeys.gen.hh>
19 #include <basic/options/option.hh>
20 #include <basic/options/keys/inout.OptionKeys.gen.hh>
21 #include <basic/options/keys/out.OptionKeys.gen.hh>
22 #include <basic/database/sql_utils.hh>
23 #include <core/types.hh>
24 #include <core/svn_version.hh>
25 #include <basic/database/schema_generator/PrimaryKey.hh>
26 #include <basic/database/schema_generator/ForeignKey.hh>
27 #include <basic/database/schema_generator/Column.hh>
28 #include <basic/database/schema_generator/Schema.hh>
29 
30 // Utility Headers
31 #include <utility/io/izstream.hh>
32 #include <utility/sql_database/DatabaseSessionManager.hh>
33 #include <utility/vector1.hh>
34 
35 //Basic Headers
36 #include <basic/Tracer.hh>
37 
38 // External Headers
39 #include <cppdb/frontend.h>
40 
41 // C++ Headers
42 #include <string>
43 #include <sstream>
44 
45 static basic::Tracer TR("protocols.features.ProtocolFeatures");
46 
47 namespace protocols{
48 namespace features{
49 
50 using std::string;
51 using std::stringstream;
52 using basic::options::OptionKeys::parser::protocol;
53 using basic::options::option;
54 using core::Size;
57 using core::pose::Pose;
58 using utility::io::izstream;
59 using utility::vector1;
60 using utility::sql_database::sessionOP;
61 using cppdb::statement;
62 using cppdb::result;
63 
65 
68 {}
69 
71 
72 string
73 ProtocolFeatures::type_name() const { return "ProtocolFeatures"; }
74 
75 void
76 ProtocolFeatures::write_schema_to_db(utility::sql_database::sessionOP db_session) const{
77  using namespace basic::database::schema_generator;
78 
79  std::string db_mode(basic::options::option[basic::options::OptionKeys::inout::dbms::mode]);
80  bool protocol_id_mode = basic::options::option[basic::options::OptionKeys::out::database_protocol_id].user();
81 
82  if(protocol_id_mode){
83 
84  Column protocol_id("protocol_id", new DbInteger());
85  Schema protocols("protocols", PrimaryKey(protocol_id));
86 
87  protocols.add_column( Column("specified_options", new DbText()) );
88  protocols.add_column( Column("command_line", new DbText()) );
89  protocols.add_column( Column("svn_url", new DbText()) );
90  protocols.add_column( Column("svn_version", new DbText()) );
91  protocols.add_column( Column("script", new DbText()) );
92  protocols.write(db_session);
93  }
94 
95  else{
96 
97  Column protocol_id("protocol_id", new DbInteger(), false /*not null*/, true /*autoincrement*/);
98  Schema protocols("protocols", PrimaryKey(protocol_id));
99 
100  protocols.add_column( Column("specified_options", new DbText()) );
101  protocols.add_column( Column("command_line", new DbText()) );
102  protocols.add_column( Column("svn_url", new DbText()) );
103  protocols.add_column( Column("svn_version", new DbText()) );
104  protocols.add_column( Column("script", new DbText()) );
105  protocols.write(db_session);
106  }
107 }
108 
111  utility::vector1<std::string> dependencies;
112  return dependencies;
113 }
114 
115 
116 
117 string
119  return "";
120 }
121 
122 Size
124  Size protocol_id,
125  sessionOP db_session
126 ){
127 
128  string const command_line( option.get_argv() );
129 
130  stringstream option_stream;
131  option_stream << basic::options::option;
132  string const specified_options( option_stream.str() );
133 
134  string const svn_url( minirosetta_svn_url() );
135  string const svn_version( minirosetta_svn_version() );
136 
137  bool using_rosetta_scripts( basic::options::option[ protocol ].active() );
138  string script = "";
139  if ( using_rosetta_scripts){
140  string const script_fname( basic::options::option[ protocol ] );
141  stringstream script_buf;
142  script_buf << utility::io::izstream( script_fname.c_str() ).rdbuf();
143  script = script_buf.str();
144  }
145 
146  //if -out:database_protocol_id is specified we need to make sure the protocol hasn't already been specified
147  std::string statement_string =
148  "SELECT\n"
149  " count(*)\n"
150  "FROM\n"
151  " protocols\n"
152  "WHERE\n"
153  " protocols.protocol_id = ?;";
154  cppdb::statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
155  stmt.bind(1,protocol_id);
156 
157  TR << "Checking for existing protocol entry with given id" << std::endl;
158  cppdb::result res(basic::database::safely_read_from_database(stmt));
159  if(res.next()) {
160  core::Size selected = 0;
161  res >> selected;
162  if(selected != 0) {
163  return protocol_id;
164  }
165  }
166 
167  cppdb::statement insert_statement;
168  if(protocol_id) {
169  TR << "Writing to protocols table with given protocol id: " << protocol_id << std::endl;
170  std::string insert_string("INSERT INTO protocols (protocol_id, specified_options, command_line, svn_url, svn_version, script) VALUES (?,?,?,?,?,?);");
171  insert_statement = basic::database::safely_prepare_statement(insert_string,db_session);
172  insert_statement.bind(1,protocol_id);
173  insert_statement.bind(2,command_line);
174  insert_statement.bind(3,specified_options);
175  insert_statement.bind(4,svn_url);
176  insert_statement.bind(5,svn_version);
177  insert_statement.bind(6,script);
178 
179  } else {
180  TR << "No protocol ID, generating one automagically" << std::endl;
181  std::string insert_string("INSERT INTO protocols (command_line, specified_options, svn_url, svn_version, script) VALUES (?,?,?,?,?);");
182  insert_statement = basic::database::safely_prepare_statement(insert_string,db_session);
183  insert_statement.bind(1,command_line);
184  insert_statement.bind(2,specified_options);
185  insert_statement.bind(3,svn_url);
186  insert_statement.bind(4,svn_version);
187  insert_statement.bind(5,script);
188  }
189 
190  basic::database::safely_write_to_database(insert_statement);
191  if(protocol_id) {
192  return protocol_id;
193  } else {
194  core::Size protocol_id = insert_statement.sequence_last("protocols_protocol_id_seq");
195  return protocol_id;
196  }
197 }
198 
199 } // features namesapce
200 } // protocols namespace