Witam.
Piszę aplikację serwerową, która wykonuje transakcje z bazą danych MySQL na podstawie informacji które prześle jej klient. No i mam teraz problem. W jakiej postaci odesłać te dane (aby było to najoptymalniejsze rozwiązanie)?
Mam jakiś obiekt typu MYSQL_RES. Zawiera on wszystko to co zwróciła baza danych. Do wyświetlenia poszczególnych wierszy z bazy danych używam funkcji mysql_fetch_row(). funkcja ta zwraca mi tablicę n elementów. Tych tablic nie wiemy ile jest dopóki ich wszystkich nie pobierzemy funkcją mysql_fetch_row().
No i jak teraz zrobić abym mógł przesłać te dane w jednej paczce i żeby klient mógł w bardzo łatwy sposób sobie te dane rozpakowywać na kawałki i wyświetlać itp.
Oto kod aplikacji serwerowej:
if(!mysql_real_query(mysql_handle, query, strlen(query)))
{
// Wyniki zapytania
MYSQL_ROW row;
// Zwrócenie wyniku
MYSQL_RES * query = mysql_use_result(mysql_handle);
// Sprawdzenie czy baza coś odesłała
if(query)
{
// Odesłanie wyniku
while((row = mysql_fetch_row(query)))
{
for(unsigned int i = 0; i < sizeof(row); i++)
{
write(waiting_socket, row[i], strlen(row[i])+1);
}
}
}
write(waiting_socket, "@~END", 5);
return true;
}
Aktualnie każdy element tablicy wysyłam osobno co skutkuje tym że klient po wysołaniu funkcji read() otrzymuje te dane wszystkie naraz a nie partiami. (może jakby zrobić jakąś pauzę po każdym wysłaniu to by mógł otrzymywać te dane w pętli po kawałku... ale wtedy przy dużej ilości danych przeciągnęło by się to znacznie w czasie).
Najpierw myślałem zeby wszystkie poszczególne elementy tablic wstawić w vector<string> ale nie wiem ile musiał bym zarezerwować miejsca na początku, a przeoełnienie vectora i później jego powiększanie zajmuje znaczną ilość czasu więc to rozwiązanie odpada.
Mógłbym też wysłać cały obiekt MYSQL_RES ale tu chodzi o to aby user nie musiał posiadać biblioteki (nagłówek mysql.h), która jest niezbędna do wycinania z tego obiektu poszczególnych tablic n elementowych.
Miałby ktoś jakiś inny pomysł?