2021-04-22 Fred Gleason <fredg@paravelsystems.com>

* Escaped all SQL identifiers in 'utils/rddbmgr/'.
	* Replaced " with ' delimiters in all SQL literal strings in
	'utils/rddbmgr/'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-04-22 20:44:19 -04:00
parent c2fcc23cfd
commit 7f44ad5780
7 changed files with 6966 additions and 6636 deletions

View File

@ -21559,3 +21559,7 @@
* Escaped all SQL identifiers in 'utils/rddbconfig/'. * Escaped all SQL identifiers in 'utils/rddbconfig/'.
* Replaced " with ' delimiters in all SQL literal strings in * Replaced " with ' delimiters in all SQL literal strings in
'utils/rddbconfig/'. 'utils/rddbconfig/'.
2021-04-22 Fred Gleason <fredg@paravelsystems.com>
* Escaped all SQL identifiers in 'utils/rddbmgr/'.
* Replaced " with ' delimiters in all SQL literal strings in
'utils/rddbmgr/'.

View File

@ -158,32 +158,32 @@ void MainObject::CheckTableAttributes()
// Per-table Attributes // Per-table Attributes
// //
sql=QString("select ")+ sql=QString("select ")+
"TABLE_NAME,"+ // 00 "`TABLE_NAME`,"+ // 00
"ENGINE,"+ // 01 "`ENGINE`,"+ // 01
"TABLE_COLLATION "+ // 02 "`TABLE_COLLATION` "+ // 02
"from information_schema.TABLES where "+ "from `information_schema`.`TABLES` where "+
"TABLE_SCHEMA='"+RDEscapeString(db_mysql_database)+"'"; "`TABLE_SCHEMA`='"+RDEscapeString(db_mysql_database)+"'";
q=new RDSqlQuery(sql,false); q=new RDSqlQuery(sql,false);
while(q->next()) { while(q->next()) {
QStringList f0=q->value(2).toString().split("_"); QStringList f0=q->value(2).toString().split("_");
QString charset=f0.at(0); QString charset=f0.at(0);
if(q->value(1).toString().toLower()!=db_mysql_engine.toLower()) { if(q->value(1).toString().toLower()!=db_mysql_engine.toLower()) {
printf(" Table \"%s\" uses engine type %s, should be %s. Fix? (y/N) ", printf(" Table \"%s\" uses engine type %s, should be %s. Fix? (y/N) ",
(const char *)q->value(0).toString().toUtf8(), q->value(0).toString().toUtf8().constData(),
(const char *)q->value(1).toString().toUtf8(), q->value(1).toString().toUtf8().constData(),
(const char *)db_mysql_engine.toUtf8()); db_mysql_engine.toUtf8().constData());
fflush(NULL); fflush(NULL);
if(UserResponse()) { if(UserResponse()) {
sql=QString("alter table `")+q->value(0).toString()+"` "+ sql=QString("alter table `")+q->value(0).toString()+"` "+
"ENGINE="+db_mysql_engine; "`ENGINE`="+db_mysql_engine;
RDSqlQuery::apply(sql); RDSqlQuery::apply(sql);
} }
} }
if(q->value(2).toString().toLower()!="utf8mb4_general_ci") { if(q->value(2).toString().toLower()!="utf8mb4_general_ci") {
printf(" Table \"%s\" uses charset/collation %s/%s, should be utf8mb4/utf8mb4_general_ci. Fix? (y/N) ", printf(" Table \"%s\" uses charset/collation %s/%s, should be utf8mb4/utf8mb4_general_ci. Fix? (y/N) ",
(const char *)q->value(0).toString().toUtf8(), q->value(0).toString().toUtf8().constData(),
(const char *)charset.toUtf8(), charset.toUtf8().constData(),
(const char *)q->value(2).toString().toUtf8()); q->value(2).toString().toUtf8().constData());
fflush(NULL); fflush(NULL);
if(UserResponse()) { if(UserResponse()) {
RewriteTable(q->value(0).toString(), RewriteTable(q->value(0).toString(),
@ -198,18 +198,18 @@ void MainObject::CheckTableAttributes()
// Database Attributes // Database Attributes
// //
sql=QString("select ")+ sql=QString("select ")+
"SCHEMA_NAME,"+ // 00 "`SCHEMA_NAME`,"+ // 00
"DEFAULT_CHARACTER_SET_NAME,"+ // 01 "`DEFAULT_CHARACTER_SET_NAME`,"+ // 01
"DEFAULT_COLLATION_NAME "+ // 02 "`DEFAULT_COLLATION_NAME` "+ // 02
"from information_schema.SCHEMATA"; "from `information_schema`.`SCHEMATA`";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
if(q->value(0).toString()==db_mysql_database) { if(q->value(0).toString()==db_mysql_database) {
if((q->value(1).toString().toLower()!="utf8mb4")|| if((q->value(1).toString().toLower()!="utf8mb4")||
(q->value(2).toString().toLower()!="utf8mb4_general_ci")) { (q->value(2).toString().toLower()!="utf8mb4_general_ci")) {
printf(" Database uses default charset/collation %s/%s, should be utf8mb4/utf8mb4_general_ci. Fix? (y/N) ", printf(" Database uses default charset/collation %s/%s, should be utf8mb4/utf8mb4_general_ci. Fix? (y/N) ",
(const char *)q->value(1).toString().toUtf8(), q->value(1).toString().toUtf8().constData(),
(const char *)q->value(2).toString().toUtf8()); q->value(2).toString().toUtf8().constData());
fflush(NULL); fflush(NULL);
if(UserResponse()) { if(UserResponse()) {
sql=QString("alter database `")+db_mysql_database+"` "+ sql=QString("alter database `")+db_mysql_database+"` "+
@ -397,10 +397,12 @@ void MainObject::RelinkAudio(const QString &srcdir) const
// //
// Check against audio cuts // Check against audio cuts
// //
sql=QString("select CUTS.CUT_NAME,CART.TITLE from ")+ sql=QString("select ")+
"CUTS left join CART "+ "`CUTS`.`CUT_NAME`,"+ // 00
"on CUTS.CART_NUMBER=CART.NUMBER where "+ "`CART`.`TITLE` "+ // 01
"CUTS.SHA1_HASH=\""+RDEscapeString(hash)+"\""; "from `CUTS` left join `CART` "+
"on `CUTS`.`CART_NUMBER`=`CART`.`NUMBER` where "+
"`CUTS`.`SHA1_HASH`='"+RDEscapeString(hash)+"'";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
RelinkCut(filename,q->value(0).toString(),q->value(1).toString(), RelinkCut(filename,q->value(0).toString(),q->value(1).toString(),
@ -411,13 +413,13 @@ void MainObject::RelinkAudio(const QString &srcdir) const
// Check against RSS posts // Check against RSS posts
// //
sql=QString("select ")+ sql=QString("select ")+
"FEEDS.KEY_NAME,"+ // 00 "`FEEDS`.`KEY_NAME`,"+ // 00
"PODCASTS.ID,"+ // 01 "`PODCASTS`.`ID`,"+ // 01
"PODCASTS.ITEM_TITLE,"+ // 02 "`PODCASTS`.`ITEM_TITLE`,"+ // 02
"PODCASTS.AUDIO_FILENAME "+ // 03 "`PODCASTS`.`AUDIO_FILENAME` "+ // 03
"from PODCASTS left join FEEDS "+ "from `PODCASTS` left join `FEEDS` "+
"on FEEDS.ID=PODCASTS.FEED_ID where "+ "on `FEEDS`.`ID`=`PODCASTS`.`FEED_ID` where "+
"PODCASTS.SHA1_HASH=\""+RDEscapeString(hash)+"\""; "`PODCASTS`.`SHA1_HASH`='"+RDEscapeString(hash)+"'";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
RelinkCast(filename,q->value(0).toString(),q->value(1).toUInt(), RelinkCast(filename,q->value(0).toString(),q->value(1).toUInt(),
@ -558,14 +560,20 @@ void MainObject::RelinkCast(const QString &src_filename,const QString &keyname,
void MainObject::CheckOrphanedTracks() const void MainObject::CheckOrphanedTracks() const
{ {
QString sql="select NUMBER,TITLE,OWNER from CART where OWNER!=\"\""; QString sql=QString("select ")+
"`NUMBER`,"+ // 00
"`TITLE`,"+ // 01
"`OWNER` "+ // 02
"from `CART` where "+
"(`OWNER`!='')&&"+
"(`OWNER` is not null)";
QSqlQuery *q=new QSqlQuery(sql); QSqlQuery *q=new QSqlQuery(sql);
QSqlQuery *q1; QSqlQuery *q1;
while(q->next()) { while(q->next()) {
sql=QString("select LINE_ID from LOG_LINES where ")+ sql=QString("select `LINE_ID` from `LOG_LINES` where ")+
"LOG_NAME=\""+RDEscapeString(q->value(2).toString())+"\" && "+ "`LOG_NAME`='"+RDEscapeString(q->value(2).toString())+"' && "+
QString().sprintf("CART_NUMBER=%u",q->value(0).toUInt()); QString().sprintf("`CART_NUMBER`=%u",q->value(0).toUInt());
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
if(!q1->first()) { if(!q1->first()) {
printf(" Found orphaned track %u - \"%s\". Delete? (y/N) ", printf(" Found orphaned track %u - \"%s\". Delete? (y/N) ",
@ -594,12 +602,16 @@ void MainObject::CheckCutCounts() const
QSqlQuery *q; QSqlQuery *q;
QSqlQuery *q1; QSqlQuery *q1;
sql="select NUMBER,CUT_QUANTITY,TITLE from CART"; sql=QString("select ")+
"`NUMBER`,"+ // 00
"`CUT_QUANTITY`,"+ // 01
"`TITLE` "+ // 02
"from `CART`";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
sql=QString().sprintf("select CUT_NAME from CUTS \ sql=QString("select `CUT_NAME` from `CUTS` where ")+
where (CART_NUMBER=%u)&&(LENGTH>0)", QString().sprintf("(`CART_NUMBER`=%u)&&",q->value(0).toUInt())+
q->value(0).toUInt()); "(`LENGTH`>0)";
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
if(q1->size()!=q->value(1).toInt()) { if(q1->size()!=q->value(1).toInt()) {
printf(" Cart %u [%s] has invalid cut count, fix (y/N)?", printf(" Cart %u [%s] has invalid cut count, fix (y/N)?",
@ -623,10 +635,10 @@ void MainObject::CheckPendingCarts() const
QSqlQuery *q; QSqlQuery *q;
QDateTime now(QDate::currentDate(),QTime::currentTime()); QDateTime now(QDate::currentDate(),QTime::currentTime());
sql=QString("select NUMBER from CART where ")+ sql=QString("select `NUMBER` from `CART` where ")+
"(PENDING_STATION is not null)&&"+ "(`PENDING_STATION` is not null)&&"+
"(PENDING_DATETIME<\""+now.addDays(-1). "(`PENDING_DATETIME`<'"+now.addDays(-1).
toString("yyyy-MM-dd hh:mm:ss")+"\")"; toString("yyyy-MM-dd hh:mm:ss")+"')";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
printf(" Cart %06u has stale reservation, delete cart(y/N)?", printf(" Cart %06u has stale reservation, delete cart(y/N)?",
@ -645,8 +657,12 @@ void MainObject::CheckOrphanedCarts() const
QSqlQuery *q; QSqlQuery *q;
QSqlQuery *q1; QSqlQuery *q1;
sql="select CART.NUMBER,CART.TITLE from CART left join GROUPS \ sql=QString("select ")+
on CART.GROUP_NAME=GROUPS.NAME where GROUPS.NAME is null"; "`CART`.`NUMBER`,"+
"`CART`.`TITLE` "+
"from `CART` left join `GROUPS` "+
"on `CART`.`GROUP_NAME`=`GROUPS`.`NAME` where "+
"`GROUPS`.`NAME` is null";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
printf(" Cart %06u [%s] has missing/invalid group.\n", printf(" Cart %06u [%s] has missing/invalid group.\n",
@ -658,10 +674,9 @@ void MainObject::CheckOrphanedCarts() const
printf(" Assign to group \"%s\" (y/N)?", printf(" Assign to group \"%s\" (y/N)?",
db_orphan_group_name.toUtf8().constData()); db_orphan_group_name.toUtf8().constData());
if(UserResponse()) { if(UserResponse()) {
sql=QString(). sql=QString("update `CART` set ")+
sprintf("update CART set GROUP_NAME=\"%s\" where NUMBER=%u", "`GROUP_NAME`='"+RDEscapeString(db_orphan_group_name)+"' "+
RDEscapeString(db_orphan_group_name).toUtf8().constData(), QString().sprintf("where `NUMBER`=%u",q->value(0).toUInt());
q->value(0).toUInt());
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
delete q1; delete q1;
} }
@ -680,8 +695,12 @@ void MainObject::CheckOrphanedCuts() const
QSqlQuery *q2; QSqlQuery *q2;
QFileInfo *file=NULL; QFileInfo *file=NULL;
sql="select CUTS.CUT_NAME,CUTS.DESCRIPTION from CUTS left join CART \ sql=QString("select ")+
on CUTS.CART_NUMBER=CART.NUMBER where CART.NUMBER is null"; "`CUTS`.`CUT_NAME`,"+ // 00
"`CUTS`.`DESCRIPTION` "+ // 01
"from `CUTS` left join `CART` "+
"on `CUTS`.`CART_NUMBER`=`CART`.`NUMBER` "+
"where `CART`.`NUMBER` is null";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
printf(" Cut %s [%s] is orphaned.\n", printf(" Cut %s [%s] is orphaned.\n",
@ -690,7 +709,7 @@ void MainObject::CheckOrphanedCuts() const
// //
// Try to repair it // Try to repair it
// //
sql=QString().sprintf("select NUMBER from CART where NUMBER=%d", sql=QString().sprintf("select `NUMBER` from `CART` where `NUMBER`=%d",
q->value(0).toString().left(6).toUInt()); q->value(0).toString().left(6).toUInt());
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
if(q1->first()) { if(q1->first()) {
@ -700,7 +719,7 @@ void MainObject::CheckOrphanedCuts() const
// FIXME: Regen Cart Data // FIXME: Regen Cart Data
// //
sql=QString(). sql=QString().
sprintf("update CUTS set CART_NUMBER=%u where CUT_NAME=\"%s\"", sprintf("update `CUTS` set `CART_NUMBER`=%u where `CUT_NAME`='%s'",
q1->value(0).toUInt(), q1->value(0).toUInt(),
q->value(0).toString().toUtf8().constData()); q->value(0).toString().toUtf8().constData());
q2=new QSqlQuery(sql); q2=new QSqlQuery(sql);
@ -720,7 +739,7 @@ void MainObject::CheckOrphanedCuts() const
if(!file->exists()) { if(!file->exists()) {
printf(" Clear it (y/N)?"); printf(" Clear it (y/N)?");
if(UserResponse()) { if(UserResponse()) {
sql=QString().sprintf("delete from CUTS where CUT_NAME=\"%s\"", sql=QString().sprintf("delete from `CUTS` where `CUT_NAME`='%s'",
q->value(0).toString().toUtf8().constData()); q->value(0).toString().toUtf8().constData());
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
delete q1; delete q1;
@ -734,7 +753,7 @@ void MainObject::CheckOrphanedCuts() const
printf(" Clear it (y/N)?"); printf(" Clear it (y/N)?");
if(UserResponse()) { if(UserResponse()) {
system(("mv "+file->filePath()+" "+db_dump_cuts_dir+"/").toUtf8()); system(("mv "+file->filePath()+" "+db_dump_cuts_dir+"/").toUtf8());
sql=QString().sprintf("delete from CUTS where CUT_NAME=\"%s\"", sql=QString().sprintf("delete from `CUTS` where `CUT_NAME`='%s'",
q->value(0).toString().toUtf8().constData()); q->value(0).toString().toUtf8().constData());
q1=new QSqlQuery(sql); q1=new QSqlQuery(sql);
delete q1; delete q1;
@ -765,9 +784,9 @@ void MainObject::CheckOrphanedAudio() const
list[i].mid(7,3).toInt(&ok); list[i].mid(7,3).toInt(&ok);
if(ok) { if(ok) {
QString sql=QString("select ")+ QString sql=QString("select ")+
"CUT_NAME "+ "`CUT_NAME` "+
"from CUTS where "+ "from `CUTS` where "+
"CUT_NAME=\""+RDEscapeString(list.at(i).left(10))+"\""; "`CUT_NAME`='"+RDEscapeString(list.at(i).left(10))+"'";
QSqlQuery *q=new QSqlQuery(sql); QSqlQuery *q=new QSqlQuery(sql);
if(!q->first()) { if(!q->first()) {
printf(" File \"%s/%s\" is orphaned.\n", printf(" File \"%s/%s\" is orphaned.\n",
@ -806,7 +825,11 @@ void MainObject::ValidateAudioLengths() const
QSqlQuery *q; QSqlQuery *q;
RDWaveFile *wave=NULL; RDWaveFile *wave=NULL;
sql="select CUT_NAME,CART_NUMBER,LENGTH from CUTS order by CART_NUMBER"; sql=QString("select ")+
"`CUT_NAME`,"+
"`CART_NUMBER`,"+
"`LENGTH` "+
"from `CUTS` order by `CART_NUMBER`";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
if(q->value(2).toInt()>0) { if(q->value(2).toInt()>0) {
@ -834,9 +857,9 @@ void MainObject::Rehash(const QString &arg) const
bool ok=false; bool ok=false;
if(arg.toLower()=="all") { if(arg.toLower()=="all") {
sql=QString("select NUMBER from CART where ")+ sql=QString("select `NUMBER` from `CART` where ")+
QString().sprintf("TYPE=%d ",RDCart::Audio)+ QString().sprintf("`TYPE`=%d ",RDCart::Audio)+
"order by NUMBER"; "order by `NUMBER`";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
RehashCart(q->value(0).toUInt()); RehashCart(q->value(0).toUInt());
@ -862,9 +885,9 @@ void MainObject::RehashCart(unsigned cartnum) const
RDCart *cart=new RDCart(cartnum); RDCart *cart=new RDCart(cartnum);
if(cart->exists()) { if(cart->exists()) {
if(cart->type()==RDCart::Audio) { if(cart->type()==RDCart::Audio) {
QString sql=QString("select CUT_NAME from CUTS where ")+ QString sql=QString("select `CUT_NAME` from `CUTS` where ")+
QString().sprintf("CART_NUMBER=%u ",cartnum)+ QString().sprintf("`CART_NUMBER`=%u ",cartnum)+
"order by CUT_NAME"; "order by `CUT_NAME`";
QSqlQuery *q=new QSqlQuery(sql); QSqlQuery *q=new QSqlQuery(sql);
while(q->next()) { while(q->next()) {
RehashCut(q->value(0).toString()); RehashCut(q->value(0).toString());
@ -930,20 +953,20 @@ void MainObject::SetCutLength(const QString &cutname,int len) const
fflush(NULL); fflush(NULL);
if(UserResponse()) { if(UserResponse()) {
fflush(NULL); fflush(NULL);
sql=QString("update CUTS set ")+ sql=QString("update `CUTS` set ")+
"START_POINT=0,"+ "`START_POINT`=0,"+
QString().sprintf("END_POINT=%d,",len)+ QString().sprintf("`END_POINT`=%d,",len)+
"FADEUP_POINT=-1,"+ "`FADEUP_POINT`=-1,"+
"FADEDOWN_POINT=-1,"+ "`FADEDOWN_POINT`=-1,"+
"SEGUE_START_POINT=-1,"+ "`SEGUE_START_POINT`=-1,"+
"SEGUE_END_POINT=-1,"+ "`SEGUE_END_POINT`=-1,"+
"TALK_START_POINT=-1,"+ "`TALK_START_POINT`=-1,"+
"TALK_END_POINT=-1,"+ "`TALK_END_POINT`=-1,"+
"HOOK_START_POINT=-1,"+ "`HOOK_START_POINT`=-1,"+
"HOOK_END_POINT=-1,"+ "`HOOK_END_POINT`=-1,"+
"PLAY_GAIN=0,"+ "`PLAY_GAIN`=0,"+
QString().sprintf("LENGTH=%d where ",len)+ QString().sprintf("`LENGTH`=%d where ",len)+
"CUT_NAME=\""+RDEscapeString(cutname)+"\""; "`CUT_NAME`='"+RDEscapeString(cutname)+"'";
q=new QSqlQuery(sql); q=new QSqlQuery(sql);
delete q; delete q;
cart->updateLength(); cart->updateLength();
@ -1031,8 +1054,8 @@ void MainObject::CheckSchedCodeRules(bool prompt_user) const
// Check that we have at least one schedule code // Check that we have at least one schedule code
// //
sql=QString("select ")+ sql=QString("select ")+
"CODE "+ // 00 "`CODE` "+ // 00
"from SCHED_CODES"; "from `SCHED_CODES`";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
if(!q->first()) { if(!q->first()) {
delete q; delete q;
@ -1044,19 +1067,19 @@ void MainObject::CheckSchedCodeRules(bool prompt_user) const
// Check for orphaned rules // Check for orphaned rules
// //
sql=QString("select ")+ sql=QString("select ")+
"NAME "+ // 00 "`NAME` "+ // 00
"from CLOCKS order by NAME"; "from `CLOCKS` order by `NAME`";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
QString where_sql=""; QString where_sql="";
while(q->next()) { while(q->next()) {
where_sql+="(CLOCK_NAME!=\""+RDEscapeString(q->value(0).toString())+"\")&&"; where_sql+="(`CLOCK_NAME`!='"+RDEscapeString(q->value(0).toString())+"')&&";
} }
where_sql=where_sql.left(where_sql.length()-2); where_sql=where_sql.left(where_sql.length()-2);
delete q; delete q;
sql=QString("select ")+ sql=QString("select ")+
"ID " // 00 "`ID` " // 00
"from RULE_LINES where "+ "from `RULE_LINES` where "+
where_sql; where_sql;
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
if(q->first()) { if(q->first()) {
@ -1076,27 +1099,27 @@ void MainObject::CheckSchedCodeRules(bool prompt_user) const
// Check for missing rules // Check for missing rules
// //
sql=QString("select ")+ sql=QString("select ")+
"NAME "+ // 00 "`NAME` "+ // 00
"from CLOCKS order by NAME"; "from `CLOCKS` order by `NAME`";
RDSqlQuery *clock_q=new RDSqlQuery(sql); RDSqlQuery *clock_q=new RDSqlQuery(sql);
while(clock_q->next()) { while(clock_q->next()) {
QString clkname=clock_q->value(0).toString(); QString clkname=clock_q->value(0).toString();
sql=QString("select ")+ sql=QString("select ")+
"CODE "+ // 00 "`CODE` "+ // 00
"from SCHED_CODES order by CODE"; "from `SCHED_CODES` order by CODE";
RDSqlQuery *code_q=new RDSqlQuery(sql); RDSqlQuery *code_q=new RDSqlQuery(sql);
while(code_q->next()) { while(code_q->next()) {
QString code=code_q->value(0).toString(); QString code=code_q->value(0).toString();
sql=QString("select ")+ sql=QString("select ")+
"ID "+ // 00 "`ID` "+ // 00
"from RULE_LINES where "+ "from `RULE_LINES` where "+
"CLOCK_NAME=\""+RDEscapeString(clkname)+"\" && "+ "`CLOCK_NAME`='"+RDEscapeString(clkname)+"' && "+
"CODE=\""+RDEscapeString(code)+"\""; "`CODE`='"+RDEscapeString(code)+"'";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
if(!q->first()) { if(!q->first()) {
sql=QString("insert into RULE_LINES set ")+ sql=QString("insert into `RULE_LINES` set ")+
"CLOCK_NAME=\""+RDEscapeString(clkname)+"\","+ "`CLOCK_NAME`='"+RDEscapeString(clkname)+"',"+
"CODE=\""+RDEscapeString(code)+"\""; "`CODE`='"+RDEscapeString(code)+"'";
RDSqlQuery::apply(sql); RDSqlQuery::apply(sql);
} }
delete q; delete q;

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
// //
// Routines for --modify for rddbmgr(8) // Routines for --modify for rddbmgr(8)
// //
// (C) Copyright 2018 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2018-2021 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -20,8 +20,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <qstringlist.h>
#include <dbversion.h> #include <dbversion.h>
#include <rddb.h> #include <rddb.h>
#include <rdescape_string.h> #include <rdescape_string.h>
@ -79,10 +77,10 @@ bool MainObject::ModifyCharset(const QString &charset,
// Per-table Attributes // Per-table Attributes
// //
sql=QString("select ")+ sql=QString("select ")+
"TABLE_NAME,"+ // 00 "`TABLE_NAME`,"+ // 00
"TABLE_COLLATION "+ // 01 "`TABLE_COLLATION` "+ // 01
"from information_schema.TABLES where "+ "from `information_schema`.`TABLES` where "+
"TABLE_SCHEMA='"+RDEscapeString(db_mysql_database)+"'"; "`TABLE_SCHEMA`='"+RDEscapeString(db_mysql_database)+"'";
q=new RDSqlQuery(sql,false); q=new RDSqlQuery(sql,false);
while(q->next()) { while(q->next()) {
QStringList f0=q->value(1).toString().split("_"); QStringList f0=q->value(1).toString().split("_");
@ -98,10 +96,10 @@ bool MainObject::ModifyCharset(const QString &charset,
// Database Attributes // Database Attributes
// //
sql=QString("select ")+ sql=QString("select ")+
"SCHEMA_NAME,"+ // 00 "`SCHEMA_NAME`,"+ // 00
"DEFAULT_CHARACTER_SET_NAME,"+ // 01 "`DEFAULT_CHARACTER_SET_NAME`,"+ // 01
"DEFAULT_COLLATION_NAME "+ // 02 "`DEFAULT_COLLATION_NAME` "+ // 02
"from information_schema.SCHEMATA"; "from `information_schema`.`SCHEMATA`";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
if(q->value(0).toString()==db_mysql_database) { if(q->value(0).toString()==db_mysql_database) {
@ -116,4 +114,3 @@ bool MainObject::ModifyCharset(const QString &charset,
delete q; delete q;
return true; return true;
} }

View File

@ -277,8 +277,8 @@ MainObject::MainObject(QObject *parent)
// Check that Orphan group exists // Check that Orphan group exists
if(!db_orphan_group_name.isEmpty()) { if(!db_orphan_group_name.isEmpty()) {
QString sql=QString("select NAME from GROUPS where ")+ QString sql=QString("select `NAME` from `GROUPS` where ")+
"NAME=\""+RDEscapeString(db_orphan_group_name)+"\""; "NAME='"+RDEscapeString(db_orphan_group_name)+"'";
RDSqlQuery *q=new RDSqlQuery(sql,false); RDSqlQuery *q=new RDSqlQuery(sql,false);
if(!q->first()) { if(!q->first()) {
fprintf(stderr,"rddbmgr: invalid group \"%s\"\n", fprintf(stderr,"rddbmgr: invalid group \"%s\"\n",
@ -380,8 +380,8 @@ MainObject::MainObject(QObject *parent)
void MainObject::WriteSchemaVersion(int ver) const void MainObject::WriteSchemaVersion(int ver) const
{ {
QString sql=QString("update VERSION set ")+ QString sql=QString("update `VERSION` set ")+
QString().sprintf("DB=%d",ver); QString().sprintf("`DB`=%d",ver);
RDSqlQuery::apply(sql); RDSqlQuery::apply(sql);
} }
@ -393,7 +393,7 @@ bool MainObject::TableExists(const QString &tbl_name) const
bool ret=false; bool ret=false;
sql=QString("show tables where ")+ sql=QString("show tables where ")+
"Tables_in_"+db_config->mysqlDbname()+"=\""+RDEscapeString(tbl_name)+"\""; "`Tables_in_"+db_config->mysqlDbname()+"`='"+RDEscapeString(tbl_name)+"'";
q=new RDSqlQuery(sql,false); q=new RDSqlQuery(sql,false);
ret=q->first(); ret=q->first();
delete q; delete q;
@ -409,7 +409,7 @@ bool MainObject::DropTable(const QString &tbl_name,QString *err_msg) const
bool ret=false; bool ret=false;
sql=QString("show tables where ")+ sql=QString("show tables where ")+
"Tables_in_"+db_config->mysqlDbname()+"=\""+RDEscapeString(tbl_name)+"\""; "`Tables_in_"+db_config->mysqlDbname()+"`='"+RDEscapeString(tbl_name)+"'";
q=new RDSqlQuery(sql,false); q=new RDSqlQuery(sql,false);
if(q->first()) { if(q->first()) {
sql=QString("drop table `")+q->value(0).toString()+"`"; sql=QString("drop table `")+q->value(0).toString()+"`";
@ -432,10 +432,10 @@ bool MainObject::ColumnExists(const QString &tbl_name,
RDSqlQuery *q; RDSqlQuery *q;
bool ret=false; bool ret=false;
sql=QString("select * from INFORMATION_SCHEMA.COLUMNS where ")+ sql=QString("select * from `INFORMATION_SCHEMA`.`COLUMNS` where ")+
"TABLE_SCHEMA=\""+db_config->mysqlDbname()+"\" && "+ "`TABLE_SCHEMA`='"+db_config->mysqlDbname()+"' && "+
"TABLE_NAME=\""+tbl_name+"\" && "+ "`TABLE_NAME`='"+tbl_name+"' && "+
"COLUMN_NAME=\""+col_name+"\""; "`COLUMN_NAME`='"+col_name+"'";
q=new RDSqlQuery(sql,false); q=new RDSqlQuery(sql,false);
ret=q->first(); ret=q->first();
delete q; delete q;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff