[C++] w jakim formacie odesłać przez gniazda tablicę?

0

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ł?

0
coder() napisał(a)

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.

Rozumiem, że problem polega na tym, że nie wiadomo ile będzie zwróconych wpisów...

  1. Jeśli nie podoba cię się vector, można tu użyć listy, w niej nie będzie relokacji i po problemie
  2. vector<string> wcale nie będzie takie wolne, string jest tablicą dynamiczną, tzn. że przy relokacji nie realokuje się ciąg znaków, jedynie informacje klasy string(wskaźnik na ten ciąg, i pewnie jeszcze pare informacji)
    Ale jeśli uważasz, że że te parę informacji to też za dużo, IMO najoptymalniej powinieneś robić ręcznie tablicę dynamiczną(tak jak string)+ przydała by się długość tej tablicy, chyba, że wolisz zaznaczyć koniec tablicy znakiem \0, ja bym jedak zrobił długość tablicy, chyba bezpieczniejsze
struct SWpis
{
  short sSize;
  char* lpString;
};

vector<SWpis> Wpisy;

while(coś tam z row)
{
  SWpis tmpWps;
  tmpWps.sSize=dlugosc;
  tmpWps.lpString=new char[dlugosc+1];//+1 jeszcze na znak \0 dla bezpieczeństwa
  memcpy czy czym tam zapisujesz do tablicy
  Wpisy.push_back(tmpWps);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1