mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-06-06 23:22:40 +02:00
2019-04-04 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rddbmgr(8) that could cause database corruption when altering a table's charset/collation.
This commit is contained in:
parent
b88565a115
commit
7bfa5c12d9
@ -18571,3 +18571,6 @@
|
|||||||
disallow invalid datetime values.
|
disallow invalid datetime values.
|
||||||
2019-04-03 Fred Gleason <fredg@paravelsystems.com>
|
2019-04-03 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Fixed a bug in rddbmgr(8) that broke schema reverting.
|
* Fixed a bug in rddbmgr(8) that broke schema reverting.
|
||||||
|
2019-04-04 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Fixed a bug in rddbmgr(8) that could cause database corruption
|
||||||
|
when altering a table's charset/collation.
|
||||||
|
@ -163,8 +163,9 @@ void MainObject::CheckTableAttributes()
|
|||||||
(const char *)q->value(2).toString().toUtf8());
|
(const char *)q->value(2).toString().toUtf8());
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
if(UserResponse()) {
|
if(UserResponse()) {
|
||||||
RewriteTable(q->value(0).toString(),charset,"utf8mb4",
|
RewriteTable(q->value(0).toString(),
|
||||||
"utf8mb4_general_ci");
|
charset,q->value(2).toString(),
|
||||||
|
"utf8mb4","utf8mb4_general_ci");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,7 +200,9 @@ void MainObject::CheckTableAttributes()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainObject::RewriteTable(const QString &tblname,const QString &old_charset,
|
void MainObject::RewriteTable(const QString &tblname,
|
||||||
|
const QString &old_charset,
|
||||||
|
const QString &old_collation,
|
||||||
const QString &new_charset,
|
const QString &new_charset,
|
||||||
const QString &new_collation)
|
const QString &new_collation)
|
||||||
{
|
{
|
||||||
@ -210,6 +213,7 @@ void MainObject::RewriteTable(const QString &tblname,const QString &old_charset,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QString filename=tempdir+"/table.sql";
|
QString filename=tempdir+"/table.sql";
|
||||||
|
QString temp_filename=tempdir+"/table-temp.sql";
|
||||||
QString out_filename=tempdir+"/table-out.sql";
|
QString out_filename=tempdir+"/table-out.sql";
|
||||||
/*
|
/*
|
||||||
printf("table \"%s\" using: %s\n",
|
printf("table \"%s\" using: %s\n",
|
||||||
@ -236,11 +240,23 @@ void MainObject::RewriteTable(const QString &tblname,const QString &old_charset,
|
|||||||
delete proc;
|
delete proc;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Modify Dump
|
// Modify COLLATION
|
||||||
|
//
|
||||||
|
args.clear();
|
||||||
|
args.push_back("s/"+old_collation+"/"+new_collation+"/g");
|
||||||
|
args.push_back(filename);
|
||||||
|
proc=new QProcess(this);
|
||||||
|
proc->setStandardOutputFile(temp_filename);
|
||||||
|
proc->start("sed",args);
|
||||||
|
proc->waitForFinished(-1);
|
||||||
|
delete proc;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modify CHARSET
|
||||||
//
|
//
|
||||||
args.clear();
|
args.clear();
|
||||||
args.push_back("s/"+old_charset+"/"+new_charset+"/g");
|
args.push_back("s/"+old_charset+"/"+new_charset+"/g");
|
||||||
args.push_back(filename);
|
args.push_back(temp_filename);
|
||||||
proc=new QProcess(this);
|
proc=new QProcess(this);
|
||||||
proc->setStandardOutputFile(out_filename);
|
proc->setStandardOutputFile(out_filename);
|
||||||
proc->start("sed",args);
|
proc->start("sed",args);
|
||||||
@ -267,6 +283,7 @@ void MainObject::RewriteTable(const QString &tblname,const QString &old_charset,
|
|||||||
// Clean Up
|
// Clean Up
|
||||||
//
|
//
|
||||||
unlink(filename.toUtf8());
|
unlink(filename.toUtf8());
|
||||||
|
unlink(temp_filename.toUtf8());
|
||||||
unlink(out_filename.toUtf8());
|
unlink(out_filename.toUtf8());
|
||||||
rmdir(tempdir);
|
rmdir(tempdir);
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,8 @@ bool MainObject::ModifyCharset(const QString &charset,
|
|||||||
QStringList f0=q->value(1).toString().split("_");
|
QStringList f0=q->value(1).toString().split("_");
|
||||||
QString prev_charset=f0.at(0);
|
QString prev_charset=f0.at(0);
|
||||||
if(q->value(1).toString().toLower()!=collation) {
|
if(q->value(1).toString().toLower()!=collation) {
|
||||||
RewriteTable(q->value(0).toString(),prev_charset,charset,collation);
|
RewriteTable(q->value(0).toString(),
|
||||||
|
prev_charset,q->value(1).toString(),charset,collation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete q;
|
delete q;
|
||||||
|
@ -42,7 +42,9 @@ class MainObject : public QObject
|
|||||||
//
|
//
|
||||||
bool Check(QString *err_msg);
|
bool Check(QString *err_msg);
|
||||||
void CheckTableAttributes();
|
void CheckTableAttributes();
|
||||||
void RewriteTable(const QString &tblname,const QString &old_charset,
|
void RewriteTable(const QString &tblname,
|
||||||
|
const QString &old_charset,
|
||||||
|
const QString &old_collation,
|
||||||
const QString &new_charset,
|
const QString &new_charset,
|
||||||
const QString &new_collation);
|
const QString &new_collation);
|
||||||
void RelinkAudio(const QString &srcdir) const;
|
void RelinkAudio(const QString &srcdir) const;
|
||||||
|
@ -2320,6 +2320,8 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
|
|||||||
q1=new RDSqlQuery(sql,false);
|
q1=new RDSqlQuery(sql,false);
|
||||||
while(q1->next()) {
|
while(q1->next()) {
|
||||||
sql=QString("insert into `")+tablename+"` set "+
|
sql=QString("insert into `")+tablename+"` set "+
|
||||||
|
"SOURCE=0,"+
|
||||||
|
"TIME_TYPE=0,"+
|
||||||
QString().sprintf("ID=%d,",1+q1->value(0).toInt())+
|
QString().sprintf("ID=%d,",1+q1->value(0).toInt())+
|
||||||
QString().sprintf("COUNT=%d,",q1->value(0).toInt())+
|
QString().sprintf("COUNT=%d,",q1->value(0).toInt())+
|
||||||
QString().sprintf("TYPE=%d,",q1->value(1).toInt())+
|
QString().sprintf("TYPE=%d,",q1->value(1).toInt())+
|
||||||
@ -2397,6 +2399,8 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
|
|||||||
q1=new RDSqlQuery(sql,false);
|
q1=new RDSqlQuery(sql,false);
|
||||||
while(q1->next()) {
|
while(q1->next()) {
|
||||||
sql=QString("insert into `")+tablename+"` set "+
|
sql=QString("insert into `")+tablename+"` set "+
|
||||||
|
"SOURCE=0,"+
|
||||||
|
"TIME_TYPE=0,"+
|
||||||
QString().sprintf("ID=%d,",1+q1->value(0).toInt())+
|
QString().sprintf("ID=%d,",1+q1->value(0).toInt())+
|
||||||
QString().sprintf("COUNT=%d,",q1->value(0).toInt())+
|
QString().sprintf("COUNT=%d,",q1->value(0).toInt())+
|
||||||
QString().sprintf("TYPE=%d,",q1->value(1).toInt())+
|
QString().sprintf("TYPE=%d,",q1->value(1).toInt())+
|
||||||
@ -2528,17 +2532,17 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
|
|||||||
"ISRC=\""+RDEscapeString(q1->value(17).toString())+"\","+
|
"ISRC=\""+RDEscapeString(q1->value(17).toString())+"\","+
|
||||||
"ISCI=\""+RDEscapeString(q1->value(18).toString())+"\","+
|
"ISCI=\""+RDEscapeString(q1->value(18).toString())+"\","+
|
||||||
"STATION_NAME=\""+RDEscapeString(q1->value(19).toString())+"\","+
|
"STATION_NAME=\""+RDEscapeString(q1->value(19).toString())+"\","+
|
||||||
"EVENT_DATETIME=\""+RDEscapeString(q1->value(20).toDateTime().
|
"EVENT_DATETIME="+
|
||||||
toString("yyyy-MM-dd hh:mm:ss"))+"\","+
|
RDCheckDateTime(q1->value(20).toDateTime(),"yyyy-MM-dd hh:mm:ss")+","+
|
||||||
"SCHEDULED_TIME=\""+RDEscapeString(q1->value(21).toTime().
|
"SCHEDULED_TIME="+
|
||||||
toString("hh:mm:ss"))+"\","+
|
RDCheckDateTime(q1->value(21).toTime(),"hh:mm:ss")+","+
|
||||||
QString().sprintf("EVENT_TYPE=%d,",q1->value(22).toInt())+
|
QString().sprintf("EVENT_TYPE=%d,",q1->value(22).toInt())+
|
||||||
QString().sprintf("EVENT_SOURCE=%d,",q1->value(23).toInt())+
|
QString().sprintf("EVENT_SOURCE=%d,",q1->value(23).toInt())+
|
||||||
QString().sprintf("PLAY_SOURCE=%d,",q1->value(24).toInt())+
|
QString().sprintf("PLAY_SOURCE=%d,",q1->value(24).toInt())+
|
||||||
QString().sprintf("START_SOURCE=%d,",q1->value(25).toInt())+
|
QString().sprintf("START_SOURCE=%d,",q1->value(25).toInt())+
|
||||||
"ONAIR_FLAG=\""+RDEscapeString(q1->value(26).toString())+"\","+
|
"ONAIR_FLAG=\""+RDEscapeString(q1->value(26).toString())+"\","+
|
||||||
"EXT_START_TIME=\""+RDEscapeString(q1->value(27).toTime().
|
"EXT_START_TIME="+
|
||||||
toString("hh:mm:ss"))+"\","+
|
RDCheckDateTime(q1->value(27).toTime(),"hh:mm:ss")+","+
|
||||||
QString().sprintf("EXT_LENGTH=%d,",q1->value(28).toInt())+
|
QString().sprintf("EXT_LENGTH=%d,",q1->value(28).toInt())+
|
||||||
"EXT_CART_NAME=\""+RDEscapeString(q1->value(29).toString())+"\","+
|
"EXT_CART_NAME=\""+RDEscapeString(q1->value(29).toString())+"\","+
|
||||||
"EXT_DATA=\""+RDEscapeString(q1->value(30).toString())+"\","+
|
"EXT_DATA=\""+RDEscapeString(q1->value(30).toString())+"\","+
|
||||||
@ -2687,8 +2691,8 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
|
|||||||
"COMMENT=\""+RDEscapeString(q1->value(21).toString())+"\","+
|
"COMMENT=\""+RDEscapeString(q1->value(21).toString())+"\","+
|
||||||
"LABEL=\""+RDEscapeString(q1->value(22).toString())+"\","+
|
"LABEL=\""+RDEscapeString(q1->value(22).toString())+"\","+
|
||||||
"ORIGIN_USER=\""+RDEscapeString(q1->value(23).toString())+"\","+
|
"ORIGIN_USER=\""+RDEscapeString(q1->value(23).toString())+"\","+
|
||||||
"ORIGIN_DATETIME=\""+q1->value(24).toDateTime().
|
"ORIGIN_DATETIME="+
|
||||||
toString("yyyy-MM-dd hh:mm:ss")+"\","+
|
RDCheckDateTime(q1->value(24).toDateTime(),"yyyy-MM-dd hh:mm:ss")+","+
|
||||||
QString().sprintf("EVENT_LENGTH=%d,",q1->value(25).toInt())+
|
QString().sprintf("EVENT_LENGTH=%d,",q1->value(25).toInt())+
|
||||||
"LINK_EVENT_NAME=\""+RDEscapeString(q1->value(26).toString())+"\","+
|
"LINK_EVENT_NAME=\""+RDEscapeString(q1->value(26).toString())+"\","+
|
||||||
QString().sprintf("LINK_START_TIME=%d,",q1->value(27).toInt())+
|
QString().sprintf("LINK_START_TIME=%d,",q1->value(27).toInt())+
|
||||||
@ -2697,7 +2701,8 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
|
|||||||
QString().sprintf("LINK_END_SLOP=%d,",q1->value(30).toInt())+
|
QString().sprintf("LINK_END_SLOP=%d,",q1->value(30).toInt())+
|
||||||
QString().sprintf("LINK_ID=%d,",q1->value(31).toInt())+
|
QString().sprintf("LINK_ID=%d,",q1->value(31).toInt())+
|
||||||
"LINK_EMBEDDED=\""+RDEscapeString(q1->value(32).toString())+"\","+
|
"LINK_EMBEDDED=\""+RDEscapeString(q1->value(32).toString())+"\","+
|
||||||
"EXT_START_TIME=\""+q1->value(33).toTime().toString("hh:mm:ss")+"\","+
|
"EXT_START_TIME="+
|
||||||
|
RDCheckDateTime(q1->value(33).toTime(),"hh:mm:ss")+","+
|
||||||
QString().sprintf("EXT_LENGTH=%d,",q1->value(34).toInt())+
|
QString().sprintf("EXT_LENGTH=%d,",q1->value(34).toInt())+
|
||||||
"EXT_CART_NAME=\""+RDEscapeString(q1->value(35).toString())+"\","+
|
"EXT_CART_NAME=\""+RDEscapeString(q1->value(35).toString())+"\","+
|
||||||
"EXT_DATA=\""+RDEscapeString(q1->value(36).toString())+"\","+
|
"EXT_DATA=\""+RDEscapeString(q1->value(36).toString())+"\","+
|
||||||
|
Loading…
x
Reference in New Issue
Block a user