From 66ae592e41a6c483428240cf7f61191475e212be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20COLANGELO?= Date: Sat, 25 Jul 2020 15:33:12 +0200 Subject: [PATCH] Split things into pieces, continue implementation of mysql backend --- src/mysql_backend.h | 18 ------ src/mysql_backend/mysql_backend.c | 61 +++++++++++++++++++ src/mysql_backend/mysql_backend.h | 13 ++++ src/mysql_backend/mysql_backend_internals.h | 24 ++++++++ .../mysql_backend_utils.c} | 25 ++------ src/smart_records.c | 37 ++++------- src/smart_records.h | 4 +- src/smart_records_internals.h | 2 +- 8 files changed, 117 insertions(+), 67 deletions(-) delete mode 100644 src/mysql_backend.h create mode 100644 src/mysql_backend/mysql_backend.c create mode 100644 src/mysql_backend/mysql_backend.h create mode 100644 src/mysql_backend/mysql_backend_internals.h rename src/{mysql_backend.c => mysql_backend/mysql_backend_utils.c} (92%) diff --git a/src/mysql_backend.h b/src/mysql_backend.h deleted file mode 100644 index a45bd8c..0000000 --- a/src/mysql_backend.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _SMART_RECORDS_MYSQL_BACKEND_H -#define _SMART_RECORDS_MYSQL_BACKEND_H - -#include -#include "smart_records_internals.h" -//#include - -typedef struct mysql_backend_ctx_t { - //MYSQL *mysql; - char *format; -} mysql_backend_ctx_t; - -int mysql_backend_write_record(smart_records_ctx_t *ctx, char **error, va_list ap); -int mysql_backend_set_format(smart_records_ctx_t *ctx, char **error, char *format); -int mysql_backend_close_records_base(smart_records_ctx_t *ctx); -void *mysql_backend_init(smart_records_ctx_t *ctx, char **error); - -#endif diff --git a/src/mysql_backend/mysql_backend.c b/src/mysql_backend/mysql_backend.c new file mode 100644 index 0000000..a1cceb7 --- /dev/null +++ b/src/mysql_backend/mysql_backend.c @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Gérald Colangelo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include +#include +#include +#include "../smart_records_internals.h" +#include "mysql_backend_internals.h" + +int mysql_backend_open_records_base(void *ctx, char **error, const char *uri) +{ + mysql_backend_ctx_t *c; + if (!ctx || !uri) { + set_error_and_fails("invalid arguments while opening records base"); + } + + c = (mysql_backend_ctx_t *)ctx; + + c->uri = mysql_parse_uri(error, uri); + if (!c->uri) + goto failed; + if(!mysql_real_connect(c->mysql_obj, c->uri->host, + c->uri->user, + c->uri->passwd, + c->uri->db, + c->uri->port, + NULL,0)) { + set_error_and_fails(mysql_error(c->mysql_obj)); + } +failed: + if(c->uri) + mysql_free_uri(c->uri); + return -1; +} + +void *mysql_backend_init(char **error) +{ + mysql_backend_ctx_t *ctx; + ctx = malloc(sizeof(mysql_backend_ctx_t)); + ctx->mysql_obj = mysql_init(NULL); + return ctx; +} diff --git a/src/mysql_backend/mysql_backend.h b/src/mysql_backend/mysql_backend.h new file mode 100644 index 0000000..2d9296d --- /dev/null +++ b/src/mysql_backend/mysql_backend.h @@ -0,0 +1,13 @@ +#ifndef _SMART_RECORDS_MYSQL_BACKEND_H +#define _SMART_RECORDS_MYSQL_BACKEND_H + +#include + + +void *mysql_backend_init(char **error); +int mysql_backend_open_records_base(void *ctx, char **error, const char *uri); +int mysql_backend_write_record(void **ctx, char **error, va_list ap); +int mysql_backend_set_format(void **ctx, char **error, char *format); +int mysql_backend_close_records_base(void **ctx); + +#endif diff --git a/src/mysql_backend/mysql_backend_internals.h b/src/mysql_backend/mysql_backend_internals.h new file mode 100644 index 0000000..acff51f --- /dev/null +++ b/src/mysql_backend/mysql_backend_internals.h @@ -0,0 +1,24 @@ +#ifndef MYSQL_BACKEND_INTERNALS_H +#define MYSQL_BACKEND_INTERNALS_H + +#include +#define URI_SCHEME "mysql://user[:password]@host[:port]/db_name.table" + +typedef struct mysql_uri { + char *host; + char *user; + char *passwd; + char *db; + char *table; + unsigned int port; +} mysql_uri_t; + +typedef struct mysql_backend_ctx_t { + MYSQL *mysql_obj; + mysql_uri_t *uri; +} mysql_backend_ctx_t; + + +void mysql_free_uri(mysql_uri_t * uri); +mysql_uri_t *mysql_parse_uri(char **error, const char *uri); +#endif diff --git a/src/mysql_backend.c b/src/mysql_backend/mysql_backend_utils.c similarity index 92% rename from src/mysql_backend.c rename to src/mysql_backend/mysql_backend_utils.c index 2ec79b1..3a721b9 100644 --- a/src/mysql_backend.c +++ b/src/mysql_backend/mysql_backend_utils.c @@ -23,19 +23,9 @@ SOFTWARE. #include #include #include -#include "smart_records_internals.h" -//#include - -#define URI_SCHEME "mysql://user[:password]@host[:port]/db_name.table" - -typedef struct mysql_uri { - char *host; - char *user; - char *passwd; - char *db; - char *table; - unsigned int port; -} mysql_uri_t; +#include "../smart_records_internals.h" +#include +#include "mysql_backend_internals.h" void mysql_free_uri(mysql_uri_t * uri) { @@ -54,9 +44,7 @@ void mysql_free_uri(mysql_uri_t * uri) free(uri); } - - -mysql_uri_t *mysql_parse_uri( /* MYSQL *mysql, */ const char *uri, char **error) +mysql_uri_t *mysql_parse_uri(char **error, const char *uri) { int conv; mysql_uri_t *r=NULL; @@ -134,23 +122,18 @@ failed: return NULL; } - #ifdef _TEST char *tests[7][2] = { { "Every info provided", "mysql://leon:bruxelles@lafrite:1024/STOCK_PATATE.avril" }, -/* { "Every info provided except password", "mysql://leon@lafrite:1024/STOCK_PATATE.avril" }, -*/ { "Every info provided but empty password", "mysql://leon:@lafrite:1024/STOCK_PATATE.avril" }, { "Every info provided except port number", "mysql://leon:coin@lafrite/STOCK_PATATE.avril" }, -/* { "Bad URI #1", "mysql://lafrite/PATATE.avril" }, { "Bad URI #1", "mysql://lafrite/" }, -*/ { NULL, NULL }, }; diff --git a/src/smart_records.c b/src/smart_records.c index ae0aa64..8f3da98 100644 --- a/src/smart_records.c +++ b/src/smart_records.c @@ -27,7 +27,7 @@ smart_records_ctx_t *smart_records_init(){ return malloc(sizeof(smart_records_ctx_t)); } -int smart_records_open_base(smart_records_ctx_t *ctx, char *uri, char **error) +int smart_records_open_base(smart_records_ctx_t *ctx, char **error, const char *uri) { int len_uri; @@ -38,11 +38,11 @@ int smart_records_open_base(smart_records_ctx_t *ctx, char *uri, char **error) len_uri = strlen(uri); if(!strncmp("mysql://", uri, len_uri < 8 ? len_uri : 8)) { #ifdef _HAS_MYSQL - ctx->CTX = malloc(sizeof(mysql_backend_ctx_t)); + ctx->backend_ctx = NULL; ctx->write_record = mysql_backend_write_record; ctx->set_format = mysql_backend_set_format; ctx->close_records_base = mysql_backend_close_records_base; - if ( mysql_backend_init(ctx->CTX, error) < 0) + if ((ctx->backend_ctx = mysql_backend_init(error) == NULL) goto failed; #else set_error_and_fails("built without support for mysql:// URIs"); @@ -52,44 +52,26 @@ int smart_records_open_base(smart_records_ctx_t *ctx, char *uri, char **error) else if(!strncmp("sqlite://", uri, len_uri < 9 ? len_uri : 9)) { #ifdef _HAS_SQLITE - ctx->CTX = malloc(sizeof(sqlite_backend_ctx_t)); - ctx->write_record = sqlite_backend_write_record(char *uri); - ctx->close_records_base = sqlite_backend_close_records_base(char *uri); - if ( sqlite_backend_init(ctx->CTX, error) < 0) - goto failed; #else - if(error) *error = strdup("built without support for sqlite:// URIs"); - goto failed; + set_error_and_fails("built without support for sqlite:// URIs"); } #endif else if(!strncmp("udp://", uri, len_uri < 8 ? len_uri : 8)) { #ifdef _HAS_UDP - ctx->CTX = malloc(sizeof(udp_backend_ctx_t)); - ctx->write_record = udp_backend_write_record(char *uri); - ctx->close_records_base = udp_backend_close_records_base(char *uri); - if ( udp_backend_init(ctx->CTX, error) < 0) - goto failed; #else - if(error) *error = strdup("built without support for udp:// URIs"); - goto failed; + set_error_and_fails("built without support for udp:// URIs"); } #endif else if(!strncmp("csv://", uri, len_uri < 8 ? len_uri : 8)) { #ifdef _HAS_CSV - ctx->CTX = malloc(sizeof(csv_backend_ctx_t)); - ctx->write_record = csv_backend_write_record(char *uri); - ctx->close_records_base = csv_backend_close_records_base(char *uri); - if ( csv_backend_init(ctx->CTX, error) < 0) - goto failed; #else - if(error) *error = strdup("built without suppor fort csv:// URIs"); - goto failed; + set_error_and_fails("built without suppor fort csv:// URIs"); #endif } else { - if(error) *error = strdup("Unknown scheme or bad URI."); + set_error_and_fails("Unknown scheme or bad URI."); goto failed; } return 0; @@ -97,6 +79,11 @@ failed: return -1; } +int smart_records_set_format(smart_records_ctx_t *ctx, char **error, const char *fmt) +{ + return ctx->set_format(ctx, error, fmt); +} + int smart_records_close_base(smart_records_ctx_t *ctx) { return ctx->close_records_base(ctx); diff --git a/src/smart_records.h b/src/smart_records.h index a7fb202..b891cba 100644 --- a/src/smart_records.h +++ b/src/smart_records.h @@ -5,8 +5,8 @@ #include "smart_records_internals.h" smart_records_ctx_t *smart_records_init(); -int smart_records_open_base(smart_records_ctx_t *ctx, char *uri, char **error); -int smart_records_set_format(smart_records_ctx_t *ctx, char *fmt, char **error); +int smart_records_open_base(smart_records_ctx_t *ctx, char **error, const char *uri); +int smart_records_set_format(smart_records_ctx_t *ctx, char **error, const char *fmt); int smart_records_write(smart_records_ctx_t *ctx, char **error, va_list ap); int smart_records_close_base(smart_records_ctx_t *ctx); #endif diff --git a/src/smart_records_internals.h b/src/smart_records_internals.h index a7753dd..0c7bb83 100644 --- a/src/smart_records_internals.h +++ b/src/smart_records_internals.h @@ -8,7 +8,7 @@ typedef struct smart_records_ctx_t { void *CTX; - int (*set_format) (struct smart_records_ctx_t *ctx, char **error, char *fmp); + int (*set_format) (struct smart_records_ctx_t *ctx, char **error, const char *fmt); int (*write_record) (struct smart_records_ctx_t *ctx, char **error, va_list ap); int (*close_records_base) (struct smart_records_ctx_t *ctx); } smart_records_ctx_t ;