From 20e7a65d9225b72e8769c8721ccd9423876313fe Mon Sep 17 00:00:00 2001 From: "roberto@natty32" Date: Tue, 19 Jul 2011 21:19:15 +0200 Subject: [PATCH] finalized zip import --- bootstrap3.py | 5 +++ buildconf/django.ini | 3 ++ plugins/python/symimporter.c | 68 ++++++++++++++++++++++++++++++------ 3 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 bootstrap3.py create mode 100644 buildconf/django.ini diff --git a/bootstrap3.py b/bootstrap3.py new file mode 100644 index 00000000..405a5ac3 --- /dev/null +++ b/bootstrap3.py @@ -0,0 +1,5 @@ +import sys +import uwsgi + +sys.meta_path.insert(0, uwsgi.SymbolsZipImporter("django_zip:djenv/lib/python2.6/site-packages")) +sys.meta_path.insert(0, uwsgi.SymbolsZipImporter("djapp_zip")) diff --git a/buildconf/django.ini b/buildconf/django.ini new file mode 100644 index 00000000..23165684 --- /dev/null +++ b/buildconf/django.ini @@ -0,0 +1,3 @@ +[uwsgi] +inherit = default +embed_files = bootstrap3.py,django.zip,djapp.zip diff --git a/plugins/python/symimporter.c b/plugins/python/symimporter.c index 051dca8d..960ac033 100644 --- a/plugins/python/symimporter.c +++ b/plugins/python/symimporter.c @@ -10,6 +10,7 @@ struct _symimporter { struct _symzipimporter { PyObject_HEAD; + char *prefix; PyObject *zip; PyObject *items; } uwsgi_symbol_zip_importer_object; @@ -28,10 +29,25 @@ static char *symbolize(char *name) { return base; } -static char *name_to_py(char *name) { +static char *name_to_py(char *prefix, char *name) { - char *base = uwsgi_concat2(name, ".py"); - char *ptr = base; + char *base; + char *ptr; + + if (prefix) { + if (prefix[strlen(prefix)-1] == '/') { + base = uwsgi_concat3(prefix, name, ".py"); + ptr = base + strlen(prefix); + } + else { + base = uwsgi_concat4(prefix, "/", name, ".py"); + ptr = base + strlen(prefix) + 1; + } + } + else { + base = uwsgi_concat2(name, ".py"); + ptr = base; + } while(*ptr != 0) { if (*ptr == '.') { *ptr = '/'; @@ -45,10 +61,26 @@ static char *name_to_py(char *name) { return base; } -static char *name_to_init_py(char *name) { +static char *name_to_init_py(char *prefix, char *name) { + + char *base; + char *ptr; + + if (prefix) { + if (prefix[strlen(prefix)-1] == '/') { + base = uwsgi_concat3(prefix, name, "/__init__.py"); + ptr = base + strlen(prefix); + } + else { + base = uwsgi_concat4(prefix, "/", name, "/__init__.py"); + ptr = base + strlen(prefix) + 1; + } + } + else { + base = uwsgi_concat2(name, "/__init__.py"); + ptr = base; + } - char *base = uwsgi_concat2(name, "/__init__.py"); - char *ptr = base; while(*ptr != 0) { if (*ptr == '.') { *ptr = '/'; @@ -59,6 +91,7 @@ static char *name_to_init_py(char *name) { // fix .py ptr-=3; *ptr = '.'; + return base; } @@ -116,7 +149,7 @@ static PyObject* symzipimporter_find_module(PyObject *self, PyObject *args) { return NULL; } - char *filename = name_to_py(fullname); + char *filename = name_to_py(this->prefix, fullname); if (py_list_has_string(this->items, filename)) { free(filename); @@ -126,7 +159,7 @@ static PyObject* symzipimporter_find_module(PyObject *self, PyObject *args) { PyErr_Clear(); free(filename); - filename = name_to_init_py(fullname); + filename = name_to_init_py(this->prefix, fullname); if (py_list_has_string(this->items, filename)) { free(filename); @@ -150,7 +183,7 @@ static PyObject* symzipimporter_load_module(PyObject *self, PyObject *args) { return NULL; } - char *filename = name_to_py(fullname); + char *filename = name_to_py(this->prefix, fullname); if (py_list_has_string(this->items, filename)) { PyObject *mod = PyImport_AddModule(fullname); @@ -176,7 +209,7 @@ static PyObject* symzipimporter_load_module(PyObject *self, PyObject *args) { PyErr_Clear(); free(filename); - filename = name_to_init_py(fullname); + filename = name_to_init_py(this->prefix, fullname); if (py_list_has_string(this->items, filename)) { PyObject *mod = PyImport_AddModule(fullname); @@ -376,10 +409,19 @@ symzipimporter_init(struct _symzipimporter *self, PyObject *args, PyObject *kwds { char *name; + char *prefix = NULL; if (!PyArg_ParseTuple(args, "s", &name)) return -1; + // avoid GC !!! + name = uwsgi_concat2(name, ""); + + prefix = strchr(name, ':'); + if (prefix) { + prefix[0] = 0; + } + char *code_start = name_to_symbol(name, "start"); if (!code_start) { PyErr_Format(PyExc_ValueError, "unable to find symbol"); @@ -456,6 +498,12 @@ symzipimporter_init(struct _symzipimporter *self, PyObject *args, PyObject *kwds Py_INCREF(self->items); + self->prefix = NULL; + if (prefix) { + self->prefix = prefix+1; + prefix[0] = ':'; + } + return 0; }