Reviving DatabaseLayer

Talk here about issues with one of the components hosted at wxCode, or suggest features for it.
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

Appreicated the prompt feedback.

I will study the updated source sometime later.At this moment when I searched the key word testEncodingSupport in tests.cpp file,I don't quite understand the existence of wxConvISO8859_1 there.To be honest,I don't quite understand Encoding stuffs,or Uncode charset stuffs,but in my testcase when I tried to manage Chinese characters interacting with MS
Access database,I did not specify in my test source file any of the encoding.That is,only in the original stringconverter ctrs,there specifies UTF8 encoding,in my C::B source editor,UTF8 has been chosen.That's all places I have to specify the encoding.I will try to test in a silly way later the testEncodingSupport function,if it can't handle Chinese character properly in my workplace,I will test again taking wxConvISO8859_1 out.

By the way,thanks for the suggestion for chosing VC++2010 Express.Just wondering whether it eats a lot of memory and or CPU cycle as it is rather an old machine.What's more,I don't know whether it will be lack of some stuffs (such as gdiplus,directX,direct show, etc) which has already been included in my VS.Net2003.

Best regards,
Sam
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
manyleaves
Earned a small fee
Earned a small fee
Posts: 21
Joined: Tue Mar 26, 2013 3:52 am

Re: Reviving DatabaseLayer

Post by manyleaves »

Sam

Thanks for your prompt feedback too!

Please enhance testEncodingSupport in any way you see fit. Personally I'd ike it that test.dat (the input stream for testEncodingSupport) can contain any number Asian or other characters and the test indicate what does or doesn't seem to be supported.

Silly way or not, you seem to have stumbled across something that works so I'm keen you encapsulate that serendipity!

BTW: The documentation for wxSafeConvertWX2MB indicates that it tries several encodings (ending up with wxConvISO8859_1 as a last resort) so there may be hints there.

FYI: My laptop is 6 years old with Windows XP SP3 and 3Gb RAM. VC++ Express 2010 is certainly heavier than VC++ 2008 but it runs well. AFAIK: gdiplus,directX,directshow are all downloadable SDKs. If you look at Tools->Options->Projects and Solutions->VC++ Directories in VS 2003 you should see what your old install is including.

Thanks

Andrew
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

I tried to build the library and the test samples but no luck same as last time(due to use C::B so no proper workable project settings).Also tried to include all sources to build,no luck too.Grateful if there will be a MinGW makefile or C::B +MinGW project file for testing.One thing I noticed when open the tests.cpp source file ,there are too many strings ACK (compiler said:illegal character set 0x6) everywhere.Don't know where are they from.
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

In previous version as I tested,I am not sure whether ODBC part has been tested,it seems that only SQLite part has been tested.

I don't know how to only test ODBC/SQLite separately.Does taking out one of it from the settings.conf file work?Or need to undefine USE_ODBC/USE_SQLite in the project and recompile(I use source,not lib generated)?I tried both ways.When there is only ODBC left in the settings.conf,I got below error message.Inside settings.conf :

Code: Select all

[ODBC]
DSN=artist
DbType=ACCESS
Connection=Driver={microsoft access driver (*.mdb)};dbq=e:\\codeblocksproject\\artist.mdb
user=
password=
Error message:

Code: Select all


>tests

+ MyTestSuite
  - MyTestSuite::testInsertRecords
  - MyTestSuite::testInsertRecordsWithPreparedStatements
  - MyTestSuite::testMultipartInserts
  - MyTestSuite::testMultipartInsertsWithResults
  - MyTestSuite::testMultipartStatements
  - MyTestSuite::testResults
  - MyTestSuite::testPreparedStatementResults
  - MyTestSuite::testSelectCorrectRecord
  - MyTestSuite::testSelectCorrectRecordFromPreparedStatement
  - MyTestSuite::testRollback
  - MyTestSuite::testRollbackComplexSequence
  - MyTestSuite::testDateTimeParameters
  - MyTestSuite::testDateTimeParametersBefore1970
  - MyTestSuite::testDateResultSetField
  - MyTestSuite::testBinaryBlobParametersSimpleRetrieval
  - MyTestSuite::testBinaryBlobParametersPreparedRetrieval
  - MyTestSuite::testChangePreparedStatementParameters
  - MyTestSuite::testSetPreparedStatementParametersOutOfOrder
  - MyTestSuite::testManyBlobRecordRetrieval
  - MyTestSuite::testLoopingPreparedStatement
  - MyTestSuite::testLoopingPreparedStatementRetrieval
  - MyTestSuite::testResultSetNext
  - MyTestSuite::testFieldNotInResultSetError
  - MyTestSuite::testNullValues
  - MyTestSuite::testNullParameters
  - MyTestSuite::testSingleLinePreparedStatement
  - MyTestSuite::testEncodingSupport
  - MyTestSuite::testParameterEncodingSupport
  - MyTestSuite::testResultsByIndex
  - MyTestSuite::testPreparedStatementResultsByIndex
  - MyTestSuite::testResultSetMetaData
  - MyTestSuite::testResultSetMetaDataForNullValues
  - MyTestSuite::testResultSetAlias
  - MyTestSuite::testViewAlias
  - MyTestSuite::testSemicolonInsideStatement
  - MyTestSuite::testDatabaseLayerWrappers
  - MyTestSuite::testPreparedStatementWrappers
  - MyTestSuite::testTextRemnants
  - MyTestSuite::testDatabaseGarbageCollection
  - MyTestSuite::testIsFieldNull
  - MyTestSuite::testDateWithoutTime
  - MyTestSuite::testDateWithoutTimePreparedStatement
  - MyTestSuite::testTableExists
  - MyTestSuite::testViewExists
  - MyTestSuite::testGetTables
  - MyTestSuite::testGetViews
  - MyTestSuite::testGetColumns
  - MyTestSuite::testCloseBeforeDelete
  - MyTestSuite::testIsOpen
  - MyTestSuite::testSingleResult
  - MyTestSuite::testSingleResultNoResults
  - MyTestSuite::testSingleResultNonUniqueResults
  - MyTestSuite::testResultArrayInt
  - MyTestSuite::testResultArrayString
  - MyTestSuite::testResultArrayLong
  - MyTestSuite::testResultArrayDouble
  - MyTestSuite::testMemoryBufferBlobParameter
  - MyTestSuite::testSmallMemoryBuffer
  - MyTestSuite::testLargeMemoryBuffer
  - MyTestSuite::testReusePreparedStatementWithResults
  - MyTestSuite::testRunQueryReturnValue
  - MyTestSuite::testPreparedStatementRunQueryReturnValue
  - MyTestSuite::testBadPreparedStatement
  - MyTestSuite::testResultSetNoRecords
  - MyTestSuite::testSpecialCharactersInPreparedStatement
Error loading database specific SQL statementsF
terminate called after throwing an instance of 'TestFailedException'

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
manyleaves
Earned a small fee
Earned a small fee
Posts: 21
Joined: Tue Mar 26, 2013 3:52 am

Re: Reviving DatabaseLayer

Post by manyleaves »

Sam

My apologies for the confusion.

The "DbType" entry is one I introduced for ODBC conenctions. It is for the benefit of "tests.cpp" and should simply reflect the corresponding SQL "dialect" used by the target database. MS Access seems to use the same SQL syntax as MS Sql Server so DbType should be set to TDS. Perhaps "DbType" is not the best name for this property!

So for SQLite3 via ODBC a suitable connection string is

Code: Select all

[ODBC]
Connection=DRIVER=SQLite3 ODBC Driver;Database=C:\\Documents and Settings\\Andrew\\My Documents\\wxWidgets\\samples\\database\\tests\\test.sqlite;
DbType=SQLITE
and for MS Access via ODBC

Code: Select all

[ODBC]
Connection=DRIVER={microsoft access driver (*.mdb)};dbq=C:\\Documents and Settings\\Andrew\\My Documents\\Downloads\\NewDBtest\\NewDBtest\\db\\db1.mdb;DSN=DbType=TDS;
DbType=TDS
Your hassle with "compiler said:illegal character set 0x6" may be because I added some additional unicode strings to testEncodingSupport.

Have you had any success with Visual C++ 2010 Express?

I have never used C::B nor MinGW and simply don't have the time to take on another compiler. Perhaps there is a tool out there that can create ::B or MinGW makefiles from a Visual C++ vcxproj!

Hope this helps a bit

Andrew
User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2409
Joined: Wed Jan 28, 2009 11:57 am
Location: United Republic of Tanzania

Re: Reviving DatabaseLayer

Post by evstevemd »

You can set VC as Compiler on Code::Blocks
Chief Justice: We have trouble dear citizens!
Citizens: What it is his honor?
Chief Justice:Our president is an atheist, who will he swear to?
manyleaves
Earned a small fee
Earned a small fee
Posts: 21
Joined: Tue Mar 26, 2013 3:52 am

Re: Reviving DatabaseLayer

Post by manyleaves »

evstevemd and Sam

If either of you have downloaded and installed VC++ 2010 Express I'm simply suggesting that you open up (and build) the solution files (*.sln) directly with VC++. Whether you intend to compile with VC++ in the future or not this should give you a working reference to compare against when constructing your own makefiles or otherwise.

Andrew
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

manyleaves wrote: Anyway, yesterday I downloaded your latest wxDatabase and merged my TDS and ODBC fixes and all the tests back into your code. In what I've put together we have MySql, PostGreSQL, Sqlite3, ODBC and TDS. I've run the tests for ODBC and TDS and they both pass all 65.
Sorry,could you please let me know which version here you've uploaded is the earliest one that passed all 65 for ODBC?Thanks.I just get back to the original DatabaseLayer ,built and tested with MinGW,result is sqlite passes all 65,ODBC not,just 58 of 65 or 59 of 65(can't remember after modified several times).I am afraid the code in the original DatabaseLayer has the discussed issue already.

If ODBC does pass all 65s,I guess your opinions on changing source and IDE encoding could be valuable helpful,if we get the right one.From http://gcc.gnu.org/onlinedocs/cpp/Invocation.html

Code: Select all

-fexec-charset=charset
Set the execution character set, used for string and character constants. The default is UTF-8. charset can be any encoding supported by the system's iconv library routine. 

-fwide-exec-charset=charset
Set the wide execution character set, used for wide string and character constants. The default is UTF-32 or UTF-16, whichever corresponds to the width of wchar_t. As with -fexec-charset, charset can be any encoding supported by the system's iconv library routine; however, you will have problems with encodings that do not fit exactly in wchar_t. 

-finput-charset=charset
Set the input character set, used for translation from the character set of the input file to the source character set used by GCC. If the locale does not specify, or GCC cannot get this information from the locale, the default is UTF-8. This can be overridden by either the locale or this command line option. Currently the command line option takes precedence if there's a conflict. charset can be any encoding supported by the system's iconv library routine. 
Maybe vc has the similar settings like:

Code: Select all

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
Here I pasted some information from gcc doc for easy reference(I am studing).
fromhttp://gcc.gnu.org/onlinedocs/cpp/Character-sets.html

Code: Select all

1.1 Character sets
Source code character set processing in C and related languages is rather complicated. The C standard discusses two character sets, but there are really at least four. 
The files input to CPP might be in any character set at all. CPP's very first action, before it even looks for line boundaries, is to convert the file into the character set it uses for internal processing. That set is what the C standard calls the source character set. It must be isomorphic with ISO 10646, also known as Unicode. CPP uses the UTF-8 encoding of Unicode. 
The character sets of the input files are specified using the -finput-charset= option. 
All preprocessing work (the subject of the rest of this manual) is carried out in the source character set. If you request textual output from the preprocessor with the -E option, it will be in UTF-8. 
After preprocessing is complete, string and character constants are converted again, into the execution character set. This character set is under control of the user; the default is UTF-8, matching the source character set. Wide string and character constants have their own character set, which is not called out specifically in the standard. Again, it is under control of the user. The default is UTF-16 or UTF-32, whichever fits in the target's wchar_t type, in the target machine's byte order.1 Octal and hexadecimal escape sequences do not undergo conversion; '\x12' has the value 0x12 regardless of the currently selected execution character set. All other escapes are replaced by the character in the source character set that they represent, then converted to the execution character set, just like unescaped characters. 
Unless the experimental -fextended-identifiers option is used, GCC does not permit the use of characters outside the ASCII range, nor ‘\u’ and ‘\U’ escapes, in identifiers. Even with that option, characters outside the ASCII range can only be specified with the ‘\u’ and ‘\U’ escapes, not used directly in identifiers. 
________________________________________
Footnotes
[1] UTF-16 does not meet the requirements of the C standard for a wide character set, but the choice of 16-bit wchar_t is enshrined in some system ABIs so we cannot fix this.


manyleaves wrote: If either of you have downloaded and installed VC++ 2010 Express I'm simply suggesting that you open up (and build) the solution files (*.sln) directly with VC++. Whether you intend to compile with VC++ in the future or not this should give you a working reference to compare against when constructing your own makefiles or otherwise.
I tried with C::B+vc2010 compiler by importing sln project.But it can't get compiled.For example,I have to add #include <wx/wx.h> to query_parser.h even if I've provide the necessay including path to the project.Others like wxDDEConnections (the like) got the same compiling error.Plus can't find wxcode_MSW29u_database.lib (the like),it seems that names of 3rd party libs generated by my wx+vc2010+c::b don't look like it.They are more like wx_vc10_xxx.lib the like.

My laptop has only 1.5G memory which is a bit hard to use VC2010 Express IDE.Anyhow I will try with it later.

Thanks and best regards,
Sam
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

Compiled with vc++2010 Express Edition IDE+ wx3.0 RC1:
base.lib and database.lib successfully;
config/tests:

Code: Select all

------ Build started: Project: tests, Configuration: Release Win32 ------
tests.obj : error LNK2001: unresolved external symbol "class wxMBConv * wxConvLibcPtr" (?wxConvLibcPtr@@3PAVwxMBConv@@A)
tests.obj : error LNK2001: unresolved external symbol "public: static unsigned int const wxString::npos" (?npos@wxString@@2IB)
tests.obj : error LNK2001: unresolved external symbol "wchar_t const * const wxEmptyString" (?wxEmptyString@@3PB_WB)
tests.obj : error LNK2001: unresolved external symbol "class wxColour wxNullColour" (?wxNullColour@@3VwxColour@@A)
tests.obj : error LNK2001: unresolved external symbol "bool wxTrapInAssert" (?wxTrapInAssert@@3_NA)
tests.obj : error LNK2001: unresolved external symbol "void (__cdecl* wxTheAssertHandler)(class wxString const &,int,class wxString const &,class wxString const &,class wxString const &)" (?wxTheAssertHandler@@3P6AXABVwxString@@H000@ZA)
tests.obj : error LNK2001: unresolved external symbol "private: static unsigned long wxThread::ms_idMainThread" (?ms_idMainThread@wxThread@@0KA)
tests.obj : error LNK2001: unresolved external symbol "private: static bool wxLog::ms_doLog" (?ms_doLog@wxLog@@0_NA)
tests.obj : error LNK2001: unresolved external symbol "char const * const wxLOG_COMPONENT" (?wxLOG_COMPONENT@@3PBDB)
.\tests\tests.exe : fatal error LNK1120: 9 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
inputted libs:

Code: Select all

xcode_msw30u_base.lib
wxmsw30u.lib
wxtiff.lib
wxjpeg.lib
wxpng.lib
wxzlib.lib
wxregexu.lib
wxexpat.lib
wxscintilla.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
odbc32.lib
oleacc.lib
..\..\lib\vc_dll\wxcode_msw30u_database.lib
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2409
Joined: Wed Jan 28, 2009 11:57 am
Location: United Republic of Tanzania

Re: Reviving DatabaseLayer

Post by evstevemd »

Hi Sam,
would you try monolithic build first?
Chief Justice: We have trouble dear citizens!
Citizens: What it is his honor?
Chief Justice:Our president is an atheist, who will he swear to?
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: Reviving DatabaseLayer

Post by samsam598 »

error.JPG
Retried with wx vc dll_release and dll_debug built libs.wxDatabaes base and database libs built successfully,config\test.exe built successfully.Inside IDE when test.exe is starting,exception caught at last line of

Code: Select all


+ MyTestSuite
  - MyTestSuite::testPath
  - MyTestSuite::testGetEntries
  - MyTestSuite::testGetGroups
  - MyTestSuite::testHasEntry
  - MyTestSuite::testHasGroup
  - MyTestSuite::testBinary
  - MyTestSuite::testDeleteEntry
  - MyTestSuite::testDeleteAndWriteEntry
  - MyTestSuite::testDeleteLastRootEntry
  - MyTestSuite::testDeleteGroup
  - MyTestSuite::testDeleteAll
  - MyTestSuite::testRenameEntry
  - MyTestSuite::testRenameGroup
  - MyTestSuite::testCreateEntriesAndSubgroup
  - MyTestSuite::testCreateSubgroupAndEntries
  - MyTestSuite::testDeleteLastGroup
  - MyTestSuite::testDeleteAndRecreateGroup
  - MyTestSuite::testAddToExistingRoot
  - MyTestSuite::testReadNonExistent
  - MyTestSuite::testStringReadWrite
  - MyTestSuite::testNumericReadWrite
  - MyTestSuite::testBooleanReadWrite
  - MyTestSuite::testColourReadWrite
  - MyTestSuite::testRecordingDefaults
Screenshot of IDE is as above.

Content of test.conf either

Code: Select all

[SQLite]
database=:memory:
or

Code: Select all

[ODBC]
Connection=Driver={microsoft access driver (*.mdb)};dbq=e:\\codeblocksproject\\artist.mdb;DSN=;DbType=TDS;
DSN=artist
DbType=TDS
user=
password=
In above ODBC configuration file,the database file name artist.mdb and the DSN name artist are both correct.

Thanks and best regards,
Sam
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2409
Joined: Wed Jan 28, 2009 11:57 am
Location: United Republic of Tanzania

Re: Reviving DatabaseLayer

Post by evstevemd »

Dealing with Bakefile to produce makefiles so that first version of the component might be released! :P
Chief Justice: We have trouble dear citizens!
Citizens: What it is his honor?
Chief Justice:Our president is an atheist, who will he swear to?
manyleaves
Earned a small fee
Earned a small fee
Posts: 21
Joined: Tue Mar 26, 2013 3:52 am

Re: Reviving DatabaseLayer

Post by manyleaves »

evstevemd and Sam

FYI: The original wxDatabase version I started this all from was dated 14th August 2013.

I'm pleased you got the DLL Debug and DLL Release builds to compile via VC++ 2010 Express. I always compile with DLL builds so I had neglected to make sure that the (non DLL) Debug and Release builds actually compiled. I've spent a few hours today correcting the non DLL builds. I've now successfully run tests.exe for both Debug and Release. I've attached my latest wxDatabase.rar. Hopefully this can serve as a buildable reference until evstevemd has had time to do the bakefiles.

Except for the encoding tests ...
TDS direct and TDS via ODBC both pass all the tests.
SQLITE and SQLITE via ODBC pass most of the tests.
MS Access via ODBC passes less tests still.

NB: You need

Code: Select all

#define wxUSE_DATABASE_SQLITE		1
#define wxUSE_DATABASE_POSTGRESQL	0
#define wxUSE_DATABASE_MYSQL		0
#define wxUSE_DATABASE_ODBC			1
#define wxUSE_DATABASE_TDS			1
for the tests above to run.

FYI: I'm still using wxWidgets 2.9.5.

Regarding your exception. I had issues like that when wxWidgets was built with VC++ 2008 and my code was built with VC++ 2010. When I rebuilt both wxWidgets and my code with the same compiler the issues went away.

Andrew
User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2409
Joined: Wed Jan 28, 2009 11:57 am
Location: United Republic of Tanzania

Re: Reviving DatabaseLayer

Post by evstevemd »

manyleaves wrote:evstevemd and Sam

FYI: The original wxDatabase version I started this all from was dated 14th August 2013.

I'm pleased you got the DLL Debug and DLL Release builds to compile via VC++ 2010 Express. I always compile with DLL builds so I had neglected to make sure that the (non DLL) Debug and Release builds actually compiled. I've spent a few hours today correcting the non DLL builds. I've now successfully run tests.exe for both Debug and Release. I've attached my latest wxDatabase.rar. Hopefully this can serve as a buildable reference until evstevemd has had time to do the bakefiles.

Except for the encoding tests ...
TDS direct and TDS via ODBC both pass all the tests.
SQLITE and SQLITE via ODBC pass most of the tests.
MS Access via ODBC passes less tests still.

NB: You need

Code: Select all

#define wxUSE_DATABASE_SQLITE		1
#define wxUSE_DATABASE_POSTGRESQL	0
#define wxUSE_DATABASE_MYSQL		0
#define wxUSE_DATABASE_ODBC			1
#define wxUSE_DATABASE_TDS			1
for the tests above to run.

FYI: I'm still using wxWidgets 2.9.5.

Regarding your exception. I had issues like that when wxWidgets was built with VC++ 2008 and my code was built with VC++ 2010. When I rebuilt both wxWidgets and my code with the same compiler the issues went away.

Andrew
Where is tha attachment?
Chief Justice: We have trouble dear citizens!
Citizens: What it is his honor?
Chief Justice:Our president is an atheist, who will he swear to?
manyleaves
Earned a small fee
Earned a small fee
Posts: 21
Joined: Tue Mar 26, 2013 3:52 am

Re: Reviving DatabaseLayer

Post by manyleaves »

My apologies ... an 8 year old on school holidays doesn't do wonders for your concentration ...
Attachments
wxDatabase.rar
(456.57 KiB) Downloaded 218 times
Post Reply