URL: https://www.overclockers.at/coding-stuff/mysql-udf-in-c_229779/page_1 - zur Vollversion wechseln!
Hallo,
ich versuche ein UDF für MySQL zu schreiben und mein C-Wissen ist leider etwas eingerostet
Code: Ctypedef char** stringArray; stringArray MallocStringArray(size_t SizeOfOneString, size_t StringCount) { char** t=malloc(StringCount*sizeof(char*)); size_t i; for(i=0;i<StringCount;++i) t[i]=malloc(SizeOfOneString); return t; } void FreeStringArray(stringArray StringArray, size_t StringCount) { size_t i; for(i=0;i<StringCount;++i) free(StringArray[i]); free(StringArray); } void levenshtein_w_deinit(UDF_INIT *initid) { if (initid->ptr != NULL) { free(initid->ptr); } } my_bool levenshtein_w_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { if ((args->arg_count != 3) || (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != STRING_RESULT || args->arg_type[2] != INT_RESULT)) { strcpy(message, "Function requires 3 arguments, (string, string, int)"); return 1; } initid->max_length = LEVENSHTEIN_MAX; initid->maybe_null = 0; //doesn't return null fprintf(stderr, "\n\nSTART FUNCTION\n\n"); fflush(stderr); return 0; } longlong levenshtein_w(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { if (args->args[0] == NULL || args->args[1] == NULL || args->args[2] == NULL) return 0; int lv_distance = *(int *) args->args[2]; char* suchbegriff=malloc(250); char* keywords=malloc(250); suchbegriff = args->args[0]; keywords = args->args[1]; //Log for Testing fprintf(stderr, "Uebergabe: %s (%p) \n", args->args[1], args->args[1]); fflush(stderr); stringArray strings; strings=MallocStringArray(250,30); // Suchbegriff spliten und in string Array speichern // .... return 1; }
Das ist in jedem Fall komisch:
Du machst ein malloc und dann überschreibst du den Pointer sofort wieder.Code: Cchar* suchbegriff=malloc(250); char* keywords=malloc(250); suchbegriff = args->args[0]; keywords = args->args[1];
Zitat von matDas ist in jedem Fall komisch:Du machst ein malloc und dann überschreibst du den Pointer sofort wieder.Code: Cchar* suchbegriff=malloc(250); char* keywords=malloc(250); suchbegriff = args->args[0]; keywords = args->args[1];
So wie es aussieht, macht er dir einfach kein '\0' am Schluss des Strings. In der Dokumentation gibt es einen lengths-Parameter im Argument-Array:
Wenn das Argument also ein String ist, dann wirst du diesen selber herausholen müssen. Am besten wahrscheinlich gleich kopieren. Würde es so machen:Zitatunsigned long *lengths
For the initialization function, the lengths array indicates the maximum string length for each argument. You should not change these. For each invocation of the main function, lengths contains the actual lengths of any string arguments that are passed for the row currently being processed. For arguments of types INT_RESULT or REAL_RESULT, lengths still contains the maximum length of the argument (as for the initialization function).
Code: Cchar szBuffer[LEVENSHTEIN_MAX]; *szBuffer = 0; strncat(args->args[0],szBuffer,args->lengths[0]);
Danke, danke, danke - das wars!
Code: Cchar suchbegriff[250]; *suchbegriff = 0; char keywords[1000]; *keywords = 0; strncat(suchbegriff,args->args[0],(args->lengths[0] > 250) ? 250 : args->lengths[0]); strncat(keywords,args->args[1],(args->lengths[1] > 1000) ? 1000 : args->lengths[1]);
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025