memcopy Problem - 2. string wird nicht geparst
-
Hallo zusammen,
in die Berkeley DB kann man nur Hashes eintragen. Einen Key und einen Datenteil. In den Datenteil kann man (laut Oracle Doku) prinzipiell auch structs einfügen.
In meinem Fall besitze ich folgendes struct-Element:
typedef struct my_post{ char *stru_header; char *stru_entry; }MY_POST;
...wobei stru_header ein *char-Pointer mit dem Inhalt "Sun, 01. Jan" ist und stru_entry (ebenfalls *char-Pointer) mit dem Inhalt "Hallo Welt".
Laut Oracle Anleitung werden die einzelnen struct-Elemente zum Eintrag in die DB aneinander gehängt:
http://download.oracle.com/docs/cd/E17076_02/html/gsg/C/cstructs.html#cstructdynamicWenn ich nun folgenden Code benutze:
buffsize = (strlen (blogpost.stru_header) + strlen (blogpost.stru_entry) + 2); databuff = malloc (buffsize); memset(databuff, 0, buffsize); memcpy(databuff, blogpost.stru_header, strlen (blogpost.stru_header) + 1); bufflen = strlen(blogpost.stru_header) + 1; memcpy(databuff + bufflen, blogpost.stru_entry, strlen (blogpost.stru_entry) + 1); bufflen += strlen (blogpost.stru_entry) + 1;
... wird das erste Element in "databuff" geschrieben. Das 2. jedoch nicht. Erst, wenn ich vom 1. string die \0 am Ende überschreibe schreibt memcpy auch den 2. string - was natürlich nicht Sinn der Sache ist.
Daher meine Frage: Übersehe ich hier irgendwas in meinem Code oder ist die Umsetzung des Beispiels in diesem Fall einfach nicht möglich?
Lg
Jan
-
Ich glaube, du übersiehst ganz was anderes. Wenn du deiner Datenbank den struct-Datenteil von 2 Zeigern übergibst, woher soll dann die DB wissen, wie groß der Datenteil ist? Bei
struct bla{ char a[100]; char b[200]; }; wäre
dies ja konstant und einfach zu ermitteln (auch hier aber auf padding achten) aber bei deiner 2-Zeiger-Konstellation? Dazu müsste deine DB eine dynamische Größenbestimmung anhand einer von dir vorgegebenen Callback-Funktion verarbeiten können.
-
Schau mal in den Oracle Link rein, den ich gepostet habe
Das würde laut Oracle ungefähr so aussehen:
my_database->get(my_database, NULL, &key, &data, 0); buffer = data.data; user.id = *((int *)data.data); user.familiar_name = buffer + sizeof(int); user.surname = buffer + sizeof(int) + strlen(user.familiar_name) + 1;
-
Erst, wenn ich vom 1. string die \0 am Ende überschreibe schreibt memcpy auch den 2. string - was natürlich nicht Sinn der Sache ist.
Nein. Er schreibt schon den zweiten String. Nur ist \0 eben das Terminierungssymbol und da bricht die Ausgabe dann einfach ab oder eben die Funktion.
Also kurz gesagt: Warum glaubst du das memcpy den zweiten String nicht kopieren würde?
Weil du
printf("%s\n", databuffer);
gemacht hast? Dann liegt es an der Terminierung :). Wenn die Oracle-API damit nicht klar kommt, dann ist das ein Problem in der DB.
-
Nein. Er schreibt schon den zweiten String. Nur ist \0 eben das Terminierungssymbol und da bricht die Ausgabe dann einfach ab oder eben die Funktion.
Also kurz gesagt: Warum glaubst du das memcpy den zweiten String nicht kopieren würde?
Du hast Recht! Mein Debuuger im NetBeans hat das ebenfalls falsch angezeigt. Mit
printf("Entry: %s", databuff + 13);
kann ich den String sehen.
Hatte ebenfalls einen üblen Fehler in meinem printf-Befehl - jetzt geht's!
Vielen Dank und LG
Jan