Как экспортировать значения из базы данных в строку или символ в C / C ++, используя SQLite? - PullRequest
1 голос
/ 07 февраля 2020

У меня есть серверный / клиентский TCP-сервер, который может выполнять эти задачи; -Когда клиент отправляет команду LIST на сервер, сервер перечисляет все подключенные клиенты с их идентификатором и отправляет эту информацию обратно клиенту, -Клиент отправляет зашифрованное сообщение и идентификатор клиента на сервер -Сервер получает зашифрованное сообщение, сохраните его в базу данных в виде сообщений и отправьте сообщение другому клиенту. - Другой клиент получает и расшифровывает сообщение

Что я пытаюсь сделать; - Когда клиент отправляет команду HISTORY на сервер, сервер должен прочитать базу данных сообщений, вставить эти сообщения в строку или массив символов и отправить эту строку или массив символов клиенту через сокет.

Проблема в том, что; -При попытке выбрать сообщения из базы данных и записать эти значения в строку, используя функцию обратного вызова sqlite3_exe c, она записывает только одну строку в строку при каждом запуске, и в конце функции обратного вызова у меня есть строка, которая включает в себя только последнее сообщение из базы данных.

Функция показа истории:

void showHistory(){
    sqlite3* DB; 
    char* messaggeError; 
    int exit = 0; 

    exit = sqlite3_open("SERVER.db", &DB); 

    if (exit) { 
        cerr << "Error open DB " << sqlite3_errmsg(DB) << endl; 
    } 

    string sql("SELECT * FROM messageHistory");

    int exit3;
    exit3 = sqlite3_exec(DB, sql.c_str(), callBackHistory, 0, &messaggeError);



    if (exit3 != SQLITE_OK) { 
        cerr << "Error Insert" << endl; 
        sqlite3_free(messaggeError); 
    }
    sqlite3_close(DB);
}

Функция обратного вызова:

int callBackHistory(void* data, int argc, char** argv, char** azColName) {
int i;
int offset = 0;
string s;

for (i = 0; i < argc; i++) { 

s += argv[i] + '\n' ;

} 

cout << "--->" << s << "<---" ;

return 0;

}

вывод:

> --->1NTU1GRFNGU0RGU0RGU0RBRg==
<------>k=
<------>ZZRkZZRA==
<------>ZZRkZZRA==
<------>ZZRkZZRA==
<------>VFRQ==
<------>==

Здесь, из команды *cout << "--->" << s << "<---" ;* в функции обратного вызова, вывод должен быть таким: *"--->message1(newline) message2 (newline) message3 (newline) ... <---"*, но здесь вывод - *--->message1(newline)<--- --->message2(newline)<--- --->message3(newline)<---*

, и если я попытаюсь чтобы отправить его клиенту через сокет, я могу только послать message3 в качестве последней строки сообщения базы данных.

Я надеюсь, что вопрос можно понять хорошо, любая помощь будет полезна, большое спасибо :)

1 Ответ

0 голосов
/ 07 февраля 2020

с использованием функций sqlite3_prepare и sqlite3_step я решил проблему следующим образом;

void showHistory(int clientSocket){
sqlite3 *DB;
char *messaggeError;
int exit = 0;

exit = sqlite3_open("SERVER.db", &DB);

if (exit)
{
    cerr << "Error open DB " << sqlite3_errmsg(DB) << endl;
}

int exit3;

sqlite3_stmt *getMessages;
char* tblN;

 sqlite3_prepare(DB, "SELECT MESSAGE FROM messageHistory", -1, &getMessages, NULL);

 while (sqlite3_step(getMessages) == SQLITE_ROW)
{
    tblN = (char*)sqlite3_column_text(getMessages, 0);
    send(clientSocket, tblN, BUFFERSIZE, 0);
}

sqlite3_close(DB);}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...