[Qt-interest] postgres bytea
Andrew Maclean
andrew.amaclean at gmail.com
Wed May 6 02:02:52 CEST 2009
I agree that it would be nice if QPSQL driver supported this
transparently - when warnings like this begin to appear it may mean
that this method of escaping may become deprecated.
Andrew
On Wed, May 6, 2009 at 1:33 AM, Diego Schulz <dschulz at gmail.com> wrote:
> On Tue, May 5, 2009 at 12:02 AM, Andrew Maclean
> <andrew.amaclean at gmail.com> wrote:
>> Thankyou for your help Diego. It was a good example and it really helped me.
>> I cannot see a way to get rid of the warnings from pg server
>> regarding the use of \E'...' notation. If you look at the warning
>> message at the end of my test this seems to be a QT thing.
>>
>>
>> So if anyone knows a way to get rid of this warning, please let us know.
>>
>>
>> I have managed to get a solution as follows:
>>
>> The table is defined by:
>> CREATE TABLE resource_store
>> (
>> content_id serial NOT NULL,
>> description text,
>> "content" bytea,
>> CONSTRAINT content_id_rs_pk PRIMARY KEY (content_id)
>> );
>>
>> To insert a bytea value into the table:
>>
>> QSqlDatabase db = QSqlDatabase::database();
>> bool blob = db.driver()->hasFeature(QSqlDriver::BLOB);
>> bool unicode = db.driver()->hasFeature(QSqlDriver::Unicode);
>> if ( db.open() && blob && unicode )
>> {
>> QApplication::setOverrideCursor(Qt::BusyCursor);
>> // read in the data
>> QFile f(fileName);
>> if(f.open(QIODevice::ReadOnly)){
>> QVariant binaryData = f.readAll();
>>
>> QString s = "insert into ";
>> s += table;
>> s += "(description, content) "
>> "VALUES ( :description, :content )";
>> QSqlQuery query;
>> query.prepare(s);
>> query.bindValue(":description", description);
>> query.bindValue(":content", binaryData);
>>
>> QSqlDatabase::database().transaction();
>> if (!query.exec())
>> {
>> QApplication::restoreOverrideCursor();
>> QMessageBox msgBox;
>> msgBox.setText("SQL command failed\n" + query.lastError().text());
>> msgBox.exec();
>> }
>> QSqlDatabase::database().commit();
>> }
>> QApplication::restoreOverrideCursor();
>> }
>>
>>
>> To get a bytea value from the table;
>>
>>
>> QSqlDatabase db = QSqlDatabase::database();
>> if ( db.open() )
>> {
>> QApplication::setOverrideCursor(Qt::BusyCursor);
>> // Saving to a file called path/name
>> path += "/";
>> path += name;
>>
>> QString s = "select";
>> s += " description, content from ";
>> s += table;
>> s += " where description = :description";
>> QSqlQuery query;
>> query.prepare(s);
>> query.bindValue(":description", description);
>> QSqlDatabase::database().transaction();
>> if (!query.exec())
>> {
>> QApplication::restoreOverrideCursor();
>> QMessageBox msgBox;
>> msgBox.setText("SQL command failed\n" + query.lastError().text());
>> msgBox.exec();
>> }
>> QSqlDatabase::database().commit();
>> if (query.next())
>> {
>> QFile f(path);
>> if(f.open(QIODevice::WriteOnly))
>> {
>> QVariant binData = query.value(1);
>> f.write(binData.toByteArray());
>> }
>> }
>> QApplication::restoreOverrideCursor();
>> }
>>
>>
>> However there is one remaining issue, relating to inserting the bytea
>> value. When the above code runs I get this message:
>>
>> WARNING: nonstandard use of \\ in a string literal
>> LINE 1: EXECUTE qpsqlpstmt_1 ('zzz', '\\377\\330\\377\\340\\000\\020...
>> ^
>> HINT: Use the escape string syntax for backslashes, e.g., E'\\'.
>>
>
> This warning is exactly what I was talking about :)
> Note the HINT suggesting the use of E'\\..' notation (postgresql specific).
> I think it would be nice if QPSQL driver supported this transparently.
>
> The only way to get rid of the warning that I'm aware of is inserting
> base64 encoded blobs, actually inserting a long ASCII string instead
> of binary data.
>
> regards,
>
>
> diego
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
--
___________________________________________
Andrew J. P. Maclean
Centre for Autonomous Systems
The Rose Street Building J04
The University of Sydney 2006 NSW
AUSTRALIA
Ph: +61 2 9351 3283
Fax: +61 2 9351 7474
URL: http://www.acfr.usyd.edu.au/
___________________________________________
More information about the Qt-interest-old
mailing list