// modify.cpp // // Routines for --modify for rddbmgr(8) // // (C) Copyright 2018-2021 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // #include #include #include #include #include "rddbmgr.h" bool MainObject::Modify(QString *err_msg,int set_schema) { *err_msg="ok"; // // Update/Revert // int current_schema=GetCurrentSchema(); if(current_schema==0) { *err_msg="unable to determine DB schema, aborting"; return false; } if(current_schema>RD_VERSION_DATABASE) { *err_msg="unable to modify, unknown current schema"; return false; } if(set_schema>current_schema) { return UpdateSchema(current_schema,set_schema,err_msg); } if(set_schemafirst()) { ret=q->value(0).toInt(); } delete q; return ret; } bool MainObject::ModifyCharset(const QString &charset, const QString &collation) { QString sql; RDSqlQuery *q; // // Per-table Attributes // sql=QString("select ")+ "`TABLE_NAME`,"+ // 00 "`TABLE_COLLATION` "+ // 01 "from `information_schema`.`TABLES` where "+ "`TABLE_SCHEMA`='"+RDEscapeString(db_mysql_database)+"'"; q=new RDSqlQuery(sql,false); while(q->next()) { QStringList f0=q->value(1).toString().split("_"); QString prev_charset=f0.at(0); if(q->value(1).toString().toLower()!=charset) { RewriteTable(q->value(0).toString(), prev_charset,q->value(1).toString(),charset,collation); } } delete q; // // Database Attributes // sql=QString("select ")+ "`SCHEMA_NAME`,"+ // 00 "`DEFAULT_CHARACTER_SET_NAME`,"+ // 01 "`DEFAULT_COLLATION_NAME` "+ // 02 "from `information_schema`.`SCHEMATA`"; q=new RDSqlQuery(sql); while(q->next()) { if(q->value(0).toString()==db_mysql_database) { if((q->value(1).toString().toLower()!=charset)|| (q->value(2).toString().toLower()!=collation)) { sql=QString("alter database `")+db_mysql_database+"` "+ "character set "+charset+" collate "+collation; RDSqlQuery::apply(sql); } } } delete q; return true; }