IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

SQLite et Qt, un bug totalement random


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut SQLite et Qt, un bug totalement random
    Bonjour,
    désolé de vous déranger avec ça mais ça fait trop longtemps que je suis sur se bug, environ 6 mois même si j'ai fais d'autre trucs à côté. Je suis désespéré ...
    J'utilise SQLite sous Qt et j'ai 1 requête sur 1000 qui plante, enfin elle plante pas mais elle écrit de fausses valeurs dans la base de données et ça nique tous mes calculs.
    En gros je sauvegarde des pseudo matrices de float dans ma base et des fois certaines requête se retrouve inversé avec les mauvais id comme si mes résultat arrivé pas dans l'ordre. (Et oui j'ai un "ORDER BY" dans ma requête !!!)

    Je sais pas trop comment expliquer ce bug donc je vous file le code de ma classe Database.
    Désolé, c'est un peu indigeste.

    PS : J'effectue BEAUCOUP de requête à la suite sur le même thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    #include "database.h"
    #include "gui/thread.h"
    #include "gui/mainwindow.h"
     
    Database *t_instance0 = 0; // use in main thread
    Database *t_instance1 = 0; // use in first thread
    Database *t_instance2 = 0; // use in cards
     
    sqlite3 *Database::db;
    bool Database::is_open = false;
    bool Database::is_opening = false;
     
    Database* Database::instance(int database_number)
    {
        if(database_number == 0)
        {
            if(t_instance0 == NULL)
                t_instance0 = new Database(0);
            return t_instance0;
        }
        else if(database_number == 1)
        {
            if(t_instance1 == NULL)
                t_instance1 = new Database(1);
            return t_instance1;
        }
        else if(database_number == 2)
        {
            if(t_instance2 == NULL)
                t_instance2 = new Database(2);
            return t_instance2;
        }
        return NULL;
    }
     
    Database::Database(int database_number)
    {
        is_open = false;
        this->database_number = database_number;
        if(is_open == false && is_opening == false)
            initialize(DATABASE);
    }
     
    int Database::callback(void *a_param, int number_value, char ** value, char ** name_column)
    {
        for (int i = 0; i < number_value; i++)
        {
            if(value[i])
            {
                Database::instance((int)a_param)->result_request.push_back(value[i]);
            }
            else
            {
                Database::instance((int)a_param)->result_request.push_back("NULL");
            }
        }
        return 0;
    }
     
    void Database::delete_all()
    {
        if(write("DROP TABLE combos") && write("DROP TABLE states"))
        {
            if(database_number == 0)
                MainWindow::instance()->write("DATABASE ALL DELETE","information");
            else
                Thread::instance()->write("DATABASE ALL DELETE","information");
        }
    }
     
    void Database::initialize(string file)
    {
        if(sqlite3_open(file.c_str(), &db) != 0)
        {
            if(database_number == 0)
                MainWindow::instance()->write("Could not open data base","information");
            else
                Thread::instance()->write("Could not open data base","information");
        }
        else
        {
            is_opening = true;
            if(database_number == 0)
            {
                write("CREATE TABLE combos(id INTEGER PRIMARY KEY, combo VARCHAR(127) UNIQUE)");
                write("CREATE TABLE states(id INTEGER PRIMARY KEY, id_combo INTEGER, score INTEGER, date_added DATETIME, FOREIGN KEY (id_combo) REFERENCES combos(id))");
                write("CREATE TABLE neural_networks(id INTEGER, id_combo INTEGER, clustering_rate REAL, number_input INTEGER, number_hidden_layer INTEGER, number_neuron_layer INTEGER"
                      "FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_combo))");
                write("CREATE TABLE perceptrons(id INTEGER, id_layer INTEGER, id_nn INTEGER, id_combo INTERGER, weights VARCHAR(255), bias REAL, number_input INTEGER, learning_rate INTEGER, "
                      "FOREIGN KEY (id_nn) REFERENCES neural_networks(id), FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_layer, id_nn, id_combo))");
     
                write("ALTER TABLE neural_networks ADD COLUMN positive_classifed_well INTEGER");
                write("ALTER TABLE neural_networks ADD COLUMN positive_misclassified INTEGER");
                write("ALTER TABLE neural_networks ADD COLUMN negative_classified_well INTEGER");
                write("ALTER TABLE neural_networks ADD COLUMN negative_misclassified INTEGER");
     
                write("ALTER TABLE states ADD COLUMN random REAL");
     
            }
            if(database_number == 0)
                MainWindow::instance()->write((string)"Opened database " + to_string(database_number),"information");
            else
                Thread::instance()->write((string)"Opened database " + to_string(database_number),"information");
            is_open = true;
        }
    }
     
    bool Database::write(string sql)
    {
        char *error = "database is not open";
        if(sqlite3_exec(db, sql.c_str(), callback, (void*)this->database_number, &error) != (SQLITE_OK || SQLITE_CONSTRAINT_UNIQUE))//can used callback function
        {
            if(database_number == 0)
                MainWindow::instance()->write("Request execute with success", "current_information");
            else
                Thread::instance()->write("Request execute with success", "current_information");
            return true;
        }
        else
        {
            if(database_number == 0)
                MainWindow::instance()->write((string)"Error : " + error, "information");
            else
                Thread::instance()->write((string)"Error : " + error, "information");
            return false;
        }
    }
     
    bool Database::read(string sql)
    {
        this->result_request.clear();
     
        return write(sql);
    }
    Et je sais ce que vous allez dire alors NON, l'erreur ne viens pas d'ailleurs et mes requêtes sont bien écrient car elles fonctionnent correctement dans 99.9% des cas !!!
    Es-ce que vous auriez des pistes ? ou des réponses ?

  2. #2
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Désolé, j'ai trouvé mon bug et il n'y a aucun rapport, désolé :'(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer valeur random SQLite dans TextView
    Par gisclace dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 26/06/2015, 10h18
  2. [Débutant] Bug avec le random ?
    Par val_300 dans le forum C#
    Réponses: 3
    Dernier message: 07/01/2015, 12h53
  3. Bug avec utilisation de plusieurs tables SQLite
    Par Toinou- dans le forum Android
    Réponses: 5
    Dernier message: 17/09/2013, 22h43
  4. [WD11] Incompréhension total de bug d'affichage
    Par labifle dans le forum WinDev
    Réponses: 6
    Dernier message: 18/05/2010, 09h30
  5. Réponses: 4
    Dernier message: 21/10/2009, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo