Thread: Exception Handling in C-Language Functions?
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); ----- -- View this message in context: http://postgresql.1045698.n5.nabble.com/GENERAL-Exception-Handling-in-C-Language-Functions-tp5734656.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
MODERATOR WARNING I noticed that this guy Rahul seems to be reinjecting old list emails somehow. Please don't approve anything coming from him. Observe this example: http://postgresql.1045698.n5.nabble.com/Re-GENERAL-MS-Access-and-Stored-procedures-td1843848.html http://postgresql.1045698.n5.nabble.com/Re-GENERAL-MS-Access-and-Stored-procedures-td5734652.html The original message was posted in 2005! The message here is this one (also in 2005): http://postgresql.1045698.n5.nabble.com/GENERAL-Exception-Handling-in-C-Language-Functions-td1843896.html I have no idea what's going on. Maybe it's something to do with Nabble. There are others pending moderation in pgsql-admin and pgsql-hackers too. rahul143 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); > > > > ----- > > > > > -- > View this message in context: http://postgresql.1045698.n5.nabble.com/GENERAL-Exception-Handling-in-C-Language-Functions-tp5734656.html > Sent from the PostgreSQL - general mailing list archive at Nabble.com. > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
OK :) Is there a way to do this automatically? Cheers, David. On Mon, Dec 03, 2012 at 03:14:54AM -0300, Alvaro Herrera wrote: > MODERATOR WARNING > > I noticed that this guy Rahul seems to be reinjecting old list emails > somehow. Please don't approve anything coming from him. Observe this > example: > > http://postgresql.1045698.n5.nabble.com/Re-GENERAL-MS-Access-and-Stored-procedures-td1843848.html > http://postgresql.1045698.n5.nabble.com/Re-GENERAL-MS-Access-and-Stored-procedures-td5734652.html > The original message was posted in 2005! > > The message here is this one (also in 2005): > http://postgresql.1045698.n5.nabble.com/GENERAL-Exception-Handling-in-C-Language-Functions-td1843896.html > > I have no idea what's going on. Maybe it's something to do with Nabble. > There are others pending moderation in pgsql-admin and pgsql-hackers too. > > rahul143 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); > > > > > > > > ----- > > > > > > > > > > -- > > View this message in context: http://postgresql.1045698.n5.nabble.com/GENERAL-Exception-Handling-in-C-Language-Functions-tp5734656.html > > Sent from the PostgreSQL - general mailing list archive at Nabble.com. > > > > > > -- > > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > > To make changes to your subscription: > > http://www.postgresql.org/mailpref/pgsql-general > > > -- > Álvaro Herrera http://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Training & Services -- David Fetter <david@fetter.org> http://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david.fetter@gmail.com iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate
On Sun, Dec 2, 2012 at 11:18 PM, rahul143 <rk204885@gmail.com> 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