On Wed, Jan 23, 2013 at 10:29 AM, Enlightenment SVN
<no-re...@enlightenment.org> wrote:
> +             {
> +                char *text;
> +                text = strdup(sqlite3_column_text(res->e->backend.stmt, i));
> +                eina_value_setup(&inv, EINA_VALUE_TYPE_STRING);
> +                eina_value_set(&inv, text);
> +                eina_array_push(memory, text);
> +                break;

Are you sure? Did you run in valgrind? I think this is wrong, because:

http://trac.enlightenment.org/e/browser/trunk/efl/src/lib/eina/eina_value.c#L2323

that is, it will duplicate the text inside inv. There is no need to do
this strdup() or push it.

And it will free the duplicated memory of inv when you call eina_value_flush().



> -              eina_value_setup(&inv, EINA_VALUE_TYPE_INT64);
> -              eina_value_set(&inv, 
> sqlite3_column_int64(res->e->backend.stmt, i));
> +             eina_value_setup(&inv, EINA_VALUE_TYPE_INT64);
> +             eina_value_set(&inv, sqlite3_column_int64(res->e->backend.stmt, 
> i));
>               break;
>
>             case SQLITE_FLOAT:
> -              eina_value_setup(&inv, EINA_VALUE_TYPE_DOUBLE);
> -              eina_value_set(&inv, 
> sqlite3_column_double(res->e->backend.stmt, i));
> +             eina_value_setup(&inv, EINA_VALUE_TYPE_DOUBLE);
> +             eina_value_set(&inv, 
> sqlite3_column_double(res->e->backend.stmt, i));
>               break;

avoid mixing the whitespace cleanups with real patch.


>             default:
>               {
>                  Eina_Value_Blob blob;
> +                char *tmp;
> +                int size;
>
> +                size = sqlite3_column_bytes(res->e->backend.stmt, i);
> +                tmp = malloc(size);
> +                memcpy(tmp, sqlite3_column_blob(res->e->backend.stmt, i), 
> size);
> +
>                  blob.ops = NULL;
> -                blob.memory = sqlite3_column_blob(res->e->backend.stmt, i);
> -                blob.size = sqlite3_column_bytes(res->e->backend.stmt, i);
> -
> +                blob.memory = tmp;
> +                blob.size = size;
>                  eina_value_setup(&inv, EINA_VALUE_TYPE_BLOB);
> -                eina_value_set(&inv, &blob);
> +                eina_value_set(&inv, blob);
> +                eina_array_push(memory, tmp);

here it is almost right:

http://trac.enlightenment.org/e/browser/trunk/efl/src/lib/eina/eina_value.c#L3820

it need the blob.memory to be allocated (as you do), but
eina_value_flush() will automatically clean the memory if you provide
EINA_VALUE_BLOB_OPERATIONS_MALLOC as ops. Then do this and do not use
this memory array at all.

I know I should have looked into this, I'm glad you did the hard work
to check why it failed (the blob part!), now it's just this minor
details and we're gold :-)

Thanks!

--
Gustavo Sverzut Barbieri
http://profusion.mobi embedded systems
--------------------------------------
MSN: barbi...@gmail.com
Skype: gsbarbieri
Mobile: +55 (19) 9225-2202

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnnow-d2d
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to