From 10beac8da64aa5f2c4ce99e94f4b67c3986fbeed Mon Sep 17 00:00:00 2001 From: Claes Sjofors <claes.sjofors@proview.se> Date: Fri, 2 Mar 2012 10:47:50 +0100 Subject: [PATCH] Sev altering of database engine added to sev_repair --- sev/exe/sev_repair/src/sev_repair.cpp | 46 ++++++++++++++++++++++-- sev/exe/sev_repair/src/sev_repair.h | 1 + sev/exe/sev_server/src/sev_server.cpp | 2 +- sev/exe/sev_xtt/src/xtt_tbl.cpp | 2 +- sev/lib/sev/src/sev_db.h | 1 + sev/lib/sev/src/sev_dbms.cpp | 50 +++++++++++++++++++++++---- sev/lib/sev/src/sev_dbms.h | 1 + src/lib/co/src/co_ccm.c | 2 +- src/lib/co/src/co_cnf.c | 6 ++-- src/lib/co/src/co_cnf.h | 2 +- wb/lib/wb/src/wb_erep.cpp | 2 +- wb/lib/wb/src/wb_ldh.cpp | 2 +- wb/lib/wb/src/wb_lfu.cpp | 2 +- wb/lib/wb/src/wb_pvd_pl.cpp | 2 +- xtt/lib/ge/src/ge_graph_javabean.cpp | 4 +-- xtt/lib/ge/src/ge_graph_web.cpp | 2 +- 16 files changed, 105 insertions(+), 22 deletions(-) diff --git a/sev/exe/sev_repair/src/sev_repair.cpp b/sev/exe/sev_repair/src/sev_repair.cpp index ad638b0d2..eccbab147 100644 --- a/sev/exe/sev_repair/src/sev_repair.cpp +++ b/sev/exe/sev_repair/src/sev_repair.cpp @@ -36,6 +36,7 @@ #if defined PWRE_CONF_MYSQL +#include <iostream> #include "pwr.h" #include "co_cdh.h" @@ -46,6 +47,16 @@ #include "rt_sev_msg.h" +static void usage() +{ + cout << endl << endl << + "sev_repair Maintain sev database" << endl << endl << + "> sev_repair [-e] [-r] [-h]" << endl << endl << + "-r Repair database" << endl << + "-e Alter database engine to engine specified in /etc/proview.cnf, " << endl << + " eg \"sevMysqlEngine innodb\"" << endl << endl; +} + int sev_repair::init() { sev_dbms_env *env; @@ -95,12 +106,43 @@ int sev_repair::check() return 1; } +int sev_repair::alter_engine() +{ + pwr_tStatus sts; + int fail_cnt = 0; + + + printf( "-- Number of tables to alter: %u\n", m_db->m_items.size()); + for ( unsigned int i = 0; i < m_db->m_items.size(); i++) { + printf( "\n-- Processing %u (%u) %s\n", i, m_db->m_items.size(), m_db->m_items[i].tablename); + m_db->alter_engine( &sts, m_db->m_items[i].tablename); + if ( EVEN(sts)) + fail_cnt++; + } + if ( fail_cnt) + printf( "** Alter failed on %d tables\n", fail_cnt); + else + printf( "-- Tables successfully altered\n"); + return 1; +} + int main (int argc, char *argv[]) { sev_repair rep; - rep.init(); - rep.check(); + if ( argc > 1 && strcmp( argv[1], "-e") == 0) { + // Alter engine + rep.init(); + rep.alter_engine(); + } + else if ( argc > 1 && strcmp( argv[1], "-r") == 0) { + // Repair + rep.init(); + rep.check(); + } + else + usage(); + } #else int main(){} diff --git a/sev/exe/sev_repair/src/sev_repair.h b/sev/exe/sev_repair/src/sev_repair.h index 9ab35c62b..300d411f6 100644 --- a/sev/exe/sev_repair/src/sev_repair.h +++ b/sev/exe/sev_repair/src/sev_repair.h @@ -55,5 +55,6 @@ class sev_repair { int init(); int check(); + int alter_engine(); }; #endif diff --git a/sev/exe/sev_server/src/sev_server.cpp b/sev/exe/sev_server/src/sev_server.cpp index 9213a5d2d..e59f6f7f4 100644 --- a/sev/exe/sev_server/src/sev_server.cpp +++ b/sev/exe/sev_server/src/sev_server.cpp @@ -118,7 +118,7 @@ int sev_server::init( int noneth) env = new sev_dbms_env( envname); env->open( envname); if ( !env->exists()) { - cnf_get_value( "mysqlSocket", socket); + cnf_get_value( "mysqlSocket", socket, sizeof(socket)); env->create( envname, "localhost", "pwrp", "", sev_dbms_env::dbName(), 50, socket); diff --git a/sev/exe/sev_xtt/src/xtt_tbl.cpp b/sev/exe/sev_xtt/src/xtt_tbl.cpp index 7ff69349a..38ed00083 100644 --- a/sev/exe/sev_xtt/src/xtt_tbl.cpp +++ b/sev/exe/sev_xtt/src/xtt_tbl.cpp @@ -78,7 +78,7 @@ XttTbl::XttTbl( void *xn_parent_ctx, sevcli_tCtx xn_sevcli) : strcpy( user, ""); // Get default privilete from proview.cnf - if ( cnf_get_value( "sevXttDefaultPriv", default_priv)) { + if ( cnf_get_value( "sevXttDefaultPriv", default_priv, sizeof(default_priv))) { if ( cdh_NoCaseStrcmp( default_priv, "READ") == 0) priv = pwr_mPrv_SevRead; else if ( cdh_NoCaseStrcmp( default_priv, "ADMIN") == 0) diff --git a/sev/lib/sev/src/sev_db.h b/sev/lib/sev/src/sev_db.h index 471b0f55d..59dcb3df5 100644 --- a/sev/lib/sev/src/sev_db.h +++ b/sev/lib/sev/src/sev_db.h @@ -134,6 +134,7 @@ class sev_db { int maxsize, pwr_tTime **tbuf, void **vbuf, unsigned int *bsize) { return 0;} virtual int handle_objectchange(pwr_tStatus *sts, char *tablename, unsigned int item_idx, bool newObject) { return 0;} virtual int repair_table( pwr_tStatus *sts, char *tablename) { return 0;} + virtual int alter_engine( pwr_tStatus *sts, char *tablename) { return 0;} }; #endif diff --git a/sev/lib/sev/src/sev_dbms.cpp b/sev/lib/sev/src/sev_dbms.cpp index 2018e51b3..6eb0253ec 100644 --- a/sev/lib/sev/src/sev_dbms.cpp +++ b/sev/lib/sev/src/sev_dbms.cpp @@ -52,6 +52,7 @@ #include "co_cdh.h" #include "co_dcli.h" #include "co_time.h" +#include "co_cnf.h" #include "rt_load.h" #include "sev_dbms.h" #include "rt_sev_msg.h" @@ -219,8 +220,8 @@ int sev_dbms_env::open(const char *v_host, const char *v_user, const char *v_pas } int sev_dbms_env::create(const char *v_fileName, const char *v_host, const char *v_user, - const char *v_passwd, const char *v_dbName, unsigned int v_port, - const char *v_socket) + const char *v_passwd, const char *v_dbName, unsigned int v_port, + const char *v_socket) { fileName(v_fileName); host(v_host); @@ -647,6 +648,11 @@ int sev_dbms::create_table( pwr_tStatus *sts, char *tablename, pwr_eType type, char jumpstr[80]; char idtypestr[20]; char readoptstr[80]; + char engine[80]; + char enginestr[100] = ""; + + if ( cnf_get_value( "sevMysqlEngine", engine, sizeof(engine)) != 0) + snprintf( enginestr, sizeof(enginestr), " engine=%s", engine); if ( options & pwr_mSevOptionsMask_PosixTime) { if ( options & pwr_mSevOptionsMask_HighTimeResolution) { @@ -684,8 +690,8 @@ int sev_dbms::create_table( pwr_tStatus *sts, char *tablename, pwr_eType type, strcpy( jumpstr, ""); sprintf( query, "create table %s ( %s" - "%s, value %s %s, index (time));", - tablename, readoptstr, timeformatstr, pwrtype_to_type( type, size), jumpstr); + "%s, value %s %s, index (time))%s;", + tablename, readoptstr, timeformatstr, pwrtype_to_type( type, size), jumpstr, enginestr); int rc = mysql_query( m_env->con(), query); if (rc) { @@ -2096,6 +2102,11 @@ int sev_dbms::create_objecttable( pwr_tStatus *sts, char *tablename, pwr_tMask o char jumpstr[80]; char idtypestr[20]; char readoptstr[80]; + char engine[80]; + char enginestr[100] = ""; + + if ( cnf_get_value( "sevMysqlEngine", engine, sizeof(engine)) != 0) + snprintf( enginestr, sizeof(enginestr), " engine=%s", engine); if ( options & pwr_mSevOptionsMask_PosixTime) { if ( options & pwr_mSevOptionsMask_HighTimeResolution) { @@ -2133,8 +2144,8 @@ int sev_dbms::create_objecttable( pwr_tStatus *sts, char *tablename, pwr_tMask o strcpy( jumpstr, ""); sprintf( query, "create table %s ( %s" - "%s %s, index (sev__time) );", - tablename, readoptstr, timeformatstr, jumpstr); + "%s %s, index (sev__time) )%s;", + tablename, readoptstr, timeformatstr, jumpstr, enginestr); int rc = mysql_query( m_env->con(), query); if (rc) { @@ -3511,6 +3522,33 @@ int sev_dbms::repair_table( pwr_tStatus *sts, char *tablename) return ODD(*sts); } +int sev_dbms::alter_engine( pwr_tStatus *sts, char *tablename) +{ + char query[200]; + int rc; + char engine[80]; + + if ( cnf_get_value( "sevMysqlEngine", engine, sizeof(engine)) == 0) { + printf( "** No engine specified in /etc/proview.cnf\n"); + return 0; + } + + // Check table + printf( "-- Altering engine to %s table %s...\n", engine, tablename); + + sprintf( query, "alter table %s engine=%s", tablename, engine); + rc = mysql_query( m_env->con(), query); + if (rc) { + printf("In %s row %d:\n", __FILE__, __LINE__); + printf( "%s: %s\n", __FUNCTION__,mysql_error(m_env->con())); + *sts = SEV__DBERROR; + return 0; + } + + *sts = SEV__SUCCESS; + return 1; +} + sev_dbms::~sev_dbms() { diff --git a/sev/lib/sev/src/sev_dbms.h b/sev/lib/sev/src/sev_dbms.h index 3d13092ed..59ea4d8e4 100644 --- a/sev/lib/sev/src/sev_dbms.h +++ b/sev/lib/sev/src/sev_dbms.h @@ -189,6 +189,7 @@ class sev_dbms : public sev_db { int handle_itemchange(pwr_tStatus *sts, char *tablename, unsigned int item_idx); int handle_objectchange(pwr_tStatus *sts, char *tablename, unsigned int item_idx, bool newObject); int repair_table( pwr_tStatus *sts, char *tablename); + int alter_engine( pwr_tStatus *sts, char *tablename); inline char* create_colName(unsigned int index, char *attributename) { static char colName[constMaxColNameLength]; strncpy(colName, attributename, constMaxColNameLength); diff --git a/src/lib/co/src/co_ccm.c b/src/lib/co/src/co_ccm.c index 16a6c61a5..ca8513f09 100644 --- a/src/lib/co/src/co_ccm.c +++ b/src/lib/co/src/co_ccm.c @@ -5044,7 +5044,7 @@ static int ccm_func_get_pwr_config( if ( arg_list->value_decl != K_DECL_STRING) return CCM__VARTYPE; - if ( cnf_get_value( arg_list->value_string, value)) { + if ( cnf_get_value( arg_list->value_string, value, sizeof(value))) { strncpy( return_string, value, K_STRING_SIZE); return_string[K_STRING_SIZE-1] = 0; } diff --git a/src/lib/co/src/co_cnf.c b/src/lib/co/src/co_cnf.c index e27dff789..fafd63692 100644 --- a/src/lib/co/src/co_cnf.c +++ b/src/lib/co/src/co_cnf.c @@ -58,7 +58,7 @@ char default_values[][2][200] = { }; -char *cnf_get_value( const char *name, char *value) +char *cnf_get_value( const char *name, char *value, int size) { FILE *fp; char line[400]; @@ -84,7 +84,7 @@ char *cnf_get_value( const char *name, char *value) if ( cdh_NoCaseStrcmp( name, item_str[0]) == 0) { strcpy( ret_value, item_str[1]); if ( value) - strcpy( value, ret_value); + strncpy( value, ret_value, size); fclose( fp); return ret_value; } @@ -97,7 +97,7 @@ char *cnf_get_value( const char *name, char *value) if ( strcmp( name, default_values[i][0]) == 0) { strcpy( ret_value, default_values[i][1]); if ( value) - strcpy( value, ret_value); + strncpy( value, ret_value, size); return ret_value; } } diff --git a/src/lib/co/src/co_cnf.h b/src/lib/co/src/co_cnf.h index 2b965cef5..1d4a88de8 100644 --- a/src/lib/co/src/co_cnf.h +++ b/src/lib/co/src/co_cnf.h @@ -45,7 +45,7 @@ extern "C" { #endif -char *cnf_get_value( const char *name, char *value); +char *cnf_get_value( const char *name, char *value, int size); #ifdef __cplusplus } diff --git a/wb/lib/wb/src/wb_erep.cpp b/wb/lib/wb/src/wb_erep.cpp index d2cb47365..15b520e4a 100644 --- a/wb/lib/wb/src/wb_erep.cpp +++ b/wb/lib/wb/src/wb_erep.cpp @@ -1184,7 +1184,7 @@ wb_vrep *wb_erep::createVolume(pwr_tStatus *sts, pwr_tVid vid, pwr_tCid cid, unsigned int port = 0; char socket[80]; - cnf_get_value( "mysqlSocket", socket); + cnf_get_value( "mysqlSocket", socket, sizeof(socket)); *sts = lfu_ParseDbmsServer( server, user, password, &port, host); if ( EVEN(*sts)) return 0; diff --git a/wb/lib/wb/src/wb_ldh.cpp b/wb/lib/wb/src/wb_ldh.cpp index 2e52276b7..37f3c4160 100644 --- a/wb/lib/wb/src/wb_ldh.cpp +++ b/wb/lib/wb/src/wb_ldh.cpp @@ -1997,7 +1997,7 @@ ldh_WbLoad( ldh_tSession session, char *loadfile, int ignore_oix) sts = lfu_ParseDbmsServer( server, user, password, &port, host); if ( EVEN(sts)) return sts; - cnf_get_value( "mysqlSocket", socket); + cnf_get_value( "mysqlSocket", socket, sizeof(socket)); wb_dbms_env *env = new wb_dbms_env(); env->create( db_name, host, user, password, cdh_Low(vname), port, socket); diff --git a/wb/lib/wb/src/wb_lfu.cpp b/wb/lib/wb/src/wb_lfu.cpp index 4bb5ced93..1922629c4 100644 --- a/wb/lib/wb/src/wb_lfu.cpp +++ b/wb/lib/wb/src/wb_lfu.cpp @@ -2907,7 +2907,7 @@ pwr_tStatus lfu_ParseDbmsServer( char *server, char *user, char *password, char lserver[80]; if ( strcmp( server, "") == 0) { - if ( !cnf_get_value( "mysqlServer", lserver)) { + if ( !cnf_get_value( "mysqlServer", lserver, sizeof(lserver))) { printf( "** mysql Server not defined\n"); return LDH__NOSERVER; } diff --git a/wb/lib/wb/src/wb_pvd_pl.cpp b/wb/lib/wb/src/wb_pvd_pl.cpp index 521d0eee3..c071b541b 100644 --- a/wb/lib/wb/src/wb_pvd_pl.cpp +++ b/wb/lib/wb/src/wb_pvd_pl.cpp @@ -152,7 +152,7 @@ void wb_pvd_pl::createObject( co_procom *pcom, pwr_tOix destoix, int desttype, pwr_sClass_ProjectReg *body = (pwr_sClass_ProjectReg *)m_list[oix].body; // Set default values to project, version and path - cnf_get_value( "defaultProjectRoot", defaultpath); + cnf_get_value( "defaultProjectRoot", defaultpath, sizeof(defaultpath)); cdh_ToLower( lowname, m_list[oix].name); strcat( defaultpath, "/"); strcat( defaultpath, lowname); diff --git a/xtt/lib/ge/src/ge_graph_javabean.cpp b/xtt/lib/ge/src/ge_graph_javabean.cpp index 7d20780f9..f230b2807 100644 --- a/xtt/lib/ge/src/ge_graph_javabean.cpp +++ b/xtt/lib/ge/src/ge_graph_javabean.cpp @@ -1679,7 +1679,7 @@ int Graph::export_javaframe( char *filename, char *bean_name, int applet, char codebase[200]; // Create a html file - cnf_get_value( "appletCodebase", codebase); + cnf_get_value( "appletCodebase", codebase, sizeof(codebase)); grow_MeasureJavaBean( grow->ctx, &x1, &x0, &y1, &y0); fp.open( fname); @@ -1981,7 +1981,7 @@ int Graph::export_gejava( char *filename, char *bean_name, int applet, int html) char codebase[200]; // Create a html file - cnf_get_value( "appletCodebase", codebase); + cnf_get_value( "appletCodebase", codebase, sizeof(codebase)); grow_SetJavaFrame( grow->ctx, &x1, &x0, &y1, &y0); fp.open( fname); diff --git a/xtt/lib/ge/src/ge_graph_web.cpp b/xtt/lib/ge/src/ge_graph_web.cpp index 1c34f6a76..45880850b 100644 --- a/xtt/lib/ge/src/ge_graph_web.cpp +++ b/xtt/lib/ge/src/ge_graph_web.cpp @@ -136,7 +136,7 @@ int Graph::generate_web( ldh_tSesContext ldhses) ge_get_systemname( sname); // Get codebase for applets from global config file - cnf_get_value( "appletCodebase", codebase); + cnf_get_value( "appletCodebase", codebase, sizeof(codebase)); // Find the WebHandler object -- 2.30.9