rework database encoding settings and conversions

This commit is contained in:
Peinthor Rene
2013-02-23 12:57:01 +01:00
parent f8777ca550
commit d6533747b4
5 changed files with 63 additions and 105 deletions

View File

@@ -777,19 +777,15 @@ void MainWindow::executeQuery()
if (mustCreateColumns)
{
QStringList headerList;
for (int e=0; e<ncol; e++)
headerList = headerList << sqlite3_column_name(vm, e);
for (int e=0; e<ncol; ++e)
headerList = headerList << QString::fromUtf8((const char *)sqlite3_column_name(vm, e));
queryResultListModel->setHorizontalHeaderLabels(headerList);
mustCreateColumns = false;
}
for (int e=0; e<ncol; e++){
char * strresult = 0;
QString rv;
strresult = (char *) sqlite3_column_text(vm, e);
rv = QString(strresult);
for (int e=0; e<ncol; ++e){
QString rv = QString::fromUtf8((const char *) sqlite3_column_text(vm, e));
//show it here
QString decoded = db.GetDecodedQString(rv);
QString firstline = decoded.section( '\n', 0,0 );
QString firstline = rv.section( '\n', 0,0 );
queryResultListModel->setItem(rownum, e, new QStandardItem(QString(firstline)));
}
queryResultListModel->setVerticalHeaderItem(rownum, new QStandardItem(QString::number(rownum + 1)));
@@ -797,7 +793,7 @@ void MainWindow::executeQuery()
}
sqlite3_finalize(vm);
}else{
lastErrorMessage = QString (sqlite3_errmsg(db._db));
lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(db._db));
}
ui->queryErrorLineEdit->setText(lastErrorMessage);
ui->queryResultTableView->resizeColumnsToContents();
@@ -937,11 +933,6 @@ void MainWindow::updatePreferences()
{
PreferencesDialog prefs(this);
if(prefs.defaultencoding == "Latin1")
db.setEncoding(kEncodingLatin1);
else
db.setEncoding(kEncodingUTF8);
db.setDefaultNewData(prefs.defaultnewdata);
defaultlocation= prefs.defaultlocation;
editWin->defaultlocation = defaultlocation;

View File

@@ -45,10 +45,10 @@ void PreferencesDialog::defaultTextChanged( int which )
void PreferencesDialog::encodingChanged( int which )
{
if (which==1) {
defaultencoding = QString("Latin1");
if (which == 0) {
defaultencoding = QString("UTF-8");
} else {
defaultencoding = QString("UTF8");
defaultencoding = QString("UTF-16");
}
}
@@ -77,18 +77,18 @@ void PreferencesDialog::loadSettings()
QSettings settings(QApplication::organizationName(), QApplication::organizationName());
settings.sync();
defaultencoding = settings.value( "/db/defaultencoding", "UTF8" ).toString();
defaultencoding = settings.value( "/db/defaultencoding", "UTF-8" ).toString();
defaultnewdata = settings.value( "/db/defaultnewdata", "NULL" ).toString();
defaultlocation = settings.value( "/db/defaultlocation", QDir::homePath() ).toString();
defaulttext = settings.value( "/db/defaulttext", "Plain" ).toString();
foreignkeys = settings.value( "/db/foreignkeys", true ).toBool();
if (defaultencoding=="Latin1")
if (defaultencoding=="Latin1" || defaultencoding == "UTF-8")
{
ui->encodingComboBox->setCurrentIndex(1);
ui->encodingComboBox->setCurrentIndex(0);
} else {
ui->encodingComboBox->setCurrentIndex(0) ;
defaultencoding = QString("UTF8");
ui->encodingComboBox->setCurrentIndex(1);
defaultencoding = QString("UTF-16");
}
if (defaultnewdata=="\'\'")

View File

@@ -117,12 +117,12 @@
<widget class="QComboBox" name="encodingComboBox">
<item>
<property name="text">
<string>UTF8 (Unicode)</string>
<string notr="true">UTF-8</string>
</property>
</item>
<item>
<property name="text">
<string>Latin1 (8bit)</string>
<string notr="true">UTF-16</string>
</property>
</item>
</widget>

View File

@@ -30,40 +30,11 @@ bool DBBrowserDB::getDirty() const
return dirty;
}
void DBBrowserDB::setEncoding( int encoding )
{
curEncoding = encoding;
}
void DBBrowserDB::setDefaultNewData( const QString & data )
{
curNewData = data;
}
char * DBBrowserDB::GetEncodedQStringAsPointer( const QString & input) const
{
if (curEncoding==kEncodingUTF8) return (char *) input.toUtf8().constData();
if (curEncoding==kEncodingLatin1) return (char *) input.toLatin1().constData();
return (char *) input.constData();
}
QString DBBrowserDB::GetEncodedQString( const QString & input) const
{
if (curEncoding==kEncodingUTF8) return input.toUtf8();
if (curEncoding==kEncodingLatin1) return input.toLatin1();
return input;
}
QString DBBrowserDB::GetDecodedQString( const QString & input) const
{
// if (curEncoding==kEncodingUTF8) return QString::fromUtf8(input);
// if (curEncoding==kEncodingLatin1) return QString::fromLatin1(input);
return input;
}
bool DBBrowserDB::open ( const QString & db)
{
bool ok=false;
@@ -91,7 +62,7 @@ bool DBBrowserDB::open ( const QString & db)
err = sqlite3_open_v2(db.toUtf8(), &_db, SQLITE_OPEN_READWRITE, NULL);
if ( err ) {
lastErrorMessage = sqlite3_errmsg(_db);
lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db));
sqlite3_close(_db);
_db = 0;
return false;
@@ -165,8 +136,20 @@ bool DBBrowserDB::create ( const QString & db)
lastErrorMessage = QObject::tr("no error");
if( sqlite3_open(db.toUtf8(), &_db) != SQLITE_OK ){
lastErrorMessage = sqlite3_errmsg(_db);
// read encoding from settings and open with sqlite3_open for utf8
// and sqlite3_open16 for utf16
QSettings settings(QApplication::organizationName(), QApplication::organizationName());
QString sEncoding = settings.value("/db/defaultencoding", "UTF-8").toString();
int openresult = SQLITE_OK;
if(sEncoding == "UTF-8" || sEncoding == "UTF8" || sEncoding == "Latin1")
openresult = sqlite3_open(db.toUtf8(), &_db);
else
openresult = sqlite3_open16(db.utf16(), &_db);
if( openresult != SQLITE_OK ){
lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db));
sqlite3_close(_db);
_db = 0;
return false;
@@ -371,8 +354,8 @@ bool DBBrowserDB::addRecord ( )
int fields = browseFields.count();
QString emptyvalue = curNewData;
QString statement = QString("INSERT INTO `%1` VALUES(").arg(GetEncodedQString(curBrowseTableName));
for ( int i=1; i<=fields; i++ ) {
QString statement = QString("INSERT INTO `%1` VALUES(").arg(curBrowseTableName);
for ( int i=1; i<=fields; ++i ) {
statement.append(emptyvalue);
if (i<fields) statement.append(", ");
}
@@ -403,7 +386,7 @@ bool DBBrowserDB::deleteRecord( int wrow)
QString& rowid = rt[0];
lastErrorMessage = QString("no error");
QString statement = QString("DELETE FROM `%1` WHERE rowid=%2;").arg(GetEncodedQString(curBrowseTableName)).arg(rowid);
QString statement = QString("DELETE FROM `%1` WHERE rowid=%2;").arg(curBrowseTableName).arg(rowid);
if (_db){
logSQL(statement, kLogMsg_App);
@@ -432,10 +415,9 @@ bool DBBrowserDB::updateRecord(int wrow, int wcol, const QString & wtext)
QString& cv = rt[wcol+1];//must account for rowid
QString ct = browseFields.at(wcol);
QString statement = QString("UPDATE `%1` SET `%2`=").arg(GetEncodedQString(curBrowseTableName)).arg(ct);
QString statement = QString("UPDATE `%1` SET `%2`=").arg(curBrowseTableName).arg(ct);
QString wenc = GetEncodedQString(wtext);
char * formSQL = sqlite3_mprintf("%Q", wenc.toUtf8().constData());
char * formSQL = sqlite3_mprintf("%Q", wtext.toUtf8().constData());
statement.append(formSQL);
if (formSQL) sqlite3_free(formSQL);
@@ -688,9 +670,10 @@ void DBBrowserDB::getTableRecords( const QString & tablename, const QString& ord
idmap.clear();
lastErrorMessage = QObject::tr("no error");
QString statement = QString("SELECT rowid, * FROM `%1` ORDER BY %2;").arg(GetEncodedQString(tablename)).arg(orderby);
QString statement = QString("SELECT rowid, * FROM `%1` ORDER BY %2;").arg(tablename).arg(orderby);
logSQL(statement, kLogMsg_App);
err=sqlite3_prepare(_db,statement.toUtf8(),statement.length(),
QByteArray utf8Statement = statement.toUtf8();
err=sqlite3_prepare(_db,utf8Statement,utf8Statement.length(),
&vm, &tail);
if (err == SQLITE_OK){
int rownum = 0;
@@ -698,12 +681,9 @@ void DBBrowserDB::getTableRecords( const QString & tablename, const QString& ord
while ( sqlite3_step(vm) == SQLITE_ROW ){
r.clear();
ncol = sqlite3_data_count(vm);
for (int e=0; e<ncol; e++){
char * strresult = 0;
QString rv;
strresult = (char *) sqlite3_column_text(vm, e);
rv = QString(strresult);
r << GetDecodedQString(rv);
for (int e=0; e<ncol; ++e){
QString rv = QString::fromUtf8((const char*)sqlite3_column_text(vm,e));
r << rv;
if (e==0){
idmap.insert(rv.toInt(),rownum);
rownum++;
@@ -729,9 +709,9 @@ resultMap DBBrowserDB::getFindResults( const QString & wstatement)
int err=0;
resultMap res;
lastErrorMessage = QObject::tr("no error");
QString encstatement = GetEncodedQString(wstatement);
logSQL(encstatement, kLogMsg_App);
err=sqlite3_prepare(_db,encstatement.toUtf8(),encstatement.length(),
logSQL(wstatement, kLogMsg_App);
QByteArray statementutf8 = wstatement.toUtf8();
err=sqlite3_prepare(_db, statementutf8, statementutf8.length(),
&vm, &tail);
if (err == SQLITE_OK){
int rownum = 0;
@@ -739,22 +719,20 @@ resultMap DBBrowserDB::getFindResults( const QString & wstatement)
QString r;
while ( sqlite3_step(vm) == SQLITE_ROW ){
ncol = sqlite3_data_count(vm);
for (int e=0; e<ncol; e++){
char * strresult = 0;
strresult = (char *) sqlite3_column_text(vm, e);
r = QString(strresult);
for (int e=0; e<ncol; ++e){
r = QString::fromUtf8((const char *) sqlite3_column_text(vm, e));
if (e==0){
rownum = r.toInt();
rowIdMap::iterator mit = idmap.find(rownum);
recnum = *mit;
}
}
res.insert(recnum, GetDecodedQString(r));
res.insert(recnum, r);
}
sqlite3_finalize(vm);
}else{
lastErrorMessage = QString(sqlite3_errmsg(_db));
lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db));
}
return res;
}
@@ -889,18 +867,18 @@ void DBBrowserDB::updateSchema( )
lastErrorMessage = QObject::tr("no error");
QString statement = "SELECT type, name, sql FROM sqlite_master;";
err=sqlite3_prepare(_db, (const char *) statement.toUtf8(),statement.length(),
QByteArray utf8Statement = statement.toUtf8();
err=sqlite3_prepare(_db, utf8Statement, utf8Statement.length(),
&vm, &tail);
if (err == SQLITE_OK){
logSQL(statement, kLogMsg_App);
while ( sqlite3_step(vm) == SQLITE_ROW ){
QString val1, val2, val3;
val1 = QString((const char *) sqlite3_column_text(vm, 0));
val2 = QString((const char *) sqlite3_column_text(vm, 1));
val3 = QString((const char *) sqlite3_column_text(vm, 2));
QString val1 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 0));
QString val2 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 1));
QString val3 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 2));
if(val1 == "table" || val1 == "index" || val1 == "view" || val1 == "trigger")
objMap.insert(val1, DBBrowserObject(GetDecodedQString(val2), GetDecodedQString(val3), GetDecodedQString(val1)));
objMap.insert(val1, DBBrowserObject(val2, val3, val1));
else
qDebug(QObject::tr("unknown object type %1").arg(val1).toStdString().c_str());
}
@@ -923,16 +901,16 @@ void DBBrowserDB::updateSchema( )
(*it).fldmap.clear();
int e = 0;
while ( sqlite3_step(vm) == SQLITE_ROW ){
if (sqlite3_column_count(vm)==6) {
QString val1, val2;
if (sqlite3_column_count(vm)==6)
{
int ispk= 0;
val1 = QString((const char *) sqlite3_column_text(vm, 1));
val2 = QString((const char *) sqlite3_column_text(vm, 2));
QString val1 = QString::fromUtf8((const char *) sqlite3_column_text(vm, 1));
QString val2 = QString::fromUtf8((const char *) sqlite3_column_text(vm, 2));
ispk = sqlite3_column_int(vm, 5);
if(ispk==1)
val2.append(QString(" PRIMARY KEY"));
(*it).addField(e,GetDecodedQString(val1),GetDecodedQString(val2));
(*it).addField(e, val1, val2);
e++;
}
}
@@ -1042,7 +1020,7 @@ QString DBBrowserDB::getPragma(const QString& pragma)
logSQL(sql, kLogMsg_App);
if(sqlite3_step(vm) == SQLITE_ROW)
{
retval = QString((const char *) sqlite3_column_text(vm, 0));
retval = QString::fromUtf8((const char *) sqlite3_column_text(vm, 0));
//qDebug((pragma + ": " + retval).toStdString().c_str());
} else {
qDebug(QObject::tr("didn't receive any output from pragma %1").arg(pragma).toStdString().c_str());

View File

@@ -13,13 +13,6 @@ enum
kLogMsg_App
};
enum
{
kEncodingUTF8,
kEncodingLatin1,
kEncodingNONE
};
/*types for encoded media data*/
enum
{
@@ -81,7 +74,7 @@ private:
class DBBrowserDB
{
public:
DBBrowserDB (): _db( 0 ) , hasValidBrowseSet(false), curEncoding(kEncodingUTF8), mainWindow(0) {}
DBBrowserDB (): _db( 0 ) , hasValidBrowseSet(false), mainWindow(0) {}
~DBBrowserDB (){}
bool open ( const QString & db);
bool create ( const QString & db);
@@ -117,11 +110,8 @@ public:
void setDirty(bool dirtyval);
bool getDirty() const;
void logSQL(const QString& statement, int msgtype);
void setEncoding( int encoding );
void setDefaultNewData( const QString & data );
char * GetEncodedQStringAsPointer( const QString & input) const;
QString GetEncodedQString( const QString & input) const;
QString GetDecodedQString( const QString & input) const;
QString getPragma(const QString& pragma);
bool setPragma(const QString& pragma, const QString& value);
bool setPragma(const QString& pragma, const QString& value, QString& originalvalue);
@@ -140,7 +130,6 @@ public:
QString curBrowseTableName;
QString lastErrorMessage;
QString curDBFilename;
int curEncoding;
QString curNewData;
MainWindow* mainWindow;