Re: plpython function problem workaround

Поиск
Список
Период
Сортировка
От Michael Fuhr
Тема Re: plpython function problem workaround
Дата
Msg-id 20050315175645.GA66610@winnie.fuhr.org
обсуждение исходный текст
Ответ на Re: plpython function problem workaround  (Marco Colombo <pgsql@esiway.net>)
Список pgsql-general
On Tue, Mar 15, 2005 at 06:03:01PM +0100, Marco Colombo wrote:
> On Tue, 15 Mar 2005, Michael Fuhr wrote:
> >I'll postpone commenting on the rest until we find out how the
> >example programs run on Windows.  If nobody follows up here then
> >maybe I'll wander over to comp.lang.python.
>
> Yeah, there's no point in discussing until we have some real world
> data. I can't compile on windows, so I'll have to wait someone else
> to do that. I'm basing my opinions on Python documentation only.

I've been looking through the Python source code (2.4.1c1) and I've
found several places that use only \n in embedded code.  One is
Modules/main.c, which says it's the "Python interpreter main program."
The Py_Main() function is processing command-line options and does
the following:

    if (c == 'c') {
            /* -c is the last option; following arguments
               that look like options are left for the
               command to interpret. */
            command = malloc(strlen(_PyOS_optarg) + 2);
            if (command == NULL)
                    Py_FatalError(
                       "not enough memory to copy -c argument");
            strcpy(command, _PyOS_optarg);
            strcat(command, "\n");
            break;
    }

Later, without further changes to the command variable, it does this:

    if (command) {
        sts = PyRun_SimpleStringFlags(command, &cf) != 0;
        free(command);

Modules/cPickle.c has additional examples:

    if (!( r=PyRun_String(
                   "def __init__(self, *args): self.args=args\n\n"
                   "def __str__(self):\n"
                   "  return self.args and ('%s' % self.args[0]) or '(what)'\n",
                   Py_file_input,
                   module_dict, t)  ))  return -1;

and

    if (!( r=PyRun_String(
                   "def __init__(self, *args): self.args=args\n\n"
                   "def __str__(self):\n"
                   "  a=self.args\n"
                   "  a=a and type(a[0]) or '(what)'\n"
                   "  return 'Cannot pickle %s objects' % a\n"
                   , Py_file_input,
                   module_dict, t)  ))  return -1;

The code in Demo/embed/demo.c uses only \n to terminate its lines:

    PyRun_SimpleString("import sys\n");
    PyRun_SimpleString("print sys.builtin_module_names\n");
    PyRun_SimpleString("print sys.modules.keys()\n");
    PyRun_SimpleString("print sys.executable\n");
    PyRun_SimpleString("print sys.argv\n");

If these examples are intended to run on Windows, then presumably
using \n works on that platform.  That doesn't necessarily preclude
\r\n from working as well, but apparently a platform-specific
sequence isn't required.  I'd still be interested in having somebody
run the test programs we've both posted to find out for sure.

Is anybody who's following this thread running a PostgreSQL server
with PL/Python on Windows?  We could use a test platform to answer
some questions, since the PostgreSQL aspect of this discussion is
about problems with PL/Python.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

В списке pgsql-general по дате отправления:

Предыдущее
От: Scott Marlowe
Дата:
Сообщение: Re: Massive performance differences
Следующее
От: Ragnar Hafstað
Дата:
Сообщение: Re: pg/plsql question