Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QSqlQuery issue
Forum Updated to NodeBB v4.3 + New Features

QSqlQuery issue

Scheduled Pinned Locked Moved General and Desktop
11 Posts 2 Posters 3.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    fahmouch
    wrote on last edited by
    #1

    Hi All,

    I am developing a qt application using a SQLite database. In fact, I collect data periodically and I store them in the database.

    The code compiles fine but after a few minutes, the application craches. I tried to debug the application using the gdb tool. Here is what the debugger appears:

    • __memmove_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1547
      1547 ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: Aucun fichier ou dossier de ce type.
      (gdb) where
      #0 __memmove_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1547
      #1 0x0000000000dbd399 in QListData::remove(int) ()
      #2 0x00000000004b1f11 in QList<QSQLiteResult*>::removeOne(QSQLiteResult* const&) ()
      #3 0x00000000004b0116 in QSQLiteResult::~QSQLiteResult() ()
      #4 0x00000000004b0189 in QSQLiteResult::~QSQLiteResult() ()
      #5 0x000000000049f4ae in QSqlQueryPrivate::~QSqlQueryPrivate() ()
      #6 0x000000000049f7df in QSqlQuery::~QSqlQuery() ()
      #7 0x0000000000545a20 in QSqlQueryModelPrivate::~QSqlQueryModelPrivate() ()
      #8 0x0000000000541ff8 in QSqlTableModelPrivate::~QSqlTableModelPrivate() ()
      #9 0x0000000000f6e7a3 in QObject::~QObject() ()
      #10 0x0000000000439516 in WritingData::updateNodeStatus(QString, int) ()
      #11 0x0000000000414a53 in CollectScheduler::updateNodeStatus(QString, int) ()
      #12 0x000000000041635b in CollectScheduler::setWorkerPing(QString, bool) ()
      #13 0x0000000000453dd4 in CollectScheduler::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
      #14 0x0000000000f67be6 in QObject::event(QEvent*) ()
      #15 0x000000000056442c in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
      #16 0x00000000005692e6 in QApplication::notify(QObject*, QEvent*) ()
      #17 0x0000000000f451e0 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) ()
      #18 0x0000000000f8525c in QEventDispatcherUNIX::processEvents(QFlagsQEventLoop::ProcessEventsFlag) ()
      #19 0x0000000000f403d1 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag >) ()
      #20 0x0000000000d54568 in QThread::run() ()
      #21 0x0000000000d598ef in QThreadPrivate::start(void*) ()
      #22 0x00007ffff6174182 in start_thread (arg=0x7ffff3140700) at pthread_create.c:312
      #23 0x00007ffff568147d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111**

    How can i fix this bug?
    Any help would be appreciated.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mcosta
      wrote on last edited by
      #2

      Hi and welcome to devnet,

      very hard to help without the code.
      BTW, the debug info says that the error is inside WritingData::updateNodeStatus

      Once your problem is solved don't forget to:

      • Mark the thread as SOLVED using the Topic Tool menu
      • Vote up the answer(s) that helped you to solve the issue

      You can embed images using (http://imgur.com/) or (http://postimage.org/)

      F 1 Reply Last reply
      0
      • M mcosta

        Hi and welcome to devnet,

        very hard to help without the code.
        BTW, the debug info says that the error is inside WritingData::updateNodeStatus

        F Offline
        F Offline
        fahmouch
        wrote on last edited by p3c0
        #3

        @mcosta

        Thanks for your reply, here the funtion WritingData::updateNodeStatus

        bool WritingData::updateNodeStatus(QString node_Id , int node_status)
        {
        bool submit=false;
        if(writingDb.isOpen())
        {
        QSqlTableModel model(NULL, writingDb);
        model.setTable("nodes");
        model.setFilter(QString("node_id = '%1'").arg(node_Id));
        model.select();
        if (model.rowCount() == 1) {
        QSqlRecord record = model.record(0);
        record.setValue("node_id", node_Id);
        record.setValue("node_status_id", QString::number(node_status));
        model.setRecord(0, record);
        submit=model.submitAll();
        }
        }
        return submit;
        }
        

        This function is called by another thread for updating the last pool column of a specified node (filtered by its id). Moreover, this function uses a writing connexion (called here "writingDb").

        1 Reply Last reply
        0
        • M Offline
          M Offline
          mcosta
          wrote on last edited by
          #4

          Hi,

          the error happens in the QSqlModel destructor. (you should run in debug mode to try to understand why it crashes)

          QUESTION: are you sure your code does what you want? each time you overwrite the first record without storing all data model.setRecord(0, record)

          Once your problem is solved don't forget to:

          • Mark the thread as SOLVED using the Topic Tool menu
          • Vote up the answer(s) that helped you to solve the issue

          You can embed images using (http://imgur.com/) or (http://postimage.org/)

          F 1 Reply Last reply
          0
          • M mcosta

            Hi,

            the error happens in the QSqlModel destructor. (you should run in debug mode to try to understand why it crashes)

            QUESTION: are you sure your code does what you want? each time you overwrite the first record without storing all data model.setRecord(0, record)

            F Offline
            F Offline
            fahmouch
            wrote on last edited by p3c0
            #5

            @mcosta
            Hi,

            I have tried to use another method to update the database. Here the implementation of the new function: (this function updates the status of one node (network node), that's why i overwrite each time the first record)

            bool WritingData::updateNodeStatus(QString node_Id , int node_status)
            {
                bool submit=false;
                if(writingDb.isOpen())
                {
                    QSqlQuery query(writingDb);
                    submit=query.exec(QString("UPDATE nodes set node_status_id='%1' where   node_id='%2'").arg(QString::number(node_status)).arg(node_Id));
                }
                return submit;
            }
            

            There still the same problem. I think the problem is caused by the function
            QListData::remove(int)

            Note : I have this problem only on Linux Os (ubuntu 14.04). It doesn't crash on windows OS.

            Have you any idea?

            Edited: Please use ``` (3 back-ticks) for code blocks - p3c0

            1 Reply Last reply
            0
            • M Offline
              M Offline
              mcosta
              wrote on last edited by
              #6

              @fahmouch said:

              writingDb

              I think is a QSqlDatabase instance. Is it used across threads??
              According to this you should use it only in the thread that created it

              Once your problem is solved don't forget to:

              • Mark the thread as SOLVED using the Topic Tool menu
              • Vote up the answer(s) that helped you to solve the issue

              You can embed images using (http://imgur.com/) or (http://postimage.org/)

              F 1 Reply Last reply
              0
              • M mcosta

                @fahmouch said:

                writingDb

                I think is a QSqlDatabase instance. Is it used across threads??
                According to this you should use it only in the thread that created it

                F Offline
                F Offline
                fahmouch
                wrote on last edited by
                #7

                @mcosta

                Hi,

                I read in the offical documentation this phrase : The driver is locked for updates while a select is executed. This may cause problems when using QSqlTableModel because Qt's item views fetch data as needed (with QSqlQuery::fetchMore() in the case of QSqlTableModel).

                In fact, i tested my application by disabling the reading component (thread) and i haven't any problem. That's why, i think that i have this problem.

                There is any way to solve this problem?

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mcosta
                  wrote on last edited by
                  #8

                  Hi,

                  the solution is to use the connection only inside the GUI thread. Or, if you need to work with multiple threads, you have to use more connections.

                  Once your problem is solved don't forget to:

                  • Mark the thread as SOLVED using the Topic Tool menu
                  • Vote up the answer(s) that helped you to solve the issue

                  You can embed images using (http://imgur.com/) or (http://postimage.org/)

                  F 1 Reply Last reply
                  0
                  • M mcosta

                    Hi,

                    the solution is to use the connection only inside the GUI thread. Or, if you need to work with multiple threads, you have to use more connections.

                    F Offline
                    F Offline
                    fahmouch
                    wrote on last edited by
                    #9

                    @mcosta

                    I'm already using two connections (readingDB and writingDB) and each connection has a specific name.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mcosta
                      wrote on last edited by
                      #10

                      mmmm,

                      the problem is that SQLite (the DB not the Qt driver) cannot handle multiple connections in the right way (is a file access problem).
                      DO you need to open the database in ReadWrite mode in both threads (do you need to modify through the view)??
                      If the view is read-only you can try to specify QSQLITE_OPEN_READONLY for the UI thread connection

                      Once your problem is solved don't forget to:

                      • Mark the thread as SOLVED using the Topic Tool menu
                      • Vote up the answer(s) that helped you to solve the issue

                      You can embed images using (http://imgur.com/) or (http://postimage.org/)

                      F 1 Reply Last reply
                      0
                      • M mcosta

                        mmmm,

                        the problem is that SQLite (the DB not the Qt driver) cannot handle multiple connections in the right way (is a file access problem).
                        DO you need to open the database in ReadWrite mode in both threads (do you need to modify through the view)??
                        If the view is read-only you can try to specify QSQLITE_OPEN_READONLY for the UI thread connection

                        F Offline
                        F Offline
                        fahmouch
                        wrote on last edited by
                        #11

                        @mcosta

                        Thanks for your reply,

                        I have already tried this solution, but unfortantly, it doesn't resolve the problem (after a few minutes, the application crashes on Linux).

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved