[solved] querys in mehreren Klassen

Alles rund um die Programmierung mit Qt
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

solarix hat geschrieben:Security by Obscurity .. meiner Meinung nach unsinnig.

Code: Alles auswählen

Debug() << query.exec() << " " << query.next() << " " << query.executedQuery() << " " << query.lastError(); 
Die Reihenfolge der Auswertung der Operanden ist in C++ undefiniert (d.h. der Compiler kann da tun was er möchte). next() muss da also nicht zwingend nach exec() ausgeführt werden..
In diesem Fall nicht, die Datenbank enthaellt Bilder, und wir moechten nicht, dass die script-kiddies die ohne Probleme ins Internet stellen koennen. Ausserdem werden viele IT-Schueler das Programm in die Haende bekommen, und da moechte ich denen schon eine Huerde bauen damit sich die ein wenig mit Programmierung auseinandersetzen, wenn sie an die Bilder ranwollen.

Das heisst, wenn ich etwas auf diese Art in den Stream klopfe muss ich nicht unbedingt die Reihenfolge eingehalten werden? Ist das der Grund, warum manchmal der cerr den cout ueberholt? Najaokay, ich bastel das mal in Einzelanweisungen um. Gesagt getan:

Code: Alles auswählen

if ( !query.exec() ) qDebug() << "exec failed";
if ( !query.next() ) qDebug() << "next failed";
qDebug() << query.executedQuery() << " " << query.lastError();
Autsch, das tut weh! das mit der Reihenfolge hab ich schon in mehreren Buechern gelesen, aber dann vergessen. Habs grade nochmal nachgelesen. Gut, das werd ich so schnell nicht mehr vergessen.
Vielen Dank soweit :)

Eine Frage hab ich aber noch: woher kommt
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Die Meldung kommt beim Beenden, ich hab schon ein db.close() in den der Hauptklasse eingefuegt, aber das aendert nichts. Die anderen Klassen, die die Datenbank nutzen, funktionieren soweit normal. Ein wirkliches Problem ist die Meldung damit nicht, aber es ist im Endeffekt ein Fehler und darum muss er weg.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich meinte nicht, das Security schlecht ist, nur "by Obscurity" :wink:
ist aber egal..
das mit der Reihenfolge hab ich schon in mehreren Buechern gelesen, aber dann vergessen.
Ich vermute, es hätte auch gereicht, die Debug-Ausgaben genau zu lesen, denn "WHERE id = ?" hätte korrekterweise vermutlich "WHERE id = 1" (oder so) ergeben..
Eine Frage hab ich aber noch:
Ich habe mittlerweile keinen Überblick mehr, was du im Code hast und was nicht.. hast du jetzt noch die private "db"-Instanz? Falls ja, kannst du mal im Destruktor

Code: Alles auswählen

MainPage::~MainPage()
{
 db = QSqlDatabase();
}
versuchen?
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

solarix hat geschrieben:Ich meinte nicht, das Security schlecht ist, nur "by Obscurity" :wink:
ist aber egal..
Ich weiss :)
solarix hat geschrieben:Ich vermute, es hätte auch gereicht, die Debug-Ausgaben genau zu lesen, denn "WHERE id = ?" hätte korrekterweise vermutlich "WHERE id = 1" (oder so) ergeben..
Dem kann ich nicht zustimmen, denn es waere das allererste mal, dass sich die Parameter entfaltet haetten ;) ich hab noch nie die Ersetzung bekommen.
solarix hat geschrieben:Ich habe mittlerweile keinen Überblick mehr, was du im Code hast und was nicht..
Ja, das kann ich gut verstehen
solarix hat geschrieben:hast du jetzt noch die private "db"-Instanz? Falls ja, kannst du mal im Destruktor

Code: Alles auswählen

MainPage::~MainPage()
{
 db = QSqlDatabase();
}
versuchen?
Die Instanz hab ich tatsaechlich noch, aber nur in der Hauptklasse, wo die Verbindung aufgebaut wird. in der MainPage sind nur noch die Query-Funktionen:

Code: Alles auswählen

QImage MainPage::getImage ( int id )
{
	QSqlQuery query ( QSqlDatabase::database() );
	query.prepare ( "SELECT data FROM splashes WHERE id = :id" );
	query.bindValue ( ":id", id+1 );
	if ( !query.exec() ) return QImage();
	if ( !query.next() ) return QImage();

	QByteArray array = query.value ( 0 ).toByteArray();
	QBuffer buffer ( &array );
	buffer.open ( QIODevice::ReadOnly );
	QImageReader reader ( &buffer, "JPG" );
	QImage image = reader.read();
	return image;
}
Das Codefragment hab ich in den Destruktor der Hauptklasse rein, aber das bringt keine aenderung, an sich sollte es ja auch nach einem close() zu sein. Momentan weiss ich aber auch nciht, an welcher Stelle die Funktion "removeDatabase" aufgerufen wird die offenbar den Fehler ausgiebt.
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

sodele, die sache ist geloest. Problem war, dass ich zwar auf Strg+Q und den Druck auf den Beenden-Knopf per slot gehoert hab, aber nicht auf das wegdruecken per [X]-Knopf in der Fensterleiste.

Code: Alles auswählen

mainclass:mainclass ( QObject *parent = 0) :QObject ( parent )
{
	connect ( qApp, SIGNAL ( lastWindowClosed() ), this, SLOT ( kill() ) );
}

void mainclass::kill()
{
	db = QSqlDatabase();
	close();
}
danke fuer die Hilfe
C167
Antworten