Browse Source

reference counting improvements

Kolja Strohm 3 years ago
parent
commit
a45f4a4572
5 changed files with 83 additions and 100 deletions
  1. BIN
      sql Linux/libSQL.so
  2. BIN
      sql Linux/libdbgSQL.so
  3. 2 2
      sql Linux/sql Linux.vcxproj
  4. 50 65
      sql/sql.cpp
  5. 31 33
      sql/sql.h

BIN
sql Linux/libSQL.so


BIN
sql Linux/libdbgSQL.so


+ 2 - 2
sql Linux/sql Linux.vcxproj

@@ -40,13 +40,13 @@
     <TargetName>libdbgSQL</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/sql/debug</RemoteProjectDir>
-    <IncludePath>..\..\Framework;../../Framework/debug;/usr/include/postgresql/;$(IncludePath);$(ISenseIncludePath);..\..\Postgres\x64\include</IncludePath>
+    <IncludePath>..\..\Framework;../../../Framework/debug;/usr/include/postgresql/;$(IncludePath);$(ISenseIncludePath);..\..\Postgres\x64\include</IncludePath>
     <OutDir>$(RemoteRootDir)/sql/debug/</OutDir>
     <IntDir>$(RemoteRootDir)/sql/debug/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <IncludePath>..\..\Framework;../../Framework/release;$(IncludePath);$(ISenseIncludePath);/usr/include/postgresql/;..\..\Postgres\x64\include</IncludePath>
+    <IncludePath>..\..\Framework;../../../Framework/release;$(IncludePath);$(ISenseIncludePath);/usr/include/postgresql/;..\..\Postgres\x64\include</IncludePath>
     <TargetName>libSQL</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/sql/release</RemoteProjectDir>

+ 50 - 65
sql/sql.cpp

@@ -9,102 +9,87 @@ using namespace Framework;
 // Inhalt ves structs Result aus sql.h
 void Result::destroy()
 {
-	delete[]felder;
-	delete[]values;
+    delete[]felder;
+    delete[]values;
 }
 
 // Inhalt der Datenbank Klasse aus sql.h
 // Konstruktor 
 Datenbank::Datenbank( const char *user, const char *passwort, const char *dbname, const char *ip, unsigned short port )
+    : ReferenceCounter()
 {
-	Text *txt = new Text( "user=" );
-	txt->append( user );
-	txt->append( " password=" );
-	txt->append( passwort );
-	txt->append( " dbname=" );
-	txt->append( dbname );
-	txt->append( " hostaddr=" );
-	txt->append( ip );
-	txt->append( " port=" );
-	txt->append( port );
-	conn = PQconnectdb( txt->getText() );
-	txt->release();
-	res = 0;
-	ref = 1;
-	if( PQstatus( conn ) != CONNECTION_OK )
-	{
-		PQfinish( conn );
-		conn = 0;
-	}
-	else
-		PQsetClientEncoding( conn, "WIN1251" );
+    Text *txt = new Text( "user=" );
+    txt->append( user );
+    txt->append( " password=" );
+    txt->append( passwort );
+    txt->append( " dbname=" );
+    txt->append( dbname );
+    txt->append( " hostaddr=" );
+    txt->append( ip );
+    txt->append( " port=" );
+    txt->append( port );
+    conn = PQconnectdb( txt->getText() );
+    txt->release();
+    res = 0;
+    if( PQstatus( conn ) != CONNECTION_OK )
+    {
+        PQfinish( conn );
+        conn = 0;
+    }
+    else
+        PQsetClientEncoding( conn, "WIN1251" );
 }
 
 // Destruktor 
 Datenbank::~Datenbank()
 {
-	PQfinish( conn );
+    PQfinish( conn );
 }
 
 // nicht constant 
 bool Datenbank::befehl( const char *txt )
 {
-	if( res )
-		PQclear( res );
-	res = PQexec( conn, txt );
-	ExecStatusType t = PQresultStatus( res );
-	if( t == PGRES_FATAL_ERROR || t == PGRES_BAD_RESPONSE || t == PGRES_NONFATAL_ERROR )
-	{
-		std::cout << "Datenbank Error bei Query '" << txt << ";'\n" << PQerrorMessage( conn ) << "\n";
-		return 0;
-	}
-	return 1;
+    if( res )
+        PQclear( res );
+    res = PQexec( conn, txt );
+    ExecStatusType t = PQresultStatus( res );
+    if( t == PGRES_FATAL_ERROR || t == PGRES_BAD_RESPONSE || t == PGRES_NONFATAL_ERROR )
+    {
+        std::cout << "Datenbank Error bei Query '" << txt << ";'\n" << PQerrorMessage( conn ) << "\n";
+        return 0;
+    }
+    return 1;
 }
 
 // constant
 int Datenbank::getZeilenAnzahl() const // Anzahl der betroffenen zeilen
 {
-	if( res )
-		return TextZuInt( PQcmdTuples( res ), 10 );
-	return 0;
+    if( res )
+        return TextZuInt( PQcmdTuples( res ), 10 );
+    return 0;
 }
 
 Result Datenbank::getResult() const
 {
-	Result ret;
-	ret.feldAnzahl = PQnfields( res );
-	ret.felder = new Text[ ret.feldAnzahl ];
-	for( int i = 0; i < ret.feldAnzahl; i++ )
-		ret.felder[ i ].setText( PQfname( res, i ) );
-	ret.zeilenAnzahl = PQntuples( res );
-	ret.values = new Text[ ret.feldAnzahl * ret.zeilenAnzahl ];
-	for( int i = 0; i < ret.feldAnzahl * ret.zeilenAnzahl; i++ )
-		ret.values[ i ].setText( PQgetvalue( res, i / ret.feldAnzahl, i % ret.feldAnzahl ) );
-	return ret;
+    Result ret;
+    ret.feldAnzahl = PQnfields( res );
+    ret.felder = new Text[ ret.feldAnzahl ];
+    for( int i = 0; i < ret.feldAnzahl; i++ )
+        ret.felder[ i ].setText( PQfname( res, i ) );
+    ret.zeilenAnzahl = PQntuples( res );
+    ret.values = new Text[ ret.feldAnzahl * ret.zeilenAnzahl ];
+    for( int i = 0; i < ret.feldAnzahl * ret.zeilenAnzahl; i++ )
+        ret.values[ i ].setText( PQgetvalue( res, i / ret.feldAnzahl, i % ret.feldAnzahl ) );
+    return ret;
 }
 
 Text *Datenbank::getLetzterFehler() const // gibt den letzten Fehler zurück
 {
-	Text *ret = new Text( PQerrorMessage( conn ) );
-	return ret;
+    Text *ret = new Text( PQerrorMessage( conn ) );
+    return ret;
 }
 
 bool Datenbank::istOk() const // prüft, ob die Verbindung zur Datenbank besteht
 {
-	return conn != 0;
-}
-
-// Reference Counting 
-Datenbank *Datenbank::getThis()
-{
-	ref++;
-	return this;
-}
-
-Datenbank *Datenbank::release()
-{
-	ref--;
-	if( ref == 0 )
-		delete this;
-	return 0;
+    return conn != 0;
 }

+ 31 - 33
sql/sql.h

@@ -17,46 +17,44 @@ struct pg_result; // libpq-fe.h
 #define __int64       long long
 #endif
 
+#include <ReferenceCounter.h>
+
 namespace Framework
 {
-	class Text; // Text.h
+    class Text; // Text.h
 }
 
 namespace sql
 {
-	struct Result; // aus dieser Datei
-	class Datenbank; // aus dieser Datei
+    struct Result; // aus dieser Datei
+    class Datenbank; // aus dieser Datei
 
-	struct Result
-	{
-		int feldAnzahl;
-		Framework::Text *felder;
-		int zeilenAnzahl;
-		Framework::Text *values;
-		__declspec( dllexport ) void destroy();
-	};
+    struct Result
+    {
+        int feldAnzahl;
+        Framework::Text *felder;
+        int zeilenAnzahl;
+        Framework::Text *values;
+        __declspec( dllexport ) void destroy();
+    };
 
-	class Datenbank
-	{
-	private:
-		pg_conn *conn;
-		pg_result *res;
-		int ref;
+    class Datenbank : public virtual Framework::ReferenceCounter
+    {
+    private:
+        pg_conn *conn;
+        pg_result *res;
 
-	public:
-		// Konstruktor 
-		__declspec( dllexport ) Datenbank( const char *user, const char *passwort, const char *dbname, const char *ip, unsigned short port );
-		// Destruktor 
-		__declspec( dllexport ) ~Datenbank();
-		// nicht constant 
-		__declspec( dllexport ) bool befehl( const char *txt ); // führt einen Befehl aus
-		// constant
-		__declspec( dllexport ) int getZeilenAnzahl() const; // Anzahl der betroffenen zeilen
-		__declspec( dllexport ) Result getResult() const; // gibt den rückgabewert des letzten Befehls zurück
-		__declspec( dllexport ) Framework::Text *getLetzterFehler() const; // gibt den letzten Fehler zurück
-		__declspec( dllexport ) bool istOk() const; // prüft, ob die Verbindung zur Datenbank besteht
-		// Reference Counting 
-		__declspec( dllexport ) Datenbank *getThis();
-		__declspec( dllexport ) Datenbank *release();
-	};
+    public:
+        // Konstruktor 
+        __declspec( dllexport ) Datenbank( const char *user, const char *passwort, const char *dbname, const char *ip, unsigned short port );
+        // Destruktor 
+        __declspec( dllexport ) ~Datenbank();
+        // nicht constant 
+        __declspec( dllexport ) bool befehl( const char *txt ); // führt einen Befehl aus
+        // constant
+        __declspec( dllexport ) int getZeilenAnzahl() const; // Anzahl der betroffenen zeilen
+        __declspec( dllexport ) Result getResult() const; // gibt den rückgabewert des letzten Befehls zurück
+        __declspec( dllexport ) Framework::Text *getLetzterFehler() const; // gibt den letzten Fehler zurück
+        __declspec( dllexport ) bool istOk() const; // prüft, ob die Verbindung zur Datenbank besteht
+    };
 }