public inbox for [email protected]  
help / color / mirror / Atom feed
From: Merlin Moncure <[email protected]>
To: rahul143 <[email protected]>
Cc: [email protected]
Subject: Re: Exception Handling in C-Language Functions?
Date: Mon, 3 Dec 2012 08:42:48 -0600
Message-ID: <CAHyXU0wSbZp3gdtm__LU+rGYs4JxdM84o+1rx=ytyYayymP_2Q@mail.gmail.com> (raw)
In-Reply-To: <[email protected]>
References: <[email protected]>
List-Unsubscribe: <mailto:[email protected]?body=unsub%20pgsql-general>

On Sun, Dec 2, 2012 at 11:18 PM, rahul143 <[email protected]> wrote:
> I have the created a C-Language function (code is below).  Now, I
> wonder: How do I handle exceptions, for example if malloc cannot assign
> the necessary memory?  Do "palloc" and "pfree" handle such a case
> cleanly?  Should I simply use an "assert"?
>
> #include "postgres.h"
> #include <string.h>
> #include <stdlib.h>
> #include "fmgr.h"
> #include "libinn.h"
>
> PG_FUNCTION_INFO_V1(ffiinews_uwildmat);
>
> /* Wrapper for INN's function uwildmat.  Needs parameters in UTF-8. */
> Datum ffiinews_uwildmat(PG_FUNCTION_ARGS) {
>     VarChar *text = PG_GETARG_VARCHAR_P(0);
>     VarChar *pattern = PG_GETARG_VARCHAR_P(1);
>     int text_len = VARSIZE(text)-VARHDRSZ;
>     int pattern_len = VARSIZE(pattern)-VARHDRSZ;
>     char *tmp_text = (char *)malloc(text_len+1);
>     if (tmp_text == NULL)
>         ; /* What now? */
>     char *tmp_pattern = (char *)malloc(pattern_len+1);
>     if (tmp_pattern == NULL)
>         ; /* What now? */
>     strncpy(tmp_text, VARDATA(text), text_len);
>     tmp_text[text_len] = '\0';
>     strncpy(tmp_pattern, VARDATA(pattern), pattern_len);
>     tmp_pattern[pattern_len] = '\0';
>     bool matches = uwildmat(tmp_text, tmp_pattern);

yes, you should always use database memory api: palloc/pfree and if
necessary memory context switching.  memory allocation error then
raises database exception.  any situation that raises an exception or
other critical needs to be caught and rethrown as database exception
(ereport, etc).

merlin


-- 
Sent via pgsql-general mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general




view thread (4+ messages)

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected]
  Subject: Re: Exception Handling in C-Language Functions?
  In-Reply-To: <CAHyXU0wSbZp3gdtm__LU+rGYs4JxdM84o+1rx=ytyYayymP_2Q@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox