Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
Home » U++ Library support » U++ SQL » MySqlSession Close and Reconnect crashes Application (Reconnect crashes on newer Upp Version (CLANG) but works on older (Mingw))
MySqlSession Close and Reconnect crashes Application [message #55629] Wed, 25 November 2020 17:17 Go to previous message
hoelblin is currently offline  hoelblin
Messages: 4
Registered: November 2020
Location: Austria
Junior Member
Hi,

I have an Application with a Connection to MySql. When the Application is Idle for
a long Period of Time the Connection is Closed with session.Close.

After that session.IsOpen returns false.

When I try to reconnect with session.Reconnect() the App Crashes with a Null Pointer dereference.
It seems like in Sql.Cancel cn->cancel is called while Member cn == NULL.

This behavior is on TheIDE Version 15512 on Windows with CLANG, on TheIDE 13664 with minGW this works as
expected without crashing.

To reproduce the Crash i have taken the SQL_MySql reference Example and make some minor changes.

#include <MySql/MySql.h>

// debian: sudo apt-get install libmysqlclient-dev

using namespace Upp;

#define SCHEMADIALECT <MySql/MySqlSchema.h>
#define MODEL <mysqlCrash/schema.sch>
#include <Sql/sch_header.h>
#include <Sql/sch_source.h>
#include <Sql/sch_schema.h>

CONSOLE_APP_MAIN
{
	MySqlSession session;
	// edit the connection parameters if necessary
	if(session.Connect("test_user", "test", "test")) {
		Cout() << "Connected\n";
		SQL = session;
		
		SqlSchema sch(MY_SQL);
		All_Tables(sch);
		// create the table if necessary
		SqlPerformScript(sch.Upgrade());
		SqlPerformScript(sch.Attributes());
		SQL.ClearError();


		try {
			// insert some random data
			SQL & Insert(TEST_TABLE)(VALUE, Uuid::Create().ToString());
			// fetch some data
			Sql sql;
			sql * Select(ID, VALUE).From(TEST_TABLE)
			                       .OrderBy(Descending(ID))
			                       .Limit(5);
			while(sql.Fetch())
				Cout() << AsString(sql[0]) << ": " << AsString(sql[VALUE]) << "\n";
		}
		catch(SqlExc &ex) {
			Cerr() << "ERROR: " << ex << "\n";
			SetExitCode(1);
		}
		
		session.Close();
		
		Sleep(2000);

		if(session.IsOpen()) {
			Cout() << "Connection closed FAILED!\n";
		} else {
			Cout() << "Connection closed!\n";
		}
		
		Sleep(2000);
		
		Cout() << "Try open Connection again\n";
		
		if(session.Reconnect()) { // CRASH !!!!!!!!!
			try {
				Sql sql;
				sql * Select(ID, VALUE).From(TEST_TABLE)
				                       .OrderBy(Descending(ID))
				                       .Limit(3);
				while(sql.Fetch())
					Cout() << AsString(sql[0]) << ": " << AsString(sql[VALUE]) << "\n";
			}
			catch(SqlExc &ex) {
				Cerr() << "ERROR: " << ex << "\n";
				SetExitCode(1);
			}
		} else {
			Cout() << "ERROR: " << session.GetLastError() << "\n";
		}
	}
	else {
		Cerr() <<"ERROR: Unable to connect to database\n";
		SetExitCode(1);
	}
}

// Moderator: PLESE USE CODE TAG FOR THE NEXT TIME!

My Question is what is the right way to do a Reconnect after Close ?

index.php?t=getfile&id=6285&private=0

index.php?t=getfile&id=6286&private=0

[Updated on: Wed, 25 November 2020 17:30] by Moderator

Report message to a moderator

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Some queries return incorrect datatypes with SqLite
Next Topic: Sql object
Goto Forum:
  


Current Time: Wed Apr 24 02:10:57 CEST 2024

Total time taken to generate the page: 0.02307 seconds