emile Sat Feb 17 15:21:54 2001 EDT Modified files: /php4/ext/midgard .cvsignore ChangeLog INSTALL Makefile.in article.c attachment.c calendar.c config.m4 element.c event.c eventmember.c file.c group.c host.c image.c mail.c member.c mgd_access.h mgd_article.h mgd_attachment.h mgd_calendar.h mgd_element.h mgd_errno.pl mgd_event.h mgd_eventmember.h mgd_file.h mgd_group.h mgd_host.h mgd_image.h mgd_internal.h mgd_mail.h mgd_member.h mgd_midgard.h mgd_oop.h mgd_page.h mgd_pageelement.h mgd_pagelink.h mgd_person.h mgd_preferences.h mgd_preparser.h mgd_sitegroup.h mgd_snippet.h mgd_snippetdir.h mgd_style.h mgd_topic.h midgard.c mkall oop.c page.c pageelement.c pagelink.c parameter.c person.c php_midgard.h preferences.c preparser-parser.y preparser-scanner.l preparser.c sitegroup.c snippet.c snippetdir.c style.c topic.c Log: Remove/Add appearantly doesn't cancel the remove... add separately.
Index: php4/ext/midgard/.cvsignore diff -u /dev/null php4/ext/midgard/.cvsignore:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/.cvsignore Sat Feb 17 15:21:49 2001 @@ -0,0 +1,122 @@ +.deps +.libs +CVS +Makefile +access.lo +access.o +access.slo +acinclude.m4 +aclocal.m4 +article.lo +article.o +article.slo +attachment.lo +attachment.o +attachment.slo +build +calendar.lo +calendar.o +calendar.slo +config.cache +config.guess +config.log +config.status +config.sub +config_vars.mk +configure +configure.in +dynlib.m4 +element.lo +element.o +element.slo +event.lo +event.o +event.slo +eventmember.lo +eventmember.o +eventmember.slo +file.lo +file.o +file.slo +group.lo +group.o +group.slo +host.lo +host.o +host.slo +image.lo +image.o +image.slo +install-sh +libs.mk +libtool +ltconfig +ltmain.sh +mail.lo +mail.o +mail.slo +member.lo +member.o +member.slo +mgd_errno.c +mgd_errno.h +mgd_errno.lo +mgd_errno.o +mgd_errno.slo +midgard.la +midgard.lo +midgard.o +midgard.slo +missing +mkinstalldirs +modules +oop.lo +oop.o +oop.slo +page.lo +page.o +page.slo +pageelement.lo +pageelement.o +pageelement.slo +pagelink.lo +pagelink.o +pagelink.slo +parameter.lo +parameter.o +parameter.slo +person.lo +person.o +person.slo +php_config.h +php_config.h.in +preferences.lo +preferences.o +preferences.slo +preparser-parser.h +preparser-parser.lo +preparser-parser.o +preparser-parser.slo +preparser-scanner.lo +preparser-scanner.o +preparser-scanner.slo +preparser.c.bk +preparser.lo +preparser.o +preparser.slo +sitegroup.lo +sitegroup.o +sitegroup.slo +snippet.lo +snippet.o +snippet.slo +snippetdir.lo +snippetdir.o +snippetdir.slo +style.lo +style.o +style.slo +topic.lo +topic.o +topic.slo +y.output Index: php4/ext/midgard/ChangeLog diff -u /dev/null php4/ext/midgard/ChangeLog:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/ChangeLog Sat Feb 17 15:21:49 2001 @@ -0,0 +1,175 @@ +2001-01-30 10:07 emile + + * MidgardClassWhatever renamed to MidgardWhatever + +2001-01-26 02:09 david + + * httpd.error_log.tgz: this is the httpd error_log associated with + the backtrace (see bt.txt). + +2001-01-26 02:05 david + + * bt.txt: backtrace of an Asgard request (running out of memory). + +2001-01-26 02:04 david + + * preparser-parser.y, preparser-scanner.l, preparser.c: debug + version. Lots of log, in httpd error_log and in the browser. + +2001-01-25 18:25 david + + * preparser-parser.y, preparser-scanner.l, preparser.c: oops, + forgot default rule when in eval'ed quoted strings... + +2001-01-25 15:18 david + + * article.c: removed some useless logging in mgd_get_article. + +2001-01-25 15:15 david + + * Makefile.in, access.c, article.c, attachment.c, config.m4, + element.c, host.c, mgd_access.h, midgard.c, page.c, pageelement.c, + pagelink.c, preparser.c, style.c, topic.c: Eliminated the warnings + at compile, and cleaned the code. + +2001-01-25 04:38 david + + * ab_config.m4, ab_mgd_preparser.h, ab_preparser-parser.y, + ab_preparser-scanner.l, ab_preparser.c, config.m4, mgd_preparser.h, + mkall, preparser-parser.y, preparser-scanner.l, preparser.c: added + Alexander's memory management modifications. changed the lexer to + be more readable (easier to debug). Status: old admin and VMUC + still working, Asgard has the same problem + +2001-01-24 21:45 david + + * preparser-parser.y, preparser-scanner.l, preparser.c: Syncing. + Asgard still crashing on form-template snippet but this is not a + mgd_include_snippet problem + +2001-01-24 20:46 david + + * parameter.c, snippet.c: little bug on parameters oop members. + +2001-01-24 20:01 ab + + * ab_mgd_preparser.h: Example site now works with dynamic memory + management. Old Admin site has problems with authentication (?) + +2001-01-24 19:22 david + + * test-db.tar.gz: My test DB, Asgard was modified in order to fix + some PHP3/PHP4 incompatibilities so everybody can test it. + +2001-01-24 19:09 david + + * mgd_preparser.h, midgard.c, preparser-parser.y, + preparser-scanner.l, preparser.c: Preparser modifications, Asgard + is working almost fine, I'm on the way... + +2001-01-24 12:05 david + + * preparser-parser.y, preparser.c: just syncing... added the call + to zend_eval_string that seems to work on the snippets... need to + implement it in variables and template elements. + +2001-01-24 02:24 david + + * ab_config.m4, ab_mgd_preparser.h, ab_preparser-parser.y, + ab_preparser-scanner.l, ab_preparser.c, php_midgard.h: Alexander's + patch to the memory management in the preparser. Doesn't work yet. + +2001-01-23 21:12 david + + * BUGS, mgd_preparser.h, preparser-parser.y, preparser-scanner.l, + preparser.c: Fixed the variable handling, the VMUC example site now + runs fine. + +2001-01-23 18:51 david + + * mgd_oop.h, midgard.c, preparser-parser.y, preparser.c: little fix + on snippets, MidgardClassSitegroup fix from marius and misc sync. + +2001-01-23 15:47 david + + * host.c, parameter.c, preparser-parser.y, preparser.c, + sitegroup.c, snippet.c, snippetdir.c: Several bugs on php3/Zend + differences fixed. + +2001-01-23 11:34 david + + * preparser-parser.y, preparser-scanner.l, preparser.c: + Modification on mgd_include_snippet handling in the preparser. + +2001-01-23 10:36 david + + * preparser-scanner.l, preparser.c: Fixed snippet bug, doesn't work + with Asgard yet though (something like snippet too big). + +2001-01-23 09:48 david + + * BUGS, oop.c: Bug on object instanciating fixed. Now the old + admin work !!! + +2001-01-23 09:09 david + + * BUGS: Known bugs updated. + +2001-01-23 03:13 david + + * article.c, attachment.c, mgd_oop.h, midgard.c, oop.c, + parameter.c, preparser-scanner.l, sitegroup.c, topic.c: some more + bug fixing and code cleaning. + +2001-01-23 00:39 david + + * mgd_internal.h: fixing differences between different Zend API + versions (at least between php-4.0.4-1.src.rpm and the current zend + CVS) + +2001-01-22 19:55 david + + * mgd_internal.h, preparser.c: fixed a bug with variable as array + +2001-01-22 19:11 david + + * BUGS, access.c, article.c, element.c, event.c, group.c, host.c, + mgd_internal.h, mgd_preparser.h, oop.c, pagelink.c, person.c, + preparser-scanner.l, preparser.c, sitegroup.c, snippetdir.c, + topic.c: corrected a lot of (maybe) harmful warnings. added the + file BUGS + +2001-01-22 16:15 david + + * Makefile.in, config.m4, mgd_internal.h, preparser-parser.y, + preparser.c: one of the reasons it segfaults fixed. it still + segfaults on the old admin... + +2001-01-22 02:15 david + + * mgd_internal.h, mgd_preparser.h, preparser-scanner.l, + preparser.c: Some work done on memory management in the preparser. + +2001-01-21 21:01 david + + * midgard-root.php: midgard-root.php used instead of + midgard-root.php3 + +2001-01-21 20:51 david + + * .cvsignore, Makefile.in, access.c, article.c, attachment.c, + calendar.c, config.m4, element.c, event.c, eventmember.c, file.c, + fudge, genentry.pl, group.c, host.c, image.c, mail.c, member.c, + mgd_access.h, mgd_article.h, mgd_attachment.h, mgd_calendar.h, + mgd_element.h, mgd_errno.c, mgd_errno.h, mgd_errno.pl, mgd_event.h, + mgd_eventmember.h, mgd_file.h, mgd_group.h, mgd_host.h, + mgd_image.h, mgd_internal.h, mgd_mail.h, mgd_member.h, + mgd_midgard.h, mgd_oop.h, mgd_page.h, mgd_pageelement.h, + mgd_pagelink.h, mgd_person.h, mgd_preferences.h, mgd_preparser.h, + mgd_sitegroup.h, mgd_snippet.h, mgd_snippetdir.h, mgd_style.h, + mgd_topic.h, midgard.c, mkall, oop.c, page.c, pageelement.c, + pagelink.c, parameter.c, person.c, php_midgard.h, preferences.c, + preparser-parser.y, preparser-scanner.l, preparser.c, sitegroup.c, + snippet.c, snippetdir.c, style.c, topic.c: PHP4+preparser self + contained module source. + Index: php4/ext/midgard/INSTALL diff -u /dev/null php4/ext/midgard/INSTALL:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/INSTALL Sat Feb 17 15:21:49 2001 @@ -0,0 +1,27 @@ +1 - To install midgard php4-module, you'll first need to have the version +4.0.4 of PHP, as well as the matching php-devel package (or install +PHP 4.0.4 from source). + + +2 - Then run: + +./mkall + +or + +./mkall /prefix/directory + +where /prefix/directory is the directory you specified when ./configure'ing +midgard-lib (defaults to /usr/local) + + +3 - Copy the file midgard-root.php at the same location as the +midgard-root.php3 file, and edit midgard-data.conf accordingly. + + +4 - Edit your php.ini to add: + +extension=midgard.so + + +5 - Stop and start httpd. Index: php4/ext/midgard/Makefile.in diff -u /dev/null php4/ext/midgard/Makefile.in:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/Makefile.in Sat Feb 17 15:21:49 2001 @@ -0,0 +1,40 @@ +# $Id: Makefile.in,v 1.3 2001/02/17 23:21:49 emile Exp $ +# +# Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +# Copyright (C) 2000 The Midgard Project ry +# Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +LTLIBRARY_NAME = libmidgard.la +LTLIBRARY_SOURCES = mgd_errno.c midgard.c article.c \ + parameter.c attachment.c oop.c \ + topic.c element.c mail.c \ + group.c file.c host.c image.c member.c \ + calendar.c event.c eventmember.c page.c \ + pageelement.c pagelink.c person.c \ + preferences.c snippet.c \ + snippetdir.c style.c sitegroup.c \ + preparser-parser.c preparser-scanner.c \ + preparser.c +LTLIBRARY_SHARED_NAME = midgard.la +LTLIBRARY_SHARED_LIBADD = $(MIDGARD_SHARED_LIBADD) + +YFLAGS=-d -v -p mgd +EXTRA_CFLAGS=-ggdb -Wall `$(GLIBCONFIG) --cflags` +include $(top_srcdir)/build/dynlib.mk + +mgd_errno.c mgd_errno.h: mgd_errno.pl + perl mgd_errno.pl Index: php4/ext/midgard/article.c diff -u /dev/null php4/ext/midgard/article.c:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/article.c Sat Feb 17 15:21:49 2001 @@ -0,0 +1,1035 @@ +/* $Id: article.c,v 1.3 2001/02/17 23:21:49 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" +#include "mgd_article.h" + +MGD_FUNCTION(is_article_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(isarticleowner(id)); +} + +MGD_FUNCTION(is_article_in_topic_tree) +{ + zval **root, **article; + int *ids, id, i; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &root, &article) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(root); + convert_to_long_ex(article); + +#if 0 + if (!isarticlereader((*article)->value.lval)) + return; +#endif + + ids = mgd_tree(mgd_handle(), "topic", (*root)->value.lval, 0, NULL); + if (ids) { + id = + mgd_idfield(mgd_handle(), "topic", "article", + (*article)->value.lval); + for (i = 0; ids[i]; i++) + if (ids[i] == id) + RETURN_TRUE; + } +} + +const char *article_sort(const char *order) +{ + static struct + { + const char *order, *sort; + } sort[] = + { + { + "calendar", "article.calstart"} + , { + "alpha", "title ASC"} + , { + "reverse alpha", "title DESC"} + , { + "name", "name ASC"} + , { + "reverse name", "name DESC"} + , { + "score", "article.score ASC,title ASC"} + , { + "reverse score", "article.score DESC, title ASC"} + , { + "revised", "article.revised ASC"} + , { + "reverse revised", "article.revised DESC"} + , { + "created", "article.created ASC"} + , { + "reverse created", "article.created DESC"} + , { + NULL, "article.created DESC"} + }; + int i; + + for (i = 0; sort[i].order; i++) + if (strcmp(order, sort[i].order) == 0) + return sort[i].sort; + + return sort[i].sort; +} + +MGD_FUNCTION(list_topic_articles) +{ + const char *sortv = NULL; + int typev = 0; + zval **id, **sortn, **typen, **upn; + int up = 0, up_wild = 0; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 4: + if (zend_get_parameters_ex(4, &id, &sortn, &typen, &upn) + == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + convert_to_long_ex(upn); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = (*upn)->value.lval; + up_wild = (up == 0 ? 1 : 0); + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &sortn, &typen) == + SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = 0; + up_wild = 0; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = article_sort((*sortn)->value.str.val); + typev = -1; + up = 0; + up_wild = 0; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "article.created DESC"; + typev = -1; + up = 0; + up_wild = 0; + break; + } + default: + wrong_param_count(); + } + + if (typev == -1) + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, ARTICLE_FROM, + "article.topic=$d AND author=person.id" + " AND (article.up=$d OR 1=$d)", + sortv, (*id)->value.lval, up, up_wild); + else + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, ARTICLE_FROM, + "article.type=$d AND article.topic=$d" + " AND (article.up=$d OR 1=$d)" + " AND author=person.id", + sortv, typev, (*id)->value.lval, up, + up_wild); +} + +MGD_FUNCTION(list_reply_articles) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, ARTICLE_FROM, + "article.up=$d AND author=person.id", + "article.created DESC", id); +} + +MGD_FUNCTION(list_topic_articles_all) +{ + int *topics; + const char *sortv = NULL; + int typev = 0; + zval **id, **sortn, **typen, **upn; + int up = 0, up_wild = 0; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 4: + if (zend_get_parameters_ex(4, &id, &sortn, &typen, &upn) + == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + convert_to_long_ex(upn); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = (*upn)->value.lval; + up_wild = (up == 0 ? 1 : 0); + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &sortn, &typen) == + SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = 0; + up_wild = 0; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = article_sort((*sortn)->value.str.val); + typev = -1; + up = 0; + up_wild = 0; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "article.created DESC"; + typev = -1; + up = 0; + up_wild = 0; + break; + } + default: + wrong_param_count(); + } + + topics = mgd_tree(mgd_handle(), "topic", (*id)->value.lval, 0, NULL); + + if (typev == -1) + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, + ARTICLE_FROM, + "article.topic IN $D AND author=person.id" + " AND (article.up=$d OR 1=$d)", + sortv, topics, up, up_wild); + else + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, + ARTICLE_FROM, + "article.type=$d AND article.topic IN $D" + " AND (article.up=$d OR 1=$d)" + " AND author=person.id", + sortv, typev, topics, up, up_wild); +} + +MGD_FUNCTION(list_topic_articles_all_fast) +{ + int *topics; + const char *sortv = NULL; + int typev = 0; + zval **id, **sortn, **typen, **upn; + int up = 0, up_wild = 0; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 4: + if (zend_get_parameters_ex(4, &id, &sortn, &typen, &upn) + == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = (*upn)->value.lval; + up_wild = (up == 0 ? 1 : 0); + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &sortn, &typen) == + SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = article_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + up = 0; + up_wild = 0; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = article_sort((*sortn)->value.str.val); + typev = -1; + up = 0; + up_wild = 0; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "article.created DESC"; + typev = -1; + up = 0; + up_wild = 0; + break; + } + default: + wrong_param_count(); + } + + topics = mgd_tree(mgd_handle(), "topic", (*id)->value.lval, 0, NULL); + + if (typev == -1) + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT_FAST, + ARTICLE_FROM_FAST, + "article.topic IN $D" + " AND (article.up=$d OR 1=$d)", + sortv, topics, up, up_wild); + else + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT_FAST, + ARTICLE_FROM_FAST, + "article.type=$d AND article.topic IN $D" + " AND (article.up=$d OR 1=$d)", + sortv, typev, topics, up, up_wild); +} + +MGD_FUNCTION(list_topic_articles_all_of_person) +{ + int *topics; + zval **topic, **person; + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &topic, &person) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(topic); + convert_to_long_ex(person); + + topics = + mgd_tree(mgd_handle(), "topic", (*topic)->value.lval, 0, NULL); + + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT, ARTICLE_FROM, + "article.topic IN $D AND author=person.id AND author=$d AND +article.up=0", + "article.created DESC", topics, + (*person)->value.lval); +} + +MGD_FUNCTION(get_article) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardArticle); + mgd_object_init(return_value, "up", "topic", "title", + "abstract", "content", "author", + "created", "url", "calstart", + "caldays", "icon", "view", "print", + "extra1", "extra2", "extra3", "name", + "creator", "revisor", "revision", + "approver", "revised", "approved", + "score", "type", "locked", "locker", + NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardArticle, return_value, + "id,up,topic,name,title,abstract,content,author," + "Date_format(created,'%d.%m.%Y') AS date," + "Date_format(created,'%D %b. %Y') AS adate," + "Date_format(created,'%D %M %Y') AS aldate," + "extra1,extra2,extra3,article.score,type," + "Unix_Timestamp(created) AS created,creator," + "Unix_Timestamp(revised) AS revised,revisor,revision," + "Unix_Timestamp(approved) AS approved,approver," + "Unix_Timestamp(locked) AS locked,locker," + "url,icon,view,print," + CALENDAR_FIELDS, "article", (*id)->value.lval); +} + +MGD_FUNCTION(get_article_by_name) +{ + zval **id, **name; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardArticle); + mgd_object_init(return_value, "up", "topic", "title", + "abstract", "content", "author", + "created", "url", "calstart", + "caldays", "icon", "view", "print", + "extra1", "extra2", "extra3", "name", + "creator", "revisor", "revision", + "approver", "revised", "approved", + "score", "type", "locked", "locker", + NULL); + return; + case 2: + if (zend_get_parameters_ex(2, &id, &name) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(name); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get_by_name(&MidgardArticle, return_value, + "id,up,topic,name,title,abstract,content,author," + "Date_format(created,'%d.%m.%Y') AS date," + "Date_format(created,'%D %b. %Y') AS adate," + "Date_format(created,'%D %M %Y') AS aldate," + "extra1,extra2,extra3,article.score,type," + "Unix_Timestamp(created) AS created,creator," + "Unix_Timestamp(revised) AS revised,revisor," + "revision," + "Unix_Timestamp(approved) AS approved,approver," + "Unix_Timestamp(locked) AS locked,locker," + "url,icon,view,print," + CALENDAR_FIELDS, "article", "topic", + (*id)->value.lval, (*name)->value.str.val); +} + +MGD_FUNCTION(get_reply_by_name) +{ + zval **id, **name; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &name) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(name); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get_by_name(&MidgardArticle, return_value, + "id,up,topic,name,title,abstract,content,author," + "Date_format(created,'%d.%m.%Y') AS date," + "Date_format(created,'%D %b. %Y') AS adate," + "Date_format(created,'%D %M %Y') AS aldate," + "extra1,extra2,extra3,article.score,type," + "Unix_Timestamp(created) AS created,creator," + "Unix_Timestamp(revised) AS revised,revisor," + "revision," + "Unix_Timestamp(approved) AS approved,approver," + "Unix_Timestamp(locked) AS locked,locker," + "url,icon,view,print," + CALENDAR_FIELDS, "article", "up", + (*id)->value.lval, (*name)->value.str.val); +} + +MGD_FUNCTION(create_article) +{ + zval **up, **topic, **name, **title, **abstract, **content, **author; + zval **url, **calstart, **caldays, **icon, **view, **print; + zval **extra1, **extra2, **extra3, **type; + zval *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "topic", topic) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "abstract", abstract) + || !MGD_PROPFIND(self, "content", content) + || !MGD_PROPFIND(self, "author", author) + || !MGD_PROPFIND(self, "url", url) + || !MGD_PROPFIND(self, "calstart", calstart) + || !MGD_PROPFIND(self, "caldays", caldays) + || !MGD_PROPFIND(self, "icon", icon) + || !MGD_PROPFIND(self, "view", view) + || !MGD_PROPFIND(self, "print", print) + || !MGD_PROPFIND(self, "extra1", extra1) + || !MGD_PROPFIND(self, "extra2", extra2) + || !MGD_PROPFIND(self, "extra3", extra3) + || !MGD_PROPFIND(self, "type", type)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 17 + || zend_get_parameters_ex(17, &up, &topic, &name, &title, + &abstract, &content, &author, + &url, &calstart, &caldays, &icon, + &view, &print, &extra1, &extra2, + &extra3, &type) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_long_ex(topic); + convert_to_string_ex(name); + convert_to_string_ex(title); + convert_to_string_ex(abstract); + convert_to_string_ex(content); + convert_to_long_ex(author); + convert_to_string_ex(url); + convert_to_string_ex(calstart); + convert_to_long_ex(caldays); + convert_to_long_ex(icon); + convert_to_long_ex(view); + convert_to_long_ex(print); + convert_to_string_ex(extra1); + convert_to_string_ex(extra2); + convert_to_string_ex(extra3); + convert_to_long_ex(type); + + if (!istopicowner((*topic)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "article", + "id=$d AND sitegroup IN (0,$d)", + (*up)->value.lval, + mgd_sitegroup(mgd_handle()))) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } + + /* topic must be in same SG or be 0 */ + if ((*topic)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "topic", + "id=$d AND sitegroup IN (0,$d)", + (*topic)->value.lval, + mgd_sitegroup(mgd_handle + ()))) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } + /* author must be in same SG or be 0 */ + if ((*author)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "person", + "id=$d AND sitegroup IN (0,$d)", + (*author)->value.lval, + mgd_sitegroup(mgd_handle + ()))) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + php_midgard_create(return_value, "article", + "up,topic,name,title,abstract,content,author," + "url,calstart,caldays,icon,view,print," + "extra1,extra2,extra3,score,type," + "created,creator,revised,revisor," + "revision,approved,approver", + "$d,$d,$q,$q,$q,$q,$d,$q,$t,$d,$d,$d,$d,$q,$q,$q,0,$d," + "Now(),$d,Now(),$d,1,0,0", + (*up)->value.lval, (*topic)->value.lval, + (*name)->value.str.val, (*title)->value.str.val, + (*abstract)->value.str.val, + (*content)->value.str.val, (*author)->value.lval, + (*url)->value.str.val, (*calstart)->value.str.val, + (*caldays)->value.lval, (*icon)->value.lval, + (*view)->value.lval, (*print)->value.lval, + (*extra1)->value.str.val, (*extra2)->value.str.val, + (*extra3)->value.str.val, (*type)->value.lval, + mgd_user(mgd_handle()), mgd_user(mgd_handle())); + PHP_CREATE_REPLIGARD("article", return_value->value.lval); +} + +MGD_FUNCTION(update_article_score) +{ + zval **id, **score, *self; + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, + &score) != + SUCCESS) { + WRONG_PARAM_COUNT; + } + if (!MGD_PROPFIND(self, "id", id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &score) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_long_ex(score); + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "article", "score=$d", + (*id)->value.lval, (*score)->value.lval); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(update_article_created) +{ + zval **id, **timestamp; + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, ×tamp) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + convert_to_long_ex(timestamp); + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "article", "created=from_unixtime($d)", + (*id)->value.lval, (*timestamp)->value.lval); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(update_article_replyto) +{ + zval **id, **up; +#if HAVE_MIDGARD_SITEGROUPS + int parent_topic; +#endif + RETVAL_FALSE; + CHECK_MGD; + + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, + &up) != SUCCESS) WRONG_PARAM_COUNT; + + convert_to_long_ex(id); + convert_to_long_ex(up); + +#if HAVE_MIDGARD_SITEGROUPS + parent_topic = + mgd_idfield(mgd_handle(), "topic", "article", (*up)->value.lval); + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "article src, article tgt", + "src.id=$d AND tgt.id=$d" + " AND (src.sitegroup=tgt.sitegroup" + " OR src.sitegroup=0" " OR tgt.sitegroup=0)", + (*id)->value.lval, (*up)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "article", "up=$d" +#if HAVE_MIDGARD_SITEGROUPS + ",topic=$d" +#endif + , (*id)->value.lval, (*up)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + , parent_topic +#endif + ); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(update_article_type) +{ + zval **id, **type, *self; + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, + &type) != + SUCCESS) WRONG_PARAM_COUNT; + if (!MGD_PROPFIND(self, "id", id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &type) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_long_ex(type); + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "article", "type=$d", + (*id)->value.lval, (*type)->value.lval); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(toggle_article_lock) +{ + zval **id; + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "article", + "locked=Now(),locker=If(locker,0,$d)", + (*id)->value.lval, mgd_user(mgd_handle())); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(approve_article) +{ + zval **id; + zval **approve; + int flag; + RETVAL_FALSE; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + flag = 1; + break; + + case 2: + if (zend_get_parameters_ex(2, &id, &approve) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + convert_to_boolean_ex(approve); + flag = (*approve)->value.lval; + break; + + default: + WRONG_PARAM_COUNT; + } + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (flag) + php_midgard_update(return_value, "article", + "approved=Now(),approver=$d", + (*id)->value.lval, mgd_user(mgd_handle())); + else + php_midgard_update(return_value, "article", + "approved='0000-00-00 00:00:00',approver=0", + (*id)->value.lval); + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(update_article) +{ + zval **id, **topic, **name, **title, **abstract, **content, **author; + zval **url, **calstart, **caldays, **icon, **view, **print; + zval **extra1, **extra2, **extra3; + zval **type, **score, **up, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "topic", topic) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "abstract", abstract) + || !MGD_PROPFIND(self, "content", content) + || !MGD_PROPFIND(self, "author", author) + || !MGD_PROPFIND(self, "url", url) + || !MGD_PROPFIND(self, "calstart", calstart) + || !MGD_PROPFIND(self, "caldays", caldays) + || !MGD_PROPFIND(self, "icon", icon) + || !MGD_PROPFIND(self, "view", view) + || !MGD_PROPFIND(self, "print", print) + || !MGD_PROPFIND(self, "extra1", extra1) + || !MGD_PROPFIND(self, "extra2", extra2) + || !MGD_PROPFIND(self, "extra3", extra3) + || !MGD_PROPFIND(self, "type", type) + || !MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "score", score)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + score = type = up = NULL; + if (ZEND_NUM_ARGS() != 16 + || zend_get_parameters_ex(16, &id, &topic, &name, &title, + &abstract, &content, &author, + &url, &calstart, &caldays, &icon, + &view, &print, &extra1, &extra2, + &extra3) != SUCCESS) + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + convert_to_long_ex(topic); + convert_to_string_ex(name); + convert_to_string_ex(title); + convert_to_string_ex(abstract); + convert_to_string_ex(content); + convert_to_long_ex(author); + convert_to_string_ex(url); + convert_to_string_ex(calstart); + convert_to_long_ex(caldays); + convert_to_long_ex(icon); + convert_to_long_ex(view); + convert_to_long_ex(print); + convert_to_string_ex(extra1); + convert_to_string_ex(extra2); + convert_to_string_ex(extra3); + + /* EEH: conversion to string is intentional, see update code */ + if (type) + convert_to_string_ex(type); + if (score) + convert_to_string_ex(score); + if (up) + convert_to_string_ex(up); + + if (!isarticleowner((*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + +#if HAVE_MIDGARD_SITEGROUPS + /* TODO: If we change topic here we should clear 'up' */ + + /* topic must be in same SG or be 0 */ + if ((*topic)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "article,topic", + "article.id=$d AND topic.id=$d" + " AND (article.sitegroup=topic.sitegroup" + " OR article.sitegroup=0" " OR topic.sitegroup=0)", + (*id)->value.lval, (*topic)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } + + /* author must be in same SG or be 0 */ + if ((*author)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "article,person", + "article.id=$d AND person.id=$d" + " AND (article.sitegroup=person.sitegroup" + " OR article.sitegroup=0" " OR person.sitegroup=0)", + (*id)->value.lval, (*author)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + php_midgard_update(return_value, "article", + "name=$q,title=$q,abstract=$q,content=$q," + "author=$d,url=$q,calstart=$t,caldays=$d,icon=$d," + "view=$d,print=$d,extra1=$q,extra2=$q,extra3=$q," + "revised=Now(),revisor=$d,revision=revision+1," + "type=$s,score=$s,up=$s", + (*id)->value.lval, (*name)->value.str.val, + (*title)->value.str.val, (*abstract)->value.str.val, + (*content)->value.str.val, (*author)->value.lval, + (*url)->value.str.val, (*calstart)->value.str.val, + (*caldays)->value.lval, (*icon)->value.lval, + (*view)->value.lval, (*print)->value.lval, + (*extra1)->value.str.val, (*extra2)->value.str.val, + (*extra3)->value.str.val, mgd_user(mgd_handle()), + type ? (*type)->value.str.val : "type", + score ? (*score)->value.str.val : "score", + up ? (*up)->value.str.val : "up" ); + + PHP_UPDATE_REPLIGARD("article", (*id)->value.lval); +} + +MGD_FUNCTION(delete_article) +{ + IDINIT; + CHECK_MGD; + + if (mgd_has_dependants(mgd_handle(), id, "article")) { + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + } + + if (mgd_exists_id(mgd_handle(), "article", "up=$d", id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + } + + if (!isarticleowner(id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_delete(return_value, "article", id); + PHP_DELETE_REPLIGARD("article", id); +} + +MGD_FUNCTION(copy_article) +{ + zval **id, **newtopic; + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &newtopic) != + SUCCESS) WRONG_PARAM_COUNT; + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + newtopic = NULL; + break; + default: + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + if (newtopic) + convert_to_long_ex(newtopic); + +#if HAVE_MIDGARD_SITEGROUPS + /* newtopic must be in same SG or be 0 */ + if (newtopic && !mgd_exists_bool(mgd_handle(), "topic,article", + "topic.id=$d AND article.id=$d" + " AND (topic.sitegroup=article.sitegroup" + " OR topic.sitegroup=0" + " OR article.sitegroup=0)", + (*newtopic)->value.lval, (*id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + RETVAL_LONG(mgd_copy_article(mgd_handle(), (*id)->value.lval, + newtopic ? (*newtopic)->value.lval : 0)); +} + +MGD_FUNCTION(delete_article_tree) +{ + IDINIT; + CHECK_MGD; + + if (!isarticleowner(id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (mgd_delete_article(mgd_handle(), id)) { + RETURN_TRUE; + } + + RETURN_FALSE; +} + +MGD_MOVE_FUNCTION(article, topic, article, topic) +MGD_MOVE_FUNCTION(article, article, reply, up) + +MidgardProperty MidgardArticleProperties [] = { + { IS_LONG, "up" }, + { IS_LONG, "topic" }, + { IS_STRING, "name" }, + { IS_STRING, "title" }, + { IS_STRING, "abstract" }, + { IS_STRING, "content" }, + { IS_LONG, "author" }, + { IS_STRING, "url" }, + { IS_LONG, "calstart" }, + { IS_LONG, "caldays" }, + { IS_LONG, "icon" }, + { IS_LONG, "view" }, + { IS_LONG, "print" }, + { IS_STRING, "extra1" }, + { IS_STRING, "extra2" }, + { IS_STRING, "extra3" }, + { IS_LONG, "creator" }, + { IS_LONG, "created" }, + { IS_LONG, "revisor" }, + { IS_LONG, "revision" }, + { IS_LONG, "revised" }, + { IS_LONG, "locker" }, + { IS_LONG, "locked" }, + { IS_LONG, "approver" }, + { IS_LONG, "approved" }, + { IS_LONG, "score" }, + { IS_LONG, "type" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(article) +static zend_function_entry MidgardArticleMethods[] = { + PHP_FALIAS(midgardarticle, mgd_ctor_article, NULL) + PHP_FALIAS(create, mgd_create_article, NULL) + PHP_FALIAS(update, mgd_update_article, NULL) + PHP_FALIAS(delete, mgd_delete_article, NULL) + PHP_FALIAS(settype, mgd_update_article_type, NULL) + PHP_FALIAS(setscore, mgd_update_article_score, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + MIDGARD_OOP_PARAMETER_METHODS + MIDGARD_OOP_ATTACHMENT_METHODS + MIDGARD_OOP_SITEGROUP_METHODS + { NULL, NULL, NULL} +}; +MidgardClass MidgardArticle = { + "MidgardArticle", + "article", + MidgardArticleMethods, + {}, + mgd_article_call_function_handler, + mgd_article_get_property_handler, + mgd_article_set_property_handler, + MidgardArticleProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardArticle, article) Index: php4/ext/midgard/attachment.c diff -u /dev/null php4/ext/midgard/attachment.c:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/attachment.c Sat Feb 17 15:21:49 2001 @@ -0,0 +1,771 @@ +/* $Id: attachment.c,v 1.3 2001/02/17 23:21:49 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "php.h" +#include "php_ini.h" +#include "php_globals.h" +#include "ext/standard/file.h" +#include "php_midgard.h" +#include "mgd_internal.h" +#include "mgd_oop.h" +#include "mgd_errno.h" +#include "mgd_access.h" + +#include <sys/stat.h> +#include <unistd.h> + +enum { MGD_BLOB_CALL_FUNC, MGD_BLOB_CALL_SELF, MGD_BLOB_CALL_OTHER }; + +static long mgd_get_blob_id(zval *self, zval **name, int *calltype) +{ +zval **table, **id; + + if (self == NULL) { + if (calltype) *calltype = MGD_BLOB_CALL_FUNC; + if (name == NULL) return MGD_ERR_INVALID_NAME; + convert_to_long_ex(name); + return (*name)->value.lval; + } + + if (!MGD_PROPFIND(self, "__table__", table)) { + return MGD_ERR_NOT_OBJECT; + } + if (!MGD_PROPFIND(self, "id", id)) { + return MGD_ERR_NOT_OBJECT; + } + + if ((*table)->type != IS_STRING) { + return MGD_ERR_NOT_OBJECT; + } + + if (strcmp((*table)->value.str.val, "blobs") == 0) { + if (calltype) *calltype = MGD_BLOB_CALL_SELF; + convert_to_long_ex(id); + return (*id)->value.lval; + } + + if (calltype) *calltype = MGD_BLOB_CALL_OTHER; + if (name == NULL) return MGD_ERR_INVALID_NAME; + convert_to_string_ex(name); + return mgd_exists_id(mgd_handle(), "blobs", + "ptable=$q AND pid=$d AND name=$q", + (*table)->value.str.val, (*id)->value.lval, + (*name)->value.str.val); +} + +MGD_FUNCTION(oop_attachment_create) +{ + zval *self; + zval **zv_table, **zv_id; + zval **zv_name, **zv_title, **zv_mimetype, **zv_score; + int id; + int table; + int score; + char location[MIDGARD_REPLIGARD_TAG_LENGTH + 5]; + static char dir[16] = "0123456789ABCDEF"; + char *path; + struct stat statbuf; + midgard_pool *pool; + FILE *fp; + const char *blobdir; + + CHECK_MGD; + + blobdir = mgd_get_blobdir(mgd_handle()); + if (!blobdir || (*blobdir != '/') + || (stat(blobdir, &statbuf) != 0) + || !S_ISDIR(statbuf.st_mode)) { + php_log_err("Midgard: Invalid blobdir or blobdir not set"); + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (!MGD_PROPFIND(self, "__table__", zv_table)) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + if (!MGD_PROPFIND(self, "id", zv_id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(zv_table); + convert_to_long_ex(zv_id); + + switch (ZEND_NUM_ARGS()) { + case 3: + if (zend_get_parameters_ex + (3, &zv_name, &zv_title, &zv_mimetype) != SUCCESS) { + WRONG_PARAM_COUNT; + } + score = 0; + break; + case 4: + if (zend_get_parameters_ex + (4, &zv_name, &zv_title, &zv_mimetype, &zv_score) + != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(zv_score); + score = (*zv_score)->value.lval; + break; + default: + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(zv_name); + convert_to_string_ex(zv_title); + convert_to_string_ex(zv_mimetype); + + if (mgd_exists_id + (mgd_handle(), "blobs", "ptable=$q AND pid=$d AND name=$q", + (*zv_table)->value.str.val, (*zv_id)->value.lval, + (*zv_name)->value.str. + val)) { + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + } + + id = (*zv_id)->value.lval; + table = mgd_lookup_table_id((*zv_table)->value.str.val); + + if (!isglobalowner(table, id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + do { + strcpy(location + 4, + mgd_create_guid(mgd_handle(), + (*zv_table)->value.str.val, id)); + } while (strstr(location + 4, "..")); + + /* some basic hashing to aid in dirsize balancing. This probably + needs refinement since the rc5 checksum we use to generate the names + returns all readable chars which don't distribute well with the + simple method below + */ + location[1] = location[3] = '/'; + location[0] = dir[((unsigned char) location[4]) / 16]; + location[2] = dir[((unsigned char) location[4]) % 16]; + + if (!(pool = mgd_alloc_pool())) { + php_log_err("Midgard: out of memory"); + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + path = mgd_format(mgd_handle(), pool, "$s/$s", blobdir, location); + + if ((fp = fopen(path, "w")) == NULL) { + php_log_err("Midgard: Can't create blob"); + RETVAL_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + else { + fclose(fp); + php_midgard_create(return_value, "blobs", + +"ptable,pid,name,title,location,mimetype,author,created,score", + "$q,$d,$q,$q,$q,$q,$d,Now(),$d", + (*zv_table)->value.str.val, id, + (*zv_name)->value.str.val, + (*zv_title)->value.str.val, location, + (*zv_mimetype)->value.str.val, + mgd_user(mgd_handle()), score); + PHP_CREATE_REPLIGARD("blobs", return_value->value.lval); + } + + mgd_free_pool(pool); +} + +MGD_FUNCTION(oop_attachment_list) +{ + zval *self, **zv_table, **zv_id, **zv_order; + char *order = NULL; + + CHECK_MGD; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (!MGD_PROPFIND(self, "__table__", zv_table)) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + if (!MGD_PROPFIND(self, "id", zv_id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(zv_table); + convert_to_long_ex(zv_id); + + if (ZEND_NUM_ARGS() == 1) { + if (zend_get_parameters_ex(1, &zv_order) == FAILURE) { + WRONG_PARAM_COUNT; + } + else { + convert_to_string_ex(zv_order); + order = (*zv_order)->value.str.val; + } + } + + php_midgard_select(&MidgardAttachment, return_value, + "id,name,title,mimetype,score,author,created", + "blobs", "ptable=$q AND pid=$d", order, + (*zv_table)->value.str.val, (*zv_id)->value.lval); +} + +MGD_FUNCTION(open_attachment) +{ + int pid; + int ptable; + FILE *fp; + const char *location; + char *path; + midgard_pool *pool; + midgard_res *res; + const char *blobdir; + zval **zv_id, **zv_mode; + zval *self; + long aid; + + CHECK_MGD; + RETVAL_FALSE; + + blobdir = mgd_get_blobdir(mgd_handle()); + if (!blobdir || *blobdir != '/') { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + switch (ZEND_NUM_ARGS()) { + case 0: + zv_id = NULL; + zv_mode = NULL; + break; + case 1: + if (zend_get_parameters_ex(1, &zv_id) != SUCCESS) { + WRONG_PARAM_COUNT; + } + zv_mode = NULL; + break; + case 2: + if (zend_get_parameters_ex(1, &zv_id, &zv_mode) != + SUCCESS) { + WRONG_PARAM_COUNT; + } + break; + default: + WRONG_PARAM_COUNT; + } + + aid = mgd_get_blob_id((self = getThis()), zv_id, NULL); + if (aid == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (aid == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (aid < 0) { RETURN_FALSE_BECAUSE(aid); } + + if (zv_mode) + convert_to_string_ex(zv_mode); + + res = mgd_sitegroup_record(mgd_handle(), "ptable,pid,location", + "blobs", aid); + + if (!res || !mgd_fetch(res)) { + if (res) { + mgd_release(res); + } + + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + ptable = mgd_lookup_table_id(mgd_colvalue(res, 0)); + pid = mgd_sql2id(res, 1); + location = mgd_colvalue(res, 2); + + if (strstr(location, "..") || !isglobalowner(ptable, pid)) { + mgd_release(res); + php_log_err("Midgard: blobdir location relative or not owner"); + + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + pool = mgd_alloc_pool(); + path = mgd_format(mgd_handle(), pool, "$s/$s", blobdir, location); + fp = fopen(path, zv_mode ? (*zv_mode)->value.str.val : "w"); + + if (!fp) { + RETVAL_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + else { + if (mgd_update + (mgd_handle(), "blobs", aid, + "author=$d,created=Now()", mgd_user(mgd_handle()))) { + ZEND_REGISTER_RESOURCE(return_value, fp, php_file_le_fopen()); + } + else { + fclose(fp); + fp = NULL; + } + } + + if (!fp) { + RETVAL_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_log_err("Midgard: failed to open blob"); + } + + mgd_free_pool(pool); + mgd_release(res); +} + +MGD_FUNCTION(get_attachment) +{ + zval **id; + zval *self; + long aid; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + /* EEH/TODO: Why this? + case 0: + php_midgard_bless(return_value, &MidgardAttachment); + return; + */ + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) +WRONG_PARAM_COUNT; + break; + + default: + WRONG_PARAM_COUNT; + } + + aid = mgd_get_blob_id((self = getThis()), id, NULL); + if (aid == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (aid == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (aid < 0) { RETURN_FALSE_BECAUSE(aid); } + + php_midgard_get(&MidgardAttachment, return_value, + "id,name,title,mimetype,score,author,created,ptable,pid", + "blobs", aid); +} + +MGD_FUNCTION(serve_attachment) +{ + midgard_res *res; + const char *location, *mimetype; + midgard_pool *pool; + char *path; + FILE *fp; + int b; + char buf[1024]; + const char *blobdir; + int id; + zval *self, **zv_id; + char *content_type; + + CHECK_MGD; + RETVAL_FALSE; + + switch (ZEND_NUM_ARGS()) { + case 0: + zv_id = NULL; + break; + + case 1: + if (zend_get_parameters_ex(1, &zv_id) != SUCCESS) +WRONG_PARAM_COUNT; + break; + + default: + WRONG_PARAM_COUNT; + } + + id = mgd_get_blob_id((self = getThis()), zv_id, NULL); + if (id == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (id == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (id < 0) { RETURN_FALSE_BECAUSE(id); } + + blobdir = mgd_get_blobdir(mgd_handle()); + if (!blobdir || *blobdir != '/') { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + res = + mgd_sitegroup_record(mgd_handle(), "location,mimetype", "blobs", + id); + + if (!res || !mgd_fetch(res)) { + if (res) { mgd_release(res); } + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + location = mgd_colvalue(res, 0); + mimetype = mgd_colvalue(res, 1); + if (!mimetype || !*mimetype) { + mimetype = "application/binary"; + } + + if (!location || !*location || strstr(location, "..")) { + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + pool = mgd_alloc_pool(); + path = mgd_format(mgd_handle(), pool, "$s/$s", blobdir, location); + + if (!(fp = fopen(path, "r"))) { + mgd_free_pool(pool); + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + content_type + = mgd_format (mgd_handle(), pool, "Content-type: $s", mimetype); + sapi_add_header(content_type, strlen(content_type), 1); + + if (sapi_send_headers() != SUCCESS) { + mgd_free_pool(pool); + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + while ((b = fread(buf, 1, sizeof(buf), fp)) > 0) { + PHPWRITE(buf, b); + } + + mgd_free_pool(pool); + mgd_release(res); + RETVAL_TRUE; +} + +MGD_FUNCTION(stat_attachment) +{ + midgard_res *res; + const char *location; + midgard_pool *pool; + char *path; + struct stat blobstat; + long id; + zval **zv_id, *self; + + CHECK_MGD; + RETVAL_FALSE; + + switch (ZEND_NUM_ARGS()) { + case 0: + zv_id = NULL; + break; + + case 1: + if (zend_get_parameters_ex(1, &zv_id) != SUCCESS) +WRONG_PARAM_COUNT; + break; + + default: + WRONG_PARAM_COUNT; + } + + id = mgd_get_blob_id((self = getThis()), zv_id, NULL); + if (id == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (id == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (id < 0) { RETURN_FALSE_BECAUSE(id); } + + if (!mgd_dcfg() || !mgd_dcfg()->blobdir + || *(mgd_dcfg()->blobdir) != '/') { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + res = mgd_sitegroup_record(mgd_handle(), "location", "blobs", id); + + if (!res || !mgd_fetch(res)) { + if (res) { mgd_release(res); } + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + location = mgd_colvalue(res, 0); + + if (!location || !*location || strstr(location, "..")) { + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + pool = mgd_alloc_pool(); + path = + mgd_format(mgd_handle(), pool, "$s/$s", mgd_dcfg()->blobdir, + location); + stat(path, &blobstat); + + if (array_init(return_value) == FAILURE) { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + add_next_index_long(return_value, blobstat.st_dev); + add_next_index_long(return_value, blobstat.st_ino); + add_next_index_long(return_value, blobstat.st_mode); + add_next_index_long(return_value, blobstat.st_nlink); + add_next_index_long(return_value, blobstat.st_uid); + add_next_index_long(return_value, blobstat.st_gid); +#ifdef HAVE_ST_BLKSIZE + add_next_index_long(return_value, blobstat.st_rdev); +#else + add_next_index_long(return_value, -1); +#endif + add_next_index_long(return_value, blobstat.st_size); + add_next_index_long(return_value, blobstat.st_atime); + add_next_index_long(return_value, blobstat.st_mtime); + add_next_index_long(return_value, blobstat.st_ctime); +#ifdef HAVE_ST_BLKSIZE + add_next_index_long(return_value, blobstat.st_blksize); +#else + add_next_index_long(return_value, -1); +#endif +#ifdef HAVE_ST_BLOCKS + add_next_index_long(return_value, blobstat.st_blocks); +#else + add_next_index_long(return_value, -1); +#endif +} + +MGD_FUNCTION(delete_attachment) +{ + int pid; + int ptable; + const char *location; + char *path; + midgard_pool *pool; + midgard_res *res; + const char *blobdir; + long id; + zval *self, **zv_id; + + CHECK_MGD; + RETVAL_FALSE; + + switch (ZEND_NUM_ARGS()) { + case 0: + zv_id = NULL; + break; + + case 1: + if (zend_get_parameters_ex(1, &zv_id) != SUCCESS) +WRONG_PARAM_COUNT; + break; + + default: + WRONG_PARAM_COUNT; + } + + id = mgd_get_blob_id((self = getThis()), zv_id, NULL); + if (id == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (id == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (id < 0) { RETURN_FALSE_BECAUSE(id); } + + if (mgd_has_dependants(mgd_handle(), id, "blobs")) { + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + } + + blobdir = mgd_get_blobdir(mgd_handle()); + if (!blobdir || *blobdir != '/') { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + + res = + mgd_sitegroup_record(mgd_handle(), "ptable,pid,location", "blobs", + id); + + if (!res || !mgd_fetch(res)) { + if (res) { mgd_release(res); } + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + ptable = mgd_lookup_table_id(mgd_colvalue(res, 0)); + pid = mgd_sql2id(res, 1); + location = mgd_colvalue(res, 2); + + if (strstr(location, "..") || !isglobalowner(ptable, pid)) { + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + pool = mgd_alloc_pool(); + path = mgd_format(mgd_handle(), pool, "$s/$s", blobdir, location); + + if (unlink(path) == 0 || errno == ENOENT) { + php_midgard_delete(return_value, "blobs", id); + PHP_DELETE_REPLIGARD("blobs", id); + } + + mgd_free_pool(pool); + mgd_release(res); +} + +MGD_FUNCTION(update_attachment) +{ + zval **id, **name, **title, **mimetype, **score, **author, *self; + int ptable, pid; + midgard_res *res = NULL; + const char *location; + int sc, auth, calltype; + long aid; + + RETVAL_FALSE; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 6: + if (zend_get_parameters_ex + (6, &id, &name, &title, &mimetype, &score, + &author) != SUCCESS) { + WRONG_PARAM_COUNT; + } + break; + + case 5: + if (zend_get_parameters_ex + (5, &id, &name, &title, &mimetype, + &score) != SUCCESS) {WRONG_PARAM_COUNT; + } + author = NULL; + break; + + case 4: + if (zend_get_parameters_ex + (4, &id, &name, &title, &mimetype) != SUCCESS) { + WRONG_PARAM_COUNT; + } + author = NULL; + score = NULL; + break; + + case 0: + id = NULL; + break; + + default: + WRONG_PARAM_COUNT; + break; + } + + aid = mgd_get_blob_id((self = getThis()), id, &calltype); + if (aid == 0) { RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); } + else if (aid == MGD_ERR_INVALID_NAME) { WRONG_PARAM_COUNT; } + else if (aid < 0) { RETURN_FALSE_BECAUSE(aid); } + + if (calltype == MGD_BLOB_CALL_SELF) { + if (!MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "mimetype", mimetype)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + + if (!MGD_PROPFIND(self, "author", author)) { author = NULL; } + if (!MGD_PROPFIND(self, "score", score)) { score = NULL; } + } + + convert_to_string_ex(name); + convert_to_string_ex(title); + convert_to_string_ex(mimetype); + + if (mgd_exists_bool(mgd_handle(), "blobs me, blobs other", + "me.id=$d AND me.id<>other.id" + " AND me.ptable=other.ptable AND me.pid=other.pid" + " AND other.name=$q", + aid, (*name)->value.str.val)) { + mgd_release(res); + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + } + + res = + mgd_sitegroup_record(mgd_handle(), "ptable,pid,location", "blobs", + aid); + + if (!res || !mgd_fetch(res)) { + if (res) { mgd_release(res); } + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + ptable = mgd_lookup_table_id(mgd_colvalue(res, 0)); + pid = mgd_sql2id(res, 1); + location = mgd_colvalue(res, 2); + + if (!isglobalowner(ptable, pid)) { + mgd_release(res); + + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (score) { + convert_to_long_ex(score); + sc = (*score)->value.lval; + } + else + sc = 0; + if (author) { + convert_to_long_ex(author); + auth = (*author)->value.lval; + } + else + auth = 0; + + php_midgard_update(return_value, "blobs", + (author ? + "name=$q,title=$q,mimetype=$q,score=$d,author=$d" + : (score ? "name=$q,title=$q,mimetype=$q,score=$d" : + "name=$q,title=$q,mimetype=$q")), + aid, (*name)->value.str.val, + (*title)->value.str.val, (*mimetype)->value.str.val, + sc, auth); + PHP_UPDATE_REPLIGARD("blobs", aid); + mgd_release(res); +} + +MidgardProperty MidgardAttachmentProperties [] = { + { IS_STRING, "name" }, + { IS_STRING, "title" }, + { IS_STRING, "mimetype" }, + { IS_LONG, "score" }, + { IS_STRING, "ptable" }, + { IS_LONG, "pid" }, + { IS_LONG, "author" }, + { IS_LONG, "created" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(attachment) +static zend_function_entry MidgardAttachmentMethods[] = + { +// MidgardAttachment class constructor +// PHP_FALIAS(midgardattachment, mgd_ctor_attachment, NULL) + PHP_FALIAS(update, mgd_update_attachment, NULL) + PHP_FALIAS(delete, mgd_delete_attachment, NULL) + PHP_FALIAS(stat, mgd_stat_attachment, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + MIDGARD_OOP_PARAMETER_METHODS + MIDGARD_OOP_SITEGROUP_METHODS + { NULL, NULL, NULL } + }; +MidgardClass MidgardAttachment = { + "MidgardAttachment", + "blobs", + MidgardAttachmentMethods, + {}, + mgd_attachment_call_function_handler, + mgd_attachment_get_property_handler, + mgd_attachment_set_property_handler, + MidgardAttachmentProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardAttachment, attachment) Index: php4/ext/midgard/calendar.c diff -u /dev/null php4/ext/midgard/calendar.c:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/calendar.c Sat Feb 17 15:21:49 2001 @@ -0,0 +1,205 @@ +/* $Id: calendar.c,v 1.3 2001/02/17 23:21:49 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#define DATE_MAX 0x7FFFFFFF + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_topic_calendar_all) +{ + int *topics; + int typev = 0, startv = 0, stopv = 0; + const char *sortv = NULL; + zval **id, **startn, **stopn, **sortn, **typen; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 5: + if (zend_get_parameters_ex(5, + &id, &startn, &stopn, &sortn, +&typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + typev = (*typen)->value.lval; + sortv = article_sort((*sortn)->value.str.val); + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 4: + if (zend_get_parameters_ex(4, &id, &startn, &stopn, &sortn) == +SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + convert_to_string_ex(sortn); + typev = -1; + sortv = article_sort((*sortn)->value.str.val); + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &startn, &stopn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + typev = -1; + sortv = "article.calstart"; + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(typen); + typev = (*typen)->value.lval; + sortv = "article.calstart"; + startv = time(NULL); + stopv = DATE_MAX; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + typev = -1; + sortv = "article.calstart"; + startv = time(NULL); + stopv = DATE_MAX; + break; + } + default: + wrong_param_count(); + } + + topics = mgd_tree(mgd_handle(), "topic", (*id)->value.lval, 0, NULL); + + if (typev == -1) + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT "," ARTICLE_CALENDAR, +ARTICLE_FROM, + "article.topic IN $D AND author=person.id" + " AND article.up=0 AND +Unix_Timestamp(calstart)<$d" + " AND 24*60*60-1+Unix_timestamp(" + " Date_Add(calstart, INTERVAL caldays +DAY))>$d", + sortv, topics, stopv, startv); + else + php_midgard_select(&MidgardArticle, return_value, + ARTICLE_SELECT "," ARTICLE_CALENDAR, +ARTICLE_FROM, + "article.type=$d AND article.topic IN $D" + " AND author=person.id" + " AND article.up=0 AND +Unix_Timestamp(calstart)<$d" + " AND 24*60*60-1+Unix_timestamp(" + " Date_Add(calstart, INTERVAL caldays +DAY))>$d", + sortv, typev, topics, stopv, startv); +} + +MGD_FUNCTION(list_topic_calendar_all_fast) +{ + int *topics; + int typev = 0, startv = 0, stopv = 0; + const char *sortv = NULL; + zval **id, **startn, **stopn, **sortn, **typen; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 5: + if (zend_get_parameters_ex(5, + &id, &startn, &stopn, &sortn, +&typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + typev = (*typen)->value.lval; + sortv = article_sort((*sortn)->value.str.val); + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 4: + if (zend_get_parameters_ex(4, &id, &startn, &stopn, &sortn) == +SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + convert_to_string_ex(sortn); + typev = -1; + sortv = article_sort((*sortn)->value.str.val); + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &startn, &stopn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(startn); + convert_to_long_ex(stopn); + typev = -1; + sortv = "article.calstart"; + startv = (*startn)->value.lval; + stopv = ((*stopn)->value.lval > 0) ? (*stopn)->value.lval : +DATE_MAX; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(typen); + typev = (*typen)->value.lval; + sortv = "article.calstart"; + startv = time(NULL); + stopv = DATE_MAX; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + typev = -1; + sortv = "article.calstart"; + startv = time(NULL); + stopv = DATE_MAX; + break; + } + default: + wrong_param_count(); + } + + topics = mgd_tree(mgd_handle(), "topic", (*id)->value.lval, 0, NULL); + + if (typev == -1) + php_midgard_select(&MidgardArticle, return_value, ARTICLE_SELECT_FAST "," +ARTICLE_CALENDAR, + ARTICLE_FROM_FAST, + "article.topic IN $D" + " AND article.up=0 AND +Unix_Timestamp(calstart)<$d" + " AND 24*60*60-1+Unix_timestamp(" + " Date_Add(calstart, INTERVAL caldays +DAY))>$d", + sortv, topics, stopv, startv); + else + php_midgard_select(&MidgardArticle, return_value, ARTICLE_SELECT_FAST "," +ARTICLE_CALENDAR, + ARTICLE_FROM_FAST, + "article.type=$d AND article.topic IN $D" + " AND article.up=0 AND +Unix_Timestamp(calstart)<$d" + " AND 24*60*60-1+Unix_timestamp(" + " Date_Add(calstart, INTERVAL caldays +DAY))>$d", + sortv, typev, topics, stopv, startv); +} Index: php4/ext/midgard/config.m4 diff -u /dev/null php4/ext/midgard/config.m4:1.5 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/config.m4 Sat Feb 17 15:21:49 2001 @@ -0,0 +1,59 @@ +dnl $Id: config.m4,v 1.5 2001/02/17 23:21:49 emile Exp $ + +dnl Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +dnl Copyright (C) 2000 The Midgard Project ry +dnl Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> +dnl +dnl This program is free software; you can redistribute it and/or modify it +dnl under the terms of the GNU Lesser General Public License as published +dnl by the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +AC_PROG_YACC +AC_DECL_YYTEXT +AC_PROG_LEX + +PHP_ARG_WITH(midgard, for midgard support, +[ --with-midgard Include midgard 1.4 support]) + +if test "$PHP_MIDGARD" != "no"; then + if test "$PHP_MIDGARD" != "yes"; then + AC_ADD_LIBRARY_WITH_PATH(midgard, "$PHP_MIDGARD/lib", MIDGARD_SHARED_LIBADD) + AC_ADD_INCLUDE("$PHP_MIDGARD/include") + else + AC_ADD_LIBRARY(midgard) + fi + AC_DEFINE(HAVE_MIDGARD, 1, [ ]) + PHP_EXTENSION(midgard, $ext_shared) + +dnl EEH/TODO: Add checks for apache-static compilation + AC_PATH_PROG(APXS, apxs) + if test -z $APXS; then + AC_MSG_ERROR(apxs not found.) + fi + APACHE_INCLUDES=`$APXS -q INCLUDEDIR` + AC_ADD_INCLUDE($APACHE_INCLUDES) + + AC_PATH_PROG(GLIBCONFIG, glib-config) + dnl Ackackack... why do people do this? + if test -z $GLIBCONFIG; then + AC_PATH_PROG(GLIBCONFIG, glib12-config) + fi + if test -z $GLIBCONFIG; then + AC_MSG_ERROR(glib-config not found. Did you install glib?) + fi + CFLAGS="$CFLAGS "`$GLIBCONFIG --cflags` + LIBS="$LIBS "`$GLIBCONFIG --libs` + LFLAGS="$LFLAGS -Pmgd -olex.yy.c" + + PHP_SUBST(GLIBCONFIG) +fi Index: php4/ext/midgard/element.c diff -u /dev/null php4/ext/midgard/element.c:1.3 --- /dev/null Sat Feb 17 15:21:51 2001 +++ php4/ext/midgard/element.c Sat Feb 17 15:21:49 2001 @@ -0,0 +1,231 @@ +/* $Id: element.c,v 1.3 2001/02/17 23:21:49 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_access.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_elements) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardElement, return_value, + "id,name", "element", "style=$d", "name", id); +} + +MGD_FUNCTION(get_element) +{ + zval **id; + zval **style, **name; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardElement); + mgd_object_init(return_value, "id", "style", "name", + "value", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + + php_midgard_get(&MidgardElement, + return_value, + "id,style,name,value", + "element", (*id)->value.lval); + break; + case 2: + if (zend_get_parameters_ex(2, &style, &name) != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(style); + convert_to_string_ex(name); + php_midgard_get_by_name(&MidgardElement, + return_value, + "id,style,name,value", + "element", "style", + (*style)->value.lval, + (*name)->value.str.val); + break; + default: + WRONG_PARAM_COUNT; + } +} + +MGD_FUNCTION(get_element_by_name) +{ + /* EEH: just an alias for get_element */ + php_if_mgd_get_element(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} + +MGD_FUNCTION(create_element) +{ + zval **style, **name, **value, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "style", style) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "value", value)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &style, &name, + &value) == FAILURE) { + WRONG_PARAM_COUNT; + } + } + + convert_to_long_ex(style); + convert_to_string_ex(name); + convert_to_string_ex(value); + + if (!(*style)->value.lval + || !mgd_exists_id(mgd_handle(), "style", "id=$d", + (*style)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (!isstyleowner((*style)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (mgd_exists_id(mgd_handle(), "element", "style=$d AND name=$q", + (*style)->value.lval, (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + +#if HAVE_MIDGARD_SITEGROUPS + /* style must be in same SG or be 0 */ + if ((*style)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "style", + "id=$d AND sitegroup IN (0,$d)", + (*style)->value.lval, + mgd_sitegroup(mgd_handle + +())))RETURN_FALSE_BECAUSE + (MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, + "element", "style,name,value", + "$d,$q,$q", (*style)->value.lval, + (*name)->value.str.val, (*value)->value.str.val); + PHP_CREATE_REPLIGARD("element", return_value->value.lval); +} + +MGD_FUNCTION(update_element) +{ + zval **id, **name, **value, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "value", value)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &id, &name, &value) == FAILURE) { + WRONG_PARAM_COUNT; + } + } + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(value); + + if (!isstyleowner(mgd_idfield(mgd_handle(), "style", "element", + (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "element", "name=$q,value=$q", + (*id)->value.lval, + (*name)->value.str.val, (*value)->value.str.val); + PHP_UPDATE_REPLIGARD("element", (*id)->value.lval); +} + +MGD_FUNCTION(delete_element) +{ + IDINIT; + CHECK_MGD; + if (mgd_has_dependants(mgd_handle(), id, "element")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isstyleowner(mgd_idfield(mgd_handle(), "style", "element", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_delete(return_value, "element", id); + PHP_DELETE_REPLIGARD("element", id); +} + +MGD_FUNCTION(copy_element) +{ + zval **id, **newstyle; + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &newstyle) != + SUCCESS) WRONG_PARAM_COUNT; + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + newstyle = NULL; + break; + default: + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + if (newstyle) + convert_to_long_ex(newstyle); + +#if HAVE_MIDGARD_SITEGROUPS + /* newstyle must be in same SG or be 0 */ + if (newstyle && !mgd_exists_bool(mgd_handle(), "style,element", + "style.id=$d AND element.id=$d" + " AND (style.sitegroup=element.sitegroup" + " OR style.sitegroup=0" + " OR element.sitegroup=0)", + (*newstyle)->value.lval, (*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + RETVAL_LONG(mgd_copy_element(mgd_handle(), (*id)->value.lval, + newstyle ? (*newstyle)->value.lval : 0)); + +} + +MGD_MOVE_FUNCTION(element, style, element, style) + +MidgardProperty MidgardElementProperties [] = { + { IS_LONG, "style" }, + { IS_STRING, "name" }, + { IS_STRING, "value" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardElement, element) + Index: php4/ext/midgard/event.c diff -u /dev/null php4/ext/midgard/event.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/event.c Sat Feb 17 15:21:49 2001 @@ -0,0 +1,865 @@ +/* $Id: event.c,v 1.3 2001/02/17 23:21:49 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +/* begin calendar functions */ + +MGD_FUNCTION(is_event_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(iseventowner(id)); +} + +MGD_FUNCTION(create_event) +{ + zval **up, **start, **end, **title, **description; + zval **type, **extra, **owner, **busy, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "start", start) + || !MGD_PROPFIND(self, "end", end) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "type", type) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + || !MGD_PROPFIND(self, "busy", busy) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 9 + || zend_get_parameters_ex(9, &up, &start, &end, &title, + &description, &type, &extra, &owner, + &busy) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(title); + convert_to_string_ex(description); + convert_to_long_ex(type); + convert_to_string_ex(extra); + convert_to_long_ex(owner); + convert_to_boolean_ex(busy); + + if ((*start)->value.lval > (*end)->value.lval) + RETURN_FALSE_BECAUSE(MGD_ERR_RANGE); + + if ((*up)->value.lval && !iseventowner((*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "event", + "id=$d AND sitegroup IN (0,$d)", + (*up)->value.lval, + mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* owner must be in same SG or be 0 */ + /* TODO: should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d AND sitegroup IN (0,$d)", + (*owner)->value.lval, + mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#else + if ((*up)->value.lval != 0 + && !mgd_exists_id(mgd_handle(), "event", "id=$d", + (*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); +#endif + + php_midgard_create(return_value, "event", "up,start,end,title," + +"description,type,extra,owner,creator,created,revisor,revised,revision,busy", + "$d,$d,$d,$q,$q,$d,$q,$d,$d,Now(),$d,Now(),0,$d", + (*up)->value.lval, (*start)->value.lval, (*end)->value.lval, + (*title)->value.str.val, (*description)->value.str.val, + (*type)->value.lval, (*extra)->value.str.val, + (*owner)->value.lval, mgd_user(mgd_handle()), + mgd_user(mgd_handle()), (*busy)->value.lval); + + PHP_CREATE_REPLIGARD("event", return_value->value.lval); +} + +MGD_FUNCTION(update_event) +{ + zval **id, **start, **end, **title, **description; + zval **type, **extra, **owner, **busy, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "start", start) + || !MGD_PROPFIND(self, "end", end) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "type", type) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + || !MGD_PROPFIND(self, "busy", busy) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 9 + || zend_get_parameters_ex(9, &id, &start, &end, + &title, &description, &type, &extra, + &owner, &busy) == FAILURE) + + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(title); + convert_to_string_ex(description); + convert_to_long_ex(type); + convert_to_string_ex(extra); + convert_to_long_ex(owner); + convert_to_boolean_ex(busy); + + if ((*start)->value.lval > (*end)->value.lval) + RETURN_FALSE_BECAUSE(MGD_ERR_RANGE); + + if (!(*id)->value.lval || !iseventowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* owner must be in same SG or be 0 */ + /* should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "event,grp", + "event.id=$d AND grp.id=$d" + " AND (event.sitegroup=grp.sitegroup" + " OR event.sitegroup=0" + " OR grp.sitegroup=0)", + (*id)->value.lval, + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_update(return_value, "event", + "start=$d,end=$d,title=$q," + +"description=$q,type=$d,extra=$q,owner=$d,revisor=$d,revised=Now(),revision=revision+1,busy=$d", + (*id)->value.lval, + (*start)->value.lval, (*end)->value.lval, + (*title)->value.str.val, (*description)->value.lval, + (*type)->value.lval, (*extra)->value.str.val, + (*owner)->value.lval, mgd_user(mgd_handle()), + (*busy)->value.lval); + PHP_UPDATE_REPLIGARD("event", (*id)->value.lval); +} + +MGD_FUNCTION(delete_event) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"event")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (mgd_exists_id(mgd_handle(), "event", "up=$d", id) + || mgd_exists_id(mgd_handle(), "eventmember", "eid=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!id || !iseventowner(id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_delete(return_value, "event", id); + PHP_DELETE_REPLIGARD("event", id); +} + +MGD_FUNCTION(delete_event_tree) +{ + IDINIT; + CHECK_MGD; + if (!iseventowner(mgd_idfield(mgd_handle(), "up", "event", id))) +RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if(mgd_delete_event(mgd_handle(), id)) { RETURN_TRUE; } + RETURN_FALSE; +} + +MGD_FUNCTION(get_event) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardEvent); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardEvent, return_value, "id,up,start,end,title,description," + +"type,extra,owner,creator,created,revisor,revised,revision,busy", + "event", (*id)->value.lval); +} + +static const char *event_sort(const char *order) +{ + static struct { const char *order, *sort; } sort[] = { + { "start", "event.start ASC" }, + { "reverse start", "event.start DESC" }, + { "alpha", "event.title ASC" }, + { "reverse alpha", "event.title DESC" }, + { "end", "event.end ASC" }, + { "reverse end", "event.end DESC" }, + { "up", "event.up ASC,event.id ASC" }, + { "reverse up", "event.up DESC,event.id DESC" }, + { "created", "event.created ASC" }, + { NULL, "event.created DESC" } + }; + int i; + + for (i = 0; sort[i].order; i++) + if (strcmp(order, sort[i].order) == 0) + return sort[i].sort; + + return sort[i].sort; +} + +MGD_FUNCTION(list_events) +{ + const char *sortv; + int typev; + zval **id, **sortn, **typen; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 3: + if (zend_get_parameters_ex(3, &id, &sortn, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = event_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = event_sort((*sortn)->value.str.val); + typev = -1; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "event.id DESC"; + typev = -1; + break; + } + default: + WRONG_PARAM_COUNT; + } + + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, "id,up,start,end,title," + "description,type,extra,owner,busy", + "event", "event.up=$d", + sortv, (*id)->value.lval); + else + php_midgard_select(&MidgardEvent, return_value, "id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "event.type=$d AND event.up=$d", + sortv, typev, (*id)->value.lval); +} + +MGD_FUNCTION(list_events_between) +{ + const char *sortv; + int typev; + zval **id, **sortn, **typen; + zval **start, **end; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 5: + if (zend_get_parameters_ex(5, &id, &start, &end, &sortn, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = event_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + break; + } + case 4: + if (zend_get_parameters_ex(4, &id, &start, &end, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(sortn); + sortv = event_sort((*sortn)->value.str.val); + typev = -1; + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &start, &end) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + sortv = "event.id DESC"; + typev = -1; + break; + } + default: + WRONG_PARAM_COUNT; + } + + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, "id,up,start,end,title," + "description,type,extra,owner,busy", + "event", "event.up=$d AND " + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, (*id)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); + else + php_midgard_select(&MidgardEvent, return_value, "id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "event.type=$d AND event.up=$d AND " + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, typev, (*id)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); +} + +MGD_FUNCTION(list_events_all) +{ + int *events; + const char *sortv; + int typev; + zval **id, **sortn, **typen; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 3: + if (zend_get_parameters_ex(3, &id, &sortn, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = event_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = event_sort((*sortn)->value.str.val); + typev = -1; + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "event.id DESC"; + typev = -1; + break; + } + default: + WRONG_PARAM_COUNT; + } + + if((*id)->value.lval) { + if(!(events = mgd_tree(mgd_handle(), "event", (*id)->value.lval, 0, +NULL))) + RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", "event.id IN $D", + sortv, events); + else + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "event.type=$d AND event.id IN $D", + sortv, typev, events); + + free(events); + } + else { + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", NULL, sortv); + else + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", "event.type=$d", + sortv, typev); + } +} + +MGD_FUNCTION(list_events_all_between) +{ + int *events; + const char *sortv; + int typev; + zval **id, **sortn, **typen; + zval **start, **end; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 5: + if (zend_get_parameters_ex(5, &id, &start, &end, &sortn, &typen) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(sortn); + convert_to_long_ex(typen); + sortv = event_sort((*sortn)->value.str.val); + typev = (*typen)->value.lval; + break; + } + case 4: + if (zend_get_parameters_ex(4, &id, &start, &end, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + convert_to_string_ex(sortn); + sortv = event_sort((*sortn)->value.str.val); + typev = -1; + break; + } + case 3: + if (zend_get_parameters_ex(3, &id, &start, &end) == SUCCESS) { + convert_to_long_ex(id); + convert_to_long_ex(start); + convert_to_long_ex(end); + sortv = "event.id DESC"; + typev = -1; + break; + } + default: + WRONG_PARAM_COUNT; + } + + if((*id)->value.lval) { + if(!(events = mgd_tree(mgd_handle(), "event", (*id)->value.lval, 0, +NULL))) + RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", "event.id in $D +AND " + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, events, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); + else + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "event.type=$d AND event.id IN $D AND " + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, typev, events, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); + } else { + if (typev == -1) + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); + else + php_midgard_select(&MidgardEvent, return_value, +"id,up,start,end,title," + "description,type,extra,owner,busy", + "event", + "event.type=$d AND " + "((event.start>=$d AND +event.start<=$d) OR " + "(event.start<=$d AND +event.end>=$d) OR " + "(event.end>=$d AND +event.end<=$d))", + sortv, typev, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval, + +(*start)->value.lval,(*end)->value.lval); + } +} + +void php_midgard_select_count_event_in_month(zval *return_value, + const char *tables, const char *where, + struct tm *start, struct tm *end) +{ + midgard_res *res=NULL; + zval day; + struct { int total; int both; int start; int end; int none; } days[31]; + struct tm s,e; + time_t tss,tse,tsstart,tsend; + int i; + + RETVAL_FALSE; + + res = mgd_query(mgd_handle(),"SELECT start, end FROM $s WHERE $s", + tables, where); + if(res) { + array_init(return_value); + add_assoc_long(return_value,"total",mgd_rows(res)); + for(i=0;i<31;i++) + { + days[i].total=0; + days[i].both=0; + days[i].start=0; + days[i].end=0; + days[i].none=0; + } + while(mgd_fetch(res)) + { + tss=mgd_sql2int(res,EVENT_START); + tse=mgd_sql2int(res,EVENT_END); + tsstart=mktime(start); + tsend=mktime(end); + memcpy((void *)&s,(void *)localtime(&tss),sizeof(s)); + memcpy((void *)&e,(void *)localtime(&tse),sizeof(e)); + if(tss<tsstart && tse>tsend) + { + for(i=start->tm_mday;i<=end->tm_mday;i++) + { + days[i].none++; + days[i].total++; + } + continue; + } + if(tss<tsend && tse>tsend) + { + days[s.tm_mday].start++; + days[s.tm_mday].total++; + for(i=s.tm_mday+1;i<=end->tm_mday;i++) + { + days[i].none++; + days[i].total++; + } + continue; + } + if(tss<tsstart && tse>tsstart) + { + days[e.tm_mday].end++; + days[e.tm_mday].total++; + for(i=start->tm_mday;i<e.tm_mday;i++) + { + days[i].none++; + days[i].total++; + } + continue; + } + if(tss>=tsstart && tss<=tsend && tse<=tsend) + { + if ( s.tm_mday == e.tm_mday + && s.tm_mon == e.tm_mon + && s.tm_year == e.tm_year) + { + days[s.tm_mday].both++; + days[s.tm_mday].start++; + days[e.tm_mday].end++; + days[e.tm_mday].total++; + } + else + { + days[s.tm_mday].start++; + days[s.tm_mday].total++; + days[e.tm_mday].end++; + days[e.tm_mday].total++; + for(i=s.tm_mday+1;i<e.tm_mday;i++) + { + days[i].none++; + days[i].total++; + } + } + } + } + for(i=1;i<=end->tm_mday;i++) + { + array_init(&day); + add_assoc_long(&day,"total",days[i].total); + add_assoc_long(&day,"both",days[i].both); + add_assoc_long(&day,"start",days[i].start); + add_assoc_long(&day,"end",days[i].end); + add_assoc_long(&day,"none",days[i].none); + zend_hash_index_update(return_value->value.ht,i, + &day,sizeof(pval),NULL); + } + mgd_release(res); + } + else { + array_init(return_value); + add_assoc_long(return_value,"total",0); + } +} + +MGD_FUNCTION(count_events_in_period) +{ + midgard_res *res; + zval **startn, **endn, **uidn, **typen; + const char *table=EVENT_COUNT_TABLE; + char *where; + midgard_pool *pool=NULL; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 4: + if (zend_get_parameters_ex(4, &startn, &endn, &uidn, &typen) == SUCCESS) { + convert_to_long_ex(startn); + convert_to_long_ex(endn); + convert_to_long_ex(uidn); + convert_to_long_ex(typen); + pool=mgd_alloc_pool(); + if((*uidn)->value.lval<=0) + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_43, + (*startn)->value.lval,(*endn)->value.lval, + (*typen)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + else { + table=EVENT_COUNT_TABLE_2; + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_4, + (*startn)->value.lval,(*endn)->value.lval, + +(*uidn)->value.lval,(*typen)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + +,mgd_sitegroup(mgd_handle()),mgd_sitegroup(mgd_handle()) +#endif + ); + } + break; + } + case 3: + if (zend_get_parameters_ex(3, &startn, &endn, &uidn) == SUCCESS) { + convert_to_long_ex(startn); + convert_to_long_ex(endn); + convert_to_long_ex(uidn); + pool=mgd_alloc_pool(); + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_3, + (*startn)->value.lval,(*endn)->value.lval, + (*uidn)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + break; + } + case 2: + if (zend_get_parameters_ex(2, &startn, &endn) == SUCCESS) { + convert_to_long_ex(startn); + convert_to_long_ex(endn); + pool=mgd_alloc_pool(); + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_2, + (*startn)->value.lval,(*endn)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + break; + } + case 1: + if (zend_get_parameters_ex(1, &endn) == SUCCESS) { + convert_to_long_ex(endn); + pool=mgd_alloc_pool(); + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_1, + (*endn)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + break; + } + case 0: + pool=mgd_alloc_pool(); +#if HAVE_MIDGARD_SITEGROUPS + where=mgd_format(mgd_handle(),pool,EVENT_COUNT_WHERE_0, + mgd_sitegroup(mgd_handle())); +#else + where=EVENT_COUNT_WHERE_0; +#endif + break; + default: + WRONG_PARAM_COUNT; + } + res = mgd_query(mgd_handle(),"SELECT count(*) FROM $s WHERE $s", + table, where); + if(res && mgd_fetch(res)) { + RETVAL_LONG(mgd_sql2int(res,0)); + mgd_release(res); + } + if(pool!=NULL) + mgd_free_pool(pool); +} + +MGD_FUNCTION(count_events_in_month) +{ + zval **monthn, **yearn, **typen; + char *where; + midgard_pool *pool=NULL; + struct tm start,end; + time_t tsstart,tsend; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 3: + if (zend_get_parameters_ex(3, &monthn, &yearn, &typen) == SUCCESS) { + convert_to_long_ex(monthn); + convert_to_long_ex(yearn); + convert_to_long_ex(typen); + break; + } + case 2: + if (zend_get_parameters_ex(2, &monthn, &yearn) == SUCCESS) { + convert_to_long_ex(monthn); + convert_to_long_ex(yearn); + break; + } + default: + WRONG_PARAM_COUNT; + } + start.tm_year=end.tm_year=(*yearn)->value.lval-1900; + start.tm_mon=(*monthn)->value.lval-1; end.tm_mon=(*monthn)->value.lval; + start.tm_mday=end.tm_mday=1; + start.tm_hour=end.tm_hour=0; + start.tm_min=end.tm_min=0; + start.tm_sec=0; end.tm_sec=-1; + tsstart=mktime(&start); + tsend=mktime(&end); + memcpy((void *)&end,(void *)localtime(&tsend),sizeof(end)); + pool=mgd_alloc_pool(); + if(ZEND_NUM_ARGS()==3) { + where=mgd_format(mgd_handle(),pool,EVENT_MONTH_WHERE_TYPE, + tsstart,tsend, + tsstart,tsend, + tsstart,tsend, + (*typen)->value.lval +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + } else { + where=mgd_format(mgd_handle(),pool,EVENT_MONTH_WHERE, + tsstart,tsend, + tsstart,tsend, + tsstart,tsend +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + } + php_midgard_select_count_event_in_month(return_value, + "event", where, &start, &end); + if(pool!=NULL) + mgd_free_pool(pool); +} + +MGD_FUNCTION(copy_event) +{ + zval **id, **root; int id_r; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &root) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + convert_to_long_ex(root); + +#if HAVE_MIDGARD_SITEGROUPS + /* root must be in same SG or be 0 */ + if ((*root)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "event src, +event tgt", + +"src.id=$d AND tgt.id=$d" + " AND +(src.sitegroup=tgt.sitegroup" + + " OR src.sitegroup=0" + + " OR tgt.sitegroup=0)", + +(*id)->value.lval,(*root)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + id_r = mgd_copy_event(mgd_handle(), (*id)->value.lval); + if(id_r) { + php_midgard_update(return_value, "event", "up=$i", id_r, (*root)->value.lval); + PHP_UPDATE_REPLIGARD("event",id_r); + } +} + +MGD_MOVE_FUNCTION(event,event,event,up); + +MidgardProperty MidgardEventProperties [] = { + { IS_LONG, "up" }, + { IS_LONG, "start" }, + { IS_LONG, "end" }, + { IS_STRING, "title" }, + { IS_STRING, "description" }, + { IS_LONG, "type" }, + { IS_STRING, "extra" }, + { IS_LONG, "owner" }, + { IS_LONG, "busy" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardEvent, event) Index: php4/ext/midgard/eventmember.c diff -u /dev/null php4/ext/midgard/eventmember.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/eventmember.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,293 @@ +/* $Id: eventmember.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +int event_collides(int first, int second) +{ + midgard_res *res; + int s1,s2,e1,e2; + const char query[]="SELECT start,end FROM event WHERE id=$d AND busy=1"; + + if((res = mgd_query(mgd_handle(),query,first)) && mgd_fetch(res)) + { + s1=mgd_sql2int(res, 0); + e1=mgd_sql2int(res, 1); + } + else + return 0; + mgd_release(res); + + if((res = mgd_query(mgd_handle(),query,second)) && mgd_fetch(res)) + { + s2=mgd_sql2int(res, 0); + e2=mgd_sql2int(res, 1); + } + else + return 0; + mgd_release(res); + + if(s1>=e2 || e1<=s2) + return 0; + else + return 1; +} + +MGD_FUNCTION(create_event_member) +{ + midgard_res *res; + const char query[] = "SELECT eid FROM eventmember WHERE uid=$d"; + zval **eid, **uid, **extra, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "eid", eid) + || !MGD_PROPFIND(self, "uid", uid) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &eid, &uid, &extra) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(eid); + convert_to_long_ex(uid); + convert_to_string_ex(extra); + + /* event must exist and be in the same sitegroup as the current sitegroup + */ + if (!mgd_exists_id(mgd_handle(), "event", "id=$d", (*eid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + /* person must exist and be in the same sitegroup as the current sitegroup + */ + if (!mgd_exists_id(mgd_handle(), "person", "id=$d", (*uid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (!iseventowner((*eid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + /* check collision if event is marked as busy */ + if (mgd_exists_id + (mgd_handle(), "event", "id=$d AND busy=1", (*eid)->value.lval)) { + if ((res = mgd_query(mgd_handle(), query, (*uid)->value.lval))) { + while (mgd_fetch(res)) { + if (event_collides + ((*eid)->value.lval, mgd_sql2int(res, 0))) { + mgd_release(res); + RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); + } + } + mgd_release(res); + } + } + php_midgard_create(return_value, "eventmember", "eid,uid,extra", + "$d,$d,$q", (*eid)->value.lval, + (*uid)->value.lval, (*extra)->value.str.val); + + PHP_CREATE_REPLIGARD("eventmember", return_value->value.lval); +} + +MGD_FUNCTION(update_event_member) +{ + zval **id, **extra, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &extra) == FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(extra); + + /* event member must exist and be in the same sitegroup as the current +sitegroup + */ + if (!mgd_exists_id(mgd_handle(), "eventmember", "id=$d", (*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (!iseventowner + (mgd_idfield(mgd_handle(), "eid", "eventmember", (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "eventmember", + "extra=$q", (*id)->value.lval, (*extra)->value.str.val); + PHP_UPDATE_REPLIGARD("eventmember", (*id)->value.lval); +} + +MGD_FUNCTION(delete_event_member) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"eventmember")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if(!iseventowner(mgd_idfield(mgd_handle(), "eid", "eventmember", id)) && +mgd_user(mgd_handle())!=mgd_idfield(mgd_handle(), "uid", "eventmember", id)) +RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "eventmember", id); + PHP_DELETE_REPLIGARD("eventmember", id); +} + +MGD_FUNCTION(get_event_member) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardEventMember); + mgd_object_init(return_value, "eid", "uid", "extra", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardEventMember, return_value, "id,eid,uid,extra", + "eventmember", (*id)->value.lval); +} + +static const char *eventmember_sort(const char *order) +{ + static struct { const char *order, *sort; } sort[] = { + { "username", "username ASC" }, + { "reverse username", "username DESC" }, + { "reverse rname", "rname DESC" }, + { "name", "name ASC" }, + { "reverse name", "name DESC" }, + { NULL, "rname ASC" } + }; + int i; + + for (i = 0; sort[i].order; i++) + if (strcmp(order, sort[i].order) == 0) + return sort[i].sort; + + return sort[i].sort; +} + + +MGD_FUNCTION(list_event_members) +{ + const char *sortv; + zval **id, **sortn; + char *query; + midgard_pool *pool; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = eventmember_sort((*sortn)->value.str.val); + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "rname"; + break; + } + default: + WRONG_PARAM_COUNT; + } + + if (mgd_isadmin(mgd_handle())) { + php_midgard_select(&MidgardEventMember, return_value, + "eventmember.id AS +id,eid,uid,eventmember.extra" + ", " EMAIL_FIELDS ", " NAME_FIELDS + , "eventmember,person", + "eid=$d AND person.id=eventmember.uid", + sortv, (*id)->value.lval); + } + else { + pool=mgd_alloc_pool(); + query=mgd_format(mgd_handle(),pool, + "eventmember.id AS id,eid,uid,eventmember.extra" + ", " NAME_FIELDS ", " EVENT_PUBLIC_FIELD(16,email) + ", " EVENT_EMAIL_FIELD + ,mgd_user(mgd_handle()), mgd_user(mgd_handle())); + php_midgard_select(&MidgardEventMember, return_value, query, +"eventmember,person", + "eid=$d AND person.id=eventmember.uid", + sortv, (*id)->value.lval); + + } +} + +MGD_FUNCTION(count_event_members) +{ + midgard_res *res; + + IDINIT; + CHECK_MGD; + + RETVAL_FALSE; + + res = mgd_query(mgd_handle(),"SELECT count(*) FROM $s WHERE eid=$d" + EVENT_SITEGROUP, "eventmember" , id +#if HAVE_MIDGARD_SITEGROUPS + ,mgd_sitegroup(mgd_handle()) +#endif + ); + if(res && mgd_fetch(res)) { + RETVAL_LONG(mgd_sql2int(res,0)); + mgd_release(res); + } +} + +/* end calendar functions */ + +MidgardProperty MidgardEventMemberProperties [] = { + { IS_LONG, "eid" }, + { IS_LONG, "uid" }, + { IS_STRING, "extra" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardEventMember, event_member) Index: php4/ext/midgard/file.c diff -u /dev/null php4/ext/midgard/file.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/file.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,165 @@ +/* $Id: file.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_files) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardFile, return_value, +"id,article,type,name,content,size,md5", "file", "article=$d", "name", id); +} + +MGD_FUNCTION(get_file) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardFile); + mgd_object_init(return_value, "article", "type", "name", "content", "size", +"md5", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardFile, return_value, +"id,article,type,name,content,size,md5", "file", (*id)->value.lval); +} + +MGD_FUNCTION(create_file) +{ + zval **article, **type, **name, **content, **size, **md5, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "article", article) + || !MGD_PROPFIND(self, "type", type) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "content", content) + || !MGD_PROPFIND(self, "size", size) + || !MGD_PROPFIND(self, "md5", md5) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 6 + || zend_get_parameters_ex(6, &article, &type, &name, + &content, &size, &md5) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(article); + convert_to_string_ex(type); + convert_to_string_ex(name); + convert_to_string_ex(content); + convert_to_long_ex(size); + convert_to_string_ex(md5); + + if (!isarticleowner((*article)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* article must be in same SG */ + if (!mgd_exists_id(mgd_handle(), "article", "id=$d", + +(*article)->value.lval)) RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "file", + "article,type,name,content,size,md5", + "$d,$q,$q,$q,$d,$q", (*article)->value.lval, + (*type)->value.str.val, (*name)->value.str.val, + (*content)->value.str.val, (*size)->value.lval, + (*md5)->value.str.val); + + PHP_CREATE_REPLIGARD("file", return_value->value.lval); +} + +MGD_FUNCTION(update_file) +{ + zval **id, **type, **name, **content, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "type", type) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "content", content) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, + &id, &type, &name, &content) != +SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(type); + convert_to_string_ex(name); + convert_to_string_ex(content); + + if (!isarticleowner(mgd_idfield(mgd_handle(), "article", "file", + +(*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "file", "type=$q,name=$q,content=$q", + (*id)->value.lval, (*type)->value.str.val, + (*name)->value.str.val, (*content)->value.str.val); + PHP_UPDATE_REPLIGARD("file",(*id)->value.lval); +} + +MGD_FUNCTION(delete_file) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"file")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isarticleowner(mgd_idfield(mgd_handle(), "article", "file", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "file", id); + PHP_DELETE_REPLIGARD("file", id); +} + +MidgardProperty MidgardFileProperties [] = { + { IS_LONG, "article" }, + { IS_STRING, "name" }, + { IS_STRING, "type" }, + { IS_STRING, "content" }, + { IS_STRING, "md5" }, + { IS_LONG, "size" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardFile, file) Index: php4/ext/midgard/group.c diff -u /dev/null php4/ext/midgard/group.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/group.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,306 @@ +/* $Id: group.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_group_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(isgroupowner(id)); +} + +MGD_FUNCTION(list_groups) +{ + zval **id; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_select(&MidgardGroup, return_value, + "id,name,official", "grp", NULL, "name"); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + if((*id)->value.lval && !mgd_exists_id(mgd_handle(), "grp", "id=$d", +(*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + php_midgard_select(&MidgardGroup, return_value, "id,name,official", "grp", +"owner=$d", "name",(*id)->value.lval); +} + +MGD_FUNCTION(get_group) +{ + zval **id; + CHECK_MGD; + + RETVAL_FALSE; + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardGroup); + mgd_object_init(return_value, "name", "official", "street", "postcode", "city", +"homepage", "email", "extra", "owner", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardGroup, return_value, "id,name,official," ADDRESS_FIELDS +"," + GROUP_HOMEPAGE_FIELDS "," GROUP_EMAIL_FIELDS +"," + "extra,owner", "grp", (*id)->value.lval); +} + +MGD_FUNCTION(get_group_by_name) +{ + zval **id, **name; + int gid=0; + CHECK_MGD; + + RETVAL_FALSE; + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardGroup); + mgd_object_init(return_value, "name", "official", "street", + "postcode", "city", "homepage", "email", + "extra", "owner", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &name) == SUCCESS) { + convert_to_string_ex(name); + +if(!(gid=mgd_exists_id(mgd_handle(),"grp","name=$q",(*name)->value.str.val))) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + php_midgard_get(&MidgardGroup, return_value, "id,name,official," +ADDRESS_FIELDS "," + GROUP_HOMEPAGE_FIELDS "," GROUP_EMAIL_FIELDS +"," + "extra,owner", "grp", gid); + break; + } + case 2: + if (zend_get_parameters_ex(2, &id, &name) == SUCCESS) { + convert_to_long_ex(id); + gid=(*id)->value.lval; + convert_to_string_ex(name); + php_midgard_get_by_name(&MidgardGroup, return_value, "id,name,official," + ADDRESS_FIELDS "," + GROUP_HOMEPAGE_FIELDS "," GROUP_EMAIL_FIELDS +"," + "extra,owner", "grp", "owner", gid, +(*name)->value.str.val); + +gid=mgd_exists_id(mgd_handle(),"grp","name=$q",(*name)->value.str.val); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } +} + +MGD_FUNCTION(create_group) +{ + zval **name, **official, **street, **postcode, **city; + zval **homepage, **email, **extra, **owner; + zval *self = NULL; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "official", official) + || !MGD_PROPFIND(self, "street", street) + || !MGD_PROPFIND(self, "postcode", postcode) + || !MGD_PROPFIND(self, "city", city) + || !MGD_PROPFIND(self, "homepage", homepage) + || !MGD_PROPFIND(self, "email", email) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 9 + || zend_get_parameters_ex(9, &name, &official, &street, + &postcode, &city, &homepage, &email, + &extra, &owner) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(name); + convert_to_string_ex(official); + convert_to_string_ex(street); + convert_to_string_ex(postcode); + convert_to_string_ex(city); + convert_to_string_ex(homepage); + convert_to_string_ex(email); + convert_to_string_ex(extra); + convert_to_long_ex(owner); + +#if HAVE_MIDGARD_SITEGROUPS +// Creating a group in SG0 is needed in Asgard to avoid reloging twice +// Note: creating a group in SG0 is absolutely useless outside of Asgard. +// if (mgd_sitegroup(mgd_handle()) == 0) +// RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + if (!isgroupowner((*owner)->value.lval) + || mgd_exists_id(mgd_handle(), "grp", "name=$q", + (*name)->value.str. + val)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_create(return_value, "grp", + "name,official,street,postcode,city," + "homepage,email,extra,owner", + "$q,$q,$q,$q,$q,$q,$q,$q,$d", (*name)->value.str.val, + (*official)->value.str.val, (*street)->value.str.val, + (*postcode)->value.str.val, (*city)->value.str.val, + (*homepage)->value.str.val, (*email)->value.str.val, + (*extra)->value.str.val, (*owner)->value.lval); + + PHP_CREATE_REPLIGARD("grp", return_value->value.lval); +} + +MGD_FUNCTION(update_group) +{ + zval **gid, **name, **official, **street, **postcode, **city; + zval **homepage, **email, **extra, **owner; + zval *self = NULL; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", gid) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "official", official) + || !MGD_PROPFIND(self, "street", street) + || !MGD_PROPFIND(self, "postcode", postcode) + || !MGD_PROPFIND(self, "city", city) + || !MGD_PROPFIND(self, "homepage", homepage) + || !MGD_PROPFIND(self, "email", email) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 10 + || zend_get_parameters_ex(10, &gid, &name, &official, &street, + &postcode, &city, &homepage, &email, + &extra, &owner) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(gid); + convert_to_string_ex(name); + convert_to_string_ex(official); + convert_to_string_ex(street); + convert_to_string_ex(postcode); + convert_to_string_ex(city); + convert_to_string_ex(homepage); + convert_to_string_ex(email); + convert_to_string_ex(extra); + convert_to_long_ex(owner); + + if (!isgroupowner((*gid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "grp", + "name=$q,official=$q,street=$q,postcode=$q,city=$q," + "homepage=$q,email=$q,extra=$q,owner=$d", + (*gid)->value.lval, + (*name)->value.str.val, (*official)->value.str.val, + (*street)->value.str.val, (*postcode)->value.str.val, + (*city)->value.str.val, (*homepage)->value.str.val, + (*email)->value.str.val, (*extra)->value.str.val, + (*owner)->value.lval); + PHP_UPDATE_REPLIGARD("grp", (*gid)->value.lval); +} + +MGD_FUNCTION(delete_group) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"group")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if(mgd_global_exists(mgd_handle(), "owner=$d", id) + || mgd_exists_id(mgd_handle(), "member", "gid=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isgroupowner(id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "grp", id); + PHP_DELETE_REPLIGARD("grp", id); +} + +MidgardProperty MidgardGroupProperties [] = { + { IS_LONG, "owner" }, + { IS_STRING, "name" }, + { IS_STRING, "official" }, + { IS_STRING, "street" }, + { IS_STRING, "postcode" }, + { IS_STRING, "city" }, + { IS_STRING, "email" }, + { IS_STRING, "homepage" }, + { IS_STRING, "extra" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(group) +static zend_function_entry MidgardGroupMethods[] = + { + PHP_FALIAS(midgardgroup, mgd_ctor_group, NULL) + PHP_FALIAS(create, mgd_create_group, NULL) + PHP_FALIAS(update, mgd_update_group, NULL) + PHP_FALIAS(delete, mgd_delete_group, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + MIDGARD_OOP_ATTACHMENT_METHODS + MIDGARD_OOP_SITEGROUP_METHODS + MIDGARD_OOP_PARAMETER_METHODS + {NULL, NULL, NULL} + }; +MidgardClass MidgardGroup = { + "MidgardGroup", + "grp", + MidgardGroupMethods, + {}, + mgd_group_call_function_handler, + mgd_group_get_property_handler, + mgd_group_set_property_handler, + MidgardGroupProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardGroup, group) Index: php4/ext/midgard/host.c diff -u /dev/null php4/ext/midgard/host.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/host.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,366 @@ +/* $Id: host.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_host_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(ishostowner(id)); +} + +MGD_FUNCTION(list_hosts) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_select(&MidgardHost, return_value, + "id,name,port,online,root,style,owner,info&1 AS auth,prefix," +HOSTNAME_FIELD, + "host", NULL, "hostname, online DESC"); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + php_midgard_select(&MidgardHost, return_value, + "id,name,port,online,root,style,owner,info&1 AS +auth,prefix," HOSTNAME_FIELD , + "host", "root=$d", "hostname, online DESC", +(*id)->value.lval); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } +} + +MGD_FUNCTION(get_host) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardHost); + mgd_object_init(return_value, "name", "port", "online", "root", "style", +"auth", "owner", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardHost, return_value, + "id,name,port,online,root,style,info&1 AS +auth,owner,prefix," HOSTNAME_FIELD, + "host", (*id)->value.lval); +} + +MGD_FUNCTION(get_host_by_name) +{ + zval **name, **prefix; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &name, &prefix) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(name); + convert_to_string_ex(prefix); + + php_midgard_get_by_name2(&MidgardHost, return_value, + "id,name,port,online,root,style,info&1 AS auth,owner,prefix," +HOSTNAME_FIELD, + "host", "name", (*name)->value.str.val, + "prefix", (*prefix)->value.str.val); +} + +MGD_FUNCTION(create_host) +{ + zval **name, **port, **online, **root, **style, **auth, **owner, **prefix, +*self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "port", port) + || !MGD_PROPFIND(self, "online", online) + || !MGD_PROPFIND(self, "root", root) + || !MGD_PROPFIND(self, "style", style) + || !MGD_PROPFIND(self, "auth", auth) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + if (!MGD_PROPFIND(self, "prefix", prefix)) + prefix = NULL; + } + else { + switch (ZEND_NUM_ARGS()) { + case 7: + if (zend_get_parameters_ex + (7, &name, &port, &online, &root, + &style, &auth, &owner) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + prefix = NULL; + break; + case 8: + if (zend_get_parameters_ex + (8, &name, &port, &online, &root, + &style, &auth, &owner, &prefix) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + break; + default: + WRONG_PARAM_COUNT; + } + } + if (prefix) + convert_to_string_ex(prefix); + convert_to_string_ex(name); + convert_to_long_ex(port); + convert_to_long_ex(online); + convert_to_long_ex(root); + convert_to_long_ex(style); + convert_to_long_ex(auth); + convert_to_long_ex(owner); + +#if HAVE_MIDGARD_SITEGROUPS + if (!mgd_isroot(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); +#else + if (!mgd_isadmin(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); +#endif + +#if HAVE_MIDGARD_SITEGROUPS + /* root must be in same SG or be 0 */ + if ((*root)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "page", + "id=$d", + (*root)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* style must be in same SG or be 0 */ + if ((*style)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "style", + "id=$d", + (*style)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* style must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d", + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "host", + "name,port,online,root,style,info,owner,prefix", + "$q,$d,$d,$d,$d,$d,$d,$q", (*name)->value.str.val, + (*port)->value.lval, (*online)->value.lval == 1, + (*root)->value.lval, (*style)->value.lval, + (*auth)->value.lval == 1, (*owner)->value.lval, + prefix ? (*prefix)->value.str.val : ""); + + PHP_CREATE_REPLIGARD("host", return_value->value.lval); +} + +MGD_FUNCTION(update_host) +{ + zval **id, **name, **port, **online, **root, **style, **auth, **owner, +**prefix, *self; + + midgard_pool *pool = NULL; + char *prefix_sql = ""; + char *name_port_sql = ""; + +#if HAVE_MIDGARD_SITEGROUPS + int xref_ok = 1; +#endif + + RETVAL_FALSE; + CHECK_MGD; + + if (!(pool = mgd_alloc_pool())) + RETURN_FALSE_BECAUSE(MGD_ERR_NO_MEM); + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "port", port) + || !MGD_PROPFIND(self, "online", online) + || !MGD_PROPFIND(self, "root", root) + || !MGD_PROPFIND(self, "style", style) + || !MGD_PROPFIND(self, "auth", auth) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + + if ( +#if HAVE_MIDGARD_SITEGROUPS + !mgd_isroot(mgd_handle()) || +#endif + !MGD_PROPFIND(self, "prefix", prefix)) + prefix = NULL; + } + else { + switch (ZEND_NUM_ARGS()) { + case 8: + if (zend_get_parameters_ex + (8, &id, &name, &port, &online, &root, + &style, &auth, &owner) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + prefix = NULL; + break; + case 9: + if (zend_get_parameters_ex + (9, &id, &name, &port, &online, &root, + &style, &auth, &owner, &prefix) != SUCCESS) { + WRONG_PARAM_COUNT; + } + +#if HAVE_MIDGARD_SITEGROUPS + if (mgd_isroot(mgd_handle())) { + convert_to_string_ex(prefix); + } else + prefix = NULL; +#endif + break; + default: + WRONG_PARAM_COUNT; + } + } + + if (prefix) convert_to_string_ex(prefix); + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_long_ex(port); + convert_to_long_ex(online); + convert_to_long_ex(root); + convert_to_long_ex(style); + convert_to_long_ex(auth); + convert_to_long_ex(owner); + + if (!ishostowner((*id)->value.lval)) { + mgd_free_pool(pool); + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (prefix != NULL) + prefix_sql = + mgd_format(mgd_handle(), pool, ",prefix=$q", + (*prefix)->value.str.val); + +#if HAVE_MIDGARD_SITEGROUPS + if (mgd_isroot(mgd_handle())) + name_port_sql = + mgd_format(mgd_handle(), pool, ",name=$q,port=$d", + (*name)->value.str.val, (*port)->value.lval); +#else + name_port_sql = + mgd_format(mgd_handle(), pool, ",name=$q,port=$d", + (*name)->value.str.val, (*port)->value.lval); +#endif + +#if HAVE_MIDGARD_SITEGROUPS + /* root must be in same SG or be 0 */ + if ((*root)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "host,page", + "host.id=$d AND page.id=$d" + " AND +(host.sitegroup=page.sitegroup" + " OR host.sitegroup=0" + " OR page.sitegroup=0)", + (*id)->value.lval, + (*root)->value.lval)) xref_ok = +0; + /* style must be in same SG or be 0 */ + if ((*style)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "host,style", + "host.id=$d AND style.id=$d" + " AND (host.sitegroup=style.sitegroup" + " OR host.sitegroup=0" " OR style.sitegroup=0)", + (*id)->value.lval, (*style)->value.lval)) + xref_ok = 0; + /* owner must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "host,grp", + "host.id=$d AND grp.id=$d" + " AND +(host.sitegroup=grp.sitegroup" + " OR host.sitegroup=0" + " OR grp.sitegroup=0)", + (*id)->value.lval, + (*owner)->value.lval)) xref_ok += 0; + + if (!xref_ok) { + mgd_free_pool(pool); + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + php_midgard_update(return_value, "host", + "online=$d,root=$d," + "style=$d,info=$d,owner=$d $s $s", + (*id)->value.lval, + (*online)->value.lval == 1, + (*root)->value.lval, (*style)->value.lval, + (*auth)->value.lval == 1, (*owner)->value.lval, + prefix_sql, name_port_sql); + PHP_UPDATE_REPLIGARD("host", (*id)->value.lval); + mgd_free_pool(pool); +} + +MGD_FUNCTION(delete_host) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"host")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + +#if HAVE_MIDGARD_SITEGROUPS + if (!mgd_isroot(mgd_handle())) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); +#else + if (!ishostowner(id)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); +#endif + php_midgard_delete(return_value, "host", id); + PHP_DELETE_REPLIGARD("host", id); +} + +MidgardProperty MidgardHostProperties [] = { + { IS_STRING, "name" }, + { IS_LONG, "port" }, + { IS_STRING, "prefix" }, + { IS_LONG, "online" }, + { IS_LONG, "root" }, + { IS_LONG, "style" }, + { IS_LONG, "owner" }, + { IS_LONG, "auth" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardHost, host) Index: php4/ext/midgard/image.c diff -u /dev/null php4/ext/midgard/image.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/image.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,202 @@ +/* $Id: image.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_images) +{ + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 0) + WRONG_PARAM_COUNT; + php_midgard_select(&MidgardImage, return_value, "id,src,x,y,info&1 AS online", + "image", NULL, NULL); +} + +#if 0 +MGD_FUNCTION(html_image) +{ + php_midgard_res *res; + zval **id, **extra, eextra; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &extra) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_string_ex(extra); + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + extra = &eextra; + (*extra)->value.str.val = ""; + break; + default: + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + + res = mgd_query(midgard.mgd, + "SELECT src,x,y,info&1 FROM image WHERE id=$d", + (*id)->value.lval); + if (res) { + if (mgd_fetch(res) && mgd_sql2int(res, 3) == 0) { + PUTS("<img src=\"/img/"); + PUTS(mgd_sql2str(res, 0)); + PUTS("\" "); + PUTS((*extra)->value.str.val); + PUTS(" width=\""); + PUTS(mgd_sql2str(res, 1)); + PUTS("\" height=\""); + PUTS(mgd_sql2str(res, 2)); + PUTS("\">"); + PUTS("\" height=\""); + RETVAL_TRUE; + } + mgd_release(res); + } +} +#endif + +MGD_FUNCTION(get_image) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardImage); + mgd_object_init(return_value, "src", "x", "y", "offline", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardImage, return_value, + "id,src,x,y,info&1=1 AS offline," + "If(info&1,Concat('<img src=\"/img/',src," + "'\" width=\"',x,'\" height=\"',y,'\">'),'') AS img", + "image", (*id)->value.lval); +} + + +MGD_FUNCTION(create_image) +{ + zval **src, **x, **y, **offline, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "src", src) + || !MGD_PROPFIND(self, "x", x) + || !MGD_PROPFIND(self, "y", y) + || !MGD_PROPFIND(self, "offline", offline) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &src, &x, &y, &offline) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(src); + convert_to_long_ex(x); + convert_to_long_ex(y); + convert_to_long_ex(offline); + + php_midgard_create(return_value, "image", "src,x,y,info", "$q,$d,$d,$d", + (*src)->value.str.val, (*x)->value.lval, (*y)->value.lval, + (*offline)->value.lval == 1); + + PHP_CREATE_REPLIGARD("image", return_value->value.lval); +} + +MGD_FUNCTION(update_image) +{ + zval **id, **src, **x, **y, **offline, *self; + + RETVAL_FALSE; + CHECK_MGD; + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "src", src) + || !MGD_PROPFIND(self, "x", x) + || !MGD_PROPFIND(self, "y", y) + || !MGD_PROPFIND(self, "offline", offline) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 5 + || zend_get_parameters_ex(5, &id, &src, &x, &y, + &offline) != SUCCESS) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(src); + convert_to_long_ex(x); + convert_to_long_ex(y); + convert_to_long_ex(offline); + + php_midgard_update(return_value, "image", "src=$q,x=$d,y=$d,info=$d", + (*id)->value.lval, + (*src)->value.str.val, (*x)->value.lval, (*y)->value.lval, + (*offline)->value.lval == 1); + PHP_UPDATE_REPLIGARD("image", (*id)->value.lval); +} + +MGD_FUNCTION(delete_image) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"image")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + php_midgard_delete(return_value, "image", id); + PHP_DELETE_REPLIGARD("image", id); +} + +MidgardProperty MidgardImageProperties [] = { + { IS_STRING, "src" }, + { IS_LONG, "x" }, + { IS_LONG, "y" }, + { IS_LONG, "online" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardImage, image) Index: php4/ext/midgard/mail.c diff -u /dev/null php4/ext/midgard/mail.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mail.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,177 @@ +/* $Id: mail.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include <stdio.h> +#include <Zend/zend_API.h> +#include <midgard.h> +#include <mgd_internal.h> +#include <php_ini.h> + +static void q_encode(FILE * out, const char *in, const char *encoding) +{ + unsigned char ch; + int i, n = 0, encode = 0; + + for (i = 0; (ch=in[i]); i++) + if (ch > 127 || ch < 32) + encode = 1; + if (!encode) { + fprintf(out, "%s", in); + return; + } + + fprintf(out, "=?%s?Q?", encoding); + for (; (ch = *in); in++) { + switch (ch) { + case ' ': + putc('_', out); + n += 1; + break; + case '=': + case '?': + case '_': + fprintf(out, "=%.2X", ch); + n += 3; + break; + default: + if (ch > 127 || ch < 32) { + fprintf(out, "=%2X", ch); + n += 3; + } + else { + putc(ch, out); + n += 1; + } + break; + } + } + fprintf(out, "?="); +} + +static void qp_encode(FILE * out, const char *in) +{ + unsigned char ch, ws = '\0'; + int n = 0; + + for (; (ch = *in); in++) { + switch (ch) { + case ' ': + case '\t': + if (ws) { + putc(ws, out); + n += 1; + } + ws = ch; + break; + case '\r': + case '\n': + if (ws) { + fprintf(out, "=%.2X", ws); + ws = '\0'; + } + putc(ch, out); + n = 0; + break; + default: + if (ws) { + putc(ws, out); + n += 1; + ws = '\0'; + } + if (ch > 127 || ch < 32 || ch == '=') { + fprintf(out, "=%2X", ch); + n += 3; + } + else { + putc(ch, out); + n += 1; + } + break; + } + if (n > 71) { + if (ws) { + putc(ws, out); + ws = '\0'; + } + fprintf(out, "=\n"); + n = 0; + } + } +} + +MGD_FUNCTION(create_mail) +{ + zval **from, **to, **subject, **message; + FILE *sendmail; + midgard_pool *pool; + char *header; + char *sendmail_path = INI_STR("sendmail_path"); + + RETVAL_FALSE; + CHECK_MGD; + + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &from, &to, &subject, &message) != SUCCESS) + { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(from); + convert_to_string_ex(to); + convert_to_string_ex(subject); + convert_to_string_ex(message); + + if (!sendmail_path) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + sendmail = popen(sendmail_path, "w"); + if (sendmail) { + pool = mgd_alloc_pool(); + header = mgd_format(mgd_handle(), pool, + "From: $s\nTo: $s\n", (*from)->value.str.val, + (*to)->value.str.val); + fprintf(sendmail, header); + fprintf(sendmail, "Subject: "); + q_encode(sendmail, (*subject)->value.str.val, + mgd_get_encoding(mgd_handle())); + header = + mgd_format(mgd_handle(), pool, + "\nX-Mailer: Midgard $s\nMIME-Version: 1.0\n" + "Content-Type: text/plain; charset=$s\n", + mgd_version(mgd_handle()), + mgd_get_encoding(mgd_handle())); + fprintf(sendmail, header); + mgd_free_pool(pool); + if (mgd_mail_need_qp(mgd_handle())) { + fprintf(sendmail, + "Content-Transfer-Encoding: quoted-printable\n\n"); + qp_encode(sendmail, (*message)->value.str.val); + } + else { + fprintf(sendmail, "\n%s", (*message)->value.str.val); + } + putc('\n', sendmail); + if (pclose(sendmail) != -1) + RETVAL_TRUE; + } + else + zend_error(E_WARNING, + "Could not execute mail delivery program"); +} + Index: php4/ext/midgard/member.c diff -u /dev/null php4/ext/midgard/member.c:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/member.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,202 @@ +/* $Id: member.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_members) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardMember, return_value, "member.id AS id, person.id AS +uid," + NAME_FIELD " AS name," RNAME_FIELD " AS rname,department," + "member.extra as extra", + "person,member", "member.gid=$d AND member.uid=person.id", + "lastname,firstname", id); +} + +MGD_FUNCTION(list_memberships) +{ + IDINIT; + CHECK_MGD; + if (!isuserowner(id)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_select(&MidgardMember, return_value, + "distinct member.id AS id, gid, " + "IF(gid!=0,name,'Midgard Administrators') AS +name", + "grp,member", "member.uid=$d AND member.gid IN (0,grp.id)", + "name", id); +} + +MGD_FUNCTION(get_member) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardMember); + mgd_object_init(return_value, "uid", "gid", "extra", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + if (!isgroupowner(mgd_idfield(mgd_handle(), "gid", "member", (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_get(&MidgardMember, return_value, + "id,gid,uid,extra", "member", +(*id)->value.lval); +} + +MGD_FUNCTION(create_member) +{ + zval **uid, **gid, **extra, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "uid", uid) + || !MGD_PROPFIND(self, "gid", gid) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &uid, &gid, &extra) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(uid); + convert_to_long_ex(gid); + convert_to_string_ex(extra); + + if (!isgroupowner((*gid)->value.lval) + || mgd_exists_id(mgd_handle(), "member", "uid=$d AND gid=$d", + (*uid)->value.lval, (*gid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + if ((*gid)->value.lval == 0) { + /* only root can put users in root group */ + if (!mgd_isroot(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if (mgd_sitegroup(mgd_handle()) != 0) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + + /* person must exist and be in SG0 */ + if (!mgd_exists_bool(mgd_handle(), + "person", + "id=$d AND sitegroup=0", + (*uid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + else { + /* only root users in SG0 please */ + if (mgd_sitegroup(mgd_handle()) == 0) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + /* group must exist and be in the same sitegroup as the person and + the current sitegroup + */ + if (!mgd_exists_bool(mgd_handle(), + "person,grp", + "person.id=$d AND person.sitegroup=$d" + " AND grp.id=$d AND grp.sitegroup=$d", + (*uid)->value.lval, + mgd_sitegroup(mgd_handle()), + (*gid)->value.lval, + mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } +#endif + + php_midgard_create(return_value, "member", "uid,gid,extra", "$d,$d,$q", + (*uid)->value.lval, (*gid)->value.lval, + (*extra)->value.str.val); + + PHP_CREATE_REPLIGARD("member", return_value->value.lval); +} + +MGD_FUNCTION(update_member) +{ + zval **id, **extra, *self; + + RETVAL_FALSE; + CHECK_MGD; + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, + &extra) != SUCCESS) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(extra); + + if (!isgroupowner + (mgd_idfield(mgd_handle(), "gid", "member", (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "member", "extra=$q", (*id)->value.lval, + (*extra)->value.str.val); + PHP_UPDATE_REPLIGARD("member", (*id)->value.lval); +} + +MGD_FUNCTION(delete_member) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"member")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isgroupowner(mgd_idfield(mgd_handle(), "gid", "member", id))) +RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "member", id); + PHP_DELETE_REPLIGARD("member", id); +} + +MidgardProperty MidgardMemberProperties [] = { + { IS_LONG, "uid" }, + { IS_LONG, "gid" }, + { IS_STRING, "extra" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardMember, member) Index: php4/ext/midgard/mgd_access.h diff -u /dev/null php4/ext/midgard/mgd_access.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_access.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,43 @@ +/* $Id: mgd_access.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_ACCESS_H +#define MGD_ACCESS_H + +#include <midgard.h> + +#define istopicreader(topic) mgd_istopicreader(mgd_handle(), (topic)) +#define istopicowner(topic) mgd_istopicowner(mgd_handle(),(topic)) +#define issnippetdirowner(snippetdir) mgd_issnippetdirowner(mgd_handle(),(snippetdir)) +#define isgroupowner(group) mgd_isgroupowner(mgd_handle(),(group)) +#define isuserowner(user) mgd_isuserowner(mgd_handle(),(user)) +#define ispageelementowner(pageelement) +mgd_ispageelementowner(mgd_handle(),(pageelement)) +#define isarticlereader(article) mgd_isarticlereader(mgd_handle(),(article)) +#define isarticleowner(article) mgd_isarticleowner(mgd_handle(),(article)) +#define iseventowner(event) mgd_iseventowner(mgd_handle(),(event)) +#define ishostowner(host) mgd_ishostowner(mgd_handle(),(host)) +#define ispageowner(page) mgd_ispageowner(mgd_handle(),(page)) +#define isstyleowner(style) mgd_isstyleowner(mgd_handle(),(style)) +#define isglobalowner(table,id) mgd_global_is_owner(mgd_handle(),(table),(id)) +#if HAVE_MIDGARD_PAGELINKS +#define ispagelinkowner(pagelink) mgd_ispagelinkowner(mgd_handle(),(pagelink)) +#endif + +#endif Index: php4/ext/midgard/mgd_article.h diff -u /dev/null php4/ext/midgard/mgd_article.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_article.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,49 @@ +/* $Id: mgd_article.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_ARTICLE_H +#define MGD_ARTICLE_H + +extern MGD_FUNCTION(is_article_owner); +extern MGD_FUNCTION(is_article_in_topic_tree); +extern MGD_FUNCTION(list_topic_articles); +extern MGD_FUNCTION(list_reply_articles); +extern MGD_FUNCTION(list_topic_articles_all); +extern MGD_FUNCTION(list_topic_articles_all_fast); +extern MGD_FUNCTION(list_topic_articles_all_of_person); +extern MGD_FUNCTION(get_article); +extern MGD_FUNCTION(get_article_by_name); +extern MGD_FUNCTION(get_reply_by_name); +extern MGD_FUNCTION(create_article); +extern MGD_FUNCTION(update_article_score); +extern MGD_FUNCTION(update_article_created); +extern MGD_FUNCTION(update_article_replyto); +extern MGD_FUNCTION(update_article_type); +extern MGD_FUNCTION(toggle_article_lock); +extern MGD_FUNCTION(approve_article); +extern MGD_FUNCTION(update_article); +extern MGD_FUNCTION(delete_article); +extern MGD_FUNCTION(copy_article); +extern MGD_FUNCTION(move_article); +extern MGD_FUNCTION(copy_reply); +extern MGD_FUNCTION(move_reply); +extern MGD_FUNCTION(delete_article_tree); + +#endif Index: php4/ext/midgard/mgd_attachment.h diff -u /dev/null php4/ext/midgard/mgd_attachment.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_attachment.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,33 @@ +/* $Id: mgd_attachment.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_ATTACHMENT_H +#define MGD_ATTACHMENT_H + +extern MGD_FUNCTION(oop_attachment_create); +extern MGD_FUNCTION(oop_attachment_list); +extern MGD_FUNCTION(open_attachment); +extern MGD_FUNCTION(get_attachment); +extern MGD_FUNCTION(serve_attachment); +extern MGD_FUNCTION(stat_attachment); +extern MGD_FUNCTION(delete_attachment); +extern MGD_FUNCTION(update_attachment); + +#endif Index: php4/ext/midgard/mgd_calendar.h diff -u /dev/null php4/ext/midgard/mgd_calendar.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_calendar.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,27 @@ +/* $Id: mgd_calendar.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_CALENDAR_H +#define MGD_CALENDAR_H + +extern MGD_FUNCTION(list_topic_calendar_all); +extern MGD_FUNCTION(list_topic_calendar_all_fast); + +#endif Index: php4/ext/midgard/mgd_element.h diff -u /dev/null php4/ext/midgard/mgd_element.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_element.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,33 @@ +/* $Id: mgd_element.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_ELEMENT_H +#define MGD_ELEMENT_H + +extern MGD_FUNCTION(list_elements); +extern MGD_FUNCTION(get_element); +extern MGD_FUNCTION(get_element_by_name); +extern MGD_FUNCTION(create_element); +extern MGD_FUNCTION(update_element); +extern MGD_FUNCTION(delete_element); +extern MGD_FUNCTION(copy_element); +extern MGD_FUNCTION(move_element); + +#endif Index: php4/ext/midgard/mgd_errno.pl diff -u /dev/null php4/ext/midgard/mgd_errno.pl:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_errno.pl Sat Feb 17 15:21:50 2001 @@ -0,0 +1,96 @@ +#!/usr/bin/perl +#Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +#Copyright (C) 2000 The Midgard Project ry +#Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> +# +#This program is free software; you can redistribute it and/or modify it +#under the terms of the GNU Lesser General Public License as published +#by the Free Software Foundation; either version 2 of the License, or +#(at your option) any later version. +# +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. +# +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +$commonprefix = "MGD_ERR_"; + +$errcodes=<<EOERRS; + +OK +ERROR Error +ACCESS_DENIED Access denied +SITEGROUP_VIOLATION Resource link crosses sitegroup borders +NOT_OBJECT Object has no ID +NOT_EXISTS Object does not exist +NO_MEM Can't allocate memory +INVALID_NAME Username has invalid characters +DUPLICATE Name exists +HAS_DEPENDANTS Resource has dependants +RANGE Date range error +NOT_CONNECTED Not connected to the Midgard database +SG_NOTFOUND Sitegroup not found +INVALID_OBJECT Object doesn't have the expected set of properties + +INTERNAL Internal error + +EOERRS + +################################################################### + +($basename) = ($0 =~ /(.*)\.pl/); + +$basename || die "$0 must end in .pl\n"; + +open H, ">$basename.h"; +open C, ">$basename.c"; + +print H "#ifndef MGD_ERRNO_H\n#define MGD_ERRNO_H\n\n"; +print C "#include \"mgd_errno.h\"\n"; + +foreach (split(/\n/, $errcodes)) { + ($name, $comment) = /([A-Z][_A-Z0-9]*)\t+(.*)/; + if (!$name) { + ($name, $value) = /([A-Z][_A-Z0-9]*)/; + } + $name || next; + + $comment =~ s/"/\\"/; + + $name = "$commonprefix$name"; + + if (! $comment ) { $comment = $name; } + + push @names, $name; + $defines{$name} = -$#names; + $comments{$name} = $comment; +} + +foreach (@names) { + print H "#define $_ $defines{$_}\n"; +} +print H "\n"; + +print H "typedef struct { char *name; int value; } mgd_errno_codename_def;\n"; +print H "extern mgd_errno_codename_def mgd_errno_codename[];\n"; + +print C "mgd_errno_codename_def mgd_errno_codename[]= {\n"; +foreach (@names) { + print C "\t{\t\"$_\",\t$_\t},\n"; +} +print C "\t{\t(void*)0,\t0\t}\n};\n\n"; + +print H "char* mgd_errstr(int errcode);\n"; +print C "char* mgd_errstr(int errcode)\n{\n"; +print C "\tswitch (errcode) {\n"; +foreach (@names) { + print C "\t\tcase $_: return \"$comments{$_}\";\n"; +} +print C "\t}\n\n"; +print C "\treturn \"Unknow error code\";\n}\n"; + +print H "\n#endif\n"; Index: php4/ext/midgard/mgd_event.h diff -u /dev/null php4/ext/midgard/mgd_event.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_event.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,39 @@ +/* $Id: mgd_event.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_EVENT_H +#define MGD_EVENT_H + +extern MGD_FUNCTION(is_event_owner); +extern MGD_FUNCTION(create_event); +extern MGD_FUNCTION(update_event); +extern MGD_FUNCTION(delete_event); +extern MGD_FUNCTION(delete_event_tree); +extern MGD_FUNCTION(get_event); +extern MGD_FUNCTION(list_events); +extern MGD_FUNCTION(list_events_between); +extern MGD_FUNCTION(list_events_all); +extern MGD_FUNCTION(list_events_all_between); +extern MGD_FUNCTION(count_events_in_period); +extern MGD_FUNCTION(count_events_in_month); +extern MGD_FUNCTION(copy_event); +extern MGD_FUNCTION(move_event); + +#endif Index: php4/ext/midgard/mgd_eventmember.h diff -u /dev/null php4/ext/midgard/mgd_eventmember.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_eventmember.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,31 @@ +/* $Id: mgd_eventmember.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_EVENTMEMBER_H +#define MGD_EVENTMEMBER_H + +extern MGD_FUNCTION(create_event_member); +extern MGD_FUNCTION(update_event_member); +extern MGD_FUNCTION(delete_event_member); +extern MGD_FUNCTION(get_event_member); +extern MGD_FUNCTION(list_event_members); +extern MGD_FUNCTION(count_event_members); + +#endif Index: php4/ext/midgard/mgd_file.h diff -u /dev/null php4/ext/midgard/mgd_file.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_file.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,30 @@ +/* $Id: mgd_file.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_FILE_H +#define MGD_FILE_H + +extern MGD_FUNCTION(list_files); +extern MGD_FUNCTION(get_file); +extern MGD_FUNCTION(create_file); +extern MGD_FUNCTION(update_file); +extern MGD_FUNCTION(delete_file); + +#endif Index: php4/ext/midgard/mgd_group.h diff -u /dev/null php4/ext/midgard/mgd_group.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_group.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,32 @@ +/* $Id: mgd_group.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_GROUP_H +#define MGD_GROUP_H + +extern MGD_FUNCTION(is_group_owner); +extern MGD_FUNCTION(list_groups); +extern MGD_FUNCTION(get_group); +extern MGD_FUNCTION(get_group_by_name); +extern MGD_FUNCTION(create_group); +extern MGD_FUNCTION(update_group); +extern MGD_FUNCTION(delete_group); + +#endif Index: php4/ext/midgard/mgd_host.h diff -u /dev/null php4/ext/midgard/mgd_host.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_host.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,32 @@ +/* $Id: mgd_host.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_HOST_H +#define MGD_HOST_H + +extern MGD_FUNCTION(is_host_owner); +extern MGD_FUNCTION(list_hosts); +extern MGD_FUNCTION(get_host); +extern MGD_FUNCTION(get_host_by_name); +extern MGD_FUNCTION(create_host); +extern MGD_FUNCTION(update_host); +extern MGD_FUNCTION(delete_host); + +#endif Index: php4/ext/midgard/mgd_image.h diff -u /dev/null php4/ext/midgard/mgd_image.h:1.3 --- /dev/null Sat Feb 17 15:21:52 2001 +++ php4/ext/midgard/mgd_image.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,31 @@ +/* $Id: mgd_image.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_IMAGE_H +#define MGD_IMAGE_H + +extern MGD_FUNCTION(list_images); +extern MGD_FUNCTION(html_image); +extern MGD_FUNCTION(get_image); +extern MGD_FUNCTION(create_image); +extern MGD_FUNCTION(update_image); +extern MGD_FUNCTION(delete_image); + +#endif Index: php4/ext/midgard/mgd_internal.h diff -u /dev/null php4/ext/midgard/mgd_internal.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_internal.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,361 @@ +/* $Id: mgd_internal.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "php.h" +#include "php_ini.h" +#include "SAPI.h" +#include "php_midgard.h" +#include "Zend/zend.h" +#include "Zend/zend_API.h" +#include "mgd_errno.h" +#include "mgd_access.h" + +const char *article_sort(const char *order); + +#define php_rqst ((request_rec *) SG(server_context)) +#define MGD_LOG_START(fmt) ap_log_rerror(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, +php_rqst, (fmt) +#define MGD_LOG_ARG(arg) , (arg) +#define MGD_LOG_END() ); + +#define RETURN_FALSE_BECAUSE(reason) { mgd_set_errno(reason); RETURN_FALSE; } +#define RETVAL_FALSE_BECAUSE(reason) { mgd_set_errno(reason); RETVAL_FALSE; } + +#define CHECK_MGD \ + do { \ + if (!mgd_rcfg()) { \ + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); \ + } \ + mgd_set_errno(MGD_ERR_OK); \ + } while (0); + +#define MGD_FUNCTION(name) \ + PHP_FUNCTION(mgd_##name) + +#define MGD_FE(name, arg_types) \ + PHP_FE(mgd_##name, arg_types) + +#define MGD_PROPFIND(object, prop, retval) \ + (zend_hash_find((object)->value.obj.properties, (prop), strlen(prop)+1, \ + (void**)&(retval)) == SUCCESS) + +#define MGD_PROPFIND_CONST(object, prop, retval) \ + (zend_hash_find((object)->value.obj.properties, (prop), sizeof(prop), \ + (void**)&(retval)) == SUCCESS) + +#define IDINIT \ + int id; zval *self, **id_zval; \ + if (!mgd_rcfg()) \ + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); \ + if ((self = getThis()) != NULL) { \ + if (! MGD_PROPFIND(self, "id", id_zval)) { \ + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); \ + } \ + } else { \ + if (ZEND_NUM_ARGS() != 1 \ + || zend_get_parameters_ex(1, &id_zval) != SUCCESS) \ + WRONG_PARAM_COUNT; \ + } \ + convert_to_long_ex(id_zval); \ + id = (*id_zval)->value.lval; + +#define PHP_CREATE_REPLIGARD(table,id)\ + { \ + if(id != 0) CREATE_REPLIGARD(mgd_handle(), table, id) \ + else RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); \ + } + +#define PHP_DELETE_REPLIGARD(table,id) \ + { \ + if(id != 0) DELETE_REPLIGARD(mgd_handle(), table, id) \ + else RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); \ + } + +#define PHP_CREATE_REPLIGARD_VOID(table,id) \ + { \ + if(id != 0) CREATE_REPLIGARD(mgd_handle(), table, id)\ + } + +#define PHP_UPDATE_REPLIGARD(table,id) \ + UPDATE_REPLIGARD(mgd_handle(), table, id) + +#define MGD_MOVE_FUNCTION(table,roottable,name,rootname) \ +MGD_FUNCTION(move_##name) \ +{ \ + zval **id, **root; \ + RETVAL_FALSE; \ + CHECK_MGD; \ + if (ZEND_NUM_ARGS() != 2 \ + || zend_get_parameters_ex(2, &id, &root) != SUCCESS) \ + WRONG_PARAM_COUNT; \ + convert_to_long_ex(id); \ + convert_to_long_ex(root); \ + if(mgd_move_object(mgd_handle(), #table, #rootname, \ + (*id)->value.lval, (*root)->value.lval)) RETVAL_TRUE; \ + PHP_UPDATE_REPLIGARD(#table, (*id)->value.lval); \ + PHP_UPDATE_REPLIGARD(#roottable, (*root)->value.lval); \ +} + +#define MGD_WALK_FUNCTION(table) \ +/* {{{ proto void walk_ ## table ## _tree(string func, id, level, xparam[, order]) \ +*/ \ +MGD_FUNCTION(walk_ ## table ## _tree) \ +{ \ + zval **id, **level, **xparam, **order; \ + zval **old_user_func; \ + midgard_tree *tree; int mlevel, i; \ + TLS_VARS; \ +\ + old_user_func = midgard_user_call_func_name; \ + switch (ZEND_NUM_ARGS()) { \ + case 5: \ + if (zend_get_parameters_ex(5, &midgard_user_call_func_name, &id, \ + &level, &xparam, &order) == FAILURE) { \ + midgard_user_call_func_name = old_user_func; \ + WRONG_PARAM_COUNT; \ + } \ + break; \ + case 4: \ + if (zend_get_parameters_ex(4, &midgard_user_call_func_name, &id, \ + &level, &xparam) == FAILURE) { \ + midgard_user_call_func_name = old_user_func; \ + WRONG_PARAM_COUNT; \ + } else { \ + order = NULL; \ + } \ + break; \ + default: \ + midgard_user_call_func_name = old_user_func; \ + WRONG_PARAM_COUNT; \ + break; \ + }\ +\ + convert_to_string_ex(midgard_user_call_func_name); \ + convert_to_long_ex(level); \ + if (order) convert_to_long_ex(order); \ + convert_to_long_ex(id); \ +\ + tree = mgd_tree_build(mgd_handle(), #table, &mlevel, NULL); \ +\ + if (!tree) { \ + RETURN_FALSE_BECAUSE(MGD_ERR_ERROR); \ + } \ + /* Be aware of top level trees */ \ + if ((*id)->value.lval == 0) { \ + i = 0; \ + while (tree[i].id) { \ + walktree(tree, order ? (*order)->value.lval : 1, i, 0, \ + (*level)->value.lval ? (*level)->value.lval : mlevel, xparam); \ + i += tree[i].cn; \ + } \ + } else { \ + /* Traverse regular sub tree */ \ + i = mgd_tree_find(tree, id->value.lval); \ + if (i != -1) \ + walktree(tree, order ? (*order)->value.lval : 1, i, tree[i].lv-1, \ + (*level)->value.lval ? (*level)->value.lval : mlevel, xparam); \ + } \ + free(tree); \ + midgard_user_call_func_name = old_user_func; \ + RETURN_TRUE; \ +} \ +\ +/* }}} */ + +/* Commonly used macros +*/ + +#define HOSTNAME_FIELD \ + "Concat('http', If(host.port=443, 's',''), '://', host.name, If(host.port=0 || +host.port=443, '', Concat(':', host.port)),If(host.prefix='/', '/', +Concat(host.prefix, '/'))) AS hostname" + +#define PUBLIC_FIELD(n,name) "If(info&" #n "," #name ",'') AS " #name +#define PUBLIC_FIELDS \ + "info&2=2 AS addressp,info&4=4 as phonep,info&8=8 AS homepagep," \ + "info&16=16 AS emailp,info&32=32 AS extrap" + +#define NAME_FIELD \ + "Concat(firstname,If(firstname=''||lastname='','',' '),lastname)" +#define RNAME_FIELD \ + "Concat(lastname,If(firstname=''||lastname='','',', '),firstname)" +#define NAME_FIELDS "firstname,lastname,username," \ + NAME_FIELD " AS name," RNAME_FIELD " AS rname" + +#define ADDRESS_FIELD "Concat(street," \ + "If(street!=''&&(postcode!=''||city!=''),', ','')," \ + "postcode,If(postcode!=''&&city!='',' ',''),city)" +#define ADDRESS_FIELDS "street,postcode,city," ADDRESS_FIELD " AS address" + +#define PHONE_FIELD "Concat(" \ + "handphone,If(handphone=''||(homephone=''&&workphone=''),'',', ')," \ + "homephone,If(homephone=''||workphone='','',', ')," \ + "workphone,If(workphone='','',' (työ)'))" +#define PHONE_FIELDS "handphone,homephone,workphone," PHONE_FIELD " AS phone" + +#define HOMEPAGE_FIELD "If(homepage='',''," \ + "Concat('<a href=\\\"',homepage,'\\\" title=\\\"',firstname,' ',lastname," \ + "'\\\">',homepage,'</a>'))" +#define HOMEPAGE_FIELDS "homepage," HOMEPAGE_FIELD " AS homepagelink" + +#define EMAIL_FIELD "If(email='',''," \ + "Concat('<a href=\\\"mailto:',email,'\\\" title=\\\"',firstname,' '," \ + "lastname,'\\\">',email,'</a>'))" +#define EMAIL_FIELDS "email," EMAIL_FIELD " AS emaillink" + +#define GROUP_HOMEPAGE_FIELD "If(homepage='',''," \ + "Concat('<a href=\\\"',homepage,'\\\" title=\\\"',name," \ + "'\\\">',homepage,'</a>'))" +#define GROUP_HOMEPAGE_FIELDS "homepage," \ + GROUP_HOMEPAGE_FIELD " AS homepagelink" + +#define GROUP_EMAIL_FIELD "If(email='',''," \ + "Concat('<a href=\\\"mailto:',email,'\\\" title=\\\"',name," \ + "'\\\">',email,'</a>'))" +#define GROUP_EMAIL_FIELDS "email," GROUP_EMAIL_FIELD " AS emaillink" + +/* Person macroses */ +#define PERSON_SELECT \ + "id,username," NAME_FIELD " AS name," RNAME_FIELD " AS rname,extra," \ + "topic,department,office,info&1 AS admin,info>1 AS public" + +/* Article macroses */ +#define CALENDAR_FIELD \ + "If(IsNull(calstart),'',If(caldays=0,Date_Format(calstart,'%d.%m.%Y')," \ + "Concat(Date_Format(calstart," \ + "If(Year(calstart)!=Year(From_Days(To_Days(calstart)+caldays)),'%d.%m.%Y'," \ + +"If(Month(calstart)!=Month(From_Days(To_Days(calstart)+caldays)),'%d.%m.','%d.')))," \ + "Date_Format(From_Days(To_Days(calstart)+caldays),'-%d.%m.%Y'))))" +#define ACALENDAR_FIELD \ + "If(IsNull(calstart),'',If(caldays=0,Date_Format(calstart,'%D %b. %Y')," \ + "Concat(Date_Format(calstart," \ + "If(Year(calstart)!=Year(From_Days(To_Days(calstart)+caldays)),'%D %b. %Y'," \ + "If(Month(calstart)!=Month(From_Days(To_Days(calstart)+caldays)),'%D %b.','%D')))," +\ + "Date_Format(From_Days(To_Days(calstart)+caldays),'-%D %b. %Y'))))" +#define ALCALENDAR_FIELD \ + "If(IsNull(calstart),'',If(caldays=0,Date_Format(calstart,'%D %M %Y')," \ + "Concat(Date_Format(calstart," \ + "If(Year(calstart)!=Year(From_Days(To_Days(calstart)+caldays)),'%D %M %Y'," \ + "If(Month(calstart)!=Month(From_Days(To_Days(calstart)+caldays)),'%D %M','%D')))," \ + "Date_Format(From_Days(To_Days(calstart)+caldays),'-%D %M %Y'))))" +#define CALENDAR_FIELDS \ + CALENDAR_FIELD " AS calendar," \ + ACALENDAR_FIELD " AS acalendar," \ + ALCALENDAR_FIELD " AS alcalendar," \ + "Unix_Timestamp(calstart) AS startdate," \ + "Unix_Timestamp(Date_Add(calstart, INTERVAL caldays DAY)) AS enddate," \ + "caldays,Date_Format(calstart,'%d.%m.%Y') AS calstart," \ + "Date_Format(From_Days(To_Days(calstart)+caldays),'%d.%m.%Y') As calstop" + +#define ARTICLE_CALENDAR CALENDAR_FIELDS +#define ARTICLE_SELECT \ + "article.id AS id,article.name AS name,title,abstract,content,author," \ + NAME_FIELD " AS authorname,article.topic AS topic," \ + "Date_format(article.created,'%d.%m.%Y') AS date," \ + "Date_format(article.created,'%D %b. %Y') AS adate," \ + "Date_format(article.created,'%D %M %Y') AS aldate," \ + "url,icon,extra1,extra2,extra3,article.score AS score,type," \ + "Unix_Timestamp(article.created) AS created,article.creator AS creator," \ + "Unix_Timestamp(revised) AS revised,revisor,revision," \ + "Unix_Timestamp(locked) AS locked,locker," \ + "Unix_Timestamp(approved) AS approved,approver" +#define ARTICLE_SELECT_FAST \ + "id,name,title,abstract,content,author,topic," \ + "Date_format(article.created,'%d.%m.%Y') AS date," \ + "Date_format(article.created,'%D %b. %Y') AS adate," \ + "Date_format(article.created,'%D %M %Y') AS aldate," \ + "url,icon,extra1,extra2,extra3,article.score AS score,type," \ + "Unix_Timestamp(article.created) AS created,article.creator AS creator," \ + "Unix_Timestamp(revised) AS revised,revisor,revision," \ + "Unix_Timestamp(locked) AS locked,locker," \ + "Unix_Timestamp(approved) AS approved,approver" +#define ARTICLE_FROM "article,person" +#define ARTICLE_FROM_FAST "article" + +/* Macroses for Events */ +#if HAVE_MIDGARD_SITEGROUPS +#define EVENT_SITEGROUP " AND sitegroup in (0,$d)" +#define EVENT_SITEGROUP2 " AND event.sitegroup in (0,$d)"\ + " AND eventmember.sitegroup in +(0,$d)" +#else +#define EVENT_SITEGROUP "" +#define EVENT_SITEGROUP2 "" +#endif +#define EVENT_COUNT_WHERE_0 "start>=Unix_Timestamp(Now())" EVENT_SITEGROUP +#define EVENT_COUNT_WHERE_1 "start>=Unix_Timestamp(Now())"\ + " AND end<=$d" EVENT_SITEGROUP +#define EVENT_COUNT_WHERE_2 "start>=$d AND end<=$d" EVENT_SITEGROUP +#define EVENT_COUNT_WHERE_3 "start>=$d AND end<=$d"\ + " AND +event.id=eventmember.eid"\ + " AND eventmember.uid=$d" +EVENT_SITEGROUP +#define EVENT_COUNT_WHERE_4 "start>=$d AND end<=$d"\ + " AND +event.id=eventmember.eid"\ + " AND eventmember.uid=$d"\ + " AND event.type=$d" +EVENT_SITEGROUP2 +#define EVENT_COUNT_WHERE_43 "start>=$d AND end<=$d"\ + " AND event.type=$d" +EVENT_SITEGROUP +#define EVENT_COUNT_TABLE "event" +#define EVENT_COUNT_TABLE_2 "event,eventmember" + +#define EVENT_START 0 +#define EVENT_END 1 + +#define EVENT_MONTH_WHERE "((start<$d AND end>$d)"\ + " OR (start>$d AND +start<$d)"\ + " OR (end>$d AND end<$d))" +EVENT_SITEGROUP +#define EVENT_MONTH_WHERE_TYPE "((start<$d AND end>$d)"\ + " OR (start>$d AND start<$d)"\ + " OR (end>$d AND end<$d))"\ + " AND type=$d" +EVENT_SITEGROUP +/* Macroses for Event Members */ +#define EVENT_PUBLIC_FIELD(n,name) \ + "If(person.id<>$d,If(info&" #n "," #name ",'')," #name ") AS " #name + +#define EVENT_EMAIL_FIELD \ + "If(person.id<>$d,If(Info&16,If(email='',''," \ + "Concat('<a href=\\\"mailto:',email,'\\\" title=\\\"',firstname,' '," \ + "lastname,'\\\">',email,'</a>')),'')," \ + "Concat('<a href=\\\"mailto:',email,'\\\" title=\\\"',firstname,' '," \ + "lastname,'\\\">',email,'</a>')) AS emaillink" + +/* DG: fixing an incompatibility with a certain state of PHP's CVS... + * not needed anymore, but who knows... +#ifdef add_property_unset +#undef add_property_unset +#define add_property_unset(__arg, __key) add_property_unset_ex(__arg, __key, +strlen(__key) + 1) +#endif +*/ + +#define MGD_INIT_CLASS_ENTRY(class_container, class_name, functions) \ + { \ + class_container.name = strdup(class_name); \ + class_container.name_length = strlen(class_name); \ + class_container.builtin_functions = functions; \ + class_container.handle_function_call = NULL; \ + class_container.handle_property_get = NULL; \ + class_container.handle_property_set = NULL; \ + } + +#define MGD_INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, +handle_fcall, handle_propget, handle_propset) \ + { + \ + class_container.name = strdup(class_name); + \ + class_container.name_length = strlen(class_name); \ + class_container.builtin_functions = functions; \ + class_container.handle_function_call = handle_fcall; \ + class_container.handle_property_get = handle_propget; \ + class_container.handle_property_set = handle_propset; \ + } Index: php4/ext/midgard/mgd_mail.h diff -u /dev/null php4/ext/midgard/mgd_mail.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_mail.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,26 @@ +/* $Id: mgd_mail.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_MAIL_H +#define MGD_MAIL_H + +extern MGD_FUNCTION(create_mail); + +#endif Index: php4/ext/midgard/mgd_member.h diff -u /dev/null php4/ext/midgard/mgd_member.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_member.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,31 @@ +/* $Id: mgd_member.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_MEMBER_H +#define MGD_MEMBER_H + +extern MGD_FUNCTION(list_members); +extern MGD_FUNCTION(list_memberships); +extern MGD_FUNCTION(get_member); +extern MGD_FUNCTION(create_member); +extern MGD_FUNCTION(update_member); +extern MGD_FUNCTION(delete_member); + +#endif Index: php4/ext/midgard/mgd_midgard.h diff -u /dev/null php4/ext/midgard/mgd_midgard.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_midgard.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,36 @@ +/* $Id: mgd_midgard.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_MIDGARD_H +#define MGD_MIDGARD_H + +void php_midgard_select(zval * return_value, + const char *fields, const char *tables, + const char *where, const char *order, ...); + +void php_midgard_update(zval * return_value, const + char *table, const char *fields, int id, ...); + +void php_midgard_create(zval * return_value, const char *table, + const char *fields, const char *values, ...); + +void php_midgard_delete(zval * return_value, const char *table, int id); + +#endif Index: php4/ext/midgard/mgd_oop.h diff -u /dev/null php4/ext/midgard/mgd_oop.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_oop.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,348 @@ +/* $Id: mgd_oop.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_OOP_H +#define MGD_OOP_H + +#include <zend.h> + +MGD_FUNCTION(oop_parameter); +MGD_FUNCTION(oop_parameter_list); +MGD_FUNCTION(oop_parameter_search); + +MGD_FUNCTION(get_attachment); +MGD_FUNCTION(oop_attachment_create); +MGD_FUNCTION(oop_attachment_list); +MGD_FUNCTION(open_attachment); +MGD_FUNCTION(serve_attachment); +MGD_FUNCTION(delete_attachment); +MGD_FUNCTION(update_attachment); + +MGD_FUNCTION(oop_guid_get); + +MGD_FUNCTION(oop_list_fetch); + +// DG: are all these oop_xxxx_create functions actually exist ? +MGD_FUNCTION(oop_element_create); +MGD_FUNCTION(delete_element); +MGD_FUNCTION(update_element); + +MGD_FUNCTION(oop_group_create); +MGD_FUNCTION(delete_group); +MGD_FUNCTION(update_group); + +MGD_FUNCTION(oop_article_create); +MGD_FUNCTION(oop_article_score); +MGD_FUNCTION(delete_article); +MGD_FUNCTION(update_article); + +MGD_FUNCTION(oop_topic_create); +MGD_FUNCTION(oop_topic_score); +MGD_FUNCTION(delete_topic); +MGD_FUNCTION(update_topic); + +MGD_FUNCTION(oop_file_create); +MGD_FUNCTION(delete_file); +MGD_FUNCTION(update_file); + +MGD_FUNCTION(oop_host_create); +MGD_FUNCTION(delete_host); +MGD_FUNCTION(update_host); + +MGD_FUNCTION(oop_image_create); +MGD_FUNCTION(delete_image); +MGD_FUNCTION(update_image); + +MGD_FUNCTION(oop_member_create); +MGD_FUNCTION(delete_member); +MGD_FUNCTION(update_member); + +MGD_FUNCTION(oop_person_create); +MGD_FUNCTION(delete_person); +MGD_FUNCTION(update_person); + +MGD_FUNCTION(oop_preference_create); +MGD_FUNCTION(delete_preference); +MGD_FUNCTION(update_preference); + +MGD_FUNCTION(oop_page_create); +MGD_FUNCTION(delete_page); +MGD_FUNCTION(update_page); + +#if HAVE_MIDGARD_PAGELINKS +MGD_FUNCTION(oop_pagelink_create); +MGD_FUNCTION(delete_pagelink); +MGD_FUNCTION(update_pagelink); +#endif + +MGD_FUNCTION(oop_event_create); +MGD_FUNCTION(delete_event); +MGD_FUNCTION(update_event); +MGD_FUNCTION(oop_event_member_create); +MGD_FUNCTION(delete_event_member); +MGD_FUNCTION(update_event_member); + +#if HAVE_MIDGARD_SITEGROUPS +MGD_FUNCTION(oop_sitegroup_set); +MGD_FUNCTION(oop_sitegroup_get); + +MGD_FUNCTION(create_sitegroup); +MGD_FUNCTION(delete_sitegroup); +MGD_FUNCTION(update_sitegroup); +#endif + +MGD_FUNCTION(oop_style_create); +MGD_FUNCTION(delete_style); +MGD_FUNCTION(update_style); + +MGD_FUNCTION(oop_pageelement_create); +MGD_FUNCTION(delete_pageelement); +MGD_FUNCTION(update_pageelement); + +MGD_FUNCTION(oop_snippetdir_create); +MGD_FUNCTION(delete_snippetdir); +MGD_FUNCTION(update_snippetdir); + +MGD_FUNCTION(oop_snippet_create); +MGD_FUNCTION(delete_snippet); +MGD_FUNCTION(update_snippet); + +typedef struct { + int type; + char * name; +/* default value ? */ +} MidgardProperty; + +typedef MidgardProperty* MidgardPropertyPtr; + +typedef struct { + const char *name; + const char *table; + zend_function_entry *methods; + zend_class_entry class_entry; + void (*function_call)(INTERNAL_FUNCTION_PARAMETERS, + zend_property_reference *property_reference); + zval (*get_property)(zend_property_reference *property_reference); + int (*set_property)(zend_property_reference *property_reference, + zval *value); + MidgardProperty *properties; + zend_class_entry *entry_ptr; +} MidgardClass; + +typedef MidgardClass* MidgardClassPtr; +extern MidgardClassPtr MidgardClasses[]; + +void mgd_object_init(zval *obj, ...); +void php_midgard_bless(zval *object, MidgardClass *species); +void php_midgard_ctor(zval *object, MidgardClass *species); +void php_midgard_delete(zval * return_value, const char *table, int id); +void php_midgard_delete_repligard(const char *table, int id); +void php_midgard_update(zval * return_value, const char *table, + const char *fields, int id, ...); +void php_midgard_create(zval * return_value, const char *table, + const char *fields, const char *values, ...); +void php_midgard_select(MidgardClass *species, zval * return_value, + const char *fields, const char *tables, + const char *where, const char *order, ...); +#if HAVE_MIDGARD_SITEGROUPS +void php_midgard_sitegroup_get(MidgardClass *species, + zval * return_value, int grouped, + const char *fields, const char *table, int id); +#endif +void php_midgard_get(MidgardClass *species, zval * return_value, + const char *fields, const char *table, int id); +void php_midgard_get_by_name(MidgardClass *species, zval * return_value, + const char *fields, const char *table, + const char *idfield, int parent_id, const char *name); +void php_midgard_get_by_name2(MidgardClass *species, zval * return_value, + const char *fields, const char *table, + const char *firstfield, const char *first, + const char *secondfield, const char *second); +void php_midgard_get_by_name_only(MidgardClass *species, zval * return_value, + const char *fields, const char *table, const char *name); +zval _midgard_getset_property(MidgardClass *Class, + zend_property_reference *property_reference, + zval *value); + +extern MidgardClass MidgardArticle; +extern MidgardClass MidgardAttachment; +extern MidgardClass MidgardElement; +extern MidgardClass MidgardEvent; +extern MidgardClass MidgardEventMember; +extern MidgardClass MidgardFile; +extern MidgardClass MidgardGroup; +extern MidgardClass MidgardHost; +extern MidgardClass MidgardImage; +extern MidgardClass MidgardMember; +extern MidgardClass MidgardPage; +extern MidgardClass MidgardPageElement; +extern MidgardClass MidgardParameter; +extern MidgardClass MidgardPerson; +extern MidgardClass MidgardPreferences; +extern MidgardClass MidgardSnippet; +extern MidgardClass MidgardSnippetdir; +extern MidgardClass MidgardStyle; +extern MidgardClass MidgardTopic; +#if HAVE_MIDGARD_SITEGROUPS +extern MidgardClass MidgardSitegroup; +#endif +#if HAVE_MIDGARD_PAGELINKS +extern MidgardClass MidgardPagelink; +#endif + +/* OOP_SITEGROUP_METHODS include also method for + gathering GUID for given object +*/ +#if HAVE_MIDGARD_SITEGROUPS +#define MIDGARD_OOP_SITEGROUP_METHODS \ + PHP_FALIAS(setsitegroup, mgd_oop_sitegroup_set, NULL) \ + PHP_FALIAS(getsitegroup, mgd_oop_sitegroup_get, NULL) \ + PHP_FALIAS(guid, mgd_oop_guid_get, NULL) +#else +#define MIDGARD_OOP_SITEGROUP_METHODS \ + PHP_FALIAS(guid, mgd_oop_guid_get, NULL) +#endif + +#define MIDGARD_OOP_ATTACHMENT_METHODS \ + PHP_FALIAS(getattachment, mgd_get_attachment, NULL) \ + PHP_FALIAS(createattachment, mgd_oop_attachment_create, NULL) \ + PHP_FALIAS(listattachments, mgd_oop_attachment_list, NULL) \ + PHP_FALIAS(openattachment, mgd_open_attachment, NULL) \ + PHP_FALIAS(serveattachment, mgd_serve_attachment, NULL) \ + PHP_FALIAS(deleteattachment, mgd_delete_attachment, NULL) \ + PHP_FALIAS(updateattachment, mgd_update_attachment, NULL) + +#define MIDGARD_OOP_PARAMETER_METHODS \ + PHP_FALIAS(parameter, mgd_oop_parameter, NULL) \ + PHP_FALIAS(searchparameters, mgd_oop_parameter_search, NULL) \ + PHP_FALIAS(listparameters, mgd_oop_parameter_list, NULL) + +#define MIDGARD_CLASS(name,type) \ +MIDGARD_HANDLERS_DECL(type) \ +static zend_function_entry name ## Methods[] = \ + { \ + PHP_FALIAS(midgard # type, mgd_ctor_ ## type , NULL) \ + PHP_FALIAS(create, mgd_create_ ## type , NULL) \ + PHP_FALIAS(update, mgd_update_ ## type , NULL) \ + PHP_FALIAS(delete, mgd_delete_ ## type , NULL) \ + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) \ + MIDGARD_OOP_ATTACHMENT_METHODS \ + MIDGARD_OOP_SITEGROUP_METHODS \ + MIDGARD_OOP_PARAMETER_METHODS \ + {NULL, NULL, NULL} \ + }; \ +MidgardClass name = { \ + #name, \ + #type, \ + name ## Methods, \ + {}, \ + mgd_ ## type ## _call_function_handler, \ + mgd_ ## type ## _get_property_handler, \ + mgd_ ## type ## _set_property_handler, \ + name ## Properties, \ + NULL \ +}; \ +MIDGARD_HANDLERS(name, type) + +#define MIDGARD_HANDLERS_DECL(type) \ +void mgd_ ## type ## _call_function_handler(INTERNAL_FUNCTION_PARAMETERS, \ + zend_property_reference *property_reference); \ +zval mgd_ ## type ## _get_property_handler(zend_property_reference +*property_reference); \ +int mgd_ ## type ## _set_property_handler(zend_property_reference +*property_reference, \ + zval *value); \ +MGD_FUNCTION(ctor_ ## type); + +#define MIDGARD_HANDLERS(name, type) \ +void mgd_ ## type ## _call_function_handler(INTERNAL_FUNCTION_PARAMETERS, \ + zend_property_reference *property_reference) \ +{ \ + zval *object = property_reference->object; \ + zend_overloaded_element *function_name = (zend_overloaded_element *) \ + +property_reference->elements_list->tail->data; \ + \ +/* int arg_count = 0; \ + zval **arguments = NULL; \ + \ + if((arg_count = ZEND_NUM_ARGS()) > 0) { \ + arguments = (pval **) emalloc(sizeof(pval *)*arg_count); \ + } */ \ + RETVAL_TRUE; \ + \ + CHECK_MGD; \ + \ +/* getParametersArray(ht, arg_count, arguments); */ \ + /* if the constructor is called */ \ + if (!strcasecmp( #name ,function_name->element.value.str.val)) { \ + /* construct a Midgard object */ \ + pval *object_handle; \ + php_midgard_bless(object, &name); \ + ALLOC_ZVAL(object_handle); \ + *object_handle = *return_value; \ + pval_copy_constructor(object_handle); \ + INIT_PZVAL(object_handle); \ +/* zend_hash_index_update(object->value.obj.properties, 0, +&object_handle, sizeof(pval *), NULL); */ \ + \ + } else { \ + zend_function_entry * methods = name ## Methods; \ + int ok = 0; \ + while(methods && methods->fname) { \ + if(!strcmp(function_name->element.value.str.val, +methods->fname)) { \ + methods->handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); \ + ok = 1; \ + break; \ + } \ + methods++; \ + } \ + if(!ok) { \ + /* pval_destructor(&function_name->element); */ \ + php_error(E_ERROR, \ + "Midgard: Method '%s' is not a member +of " #name, \ + function_name->element.value.str.val); +\ + } \ +/* PHP_FN(manage function aliases +here)(INTERNAL_FUNCTION_PARAM_PASSTHRU); */ \ + } \ +/* efree(arguments); */ \ + pval_destructor(&function_name->element); \ +} \ + \ +zval mgd_ ## type ## _get_property_handler(zend_property_reference +*property_reference) \ +{ \ + zval result; \ + result = _midgard_getset_property(&name, property_reference, NULL); \ + return result; \ +} \ + \ +int mgd_ ## type ## _set_property_handler(zend_property_reference +*property_reference, \ + zval *value) \ +{ \ + zval result; \ + result = _midgard_getset_property(&name, property_reference, value); \ + /* TODO: test result to know if we return SUCCESS or FAILURE */ \ + return SUCCESS; \ +} \ +MGD_FUNCTION(ctor_ ## type) \ +{ \ + if ((return_value = getThis()) == NULL) { \ + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); \ + } \ + php_midgard_ctor(return_value, &name); \ +} + +#endif Index: php4/ext/midgard/mgd_page.h diff -u /dev/null php4/ext/midgard/mgd_page.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_page.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,37 @@ +/* $Id: mgd_page.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PAGE_H +#define MGD_PAGE_H + +extern MGD_FUNCTION(is_page_owner); +extern MGD_FUNCTION(copy_page); +extern MGD_FUNCTION(move_page); +extern MGD_FUNCTION(list_pages); +extern MGD_FUNCTION(is_in_page_tree); +extern MGD_FUNCTION(get_page); +extern MGD_FUNCTION(get_page_by_name); +extern MGD_FUNCTION(create_page); +extern MGD_FUNCTION(update_page); +extern MGD_FUNCTION(delete_page); +extern MGD_FUNCTION(page_has_children); +extern MGD_FUNCTION(delete_page_tree); + +#endif Index: php4/ext/midgard/mgd_pageelement.h diff -u /dev/null php4/ext/midgard/mgd_pageelement.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_pageelement.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,33 @@ +/* $Id: mgd_pageelement.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PAGEELEMENT_H +#define MGD_PAGEELEMENT_H + +extern MGD_FUNCTION(list_page_elements); +extern MGD_FUNCTION(get_page_element); +extern MGD_FUNCTION(get_page_element_by_name); +extern MGD_FUNCTION(create_page_element); +extern MGD_FUNCTION(update_page_element); +extern MGD_FUNCTION(delete_page_element); +extern MGD_FUNCTION(copy_page_element); +extern MGD_FUNCTION(move_page_element); + +#endif Index: php4/ext/midgard/mgd_pagelink.h diff -u /dev/null php4/ext/midgard/mgd_pagelink.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_pagelink.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,34 @@ +/* $Id: mgd_pagelink.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PAGELINK_H +#define MGD_PAGELINK_H + +extern MGD_FUNCTION(has_pagelinks); +extern MGD_FUNCTION(is_pagelink_owner); +extern MGD_FUNCTION(list_pagelinks); +extern MGD_FUNCTION(list_pagelinks_targeted_at); +extern MGD_FUNCTION(get_pagelink); +extern MGD_FUNCTION(get_pagelink_by_name); +extern MGD_FUNCTION(create_pagelink); +extern MGD_FUNCTION(update_pagelink); +extern MGD_FUNCTION(delete_pagelink); + +#endif Index: php4/ext/midgard/mgd_person.h diff -u /dev/null php4/ext/midgard/mgd_person.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_person.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,40 @@ +/* $Id: mgd_person.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PERSON_H +#define MGD_PERSON_H + +extern MGD_FUNCTION(is_person_owner); +extern MGD_FUNCTION(is_member); +extern MGD_FUNCTION(list_persons); +extern MGD_FUNCTION(list_persons_in_department); +extern MGD_FUNCTION(list_topic_persons); +extern MGD_FUNCTION(list_persons_in_department_all); +extern MGD_FUNCTION(list_topic_persons_all); +extern MGD_FUNCTION(list_persons_in_office); +extern MGD_FUNCTION(get_person); +extern MGD_FUNCTION(create_person); +extern MGD_FUNCTION(update_person); +extern MGD_FUNCTION(update_password); +extern MGD_FUNCTION(update_password_plain); +extern MGD_FUNCTION(update_public); +extern MGD_FUNCTION(delete_person); + +#endif Index: php4/ext/midgard/mgd_preferences.h diff -u /dev/null php4/ext/midgard/mgd_preferences.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_preferences.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,30 @@ +/* $Id: mgd_preferences.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PREFERENCES_H +#define MGD_PREFERENCES_H + +extern MGD_FUNCTION(list_preferences); +extern MGD_FUNCTION(get_preference); +extern MGD_FUNCTION(create_preference); +extern MGD_FUNCTION(update_preference); +extern MGD_FUNCTION(delete_preference); + +#endif Index: php4/ext/midgard/mgd_preparser.h diff -u /dev/null php4/ext/midgard/mgd_preparser.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_preparser.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,58 @@ +/* $Id: mgd_preparser.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_PREPARSER_H +#define MGD_PREPARSER_H +#include "mgd_internal.h" +#include "midgard.h" +#include <glib.h> + +extern MGD_FUNCTION(template); +extern MGD_FUNCTION(variable); +extern MGD_FUNCTION(snippet); +extern MGD_FUNCTION(eval); +extern MGD_FUNCTION(register_filter); +char * php_midgard_variable(midgard_pool * pool, char * name, char * member, char * +type); +char * php_eval_midgard(midgard_pool * pool, const char *name, char *value, int +exit_php); +int mgdparse(void); + +extern GByteArray *mgd_output_buffer; +#define mgd_append_byte(buffer, str) if((*str) != '\0' )\ + g_byte_array_append((buffer), (str), 1); +#define mgd_set_buffer(buffer, str) { \ + (buffer) = g_byte_array_new(); \ + if(strlen(str) > 0 ) { \ + g_byte_array_append((buffer), (str), strlen(str)); \ + } \ +} + +#define mgd_free_buffer(buffer) g_byte_array_free((buffer), TRUE) +#define mgd_append_buffer(buffer, str) if(strlen(str) > 0 )\ + g_byte_array_append((buffer), (str), strlen(str)); +#define mgd_append_output_buffer_const(str) if(sizeof(str) > 0 )\ + g_byte_array_append(mgd_output_buffer, (str), (sizeof(str) == 1) ? 1 : +sizeof(str)-1 ); +#define mgd_append_output_buffer(str) if(strlen(str) > 0 )\ + g_byte_array_append(mgd_output_buffer, (str), strlen(str)); +#define mgd_append_output_buffer_data(gstr) if((gstr)->len > 0 )\ + g_byte_array_append(mgd_output_buffer, (gstr)->data, (gstr)->len); + +//#define MGD_PREPARSER_LOG + +#endif Index: php4/ext/midgard/mgd_sitegroup.h diff -u /dev/null php4/ext/midgard/mgd_sitegroup.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_sitegroup.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,31 @@ +/* $Id: mgd_sitegroup.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_SITEGROUP_H +#define MGD_SITEGROUP_H + +extern MGD_FUNCTION(has_sitegroups); +extern MGD_FUNCTION(list_sitegroups); +extern MGD_FUNCTION(create_sitegroup); +extern MGD_FUNCTION(get_sitegroup); +extern MGD_FUNCTION(update_sitegroup); +extern MGD_FUNCTION(delete_sitegroup); + +#endif Index: php4/ext/midgard/mgd_snippet.h diff -u /dev/null php4/ext/midgard/mgd_snippet.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_snippet.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,34 @@ +/* $Id: mgd_snippet.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_SNIPPET_H +#define MGD_SNIPPET_H + +extern MGD_FUNCTION(snippet_exists); +extern MGD_FUNCTION(list_snippets); +extern MGD_FUNCTION(get_snippet); +extern MGD_FUNCTION(get_snippet_by_name); +extern MGD_FUNCTION(create_snippet); +extern MGD_FUNCTION(update_snippet); +extern MGD_FUNCTION(delete_snippet); +extern MGD_FUNCTION(copy_snippet); +extern MGD_FUNCTION(move_snippet); + +#endif Index: php4/ext/midgard/mgd_snippetdir.h diff -u /dev/null php4/ext/midgard/mgd_snippetdir.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_snippetdir.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,35 @@ +/* $Id: mgd_snippetdir.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_SNIPPETDIR_H +#define MGD_SNIPPETDIR_H + +extern MGD_FUNCTION(is_snippetdir_owner); +extern MGD_FUNCTION(list_snippetdirs); +extern MGD_FUNCTION(get_snippetdir); +extern MGD_FUNCTION(get_snippetdir_by_path); +extern MGD_FUNCTION(create_snippetdir); +extern MGD_FUNCTION(update_snippetdir); +extern MGD_FUNCTION(delete_snippetdir); +extern MGD_FUNCTION(delete_snippetdir_tree); +extern MGD_FUNCTION(copy_snippetdir); +extern MGD_FUNCTION(move_snippetdir); + +#endif Index: php4/ext/midgard/mgd_style.h diff -u /dev/null php4/ext/midgard/mgd_style.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_style.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,35 @@ +/* $Id: mgd_style.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_STYLE_H +#define MGD_STYLE_H + +extern MGD_FUNCTION(is_style_owner); +extern MGD_FUNCTION(list_styles); +extern MGD_FUNCTION(get_style); +extern MGD_FUNCTION(get_style_by_name); +extern MGD_FUNCTION(create_style); +extern MGD_FUNCTION(update_style); +extern MGD_FUNCTION(delete_style); +extern MGD_FUNCTION(copy_style); +extern MGD_FUNCTION(move_style); +extern MGD_FUNCTION(delete_style_tree); + +#endif Index: php4/ext/midgard/mgd_topic.h diff -u /dev/null php4/ext/midgard/mgd_topic.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mgd_topic.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,37 @@ +/* $Id: mgd_topic.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef MGD_TOPCC_H +#define MGD_TOPIC_H + +extern MGD_FUNCTION(is_topic_owner); +extern MGD_FUNCTION(list_topics); +extern MGD_FUNCTION(is_in_topic_tree); +extern MGD_FUNCTION(get_topic); +extern MGD_FUNCTION(get_topic_by_name); +extern MGD_FUNCTION(create_topic); +extern MGD_FUNCTION(update_topic); +extern MGD_FUNCTION(update_topic_score); +extern MGD_FUNCTION(delete_topic); +extern MGD_FUNCTION(copy_topic); +extern MGD_FUNCTION(move_topic); +extern MGD_FUNCTION(delete_topic_tree); + +#endif Index: php4/ext/midgard/midgard.c diff -u /dev/null php4/ext/midgard/midgard.c:1.4 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/midgard.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,700 @@ +/* $Id: midgard.c,v 1.4 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "php.h" +#include "php_ini.h" +#include "php_logos.h" +#include "php_main.h" +#include "SAPI.h" +#include "ext/standard/info.h" +#include "php_midgard.h" + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. +*/ +#if HAVE_MIDGARD + +#include <http_config.h> +#include "mgd_errno.h" +#include "mgd_internal.h" +#include "mgd_oop.h" +#include "mgd_mail.h" +#include "mgd_article.h" +#include "mgd_topic.h" +#include "mgd_attachment.h" +#include "mgd_element.h" +#include "mgd_group.h" +#include "mgd_file.h" +#include "mgd_member.h" +#include "mgd_host.h" +#include "mgd_image.h" +#include "mgd_calendar.h" +#include "mgd_event.h" +#include "mgd_eventmember.h" +#include "mgd_page.h" +#include "mgd_pageelement.h" +#include "mgd_pagelink.h" +#include "mgd_person.h" +#include "mgd_preferences.h" +#include "mgd_sitegroup.h" +#include "mgd_snippet.h" +#include "mgd_snippetdir.h" +#include "mgd_style.h" +#include "mgd_preparser.h" + + +ZEND_DECLARE_MODULE_GLOBALS(midgard) + +/* True global resources - no need for thread safety here */ +/* DG: supress warning +static int le_midgard; +*/ + +MGD_FUNCTION(errno); +MGD_FUNCTION(errstr); +MGD_FUNCTION(version); +MGD_FUNCTION(get_midgard); +MGD_FUNCTION(auth_midgard); + +/* Every user visible function must have an entry in midgard_functions[]. +*/ +function_entry midgard_functions[] = { +PHP_FE(confirm_midgard_compiled, NULL) /* For testing, remove later. +*/ +MGD_FE(is_article_owner, NULL) +MGD_FE(is_article_in_topic_tree, NULL) +MGD_FE(list_topic_articles, NULL) +MGD_FE(list_reply_articles, NULL) +MGD_FE(list_topic_articles_all, NULL) +MGD_FE(list_topic_articles_all_fast, NULL) +MGD_FE(list_topic_articles_all_of_person, NULL) +MGD_FE(get_article, NULL) +MGD_FE(get_article_by_name, NULL) +MGD_FE(get_reply_by_name, NULL) +MGD_FE(create_article, NULL) +MGD_FE(update_article_score, NULL) +MGD_FE(update_article_created, NULL) +MGD_FE(update_article_replyto, NULL) +MGD_FE(update_article_type, NULL) +MGD_FE(toggle_article_lock, NULL) +MGD_FE(approve_article, NULL) +MGD_FE(update_article, NULL) +MGD_FE(delete_article, NULL) +MGD_FE(copy_article, NULL) +MGD_FE(move_article, NULL) +MGD_FE(move_reply, NULL) +MGD_FE(delete_article_tree, NULL) +MGD_FE(open_attachment, NULL) +MGD_FE(get_attachment, NULL) +MGD_FE(serve_attachment, NULL) +MGD_FE(stat_attachment, NULL) +MGD_FE(delete_attachment, NULL) +MGD_FE(update_attachment, NULL) +//MGD_FE(errno, NULL) +//MGD_FE(errstr, NULL) +//MGD_FE(version, NULL) +MGD_FE(is_topic_owner, NULL) +MGD_FE(list_topics, NULL) +MGD_FE(is_in_topic_tree, NULL) +MGD_FE(get_topic, NULL) +MGD_FE(get_topic_by_name, NULL) +MGD_FE(create_topic, NULL) +MGD_FE(update_topic, NULL) +MGD_FE(update_topic_score, NULL) +MGD_FE(delete_topic, NULL) +MGD_FE(copy_topic, NULL) +MGD_FE(move_topic, NULL) +MGD_FE(delete_topic_tree, NULL) +MGD_FE(list_elements, NULL) +MGD_FE(get_element, NULL) +MGD_FE(get_element_by_name, NULL) +MGD_FE(create_element, NULL) +MGD_FE(update_element, NULL) +MGD_FE(delete_element, NULL) +MGD_FE(copy_element, NULL) +MGD_FE(move_element, NULL) +MGD_FE(errno, NULL) +MGD_FE(errstr, NULL) +MGD_FE(version, NULL) +MGD_FE(get_midgard, NULL) +MGD_FE(auth_midgard, NULL) +MGD_FE(create_mail, NULL) +MGD_FE(is_group_owner, NULL) +MGD_FE(list_groups, NULL) +MGD_FE(get_group, NULL) +MGD_FE(get_group_by_name, NULL) +MGD_FE(create_group, NULL) +MGD_FE(update_group, NULL) +MGD_FE(delete_group, NULL) +MGD_FE(list_files, NULL) +MGD_FE(get_file, NULL) +MGD_FE(create_file, NULL) +MGD_FE(update_file, NULL) +MGD_FE(delete_file, NULL) +MGD_FE(list_members, NULL) +MGD_FE(list_memberships, NULL) +MGD_FE(get_member, NULL) +MGD_FE(create_member, NULL) +MGD_FE(update_member, NULL) +MGD_FE(delete_member, NULL) +MGD_FE(is_host_owner, NULL) +MGD_FE(list_hosts, NULL) +MGD_FE(get_host, NULL) +MGD_FE(get_host_by_name, NULL) +MGD_FE(create_host, NULL) +MGD_FE(update_host, NULL) +MGD_FE(delete_host, NULL) +MGD_FE(list_images, NULL) +#if 0 +MGD_FE(html_image, NULL) +#endif +MGD_FE(get_image, NULL) +MGD_FE(create_image, NULL) +MGD_FE(update_image, NULL) +MGD_FE(delete_image, NULL) +MGD_FE(list_topic_calendar_all, NULL) +MGD_FE(list_topic_calendar_all_fast, NULL) +MGD_FE(is_event_owner, NULL) +MGD_FE(create_event, NULL) +MGD_FE(update_event, NULL) +MGD_FE(delete_event, NULL) +MGD_FE(delete_event_tree, NULL) +MGD_FE(get_event, NULL) +MGD_FE(list_events, NULL) +MGD_FE(list_events_between, NULL) +MGD_FE(list_events_all, NULL) +MGD_FE(list_events_all_between, NULL) +MGD_FE(count_events_in_period, NULL) +MGD_FE(count_events_in_month, NULL) +MGD_FE(copy_event, NULL) +MGD_FE(move_event, NULL) +MGD_FE(create_event_member, NULL) +MGD_FE(update_event_member, NULL) +MGD_FE(delete_event_member, NULL) +MGD_FE(get_event_member, NULL) +MGD_FE(list_event_members, NULL) +MGD_FE(count_event_members, NULL) +MGD_FE(is_page_owner, NULL) +MGD_FE(copy_page, NULL) +MGD_FE(move_page, NULL) +MGD_FE(list_pages, NULL) +MGD_FE(is_in_page_tree, NULL) +MGD_FE(get_page, NULL) +MGD_FE(get_page_by_name, NULL) +MGD_FE(create_page, NULL) +MGD_FE(update_page, NULL) +MGD_FE(delete_page, NULL) +MGD_FE(page_has_children, NULL) +MGD_FE(delete_page_tree, NULL) +MGD_FE(list_page_elements, NULL) +MGD_FE(get_page_element, NULL) +MGD_FE(get_page_element_by_name, NULL) +MGD_FE(create_page_element, NULL) +MGD_FE(update_page_element, NULL) +MGD_FE(delete_page_element, NULL) +MGD_FE(copy_page_element, NULL) +MGD_FE(move_page_element, NULL) +MGD_FE(has_pagelinks, NULL) +#if HAVE_MIDGARD_PAGELINKS +MGD_FE(is_pagelink_owner, NULL) +MGD_FE(list_pagelinks, NULL) +MGD_FE(list_pagelinks_targeted_at, NULL) +MGD_FE(get_pagelink, NULL) +MGD_FE(get_pagelink_by_name, NULL) +MGD_FE(create_pagelink, NULL) +MGD_FE(update_pagelink, NULL) +MGD_FE(delete_pagelink, NULL) +#endif +MGD_FE(is_person_owner, NULL) +MGD_FE(is_member, NULL) +MGD_FE(list_persons, NULL) +MGD_FE(list_persons_in_department, NULL) +MGD_FE(list_topic_persons, NULL) +MGD_FE(list_persons_in_department_all, NULL) +MGD_FE(list_topic_persons_all, NULL) +MGD_FE(list_persons_in_office, NULL) +MGD_FE(get_person, NULL) +MGD_FE(create_person, NULL) +MGD_FE(update_person, NULL) +MGD_FE(update_password, NULL) +MGD_FE(update_password_plain, NULL) +MGD_FE(update_public, NULL) +MGD_FE(delete_person, NULL) +MGD_FE(list_preferences, NULL) +MGD_FE(get_preference, NULL) +MGD_FE(create_preference, NULL) +MGD_FE(update_preference, NULL) +MGD_FE(delete_preference, NULL) +MGD_FE(has_sitegroups, NULL) +#if HAVE_MIDGARD_SITEGROUPS +MGD_FE(list_sitegroups, NULL) +MGD_FE(create_sitegroup, NULL) +MGD_FE(get_sitegroup, NULL) +MGD_FE(update_sitegroup, NULL) +MGD_FE(delete_sitegroup, NULL) +#endif +MGD_FE(snippet_exists, NULL) +MGD_FE(list_snippets, NULL) +MGD_FE(get_snippet, NULL) +MGD_FE(get_snippet_by_name, NULL) +MGD_FE(create_snippet, NULL) +MGD_FE(update_snippet, NULL) +MGD_FE(delete_snippet, NULL) +MGD_FE(copy_snippet, NULL) +MGD_FE(move_snippet, NULL) +MGD_FE(is_snippetdir_owner, NULL) +MGD_FE(list_snippetdirs, NULL) +MGD_FE(get_snippetdir, NULL) +MGD_FE(get_snippetdir_by_path, NULL) +MGD_FE(create_snippetdir, NULL) +MGD_FE(update_snippetdir, NULL) +MGD_FE(delete_snippetdir, NULL) +MGD_FE(delete_snippetdir_tree, NULL) +MGD_FE(copy_snippetdir, NULL) +MGD_FE(move_snippetdir, NULL) +MGD_FE(is_style_owner, NULL) +MGD_FE(list_styles, NULL) +MGD_FE(get_style, NULL) +MGD_FE(get_style_by_name, NULL) +MGD_FE(create_style, NULL) +MGD_FE(update_style, NULL) +MGD_FE(delete_style, NULL) +MGD_FE(copy_style, NULL) +MGD_FE(move_style, NULL) +MGD_FE(delete_style_tree, NULL) +/* preparser functions */ +MGD_FE(template, NULL) +MGD_FE(variable, NULL) +MGD_FE(snippet, NULL) +MGD_FE(eval, NULL) +MGD_FE(register_filter, NULL) + {NULL, NULL, NULL} /* Must be the last line in midgard_functions[] */ +}; + +zend_module_entry midgard_module_entry = { + "midgard", + midgard_functions, + PHP_MINIT(midgard), + PHP_MSHUTDOWN(midgard), + PHP_RINIT(midgard), /* Replace with NULL if there's nothing to do +at request start */ + PHP_RSHUTDOWN(midgard), /* Replace with NULL if there's nothing to do at +request end */ + PHP_MINFO(midgard), + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_MIDGARD +ZEND_GET_MODULE(midgard) +#endif + +/* Remove comments and fill if you need to have entries in php.ini +PHP_INI_BEGIN() +PHP_INI_END() +*/ + +static void php_midgard_init_globals(zend_midgard_globals *midgard_globals) +{ + midgard_globals->rcfg = NULL; + midgard_globals->dcfg = NULL; + midgard_globals->mgd = NULL; + midgard_globals->mgd_errno = MGD_ERR_OK; + midgard_globals->udf = NULL; +} + +PHP_MINIT_FUNCTION(midgard) +{ + MidgardClassPtr *midgard_class; + + ZEND_INIT_MODULE_GLOBALS(midgard, php_midgard_init_globals, NULL); +/* Remove comments if you have entries in php.ini + REGISTER_INI_ENTRIES(); +*/ + + for (midgard_class = MidgardClasses; midgard_class && + *midgard_class; +midgard_class++) { + if(*midgard_class && (*midgard_class)->name) { + MGD_INIT_OVERLOADED_CLASS_ENTRY( + (*midgard_class)->class_entry, + (*midgard_class)->name, + (*midgard_class)->methods, + NULL, + //(*midgard_class)->function_call, + NULL, + //(*midgard_class)->get_property, + (*midgard_class)->set_property + ); + } + (*midgard_class)->entry_ptr = + zend_register_internal_class(&((*midgard_class)->class_entry)); + assert((*midgard_class)->entry_ptr); + } + return SUCCESS; +} + +PHP_MSHUTDOWN_FUNCTION(midgard) +{ +/* Remove comments if you have entries in php.ini + UNREGISTER_INI_ENTRIES(); +*/ + return SUCCESS; +} + +/* Remove if there's nothing to do at request start */ +PHP_RINIT_FUNCTION(midgard) +{ +request_rec *r; +module *midgard_module; + + SLS_FETCH(); + MGDLS_FETCH(); + + midgard_module = ap_find_linked_module("mod_midgard.c"); + if (!midgard_module) { + MGDG(rcfg) = NULL; + MGDG(dcfg) = NULL; + return FAILURE; + } + + /* Failure on Apache 1.3.18-dev (Marius) ??? */ + r = ((request_rec *) SG(server_context)); + + MGDG(rcfg) = (midgard_request_config *) + ap_get_module_config(r->request_config, midgard_module); + if(MGDG(rcfg) == NULL) { + php_error(E_ERROR, "Cannot get midgard module config"); + return FAILURE; + } + MGDG(dcfg) = (midgard_directory_config *) + ap_get_module_config(r->per_dir_config, midgard_module); + if(MGDG(rcfg) == NULL) { + php_error(E_ERROR, "Cannot get midgard module directory config"); + return FAILURE; + } + + MGDG(mgd) = MGDG(rcfg)->mgd; + ALLOC_INIT_ZVAL(MGDG(udf)); + if(MGDG(udf)) array_init(MGDG(udf)); + return SUCCESS; +} + +/* Remove if there's nothing to do at request end */ +PHP_RSHUTDOWN_FUNCTION(midgard) +{ + zval *udf = mgd_getudf(); + if(udf) zval_dtor(udf); + + if (mgd_rcfg() == NULL && mgd_handle() != NULL) { + mgd_close(mgd_handle()); + /* EEH: not safe! mgd_done(); */ + } + + return SUCCESS; +} + +PHP_MINFO_FUNCTION(midgard) +{ + int i; + php_info_print_table_start(); + php_info_print_table_header(2, "Midgard Support", "enabled"); + php_info_print_table_row(2, "Midgard version", mgd_version()); + i = 0; + /* TODO: pretify output by arranging functions according object classes */ + while (midgard_module_entry.functions[i].fname) { + php_info_print_table_row(2, "", +midgard_module_entry.functions[i].fname); + i++; + } + php_info_print_table_end(); + php_info_print_box_start(0); + PUTS("<H3><a href=\"http://www.midgard-project.org/\">"); + PUTS("The Midgard Project Home Page</a></H3>\n"); + + php_printf("This program makes use of the Midgard Content Management +engine:<BR>"); + php_printf("© 1998-2001 The Midgard Project Ry - 2000-2001 Aurora +Linux</BR>\n"); + php_info_print_box_end(); + + /* Remove comments if you have entries in php.ini + DISPLAY_INI_ENTRIES(); + */ +} + +/* Remove the following function when you have succesfully modified config.m4 + so that your module can be compiled into PHP, it exists only for testing + purposes. */ + +/* Every user-visible function in PHP should document itself in the source */ +/* {{{ proto string confirm_midgard_compiled(string arg) + Return a string to confirm that the module is compiled in */ +PHP_FUNCTION(confirm_midgard_compiled) +{ + zval **arg; + int len; + char string[256]; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg); + + len = sprintf(string, "Congratulations, you have successfully modified +ext/midgard/config.m4, module %s is compiled into PHP", Z_STRVAL_PP(arg)); + RETURN_STRINGL(string, len, 1); +} +/* }}} */ +/* The previous line is meant for emacs, so it can correctly fold and unfold + functions in source code. See the corresponding marks just before function + definition, where the functions purpose is also documented. Please follow + this convention for the convenience of others editing your code. +*/ + +MGD_FUNCTION(errno) +{ + if (ZEND_NUM_ARGS() != 0) WRONG_PARAM_COUNT; + + RETURN_LONG(mgd_get_errno()); +} + +MGD_FUNCTION(errstr) +{ + zval **errcode; + char *err; + + switch(ZEND_NUM_ARGS()) { + case 0: + errcode = NULL; + break; + case 1: + if (zend_get_parameters_ex(1, &errcode)==FAILURE) + WRONG_PARAM_COUNT; + break; + default: + WRONG_PARAM_COUNT; + } + + if (errcode) convert_to_long_ex(errcode); + + err = mgd_errstr(errcode ? (*errcode)->value.lval : mgd_get_errno()); + + RETURN_STRING(err, 1); +} + +MGD_FUNCTION(version) +{ + RETURN_STRING((char*)mgd_version(), 1); +} + +/* Fetch static globals. Unfortunately these need to be here since the + module globals are declared static by the Zend macros +*/ +midgard_request_config *mgd_rcfg() +{ + MGDLS_FETCH(); + return MGDG(rcfg); +} + +midgard_directory_config *mgd_dcfg() +{ + MGDLS_FETCH(); + return MGDG(dcfg); +} + +midgard *mgd_handle() +{ + MGDLS_FETCH(); + return MGDG(mgd); +} + +zval *mgd_getudf() +{ + MGDLS_FETCH(); + return MGDG(udf); +} + +void mgd_set_errno(int mgd_errno) +{ + MGDLS_FETCH(); + if (MGDG(mgd_errno) == MGD_ERR_OK) + MGDG(mgd_errno) = mgd_errno; +} + +int mgd_get_errno() +{ + MGDLS_FETCH(); + return MGDG(mgd_errno); +} + +MGD_FUNCTION(get_midgard) +{ + int i; + zval *argv; + char **mm_argv; + long mm_argc; + midgard *mgd = mgd_handle(); + midgard_request_config *rcfg = mgd_rcfg(); + + if (rcfg == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + } + + object_init(return_value); + + add_property_long(return_value, "host", rcfg->host); + add_property_long(return_value, "style", rcfg->style); + add_property_long(return_value, "page", rcfg->resource.id); + add_property_long(return_value, "cookieauth", rcfg->auth.cookie); + add_property_long(return_value, "auth", rcfg->auth.required); + add_property_long(return_value, "author", rcfg->author); + + add_property_long(return_value, "user", mgd_user(mgd)); + add_property_long(return_value, "admin", mgd_isadmin(mgd)); + +#if HAVE_MIDGARD_SITEGROUPS + add_property_long(return_value, "root", mgd_isroot(mgd)); + add_property_long(return_value, "sitegroup", mgd_sitegroup(mgd)); +#endif + + mm_argv = (char**)rcfg->argv->elts; + mm_argc = rcfg->argv->nelts; + add_property_long(return_value, "argc", mm_argc); + + MAKE_STD_ZVAL(argv); + array_init(argv); + for (i = 0; i < mm_argc; i++) { + add_index_string(argv, i, mm_argv[i], 1); + } + + /* EEH {HACK ALERT}: We add this property with hash_update + manually since Zend doesn't offer a add_property_array. + */ + zend_hash_update(return_value->value.obj.properties, "argv", 5, + &argv, sizeof(argv), NULL); + + add_property_string(return_value, "uri", rcfg->req->uri, 1); + + add_property_stringl(return_value, "self", + rcfg->req->uri, rcfg->self_len, 1); +} + +MGD_FUNCTION(auth_midgard) +{ + zval **username, **password, **send_cookie; + char *cookie1; + static const char *cookie2; + char cookie3[256]; + static const char *u, *p; + int rv; + int sc; + + request_rec *r; + + SLS_FETCH(); + + r = ((request_rec *) SG(server_context)); + + CHECK_MGD; + + RETVAL_FALSE; + + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &username, &password) != + SUCCESS) { + WRONG_PARAM_COUNT; + } + sc = 1; + break; + + case 3: + if (zend_get_parameters_ex + (3, &username, &password, + &send_cookie) != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_boolean_ex(send_cookie); + sc = (*send_cookie)->value.lval; + break; + + default: + WRONG_PARAM_COUNT; + break; + } + + convert_to_string_ex(username); + convert_to_string_ex(password); + + if ((*username)->value.str.len) + u = ap_pstrdup(mgd_rcfg()->pool, (*username)->value.str.val); + else + u = ""; + if ((*password)->value.str.len) + p = ap_pstrdup(mgd_rcfg()->pool, (*password)->value.str.val); + else + p = ""; + + rv = mgd_auth(mgd_handle(), u, p); + if (rv >= 0 && sc) { + cookie1 = ap_psprintf(r->pool, "%s:%s", + (*username)->value.str.val, + (*password)->value.str.val); + cookie2 = ap_uuencode(r->pool, cookie1); + sprintf(cookie3, + "MidgardLogin=%s;" + " Expires=Friday, 1-Jan-%d10 12:00:00 GMT;" + " Path=/", cookie2, mgd_user(mgd_handle())? 20 : 10); + ap_table_set(r->headers_out, "Set-Cookie", + cookie3); + } + + switch (rv) { + case MGD_AUTH_NOT_CONNECTED: + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + + case MGD_AUTH_INVALID_NAME: + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_NAME); + + case MGD_AUTH_SG_NOTFOUND: + RETURN_FALSE_BECAUSE(MGD_ERR_SG_NOTFOUND); + + case MGD_AUTH_DUPLICATE: + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + + case MGD_AUTH_NOTFOUND: + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + case MGD_AUTH_REAUTH: + case MGD_AUTH_INVALID_PWD: + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + default: + if (rv >= 0) { + RETVAL_TRUE; + } + else { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + } +} + +#endif /* HAVE_MIDGARD */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ Index: php4/ext/midgard/mkall diff -u /dev/null php4/ext/midgard/mkall:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/mkall Sat Feb 17 15:21:50 2001 @@ -0,0 +1,7 @@ +#!/bin/sh + +[ "x$1" != "x" ] && MIDGARD_PATH="=$1" + +[ -f Makefile ] && make distclean +rm -f preparser-scanner.c preparser-parser.c preparser-parser.h +phpize && ./configure --with-midgard$MIDGARD_PATH && make install Index: php4/ext/midgard/oop.c diff -u /dev/null php4/ext/midgard/oop.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/oop.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,498 @@ +/* $Id: oop.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +typedef char *charp; +void mgd_object_init(zval *obj, ...) +{ +/* TODO: DG: not needed anymore cause php_midgard_bless initializes the object + * with all the properties (didn't check everywhere yet though) + +va_list args; +char *propname; + + va_start(args, obj); + while ((propname = va_arg(args, charp)) != NULL) { + add_property_unset(obj, propname); + } + va_end(args); +*/ +} + +void php_midgard_bless(zval *object, MidgardClass *species) +{ + object_init_ex(object, species->entry_ptr); + php_midgard_ctor(object, species); +} + +void php_midgard_ctor(zval *object, MidgardClass *species) +{ + MidgardProperty *midgard_props; + + /* add default properties */ + add_property_string(object, "__table__", (char*)species->table, 1); + add_property_long(object, "id", 0); + add_property_long(object, "sitegroup", 0); + + /* add other properties */ + for (midgard_props = species->properties; midgard_props && + midgard_props->name; +midgard_props++) { + switch(midgard_props->type) { + case IS_LONG: + add_property_long(object, midgard_props->name, 0); + break; + case IS_STRING: + add_property_string(object, midgard_props->name, "", +1); + break; + default: /* should not happen, but just in case */ + add_property_unset(object, midgard_props->name); + break; + } + } +} + +void php_midgard_bless_oop(zval *object, MidgardClass *species) +{ + object_init_ex(object, species->entry_ptr); + + add_property_string(object, "__table__", (char*)species->table, 1); + add_property_long(object, "id", 0); + add_property_long(object, "sitegroup", 0); +} + +zval _midgard_getset_property(MidgardClass *species, + zend_property_reference +*property_reference, + zval *value) +{ + zval result, **ppresult; + zval *object = property_reference->object; + + /* get the property name */ + zend_llist_element *element = property_reference->elements_list->head; + zend_overloaded_element *property=(zend_overloaded_element *)element->data; + char * propname = property->element.value.str.val; + int proplen = property->element.value.str.len; + + INIT_ZVAL(result); + + if(value == NULL) { /* get +property */ +/* DG: this should never happen now (check midgard.c MINIT function, + * the get_property is set to NULL) */ + if(zend_hash_find(object->value.obj.properties, propname, proplen+1, + (void **)&ppresult) == FAILURE) { + php_error(E_WARNING, + "Midgard: Property '%s' is not a +member of %s", + propname, species->name); + } else { + result = **ppresult; + zval_copy_ctor(&result); + return result; + } + + } else if(strcasecmp("__table__", propname)) { /* set r/w property */ + zend_hash_update(object->value.obj.properties, propname, proplen+1, + &value, sizeof(zval *), NULL); + } else { + /* cannot set ro property */ + php_error(E_WARNING, + "Midgard: Write access to property +'%s' forbidden", + propname); + } + return result; +} + +void php_midgard_delete(zval * return_value, const char *table, int id) +{ + if (!mgd_rcfg()) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + } + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (mgd_delete(mgd_handle(), table, id)) { + RETURN_TRUE; + } + + RETVAL_FALSE_BECAUSE(MGD_ERR_INTERNAL); + + /* EEH: TODO: log_error( + "Midgard: delete of %s %d failed", + table ? table : "<null class>", id); + */ +} + +void php_midgard_delete_repligard(const char *table, int id) +{ + if (!mgd_rcfg()) + return; + + (void) mgd_delete_repligard(mgd_handle(), table, id); +} + +void php_midgard_update(zval * return_value, const char *table, + const char *fields, int id, ...) +{ + va_list args; + RETVAL_FALSE_BECAUSE(MGD_ERR_INTERNAL); + + if (!mgd_rcfg()) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + } + + va_start(args, id); + if (mgd_vupdate(mgd_handle(), table, id, fields, args)) { + RETVAL_TRUE; + } + else { + /* EEH: TODO: log_error( + "Midgard: update of %s %d failed", + table ? table : "<null class>", id); + */ + } + + va_end(args); +} + +void php_midgard_create(zval * return_value, const char *table, + const char *fields, const char *values, ...) +{ + va_list args; + int id; + CHECK_MGD; + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + va_start(args, values); + id = mgd_vcreate(mgd_handle(), table, fields, values, args); + va_end(args); + + if (!id) { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + + /* EEH: TODO: log_error( + "Midgard: create of %s failed", + table ? table : "<null class>"); */ + } + + RETVAL_LONG(id); +} + +void php_midgard_select(MidgardClass *species, zval * return_value, + const char *fields, const char *tables, + const char *where, const char *order, ...) +{ + va_list args; + midgard_res *res; + + if (!mgd_rcfg()) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + } + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + va_start(args, order); + res = + mgd_sitegroup_vselect(mgd_handle(), fields, tables, where, order, + args); + va_end(args); + if (res) { + php_midgard_bless_oop(return_value, species); + add_property_long(return_value, "N", mgd_rows(res)); + add_property_long(return_value, "__res__", (long) res); + } +} + +#if HAVE_MIDGARD_SITEGROUPS +void php_midgard_sitegroup_get(MidgardClass *species, zval * return_value, + int grouped, const char *fields, const char *table, int id); +void php_midgard_get(MidgardClass *species, zval * return_value, + const char *fields, const char *table, int id) +{ + php_midgard_sitegroup_get(species, return_value, 1, fields, table, id); +} + +void php_midgard_sitegroup_get(MidgardClass *species, zval * return_value, + int grouped, const char *fields, const char *table, int id) +#else +void php_midgard_get(MidgardClass *species, zval * return_value, + const char *fields, const char *table, int id) +#endif +{ + midgard_res *res; + int i; + midgard_res *params = NULL; + midgard_pool *pool = NULL; + char *propname, *value=NULL; + + if (!mgd_rcfg()) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_CONNECTED); + } + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + +#if HAVE_MIDGARD_SITEGROUPS + if (grouped) + res = mgd_sitegroup_record(mgd_handle(), fields, table, id); + else + res = mgd_ungrouped_record(mgd_handle(), fields, table, id); +#else + res = mgd_ungrouped_record(mgd_handle(), fields, table, id); +#endif + if (res && mgd_fetch(res)) { + php_midgard_bless_oop(return_value, species); + + params = + mgd_ungrouped_select(mgd_handle(), "domain,name,value", + "record_extension", + "tablename=$q AND oid=$d", NULL, table, + id); + if (params) { + pool = mgd_alloc_pool(); + while (mgd_fetch(params)) { + propname = + mgd_format(mgd_handle(), pool, "$s_$s", + mgd_colvalue(params, 0), + mgd_colvalue(params, 1)); + add_property_string(return_value, propname, + (char*)mgd_colvalue (params, 2), +1); + } + } + + for (i = 0; i < mgd_cols(res); i++) { + if((value = (char *)mgd_colvalue(res, i)) == NULL ) { + value = ""; + } + add_property_string(return_value, + (char*)mgd_colname(res, i), + value, 1); + } + } + + if (res) + mgd_release(res); + if (params) + mgd_release(params); + if (pool) + mgd_free_pool(pool); +} + +/* + midgard_get_by_name is responsible for returning topics and articles using + their names instead ids. In other aspects it is equal to midgard_get. + Additional parameters are: + idfield - name of field used for id compare (should be 'topic' for article + and 'up' for topic) + parent_id - id of idfield of seeking record (father's id for topic & article) + name - name of topic or article + It allows to use equal names of articles and subtopics under different topics +*/ + +void php_midgard_get_by_name(MidgardClass *species, zval * return_value, + const char *fields, const char *table, + const char *idfield, int parent_id, const char *name) +{ + midgard_res *res; + char * value=NULL; + int i; + CHECK_MGD; + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + res = + mgd_record_by_name(mgd_handle(), fields, table, idfield, + parent_id, name); + if (res && mgd_fetch(res)) { + php_midgard_bless_oop(return_value, species); + for (i = 0; i < mgd_cols(res); i++) { + if((value = (char *)mgd_colvalue(res, i)) == NULL ) { + value = ""; + } + add_property_string(return_value, + (char*)mgd_colname(res, i), + value, 1); + } + } + if (res) + mgd_release(res); +} + +void php_midgard_get_by_name2(MidgardClass *species, zval * return_value, + const char *fields, const char *table, + const char *firstfield, const char *first, + const char *secondfield, const char *second) +{ + midgard_res *res; + char *value=NULL; + int i; + + CHECK_MGD; + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + res = mgd_record_by_name2(mgd_handle(), fields, table, + firstfield, first, secondfield, second); + if (res && mgd_fetch(res)) { + php_midgard_bless_oop(return_value, species); + for (i = 0; i < mgd_cols(res); i++) { + if((value = (char *)mgd_colvalue(res, i)) == NULL ) { + value = ""; + } + add_property_string(return_value, + (char*)mgd_colname(res, i), + value, 1); + } + } + if (res) + mgd_release(res); +} + +void php_midgard_get_by_name_only(MidgardClass *species, zval * return_value, + const char *fields, const char *table, + const char *name) +{ + midgard_res *res; + int i; + char *value=NULL; + CHECK_MGD; + + RETVAL_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + res = mgd_record_by_name_only(mgd_handle(), fields, table, name); + if (res && mgd_fetch(res)) { + php_midgard_bless_oop(return_value, species); + for (i = 0; i < mgd_cols(res); i++) { + if((value = (char *)mgd_colvalue(res, i)) == NULL ) { + value = ""; + } + add_property_string(return_value, + (char*)mgd_colname(res, i), + value, 1); + } + } + if (res) + mgd_release(res); +} + +MGD_FUNCTION(oop_guid_get) +{ + zval *self; + zval **zv_table, **zv_id; + midgard_pool *pool; + char *guid; + + CHECK_MGD; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find + (self->value.obj.properties, "__table__", 10, + (void **) &zv_table) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find + (self->value.obj.properties, "id", 3, + (void **) &zv_id) != + SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + pool = mgd_pool(mgd_handle()); + guid = + mgd_repligard_guid(mgd_handle(), pool, (*zv_table)->value.str.val, + (*zv_id)->value.lval); + if (guid) { + RETVAL_STRING(guid, 1); + mgd_free_from_pool(pool, guid); + } + else { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } +} + +MGD_FUNCTION(oop_list_fetch) +{ + zval *self; + zval **key; + midgard_res *res; + int i; + + CHECK_MGD; + RETVAL_FALSE; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "__res__", 8, (void + **) &key) + != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + if ((res = (midgard_res *) (*key)->value.lval) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + if (mgd_fetch(res)) { + for (i = 0; i < mgd_cols(res); i++) + add_property_string(self, (char*)mgd_colname(res, i), + (char*)mgd_colvalue(res, i), 1); + RETVAL_TRUE; + } else { + mgd_release(res); + zend_hash_del(self->value.obj.properties, "__res__", 8); + + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } +} + +MidgardClassPtr MidgardClasses [] = { + &MidgardArticle, + &MidgardAttachment, + &MidgardElement, + &MidgardEvent, + &MidgardEventMember, + &MidgardFile, + &MidgardGroup, + &MidgardHost, + &MidgardImage, + &MidgardMember, + &MidgardPage, + &MidgardPageElement, + &MidgardParameter, + &MidgardPerson, + &MidgardPreferences, +#if HAVE_MIDGARD_SITEGROUPS + &MidgardSitegroup, +#endif + &MidgardSnippet, + &MidgardSnippetdir, + &MidgardStyle, + &MidgardTopic, + NULL +}; Index: php4/ext/midgard/page.c diff -u /dev/null php4/ext/midgard/page.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/page.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,334 @@ +/* $Id: page.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_page_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(ispageowner(id)); +} + +MGD_FUNCTION(copy_page) +{ + zval **id, **root; int id_r; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &root) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + convert_to_long_ex(root); + +#if HAVE_MIDGARD_SITEGROUPS + /* root must be in same SG or be 0 */ + if ((*root)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "page src, page +tgt", + +"src.id=$d AND tgt.id=$d" + " AND +(src.sitegroup=tgt.sitegroup" + + " OR src.sitegroup=0" + + " OR tgt.sitegroup=0)", + +(*id)->value.lval,(*root)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + id_r = mgd_copy_page(mgd_handle(), (*id)->value.lval); + if(id_r) { + php_midgard_update(return_value, "page", "up=$i", id_r, (*root)->value.lval); + PHP_UPDATE_REPLIGARD("page",id_r); + } + RETVAL_LONG(id_r); +} + +MGD_FUNCTION(list_pages) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardPage, return_value, "page.id AS +id,name,style,title,changed,author," + NAME_FIELD " AS authorname", "page,person", + "up=$d AND person.id=page.author", "name", id); +} + +MGD_FUNCTION(is_in_page_tree) +{ + zval **root, **page; + int *ids, i; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &root, &page) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(root); + convert_to_long_ex(page); + + ids = mgd_tree(mgd_handle(), "page", (*root)->value.lval, 0, NULL); + if (ids) + for (i = 0; ids[i]; i++) + if (ids[i] == (*page)->value.lval) RETURN_TRUE; +} + +MGD_FUNCTION(get_page) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardPage); + mgd_object_init(return_value, "up", "name", "style", "title", +"content", "author", "auth", "active", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardPage, return_value, +"id,up,name,style,title,changed,content,author," + "info&1=1 AS auth,info&2=2 AS active", + "page", (*id)->value.lval); +} + +MGD_FUNCTION(get_page_by_name) +{ + zval **root, **page; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &root, &page) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(root); + convert_to_string_ex(page); + + php_midgard_get_by_name(&MidgardPage, return_value, +"id,up,name,style,title,changed,content,author," + "info&1=1 AS auth,info&2=2 AS active", + "page", "up", (*root)->value.lval, (*page)->value.str.val); +} + +MGD_FUNCTION(create_page) +{ + zval **up, **name, **style, **title, **content, **author, **auth, **active, +*self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "style", style) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "content", content) + || !MGD_PROPFIND(self, "author", author) + || !MGD_PROPFIND(self, "auth", auth) + || !MGD_PROPFIND(self, "active", active) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 8 + || zend_get_parameters_ex(8, &up, &name, &style, &title, + &content, &author, &auth, + &active) == FAILURE) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_string_ex(name); + convert_to_long_ex(style); + convert_to_string_ex(title); + convert_to_string_ex(content); + convert_to_long_ex(author); + convert_to_long_ex(auth); + convert_to_long_ex(active); + + if (!ispageowner((*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if ((*up)->value.lval != 0 + && mgd_exists_id(mgd_handle(), "page", "up=$d AND name=$q", + (*up)->value.lval, (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "page", + "id=$d", + (*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* style must be in same SG or be 0 */ + if ((*style)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "style", + "id=$d", + (*style)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* author must be in same SG or be 0 */ + if ((*author)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "person", + "id=$d", + (*author)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "page", + "up,name,style,title,changed,content,author,info", + "$d,$q,$d,$q,Curdate(),$q,$d,$d", + (*up)->value.lval, (*name)->value.str.val, + (*style)->value.lval, (*title)->value.str.val, + (*content)->value.str.val, (*author)->value.lval, + ((*auth)->value.lval == 1) | ((*active)->value.lval == + 1) << 1); + + PHP_CREATE_REPLIGARD("page", return_value->value.lval); +} + +MGD_FUNCTION(update_page) +{ + zval **id, **name, **style, **title, **content, **author, **auth, **active, +*self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "style", style) + || !MGD_PROPFIND(self, "title", title) + || !MGD_PROPFIND(self, "content", content) + || !MGD_PROPFIND(self, "author", author) + || !MGD_PROPFIND(self, "auth", auth) + || !MGD_PROPFIND(self, "active", active) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 8 + || zend_get_parameters_ex(8, &id, &name, &style, &title, + &content, &author, &auth, + &active) == FAILURE) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_long_ex(style); + convert_to_string_ex(title); + convert_to_string_ex(content); + convert_to_long_ex(author); + convert_to_long_ex(auth); + convert_to_long_ex(active); + + if (!ispageowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* style must be in same SG or be 0 */ + if ((*style)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "page,style", + "page.id=$d AND style.id=$d" + " AND (page.sitegroup=style.sitegroup" + " OR page.sitegroup=0" " OR style.sitegroup=0)", + (*id)->value.lval, (*style)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* author must be in same SG or be 0 */ + if ((*author)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "page,person", + "page.id=$d AND person.id=$d" + " AND (page.sitegroup=person.sitegroup" + " OR page.sitegroup=0" + " OR person.sitegroup=0)", (*id)->value.lval, + (*author)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_update(return_value, "page", + "name=$q,style=$d,title=$q,changed=Curdate()," + "content=$q,author=$d,info=$d", (*id)->value.lval, + (*name)->value.str.val, (*style)->value.lval, + (*title)->value.str.val, (*content)->value.str.val, + (*author)->value.lval, + ((*auth)->value.lval == 1) | ((*active)->value.lval == 1) +<< 1); + PHP_UPDATE_REPLIGARD("page", (*id)->value.lval); +} + +MGD_FUNCTION(delete_page) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"page") + || mgd_exists_id(mgd_handle(), "page", "up=$d", id) + || mgd_exists_id(mgd_handle(), "host", "root=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!ispageowner(id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + /* check for page elements */ + if (mgd_exists_id(mgd_handle(), "pageelement", "page=$d", id)) +RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); +#if HAVE_MIDGARD_PAGELINKS + /* check for page links */ + if (mgd_exists_id(mgd_handle(), "pagelink", "$d IN (up,target)", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); +#endif + + php_midgard_delete(return_value, "page", id); + PHP_DELETE_REPLIGARD("page", id); +} + +MGD_FUNCTION(page_has_children) +{ + IDINIT; + CHECK_MGD; + RETVAL_FALSE; + if (mgd_exists_id(mgd_handle(), "page", "up=$d", id)) { RETVAL_TRUE; } +} +MGD_FUNCTION(delete_page_tree) +{ + IDINIT; + CHECK_MGD; + RETVAL_FALSE; + if (!ispageowner(mgd_idfield(mgd_handle(), "up", "page", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if(mgd_exists_id(mgd_handle(), "host", "root=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_delete_page(mgd_handle(), id)) + RETVAL_TRUE; +} + +MGD_MOVE_FUNCTION(page,page,page,up) + +MidgardProperty MidgardPageProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_STRING, "title" }, + { IS_STRING, "content" }, + { IS_LONG, "style" }, + { IS_LONG, "author" }, + { IS_LONG, "auth" }, + { IS_LONG, "active" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardPage, page) Index: php4/ext/midgard/pageelement.c diff -u /dev/null php4/ext/midgard/pageelement.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/pageelement.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,225 @@ +/* $Id: pageelement.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_page_elements) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardPageElement, return_value, "id,name", "pageelement", +"page=$d", "name", id); +} + +MGD_FUNCTION(get_page_element) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardPageElement); + mgd_object_init(return_value, "page", "name", "value", "inherit", +NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardPageElement, return_value, "id,page,name,value,info&1 AS +inherit", + "pageelement", (*id)->value.lval); +} + +MGD_FUNCTION(get_page_element_by_name) +{ + zval **page, **name; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &page, &name) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(page); + convert_to_string_ex(name); + php_midgard_get_by_name(&MidgardPageElement, return_value, +"id,page,name,value,info&1 AS inherit", + "pageelement", "page", (*page)->value.lval, (*name)->value.str.val); +} + +MGD_FUNCTION(create_page_element) +{ + zval **page, **name, **value, **inherit, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "page", page) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "value", value) + || !MGD_PROPFIND(self, "inherit", inherit) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &page, &name, &value, + &inherit) != SUCCESS) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(page); + convert_to_string_ex(name); + convert_to_string_ex(value); + convert_to_long_ex(inherit); + + if (!(*page)->value.lval || !mgd_exists_id(mgd_handle(), "page", "id=$d", + (*page)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (!ispageowner((*page)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (mgd_exists_id(mgd_handle(), "pageelement", "page=$d AND name=$q", + (*page)->value.lval, (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + +#if HAVE_MIDGARD_SITEGROUPS + /* page must be in same SG or be 0 */ + if ((*page)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "page", + "id=$d", + (*page)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "pageelement", "page,name,value,info", + "$d,$q,$q,$d", (*page)->value.lval, (*name)->value.str.val, + (*value)->value.str.val, ((*inherit)->value.lval != 0)); + + PHP_CREATE_REPLIGARD("pageelement", return_value->value.lval); +} + +MGD_FUNCTION(update_page_element) +{ + zval **id, **name, **value, **inherit, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "value", value) + || !MGD_PROPFIND(self, "inherit", inherit) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &id, &name, &value, + &inherit) != SUCCESS) WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(value); + convert_to_long_ex(inherit); + + if (!ispageowner(mgd_idfield(mgd_handle(), "page", "pageelement", + (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "pageelement", + "name=$q,value=$q,info=$d", (*id)->value.lval, + (*name)->value.str.val, (*value)->value.str.val, + ((*inherit)->value.lval != 0)); + PHP_UPDATE_REPLIGARD("pageelement", (*id)->value.lval); +} + +MGD_FUNCTION(delete_page_element) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"pageelement")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!ispageowner(mgd_idfield(mgd_handle(), "page", "pageelement", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "pageelement", id); + PHP_DELETE_REPLIGARD("pageelement", id); +} + +MGD_FUNCTION(copy_page_element) +{ + zval **id, **newpage; + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &newpage) != SUCCESS) + WRONG_PARAM_COUNT; + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + newpage = NULL; + break; + default: + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + if(newpage) convert_to_long_ex(newpage); + +#if HAVE_MIDGARD_SITEGROUPS + /* newpage must be in same SG or be 0 */ + if (newpage && (*newpage)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "page src,page tgt", + +"src.id=$d AND tgt.id=$d" + " AND +(src.sitegroup=tgt.sitegroup" + + " OR src.sitegroup=0" + + " OR tgt.sitegroup=0)", + +(*id)->value.lval, (*newpage)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + RETVAL_LONG(mgd_copy_page_element(mgd_handle(), (*id)->value.lval, + newpage ? (*newpage)->value.lval : 0)); + +} + + +MGD_MOVE_FUNCTION(pageelement,page,page_element,page) + +MidgardProperty MidgardPageElementProperties [] = { + { IS_LONG, "page" }, + { IS_STRING, "name" }, + { IS_STRING, "value" }, + { IS_LONG, "inherit" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardPageElement, page_element) Index: php4/ext/midgard/pagelink.c diff -u /dev/null php4/ext/midgard/pagelink.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/pagelink.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,284 @@ +/* $Id: pagelink.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(has_pagelinks) +{ +#if HAVE_MIDGARD_PAGELINKS + RETURN_TRUE; +#else + RETURN_FALSE; +#endif +} + +#if HAVE_MIDGARD_PAGELINKS +/* pagelink */ + +MGD_FUNCTION(is_pagelink_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(ispagelinkowner(id)); +} + + +MGD_FUNCTION(list_pagelinks) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardPagelink, return_value, + "pagelink.id AS id," + "pagelink.name AS name," + "pagelink.grp," + "pagelink.up," + "pagelink.target," + "page.name AS pname," + "page.style," + "page.title," + "page.changed," + "page.author," + NAME_FIELD " AS authorname", + "pagelink,page,person", + "pagelink.up=$d AND pagelink.target=page.id AND person.id=page.author", + "pagelink.name", id); +} + +MGD_FUNCTION(list_pagelinks_targeted_at) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardPagelink, return_value, + "pagelink.id AS id," + "pagelink.name AS name," + "pagelink.grp," + "pagelink.up," + "pagelink.target," + "page.name AS pname," + "page.style," + "page.title," + "page.changed," + "page.author," + NAME_FIELD " AS authorname", + "pagelink,page,person", + "pagelink.target=$d AND pagelink.up=page.id AND person.id=page.author", + "pagelink.name", id); +} + +MGD_FUNCTION(get_pagelink) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardPagelink); + mgd_object_init(return_value, "up", "name", "target", "grp", "owner", +NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardPagelink, return_value, "id,up,name,target,grp,owner", + "pagelink", (*id)->value.lval); +} + +MGD_FUNCTION(get_pagelink_by_name) +{ + zval **root, **pagelink; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &root, &pagelink) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(root); + convert_to_string_ex(pagelink); + + php_midgard_get_by_name(&MidgardPagelink, return_value, +"id,up,name,target,grp,owner", + "pagelink", "up", (*root)->value.lval, (*pagelink)->value.str.val); +} + +MGD_FUNCTION(create_pagelink) +{ + zval **up, **name, **target, **grp, **owner, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "target", target) + || !MGD_PROPFIND(self, "grp", grp) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 5 + || zend_get_parameters_ex(5, &up, &name, &target, &grp, &owner) == +FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_string_ex(name); + convert_to_long_ex(target); + convert_to_long_ex(grp); + convert_to_long_ex(owner); + + if (!(*up)->value.lval || !ispageowner((*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if (!(*target)->value.lval || !ispageowner((*target)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if (mgd_exists_id(mgd_handle(), "pagelink", "up=$d AND name=$q and grp=$d", + (*up)->value.lval, (*name)->value.str.val, +(*grp)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "page", + "id=$d AND sitegroup IN (0,$d)", + (*up)->value.lval, mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* target must be in same SG or be 0 */ + if ((*target)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "page", + "id=$d AND sitegroup IN (0,$d)", + (*target)->value.lval, mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* grp must be in same SG or be 0 */ + if ((*grp)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d AND sitegroup IN (0,$d)", + (*grp)->value.lval, mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* owner must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d AND sitegroup IN (0,$d)", + (*owner)->value.lval, mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "pagelink", + "up,name,target,grp,owner", + "$d,$q,$d,$d,$d", + (*up)->value.lval, (*name)->value.str.val, + (*target)->value.lval, + (*grp)->value.lval, (*owner)->value.lval); + PHP_CREATE_REPLIGARD("pagelink",return_value->value.lval); +} + +MGD_FUNCTION(update_pagelink) +{ + zval **id, **name, **target, **grp, **owner, *self; + + RETVAL_FALSE; + CHECK_MGD; + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "target", target) + || !MGD_PROPFIND(self, "grp", grp) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 5 + || zend_get_parameters_ex(5, &id, &name, &target, &grp, &owner) == FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_long_ex(target); + convert_to_long_ex(grp); + convert_to_long_ex(owner); + + if (!ispagelinkowner((*id)->value.lval) + || !ispageowner((*target)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* target must be in same SG or be 0 */ + if ((*target)->value.lval == 0 || !mgd_exists_bool(mgd_handle(), +"page,pagelink", + +"pagelink.id=$d AND page.id=$d" + " AND +(pagelink.sitegroup=page.sitegroup" + + " OR pagelink.sitegroup=0" + + " OR page.sitegroup=0)", + +(*id)->value.lval, (*target)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* grp must be in same SG or be 0 */ + if ((*grp)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "pagelink,grp", + +"pagelink.id=$d AND grp.id=$d" + " AND +(pagelink.sitegroup=grp.sitegroup" + + " OR pagelink.sitegroup=0" + + " OR grp.sitegroup=0)", + +(*id)->value.lval, (*grp)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* owner must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "pagelink,grp", + +"pagelink.id=$d AND grp.id=$d" + " AND +(pagelink.sitegroup=grp.sitegroup" + + " OR pagelink.sitegroup=0" + + " OR grp.sitegroup=0)", + +(*id)->value.lval, (*owner)->value.lval)) +RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_update(return_value, "pagelink", + "name=$q,target=$d,grp=$d,owner=$d", + (*id)->value.lval, + (*name)->value.str.val, (*target)->value.lval, (*grp)->value.lval, + (*owner)->value.lval); + PHP_UPDATE_REPLIGARD("pagelink",(*id)->value.lval); +} + +MGD_FUNCTION(delete_pagelink) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"pagelink")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!ispagelinkowner(id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_delete(return_value, "pagelink", id); + PHP_DELETE_REPLIGARD("pagelink", id); +} +/* /pagelink */ + +MidgardProperty MidgardPagelinkProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_LONG, "target" }, + { IS_LONG, "grp" }, + { IS_LONG, "owner" }, + { 0, NULL } +}; +MIDGARD_CLASS(MidgardPagelink, pagelink) + +#endif + + Index: php4/ext/midgard/parameter.c diff -u /dev/null php4/ext/midgard/parameter.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/parameter.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,323 @@ +/* $Id: parameter.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "php.h" +#include "php_ini.h" +#include "php_midgard.h" +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION (oop_parameter) +{ + zval *self; + zval **zv_domain, **zv_name, **zv_value; + zval **zv_table, **zv_id; + int id = 0; + midgard_res *res; + int exists; + + CHECK_MGD; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "__table__", 10, + (void **) &zv_table) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "id", 3, + (void **) &zv_id) != + SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(zv_table); + convert_to_long_ex(zv_id); + + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &zv_domain, &zv_name) == + FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(zv_domain); + convert_to_string_ex(zv_name); + zv_value = NULL; + break; + + case 3: + if (zend_get_parameters_ex + (3, &zv_domain, &zv_name, &zv_value) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(zv_domain); + convert_to_string_ex(zv_name); + convert_to_string_ex(zv_value); + break; + + default: + WRONG_PARAM_COUNT; + } + + res = mgd_ungrouped_select(mgd_handle(), "id,value,sitegroup", + "record_extension", + "tablename=$q AND oid=$d AND domain=$q AND name=$q", + NULL, + (*zv_table)->value.str.val, + (*zv_id)->value.lval, + (*zv_domain)->value.str.val, + (*zv_name)->value.str.val); + + exists = res ? mgd_fetch(res) : 0; + if (exists) + id = atoi(mgd_colvalue(res, 0)); + + /* delete parameter */ + if (zv_value && (*zv_value)->value.str.len == 0) { + + if (res) { mgd_release(res); } + + if (!isglobalowner( + mgd_lookup_table_id((*zv_table)->value.str.val), + (*zv_id)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (!exists) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + if (mgd_delete(mgd_handle(), "record_extension", id)) { + PHP_DELETE_REPLIGARD("record_extension", id); + RETURN_TRUE; + } + else { + RETURN_FALSE_BECAUSE(MGD_ERR_INTERNAL); + } + } + + /* return parameter */ + if (!zv_value) { + + if (!res) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + if (!exists) { + mgd_release(res); + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + RETVAL_STRING((char *) mgd_colvalue(res, 1), 1); + } + else { + /* update parameter */ + + if (exists) { + if (!isglobalowner( + +mgd_lookup_table_id((*zv_table)->value.str.val), + (*zv_id)->value.lval)) { + if (res) mgd_release(res); + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + php_midgard_update(return_value, "record_extension", + "value=$q", id, + (*zv_value)->value.str.val); + PHP_UPDATE_REPLIGARD("record_extension", id); + } + else { + php_midgard_create(return_value, "record_extension", + "tablename,oid,domain,name,value", + "$q,$d,$q,$q,$q", + (*zv_table)->value.str.val, + (*zv_id)->value.lval, + (*zv_domain)->value.str.val, + (*zv_name)->value.str.val, + (*zv_value)->value.str.val); + PHP_CREATE_REPLIGARD("record_extension", + return_value->value.lval); + } + } + + if (res) + mgd_release(res); +} + +MGD_FUNCTION(oop_parameter_list) +{ + zval *self; + zval **zv_domain; + zval **zv_table, **zv_id; + + CHECK_MGD; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "id", 3, + (void **) &zv_id) != + SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "__table__", 10, + (void **) &zv_table) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(zv_table); + convert_to_long_ex(zv_id); + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &zv_domain) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(zv_domain); + break; + + case 0: + zv_domain = NULL; + break; + + default: + WRONG_PARAM_COUNT; + } + + if (zv_domain) + php_midgard_select(&MidgardParameter, return_value, + "domain,name,value", + "record_extension", + "tablename=$q AND oid=$d AND domain=$q", + "name", + (*zv_table)->value.str.val, + (*zv_id)->value.lval, + (*zv_domain)->value.str.val); + else + php_midgard_select(&MidgardParameter, return_value, + "DISTINCT domain", + "record_extension", + "tablename=$q AND oid=$d", "domain", + (*zv_table)->value.str.val, + (*zv_id)->value.lval); +} + +MGD_FUNCTION(oop_parameter_search) +{ + zval *self, **table; + zval **where, **all; + char *cond = NULL; + midgard_pool *pool; + + RETVAL_FALSE; + + CHECK_MGD; + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "__table__", 10, + (void **) &table) + != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(table); + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &where) != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(where); + all = NULL; + break; + case 2: + if (zend_get_parameters_ex(2, &where, &all) != SUCCESS) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(where); + convert_to_boolean_ex(all); + break; + default: + WRONG_PARAM_COUNT; + } + + if (*((*table)->value.str.val) == '\0') { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + if (!(pool = mgd_alloc_pool())) { + RETURN_FALSE_BECAUSE(MGD_ERR_NO_MEM); + } + + cond = mgd_format(mgd_handle(), pool, "tablename = $q AND ($s)", + (*table)->value.str.val, + ((*((*where)->value.str.val) == '\0') ? (*where)-> + value.str.val : "1=1") + ); + + if (all != NULL && (*all)->value.lval) { + php_midgard_select(&MidgardParameter, return_value, + "oid AS id,id AS pid,domain,name,value", + "record_extension", cond, NULL); + } + else { + php_midgard_select(&MidgardParameter, return_value, + "DISTINCT oid AS id", + "record_extension", cond, NULL); + } + + mgd_free_pool(pool); +} + +MidgardProperty MidgardParameterProperties [] = { + { IS_LONG, "oid" }, + { IS_STRING, "tablename" }, + { IS_STRING, "domain" }, + { IS_STRING, "name" }, + { IS_STRING, "value" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(parameter) +static zend_function_entry MidgardParameterMethods[] = { +// MidgardParameter class constructor +// PHP_FALIAS(midgardparameter, mgd_ctor_parameter, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + { NULL, NULL, NULL} +}; +MidgardClass MidgardParameter = { + "MidgardParameter", + "record_extension", + MidgardParameterMethods, + {}, + mgd_parameter_call_function_handler, + mgd_parameter_get_property_handler, + mgd_parameter_set_property_handler, + MidgardParameterProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardParameter, parameter) + Index: php4/ext/midgard/person.c diff -u /dev/null php4/ext/midgard/person.c:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/person.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,522 @@ +/* $Id: person.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +int isowner() +{ + return mgd_isadmin(mgd_handle()) || mgd_exists_id(mgd_handle(), "grp", + "owner IN $D", mgd_groups(mgd_handle())); +} + +MGD_FUNCTION(is_person_owner) +{ + IDINIT; + + CHECK_MGD; + RETVAL_LONG(isuserowner(id)); +} + +MGD_FUNCTION(is_member) +{ +zval **zv_gid, **zv_uid;; + + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &zv_gid)==FAILURE) { +WRONG_PARAM_COUNT; } + convert_to_long_ex(zv_gid); + RETVAL_LONG(mgd_ismember(mgd_handle(), (*zv_gid)->value.lval)); + break; + + case 2: + if (zend_get_parameters_ex(2, &zv_gid, &zv_uid)==FAILURE) { + WRONG_PARAM_COUNT; + } + RETVAL_LONG(mgd_exists_id(mgd_handle(), "member", + + "uid=$d AND gid=$d", + + (*zv_uid)->value.lval, + + (*zv_gid)->value.lval)) + break; + + default: + WRONG_PARAM_COUNT; + break; + } +} + +MGD_FUNCTION(list_persons) +{ + php_midgard_select(&MidgardPerson, return_value, PERSON_SELECT, + "person", NULL, "lastname,firstname"); +} + +static const char *person_sort(const char *order) +{ + static struct { const char *order, *sort; } sort[] = { + { "alpha", "lastname,firstname" }, + { "created", "created ASC" }, + { NULL, "created DESC" } + }; + int i; + + for (i = 0; sort[i].order; i++) + if (strcmp(order, sort[i].order) == 0) + return sort[i].sort; + + return sort[i].sort; +} + +MGD_FUNCTION(list_persons_in_department) +{ + const char *sortv = NULL; + zval **id, **sortn; + + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = person_sort((*sortn)->value.str.val); + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = person_sort(""); + break; + } + default: + wrong_param_count(); + } + + php_midgard_select(&MidgardPerson, return_value, PERSON_SELECT, + "person", "department=$d", sortv, (*id)->value.lval); +} + +MGD_FUNCTION(list_topic_persons) +{ + php_if_mgd_list_persons_in_department(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} + + +MGD_FUNCTION(list_persons_in_department_all) +{ + int *deps; + const char *sortv = NULL; + zval **id, **sortn; + + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = person_sort((*sortn)->value.str.val); + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = person_sort(""); + break; + } + default: + wrong_param_count(); + } + + deps = mgd_tree(mgd_handle(), "topic", (*id)->value.lval, 0, NULL); + + php_midgard_select(&MidgardPerson, return_value, PERSON_SELECT, + "person", "department IN $D", sortv, deps); +} + +MGD_FUNCTION(list_topic_persons_all) +{ + php_if_mgd_list_persons_in_department_all(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} + +MGD_FUNCTION(list_persons_in_office) +{ + const char *sortv = NULL; + zval **id, **sortn; + + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = person_sort((*sortn)->value.str.val); + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = person_sort(""); + break; + } + default: + wrong_param_count(); + } + + php_midgard_select(&MidgardPerson, return_value, PERSON_SELECT, + "person", "office=$d", sortv, (*id)->value.lval); +} + +MGD_FUNCTION(get_person) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardPerson); + mgd_object_init(return_value, "firstname", "lastname", "birthdate", +"street", "postcode", "city", "handphone", "homephone", "workphone", "homepage", +"email", "topic", "department", "office", "extra", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + if (isuserowner((*id)->value.lval)) + php_midgard_get(&MidgardPerson, return_value, "id," NAME_FIELDS "," + +"If(Left(password,2)='**',Substring(password,3),'')" + " AS password," + ADDRESS_FIELDS "," PHONE_FIELDS "," + HOMEPAGE_FIELDS "," EMAIL_FIELDS "," + "Date_format(birthdate,'%d.%m.%Y') AS +birthdate,extra," + "img,topic,department,office,pgpkey," +PUBLIC_FIELDS, + "person", (*id)->value.lval); + else + php_midgard_get(&MidgardPerson, return_value, "id," NAME_FIELDS ",'' +AS password," + "If(info&2," ADDRESS_FIELD ",'') AS +address," + PUBLIC_FIELD(2,street) "," + PUBLIC_FIELD(2,postcode) "," + PUBLIC_FIELD(2,city) "," + "If(info&4," PHONE_FIELD ",'') AS +phone," + PUBLIC_FIELD(4,handphone) "," + PUBLIC_FIELD(4,homephone) "," + PUBLIC_FIELD(4,workphone) "," + "If(info&8," HOMEPAGE_FIELD ",'') AS +homepagelink," + PUBLIC_FIELD(8,homepage) "," + "If(info&16," EMAIL_FIELD ",'') AS +emaillink," + PUBLIC_FIELD(16,email) "," + "'' AS birthdate," +PUBLIC_FIELD(32,extra) "," + PUBLIC_FIELD(32,img) +",topic,department,office,pgpkey," + PUBLIC_FIELDS, "person", +(*id)->value.lval); +} + +MGD_FUNCTION(create_person) +{ + zval **firstname, **lastname, **birthdate; + zval **street, **postcode, **city, **handphone, **homephone, **workphone; + zval **homepage, **email, **topic, **department, **office, **extra, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "firstname", firstname) + || !MGD_PROPFIND(self, "lastname", lastname) + || !MGD_PROPFIND(self, "birthdate", birthdate) + || !MGD_PROPFIND(self, "street", street) + || !MGD_PROPFIND(self, "postcode", postcode) + || !MGD_PROPFIND(self, "city", city) + || !MGD_PROPFIND(self, "handphone", handphone) + || !MGD_PROPFIND(self, "homephone", homephone) + || !MGD_PROPFIND(self, "workphone", workphone) + || !MGD_PROPFIND(self, "homepage", homepage) + || !MGD_PROPFIND(self, "email", email) + || !MGD_PROPFIND(self, "topic", topic) + || !MGD_PROPFIND(self, "department", department) + || !MGD_PROPFIND(self, "office", office) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 15 + || zend_get_parameters_ex(15, &firstname, &lastname, &birthdate, +&street, + &postcode, &city, &handphone, +&homephone, &workphone, + &homepage, &email, &topic, +&department, &office, + &extra) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(firstname); + convert_to_string_ex(lastname); + convert_to_string_ex(birthdate); + convert_to_string_ex(street); + convert_to_string_ex(postcode); + convert_to_string_ex(city); + convert_to_string_ex(handphone); + convert_to_string_ex(homephone); + convert_to_string_ex(workphone); + convert_to_string_ex(homepage); + convert_to_string_ex(email); + convert_to_long_ex(topic); + convert_to_long_ex(department); + convert_to_long_ex(office); + convert_to_string_ex(extra); + + if (!isowner()) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_create(return_value, "person", "firstname,lastname," + "birthdate,street,postcode,city,handphone," + "homephone,workphone,homepage,email," + "topic,department,office,extra,created,creator", + +"$q,$q,$t,$q,$q,$q,$q,$q,$q,$q,$q,$d,$d,$d,$q,Now(),$d", + (*firstname)->value.str.val, +(*lastname)->value.str.val, + (*birthdate)->value.str.val, + (*street)->value.str.val, +(*postcode)->value.str.val, + (*city)->value.str.val, +(*handphone)->value.str.val, + (*homephone)->value.str.val, +(*workphone)->value.str.val, + (*homepage)->value.str.val, +(*email)->value.str.val, + (*topic)->value.lval, +(*department)->value.lval, + (*office)->value.lval, +(*extra)->value.str.val, + mgd_user(mgd_handle())); + + PHP_CREATE_REPLIGARD("person",return_value->value.lval); +} + +MGD_FUNCTION(update_person) +{ + zval **id, **firstname, **lastname, **birthdate, **street, **postcode, **city; + zval **handphone, **homephone, **workphone, **homepage, **email; + zval **topic, **department, **office, **extra, *self; + + CHECK_MGD; + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "firstname", firstname) + || !MGD_PROPFIND(self, "lastname", lastname) + || !MGD_PROPFIND(self, "birthdate", birthdate) + || !MGD_PROPFIND(self, "street", street) + || !MGD_PROPFIND(self, "postcode", postcode) + || !MGD_PROPFIND(self, "city", city) + || !MGD_PROPFIND(self, "handphone", handphone) + || !MGD_PROPFIND(self, "homephone", homephone) + || !MGD_PROPFIND(self, "workphone", workphone) + || !MGD_PROPFIND(self, "homepage", homepage) + || !MGD_PROPFIND(self, "email", email) + || !MGD_PROPFIND(self, "topic", topic) + || !MGD_PROPFIND(self, "department", department) + || !MGD_PROPFIND(self, "office", office) + || !MGD_PROPFIND(self, "extra", extra) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 16 + || zend_get_parameters_ex(16, &id, &firstname, &lastname, &birthdate, + &street, &postcode, &city, + &handphone, &homephone, &workphone, &homepage, &email, + &topic, &department, &office, &extra) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(firstname); + convert_to_string_ex(lastname); + convert_to_string_ex(birthdate); + convert_to_string_ex(street); + convert_to_string_ex(postcode); + convert_to_string_ex(city); + convert_to_string_ex(handphone); + convert_to_string_ex(homephone); + convert_to_string_ex(workphone); + convert_to_string_ex(homepage); + convert_to_string_ex(email); + convert_to_long_ex(topic); + convert_to_long_ex(department); + convert_to_long_ex(office); + convert_to_string_ex(extra); + + if (!isuserowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_update(return_value, "person", "firstname=$q,lastname=$q," + "birthdate=$t,street=$q,postcode=$q,city=$q," + +"handphone=$q,homephone=$q,workphone=$q,homepage=$q," + +"email=$q,topic=$d,department=$d,office=$d,extra=$q", + (*id)->value.lval, + (*firstname)->value.str.val, +(*lastname)->value.str.val, + (*birthdate)->value.str.val, +(*street)->value.str.val, + (*postcode)->value.str.val, (*city)->value.str.val, + (*handphone)->value.str.val, +(*homephone)->value.str.val, + (*workphone)->value.str.val, +(*homepage)->value.str.val, + (*email)->value.str.val, (*topic)->value.lval, + (*department)->value.lval, (*office)->value.lval, + (*extra)->value.str.val); + PHP_UPDATE_REPLIGARD("person",(*id)->value.lval); +} + +MGD_FUNCTION(update_password) +{ + zval **uid, **username, **password; + + CHECK_MGD; + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &uid, &username, &password) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(uid); + convert_to_string_ex(username); + convert_to_string_ex(password); + + if (!mgd_isadmin(mgd_handle()) && !mgd_isuser(mgd_handle(), (*uid)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + /* no 'magic' chars in username */ + if (strpbrk((*username)->value.str.val, MIDGARD_LOGIN_RESERVED_CHARS)) + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_NAME); + + if ((*username)->value.str.len != 0 + && mgd_exists_bool(mgd_handle(), "person this, person other", + +"this.id=$d" + " AND +other.id<>$d AND other.username=$q" +#if HAVE_MIDGARD_SITEGROUPS + " AND +this.sitegroup=other.sitegroup" +#endif + , + +(*uid)->value.lval, (*uid)->value.lval, + +(*username)->value.str.val)) RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + + php_midgard_update(return_value, "person", "username=$q,password=Encrypt($q)", + (*uid)->value.lval, (*username)->value.str.val, + (*password)->value.str.val); + PHP_UPDATE_REPLIGARD("person",(*uid)->value.lval); +} + +MGD_FUNCTION(update_password_plain) +{ + zval **uid, **username, **password; + + CHECK_MGD; + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &uid, &username, &password) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(uid); + convert_to_string_ex(username); + convert_to_string_ex(password); + + if (!mgd_isadmin(mgd_handle()) && !mgd_isuser(mgd_handle(), (*uid)->value.lval) + && !(isuserowner((*uid)->value.lval) + && mgd_exists_id(mgd_handle(), "person", + "id=$d AND (password='' OR +Left(password,2)='**')", + (*uid)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + /* no 'magic' chars in username */ + if (strpbrk((*username)->value.str.val, MIDGARD_LOGIN_RESERVED_CHARS)) +RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_NAME); + + if ((*username)->value.str.len != 0 + && mgd_exists_bool(mgd_handle(), "person this, person other", + +"this.id=$d" + " AND +other.id<>$d AND other.username=$q" + " AND +this.sitegroup=other.sitegroup", + +(*uid)->value.lval, (*uid)->value.lval, + +(*username)->value.str.val)) RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + + php_midgard_update(return_value, "person", + "username=$q,password=Concat('**',$q)", + (*uid)->value.lval, (*username)->value.str.val, + (*password)->value.str.val); + PHP_UPDATE_REPLIGARD("person",(*uid)->value.lval); +} + +MGD_FUNCTION(update_public) +{ + zval **uid, **addressp, **phonep, **homepagep, **emailp, **extrap; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 6 + || zend_get_parameters_ex(6, &uid, &addressp, &phonep, + &homepagep, &emailp, &extrap) != +SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(uid); + convert_to_long_ex(addressp); + convert_to_long_ex(phonep); + convert_to_long_ex(homepagep); + convert_to_long_ex(emailp); + convert_to_long_ex(extrap); + + if (!isuserowner((*uid)->value.lval)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "person", "info=(info&1)|$d", + (*uid)->value.lval, + ((*addressp)->value.lval != 0) << 1 + | ((*phonep)->value.lval != 0) << 2 + | ((*homepagep)->value.lval != 0) << 3 + | ((*emailp)->value.lval != 0) << 4 + | ((*extrap)->value.lval != 0) << 5); + PHP_UPDATE_REPLIGARD("person",(*uid)->value.lval); +} + +MGD_FUNCTION(delete_person) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"person")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if(mgd_exists_id(mgd_handle(), "article", "author=$d", id) + || mgd_exists_id(mgd_handle(), "member", "uid=$d", id) + || mgd_exists_id(mgd_handle(), "eventmember", "uid=$d", id) + || mgd_exists_id(mgd_handle(), "page", "author=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isuserowner(id)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "person", id); + PHP_DELETE_REPLIGARD("person", id); +} + +MidgardProperty MidgardPersonProperties [] = { + { IS_STRING, "firstname" }, + { IS_STRING, "lastname" }, + { IS_STRING, "birthdate" }, + { IS_STRING, "street" }, + { IS_STRING, "postcode" }, + { IS_STRING, "city" }, + { IS_STRING, "handphone" }, + { IS_STRING, "homephone" }, + { IS_STRING, "workphone" }, + { IS_STRING, "homepage" }, + { IS_STRING, "email" }, + { IS_LONG, "topic" }, + { IS_LONG, "department" }, + { IS_LONG, "office" }, + { IS_STRING, "extra" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardPerson, person) Index: php4/ext/midgard/php_midgard.h diff -u /dev/null php4/ext/midgard/php_midgard.h:1.3 --- /dev/null Sat Feb 17 15:21:53 2001 +++ php4/ext/midgard/php_midgard.h Sat Feb 17 15:21:50 2001 @@ -0,0 +1,97 @@ +/* $Id: php_midgard.h,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef PHP_MIDGARD_H +#define PHP_MIDGARD_H + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. +*/ +#include <php_config.h> + +#if HAVE_MIDGARD + +#include <php.h> +#include <midgard.h> +#include <mgd_apache.h> +#include <Zend/modules.h> + +midgard_request_config *mgd_rcfg(); +midgard_directory_config *mgd_dcfg(); +midgard *mgd_handle(); +zval *mgd_getudf(); +int mgd_get_errno(); +void mgd_set_errno(int mgd_errno); + +extern zend_module_entry midgard_module_entry; +#define phpext_midgard_ptr &midgard_module_entry + +#ifdef PHP_WIN32 +#define PHP_MIDGARD_API __declspec(dllexport) +#else +#define PHP_MIDGARD_API +#endif + +PHP_MINIT_FUNCTION(midgard); +PHP_MSHUTDOWN_FUNCTION(midgard); +PHP_RINIT_FUNCTION(midgard); +PHP_RSHUTDOWN_FUNCTION(midgard); +PHP_MINFO_FUNCTION(midgard); + +PHP_FUNCTION(confirm_midgard_compiled); /* For testing, remove later. */ + +ZEND_BEGIN_MODULE_GLOBALS(midgard) + midgard_request_config *rcfg; + midgard_directory_config *dcfg; + midgard *mgd; + int mgd_errno; + zval *udf; +ZEND_END_MODULE_GLOBALS(midgard) + +/* In every function that needs to use variables in php_midgard_globals, + do call MGDLS_FETCH(); after declaring other variables used by + that function, and always refer to them as MGDG(variable). + You are encouraged to rename these macros something shorter, see + examples in any other php module directory. +*/ + +#ifdef ZTS +#define MGDG(v) (midgard_globals->v) +#define MGDLS_FETCH() php_midgard_globals *midgard_globals = +ts_resource(midgard_globals_id) +#else +#define MGDG(v) (midgard_globals.v) +#define MGDLS_FETCH() +#endif + +#else + +#define phpext_midgard_ptr NULL + +#endif + +#endif /* PHP_MIDGARD_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ Index: php4/ext/midgard/preferences.c diff -u /dev/null php4/ext/midgard/preferences.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/preferences.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,219 @@ +/* $Id: preferences.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(list_preferences) +{ + zval **uid, **dom; + int user; + char *domain; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 0: + user = mgd_user(mgd_handle()); + domain = NULL; + break; + case 1: + if (zend_get_parameters_ex(1, &uid) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(uid); + user = (*uid)->value.lval; + domain = NULL; + break; + case 2: + if (zend_get_parameters_ex(2, &uid, &dom) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(uid); + convert_to_string_ex(dom); + user = (*uid)->value.lval; + domain = (*dom)->value.str.val; + break; + default: + WRONG_PARAM_COUNT; + } + + if (user != mgd_user(mgd_handle()) && !mgd_isadmin(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (domain) + php_midgard_select(&MidgardPreferences, return_value, +"id,uid,domain,name,value", + "preference", "uid=$d AND +domain=$q", "name", + user, domain); + else + php_midgard_select(&MidgardPreferences, return_value, +"id,uid,domain,name,value", + "preference", "uid=$d", +"domain,name", user); +} + +MGD_FUNCTION(get_preference) +{ + zval **pid, **dom, **name; + int id; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardPreferences); + mgd_object_init(return_value, "uid", "domain", "name", "value", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &pid) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(pid); + id = (*pid)->value.lval; + break; + case 2: + if (zend_get_parameters_ex(2, &dom, &name) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_string_ex(dom); + convert_to_string_ex(name); + id = mgd_exists_id(mgd_handle(), "preference", + "uid=$d AND domain=$q AND name=$q", + mgd_user(mgd_handle()), + (*dom)->value.str.val, +(*name)->value.str.val); + break; + case 3: + if (zend_get_parameters_ex(3, &pid, &dom, &name) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(pid); + id = (*pid)->value.lval; + convert_to_string_ex(dom); + convert_to_string_ex(name); + id = mgd_exists_id(mgd_handle(), "preference", + "uid=$d AND domain=$q AND name=$q", + id, + (*dom)->value.str.val, +(*name)->value.str.val); + break; + default: + WRONG_PARAM_COUNT; + } + + if (!id) RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + if (!mgd_isadmin(mgd_handle()) && + mgd_user(mgd_handle()) != mgd_idfield(mgd_handle(), "uid", +"preference", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_get(&MidgardPreferences, return_value, + "id,uid,domain,name,value", "preference", id); +} + +MGD_FUNCTION(create_preference) +{ + zval **uid, **domain, **name, **value, *self; + + RETVAL_FALSE; + CHECK_MGD; + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "uid", uid) + || !MGD_PROPFIND(self, "domain", domain) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "value", value) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &uid, &domain, &name, &value) != SUCCESS) + WRONG_PARAM_COUNT; + } + convert_to_long_ex(uid); + convert_to_string_ex(domain); + convert_to_string_ex(name); + convert_to_string_ex(value); + + if (mgd_user(mgd_handle()) != (*uid)->value.lval && + !mgd_isadmin(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + if (!mgd_exists_id(mgd_handle(), "person", + +"id=$d", + +(*uid)->value.lval)) RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); +#endif + + php_midgard_create(return_value, "preference", "uid,domain,name,value", + "$d,$q,$q,$q", (*uid)->value.lval, +(*domain)->value.str.val, + (*name)->value.str.val, +(*value)->value.str.val); + + PHP_CREATE_REPLIGARD("preference",return_value->value.lval); +} + +MGD_FUNCTION(update_preference) +{ + zval **id, **value, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "value", value) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } else { + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &id, &value) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(value); + + if (!mgd_isadmin(mgd_handle()) && mgd_user(mgd_handle()) != + mgd_idfield(mgd_handle(), "uid", "preference", (*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "preference", "value=$q", + (*id)->value.lval, (*value)->value.str.val); + PHP_UPDATE_REPLIGARD("preference", (*id)->value.lval); +} + +MGD_FUNCTION(delete_preference) +{ + IDINIT; + RETVAL_FALSE; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"preference")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!mgd_isadmin(mgd_handle()) && + mgd_user(mgd_handle()) != mgd_idfield(mgd_handle(), "uid", +"preference", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_delete(return_value, "preference", id); + PHP_DELETE_REPLIGARD("preference", id); +} + +MidgardProperty MidgardPreferencesProperties [] = { + { IS_LONG, "uid" }, + { IS_STRING, "domain" }, + { IS_STRING, "name" }, + { IS_STRING, "value" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardPreferences, preference) Index: php4/ext/midgard/preparser-parser.y diff -u /dev/null php4/ext/midgard/preparser-parser.y:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/preparser-parser.y Sat Feb 17 15:21:50 2001 @@ -0,0 +1,212 @@ +%{ +/* $Id: preparser-parser.y,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + /*#include "mgd_wild.h"*/ + /*#define PARSER_DEBUG*/ + + #include <stdio.h> + #include <malloc.h> + #include <strings.h> + #include "php_midgard.h" + #include "midgard.h" + #include "mgd_preparser.h" +%} + +%union { +// char string[256]; + GByteArray *gstring; +} + +%token <gstring> STRING +%token MGD_TMPL +%token MGD_TMPLE +%token MGD_VAR +%token MGD_VARE +%token MGD_SNIP +%token MGD_SNIPE +%token MGD_EVAL +%token MGD_EVALE + +%% + +input: + | input instructions +; + +instructions: + | MGD_TMPL STRING MGD_TMPLE { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed elem: "); + mgd_append_output_buffer_data($2); +#endif + mgd_append_output_buffer_const("<? mgd_eval(\"?>\".mgd_template(\""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\"). \"<?\", \""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\"); ?>"); + mgd_free_buffer($2); + } + | MGD_VAR MGD_VARE { + yyerror("parse error, missing variable"); + } + | MGD_VAR STRING MGD_VARE { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed var 1: "); + mgd_append_output_buffer_data($2); +#endif + mgd_append_output_buffer_const("<? echo mgd_variable(\""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\"); ?>"); + mgd_free_buffer($2); + } + | MGD_VAR STRING ':' MGD_VARE { + yyerror("parse error, missing formatter"); + } + | MGD_VAR STRING ':' STRING MGD_VARE { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed var 2: "); + mgd_append_output_buffer_data($2); + if( (($4)->data[0] == 'h') || (($4)->data[0] == 'H') || + (($4)->data[0] == 'f') || (($4)->data[0] == 'F') || + (($4)->data[0] == 'p') || (($4)->data[0] == 'u') ) { +#endif + if(($4)->data[0] == 'p') { + mgd_append_output_buffer_const("<? mgd_eval(\"?>\".$"); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const(".\"<?\",\'"); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\'); ?>"); + } else if(($4)->data[0] == 'i') { + mgd_append_output_buffer_const("<? "); + g_byte_array_append(($2), "", 1); + mgd_append_output_buffer(php_midgard_variable(NULL, ($2)->data, NULL, "i")); + mgd_append_output_buffer_const(" ?>"); + } else { + mgd_append_output_buffer_const("<? echo mgd_variable(\""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\",\""); + mgd_append_output_buffer_data($4); + mgd_append_output_buffer_const("\"); ?>"); + } +#ifdef PARSER_DEBUG + } else { + yyerror("parse error, wrong formatter"); + } +#endif + mgd_free_buffer($2); + mgd_free_buffer($4); + } + | MGD_VAR STRING '.' STRING MGD_VARE { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed var 3: "); + mgd_append_output_buffer_data($2); +#endif + mgd_append_output_buffer_const("<? echo mgd_variable(\""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\",\""); + mgd_append_output_buffer_data($4); + mgd_append_output_buffer_const("\",\"\"); ?>"); + mgd_free_buffer($2); + mgd_free_buffer($4); + } + | MGD_VAR STRING '.' STRING ':' STRING MGD_VARE { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed var 4: "); + mgd_append_output_buffer_data($2); +#endif + if(($6)->data[0] == 'p') { + mgd_append_output_buffer_const("<? mgd_eval(\"?>\".$"); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("->"); + mgd_append_output_buffer_data($4); +/* + mgd_append_output_buffer_const(".\"<?\",'$"); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("->"); + mgd_append_output_buffer_data($4); + mgd_append_output_buffer_const("'); ?>"); +*/ + mgd_append_output_buffer_const(".\"<?\"); ?>"); + } else if(($6)->data[0] == 'i') { + mgd_append_output_buffer_const("<? "); + g_byte_array_append(($2), "", 1); + g_byte_array_append(($4), "", 1); + mgd_append_output_buffer(php_midgard_variable(NULL, ($2)->data, ($4)->data, +"i")); + mgd_append_output_buffer_const(" ?>"); + } else { + mgd_append_output_buffer_const("<? echo mgd_variable(\""); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const("\",\""); + mgd_append_output_buffer_data($4); + mgd_append_output_buffer_const("\",\""); + mgd_append_output_buffer_data($6); + mgd_append_output_buffer_const("\"); ?>"); + } + mgd_free_buffer($2); + mgd_free_buffer($4); + mgd_free_buffer($6); + } + | MGD_SNIP STRING { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed snippet: "); + mgd_append_output_buffer_data($2); +#endif + mgd_append_output_buffer_const("mgd_eval(\"?>\".mgd_snippet("); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const(").\"<?\",\"snippet://\"."); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const(")"); + mgd_free_buffer($2); + } + | MGD_EVAL STRING { +#ifdef PARSER_DEBUG + mgd_append_output_buffer_const("parsed eval: "); + mgd_append_output_buffer_data($2); +#endif + mgd_append_output_buffer_const("mgd_eval("); + mgd_append_output_buffer_data($2); + mgd_append_output_buffer_const(")"); + mgd_free_buffer($2); + } +; + +%% + +/* TODO: work on the errors */ + +//extern FILE *mgdin; + +/* +int main(void) +{ + do { + yyparse(); + } while (!feof(mgdin)); + + return 0; +} +*/ + +void yyerror(char *s) +{ + char *temp = g_strdup_printf("ERROR: %s\n", s); + mgd_append_output_buffer(temp); + g_free(temp); +} Index: php4/ext/midgard/preparser-scanner.l diff -u /dev/null php4/ext/midgard/preparser-scanner.l:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/preparser-scanner.l Sat Feb 17 15:21:50 2001 @@ -0,0 +1,307 @@ + +%{ +/* $Id: preparser-scanner.l,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_preparser.h" +#include "preparser-parser.h" +/*#define SCANNER_DEBUG */ + +GByteArray *mgd_output_buffer; +static int par_stack; +static char in_string=0; + +/* +<IN_PHP>{ANY}|{LCOMMENT} { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <6: misc char> "); +#endif + mgd_append_output_buffer(yytext); +} +*/ +%} + +%x IN_PHP +%x IN_TEMPLATE +%x IN_FORMAT +%x IN_SNIPPET +%x IN_SNIPPETQ +%x IN_SNIPPETQQ +%x IN_EVAL +%x IN_EVALQ +%x IN_EVALQQ + +%option stack +%option noyywrap +%option noyylineno + +dqstring [\"][^\"\n]*[\"] +qstring [\'][^\'\n]*[\'] +WHITESPACE [ \n\r\t] +ANY .|{WHITESPACE} +LCOMMENT "//".* +quote [\'] +dquote [\"] +MIDGARD_TEMPLATE_NAME [a-zA-Z0-9_ \x7f-\xff-]+ +MIDGARD_VARSPEC +{MIDGARD_TEMPLATE_NAME}("."{MIDGARD_TEMPLATE_NAME})?(":"{MIDGARD_TEMPLATE_NAME})? + +%% + +<INITIAL>{ANY} { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <1: Misc char> "); +#endif + mgd_append_output_buffer(yytext); +} + +<INITIAL>"<?php"|"<?"|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" + { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <2: Found php entry> "); +#endif + mgd_append_output_buffer(yytext); + yy_push_state(IN_PHP); +} + +<IN_PHP>("?>"|"</script"{WHITESPACE}*">") { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <4: Found php end> "); +#endif + mgd_append_output_buffer(yytext); + yy_pop_state(); +} + +<IN_PHP>{ANY}|{LCOMMENT} { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <6: misc char> "); +#endif + mgd_append_output_buffer(yytext); +} + +<IN_PHP>{qstring}|{dqstring} { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <5: String> "); +#endif + mgd_append_output_buffer(yytext); +} + +<INITIAL>"<"[\[\(]/{MIDGARD_TEMPLATE_NAME}[\]\)]">" { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <9: Found start of element> "); +#endif + yy_push_state(IN_TEMPLATE); + return MGD_TMPL; +} + +<IN_TEMPLATE>[\]\)]">" { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <10: Found end of element> "); +#endif + yy_pop_state(); + return MGD_TMPLE; +} + +<INITIAL>"&("/{MIDGARD_VARSPEC}");" { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <11: Found start of variable> "); +#endif + yy_push_state(IN_FORMAT); + return MGD_VAR; +} + +<IN_FORMAT>");" { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <12: Found end of variable> "); +#endif + yy_pop_state(); + return MGD_VARE; +} + +<IN_FORMAT,IN_TEMPLATE>[a-zA-Z0-9_ -]+ { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <13: Found string> "); +#endif + mgd_set_buffer(mgdlval.gstring,mgdtext); + return STRING; +} + +<IN_FORMAT,IN_TEMPLATE>{ANY} { +#ifdef SCANNER_DEBUG + mgd_append_output_buffer_const(" <14: Found char> "); +#endif + return yytext[0]; +} + +<IN_PHP>"mgd_include_snippet"{WHITESPACE}*"(" { + yy_push_state(IN_SNIPPET); + par_stack=0; + in_string = 0; + mgdlval.gstring = g_byte_array_new(); + return MGD_SNIP; +} + +<IN_SNIPPET>{quote} { + yy_push_state(IN_SNIPPETQ); + in_string = mgdtext[0]; + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_SNIPPET>{dquote} { + yy_push_state(IN_SNIPPETQQ); + in_string = mgdtext[0]; + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_SNIPPETQ>[\\]{quote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + mgd_append_byte(mgdlval.gstring, mgdtext+1); +} + +<IN_SNIPPETQ>{quote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + yy_pop_state(); +} + +<IN_SNIPPETQ>{ANY} { + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_SNIPPETQQ>[\\]{dquote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + mgd_append_byte(mgdlval.gstring, mgdtext+1); +} + +<IN_SNIPPETQQ>{dquote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + yy_pop_state(); +} + +<IN_SNIPPETQQ>{ANY} { + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_SNIPPET>{ANY} { + if(yytext[0] == '(') par_stack++; + if(yytext[0] == ')') par_stack--; + if(par_stack < 0) { + yy_pop_state(); + return STRING; + } + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_PHP>[^_]"eval"{WHITESPACE}*"(" { +/* TODO: change the [^_] to make it conditional, so it's not part of the match + */ + mgd_append_byte(mgd_output_buffer, mgdtext); + yy_push_state(IN_EVAL); + par_stack=0; + in_string = 0; + mgdlval.gstring = g_byte_array_new(); + return MGD_EVAL; +} + +<IN_EVAL>{quote} { + yy_push_state(IN_EVALQ); + in_string = mgdtext[0]; + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_EVAL>{dquote} { + yy_push_state(IN_EVALQQ); + in_string = mgdtext[0]; + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_EVALQ>[\\]{quote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + mgd_append_byte(mgdlval.gstring, mgdtext+1); +} + +<IN_EVALQ>{quote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + yy_pop_state(); +} + +<IN_EVALQ>{ANY} { + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_EVALQQ>[\\]{dquote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + mgd_append_byte(mgdlval.gstring, mgdtext+1); +} + +<IN_EVALQQ>{dquote} { + mgd_append_byte(mgdlval.gstring, mgdtext); + yy_pop_state(); +} + +<IN_EVALQQ>{ANY} { + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +<IN_EVAL>{ANY} { + if(yytext[0] == '(') par_stack++; + if(yytext[0] == ')') par_stack--; + if(par_stack < 0) { + yy_pop_state(); + return STRING; + } + mgd_append_byte(mgdlval.gstring, mgdtext); +} + +%% + +char * php_eval_midgard(midgard_pool * pool, const char *name, char *value, int +exit_php) +{ + YY_BUFFER_STATE bufferState; + int len = strlen(value); + char *tmp; + + if (len == 0) + return NULL; + + tmp = (char *) emalloc(len + 2); + memcpy(tmp, value, len+1); + tmp[len + 1] = 0; + value = tmp; + +// mgdin = NULL; + + /* TODO: dynamic scale this buffer */ + mgd_output_buffer = g_byte_array_new(); + + if(exit_php) mgd_append_output_buffer_const("?>"); + + bufferState = yy_scan_buffer(value, len + 2); + BEGIN(INITIAL); + mgdparse(); + yy_delete_buffer(bufferState); + + if(exit_php) mgd_append_output_buffer_const("<?\n"); + + tmp = estrndup(mgd_output_buffer->data, mgd_output_buffer->len); + + efree(value); + g_byte_array_free(mgd_output_buffer, TRUE); + + return tmp; +} Index: php4/ext/midgard/preparser.c diff -u /dev/null php4/ext/midgard/preparser.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/preparser.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,452 @@ +/* $Id: preparser.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "php.h" +#include "php_ini.h" +//#include "../../php-4.0.4/Zend/zend_hilight.h" +#include "zend_highlight.h" +#include "ext/standard/basic_functions.h" +#include "php_midgard.h" +#include "mgd_internal.h" +#include "mgd_preparser.h" +//#include "internal_functions.h" + +#if HAVE_MIDGARD + +#include <mgd_apache.h> +#include <mgd_select_db.h> + +#include "midgard.h" + +void php_mgd_call_udf_function(char *type, zval *return_value, zval *arg) +{ + zval retval, **function_name; + zval *udf = mgd_getudf(); + + if(!return_value) { + INIT_ZVAL(retval); + return_value = &retval; + } + + if(zend_hash_find(udf->value.ht, type, + strlen(type)+1, + (void **)&function_name) != +SUCCESS) { + php_error(E_WARNING,"Unknown user formatter [x]%s", type); + RETURN_FALSE; + } +// *return_value = **function_name; zval_copy_ctor(return_value); + + RETVAL_FALSE; + if (call_user_function(CG(function_table), NULL, *function_name, + return_value, 1, &arg) != SUCCESS) { + php_error(E_WARNING,"Unable to call %s() - function does not exist", + (*function_name)->value.str.val); + RETURN_FALSE; + } +} + +char * php_midgard_include(midgard_pool * pool, char * name, char * value, char * +type) +{ + midgard *mgd; + + if ((mgd = mgd_handle()) == NULL) { + php_error(E_NOTICE, "Not a midgard request"); + return NULL; + } + + if(!pool && type[0]=='i') { /* inline */ + return value; + } + + if (!type) { + return mgd_format(mgd, pool, "$p", value); + } + + if (strcmp(type, "u") == 0 + || strcmp(type, "url") == 0) + return mgd_format(mgd, pool, "$u", value); + else if (strcmp(type, "f") == 0 + || strcmp(type, "format") == 0) + return mgd_format(mgd, pool, "$f", value); + else if (strcmp(type, "F") == 0 + || strcmp(type, "format-more") == 0) + return mgd_format(mgd, pool, "$F", value); + else if (strcmp(type, "t") == 0 + || strcmp(type, "text") == 0) + return mgd_format(mgd, pool, "$h", value); + else if (strcmp(type, "T") == 0 + || strcmp(type, "quote-all") == 0) + return mgd_format(mgd, pool, "$p", value); + else if (strcmp(type, "h") == 0 + || strcmp(type, "html") == 0) + return mgd_format(mgd, pool, "$H", value); + else + php_error(E_NOTICE, "Unknown format type %s", type); + + return NULL; +} + +char * php_midgard_template(midgard_pool * pool, char * name) +{ + char *value = NULL; + midgard_request_config *rcfg = mgd_rcfg(); + + if (mgd_handle() == NULL) { + php_error(E_ERROR, "Not a midgard request."); + return NULL; + } + +/* TODO: check this when enabling FTs + if (MGD_ENV.ft.elements) { + value = g_hash_table_lookup(MGD_ENV.ft.elements, name); + } +*/ + + if (value == NULL && rcfg != NULL) + value = (char *)ap_table_get(rcfg->elements, name); + + if (value == NULL) { + return NULL; + } + + return value; +} + +MGD_FUNCTION(template) +{ + zval **arg; + char *tmp; + midgard_pool * pool; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1,&arg)==FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(arg); + pool = mgd_alloc_pool(); + tmp = php_midgard_template(pool, (*arg)->value.str.val); + + if( tmp== NULL ) { + RETVAL_STRING("",1); + } else { + RETVAL_STRING(tmp,1); + } + + mgd_free_pool(pool); +} + +char * php_midgard_variable(midgard_pool * pool, char * name, char * member, char * +type) +{ + zval **var; + + if (mgd_handle() == NULL) { + php_error(E_ERROR, "Not a midgard request."); + return NULL; + } + + if (zend_hash_find (EG(active_symbol_table), name, + strlen(name)+1, (void **) &var) == FAILURE) { + MGD_LOG_START("Uninitialized variable $%s") + MGD_LOG_ARG(name) + MGD_LOG_END() + php_error(E_NOTICE, "Uninitialized variable $%s", name); + return NULL; + } + + if (member) { + + if (!(Z_TYPE_PP(var) == IS_ARRAY || Z_TYPE_PP(var) == IS_OBJECT)) { + MGD_LOG_START("Not an object or array: $%s") + MGD_LOG_ARG(name) + MGD_LOG_END() + php_error(E_NOTICE, "Not an object or array: $%s", name); + return NULL; + } + + if (!(Z_TYPE_PP(var) == IS_OBJECT)) { + if(zend_hash_find((*var)->value.ht, member, strlen(member)+1, + (void **)&var)!= SUCCESS) { + MGD_LOG_START("Uninitialized hash property $%s") + MGD_LOG_ARG(member) + MGD_LOG_END() + php_error(E_NOTICE, "Uninitialized hash property $%s", +member); + return NULL; + } + } else { + if(!MGD_PROPFIND((*var), member, var)) { + MGD_LOG_START("Uninitialized member variable $%s") + MGD_LOG_ARG(member) + MGD_LOG_END() + php_error(E_NOTICE, "Uninitialized member variable +$%s", + member); + return NULL; + } + } + } + + if(type && type[0] == 'x') {/* User Defined Filter func. (UDF/Xtension) */ + php_mgd_call_udf_function(type + 1, NULL, *var); + return NULL; + } + + convert_to_string_ex(var); + return php_midgard_include(pool, name, (*var)->value.str.val, type); +} + +MGD_FUNCTION(variable) +{ + zval **var, **arg, **rec; + char *tmp; + midgard_pool *pool=NULL; + + if (ZEND_NUM_ARGS() == 1) { + if( zend_get_parameters_ex(1,&var) == FAILURE ) { + WRONG_PARAM_COUNT; + } else { + pool = mgd_alloc_pool(); + convert_to_string_ex(var); + tmp = php_midgard_variable(pool, (*var)->value.str.val, NULL, +NULL); + if( tmp== NULL ) { + RETVAL_STRING("",1); + } else { + RETVAL_STRING(tmp,1); + } + } + } + + if (ZEND_NUM_ARGS() == 2) { + if( zend_get_parameters_ex(2,&var,&arg) == FAILURE ) { + WRONG_PARAM_COUNT; + } else { + pool = mgd_alloc_pool(); + convert_to_string_ex(var); + convert_to_string_ex(arg); + tmp = php_midgard_variable(pool, (*var)->value.str.val, NULL, + + (*arg)->value.str.val); + if( tmp== NULL ) { + RETVAL_STRING("",1); + } else { + RETVAL_STRING(tmp,1); + } + } + } + + if (ZEND_NUM_ARGS() == 3) { + if( zend_get_parameters_ex(3,&var,&rec,&arg) == FAILURE ) { + WRONG_PARAM_COUNT; + } else { + pool = mgd_alloc_pool(); + convert_to_string_ex(var); + convert_to_string_ex(arg); + convert_to_string_ex(rec); + if( (*arg)->value.str.val[0] == '\0' ) { + tmp = php_midgard_variable(pool, (*var)->value.str.val, + + (*rec)->value.str.val, + + NULL); + } else { + tmp = php_midgard_variable(pool, (*var)->value.str.val, + + (*rec)->value.str.val, + + (*arg)->value.str.val); + } + if( tmp== NULL ) { + RETVAL_STRING("",1); + } else { + RETVAL_STRING(tmp,1); + } + } + } + mgd_free_pool(pool); +} + +MGD_FUNCTION(snippet) +{ + zval **file; + char *part, *name; + midgard_res *res; + midgard_pool *pool; + int upval, idval; + midgard *mgd = mgd_handle(); // DG: GLOBAL(midgard_module_env).mgd; + midgard_request_config *rcfg = mgd_rcfg(); + char *db = NULL; + + if (ZEND_NUM_ARGS() == 1) { + if( zend_get_parameters_ex(1,&file) == FAILURE ) { + WRONG_PARAM_COUNT; + } else { + convert_to_string_ex(file); + } + } else WRONG_PARAM_COUNT; + + /* EEH: if the page database has been defined you will want to include +snippets from there too. */ + if (rcfg->database.page && rcfg->database.page->handle + && rcfg->database.page->handle->mgd) { + mgd_select_database(php_rqst, rcfg->database.page, rcfg); + db = rcfg->database.page->name; + MGD_LOG_START("Midgard: fetching snippet '%s' from database %s") + MGD_LOG_ARG((*file)->value.str.val) + MGD_LOG_ARG(db) + MGD_LOG_END() + } + + if (MGD_PARSE_COMMON_PATH(mgd, (*file)->value.str.val, + "snippetdir", "snippet", &idval, &upval)) + RETURN_STRING("",1); + + + res = mgd_sitegroup_record(mgd, "code", "snippet", idval); + if (!res || !mgd_fetch(res)) { + if (res) + mgd_release(res); + MGD_LOG_START("Midgard: snippet get record failed: %s") + MGD_LOG_ARG((*file)->value.str.val) + MGD_LOG_END() + RETURN_STRING("",1); + } + + pool = mgd_alloc_pool(); + if (!pool) { + if (res) + mgd_release(res); + MGD_LOG_START("Midgard: snippet no pool: %s") + MGD_LOG_ARG((*file)->value.str.val) + MGD_LOG_END() + RETURN_STRING("",1); + } + + part = mgd_strdup(pool, mgd_colvalue(res, 0)); + name = mgd_strcat(pool, 2, "snippet://", (*file)->value.str.val); + mgd_release(res); + + if (db) { + MGD_LOG_START("Midgard: fetched snippet '%s' from database %s") + MGD_LOG_ARG(name) + MGD_LOG_ARG(db) + MGD_LOG_END() + mgd_select_database(php_rqst, rcfg->database.main, rcfg); + } + + RETVAL_STRING(part,1); + mgd_free_pool(pool); +} + +MGD_FUNCTION(eval) +{ + zval **string, **name; + char *tmp, *value; + midgard_pool *pool; + + RETVAL_FALSE; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &string, &name) == SUCCESS) { + convert_to_string_ex(string); + convert_to_string_ex(name); + tmp = (*name)->value.str.val; + break; + } + case 1: + if (zend_get_parameters_ex(1, &string) == SUCCESS) { + convert_to_string_ex(string); + tmp = "mgd_eval()"; + break; + } + default: + WRONG_PARAM_COUNT; + } + if((*string)->value.str.len) { +#ifdef MGD_PREPARSER_LOG + zend_syntax_highlighter_ini syntax_highlighter_ini; + php_get_highlight_struct(&syntax_highlighter_ini); +// highlight_string(*string, &syntax_highlighter_ini, tmp); +#endif + pool = mgd_alloc_pool(); + value = php_eval_midgard(pool, tmp, (*string)->value.str.val, 0); +#ifdef MGD_PREPARSER_LOG +MGD_LOG_START("mgd_eval(%s) '%s'\n\n\n\n\n\n\n\n") + MGD_LOG_ARG(tmp) + MGD_LOG_ARG(value) +MGD_LOG_END() +#endif + if(zend_eval_string(value, NULL /* return_value */, tmp CLS_CC ELS_CC) +!= SUCCESS) { +/* DG: we probably want to turn that off when stable and ready to release + * or at least offer the user an option to turn it off, as it exposes the + * PHP source (security issue here) + */ + zend_syntax_highlighter_ini syntax_highlighter_ini; + php_get_highlight_struct(&syntax_highlighter_ini); + highlight_string(*string, &syntax_highlighter_ini, tmp); + mgd_free_pool(pool); + zend_bailout(); //exit(0); + } + mgd_free_pool(pool); + } +} + +MGD_FUNCTION(register_filter) +{ + zval **name, **function; + zval *func, **retval; + zval *udf; + + RETVAL_FALSE; + udf = mgd_getudf(); + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &name, &function) == SUCCESS) { + convert_to_string_ex(name); + convert_to_string_ex(function); + break; + } + case 1: + if (zend_get_parameters_ex(1, &name) == SUCCESS) { + convert_to_string_ex(name); + function = NULL; + break; + } + case 0: + *return_value = *udf; zval_copy_ctor(return_value); + return; + default: + WRONG_PARAM_COUNT; + } + if(function) { + if((*function)->value.str.len) { /* registration */ + MAKE_STD_ZVAL(func); + *func = **function; zval_copy_ctor(func); + if(zend_hash_update(udf->value.ht, (*name)->value.str.val, + +(*name)->value.str.len+1, + &func, + sizeof(func), NULL) == +SUCCESS) { + RETVAL_TRUE; + } + } else { /* unregistration */ + if(zend_hash_del(udf->value.ht, (*name)->value.str.val, + +(*name)->value.str.len+1) == SUCCESS) { + RETVAL_TRUE; + } + } + } else { + if(zend_hash_find(udf->value.ht, (*name)->value.str.val, + +(*name)->value.str.len+1, + (void **)&retval) == +SUCCESS) { + *return_value = **retval; zval_copy_ctor(return_value); + } + } +} +#endif /* HAVE_MIDGARD */ Index: php4/ext/midgard/sitegroup.c diff -u /dev/null php4/ext/midgard/sitegroup.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/sitegroup.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,303 @@ +/* $Id: sitegroup.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(has_sitegroups) +{ +#if HAVE_MIDGARD_SITEGROUPS + RETURN_TRUE; +#else + RETURN_FALSE; +#endif +} + +#if HAVE_MIDGARD_SITEGROUPS +MGD_FUNCTION(list_sitegroups) +{ + php_midgard_select(&MidgardSitegroup, return_value, "*", "sitegroup", NULL, "name"); +} + +MGD_FUNCTION(create_sitegroup) +{ + zval **zv_name, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if (!mgd_isroot(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "name", zv_name) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if ((ZEND_NUM_ARGS() != 1) + || (zend_get_parameters_ex(1, &zv_name) != + SUCCESS)) WRONG_PARAM_COUNT; + } + + convert_to_string_ex(zv_name); + + /* no 'magic' chars in sitegroup name */ + if (strpbrk((*zv_name)->value.str.val, MIDGARD_LOGIN_RESERVED_CHARS)) + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_NAME); + + if (mgd_exists_bool + (mgd_handle(), "sitegroup", "name=$q", + (*zv_name)->value.str.val)) RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + + php_midgard_create(return_value, "sitegroup", + "name,admingroup", "$q,$d", (*zv_name)->value.str.val, + 0); + + PHP_CREATE_REPLIGARD("sitegroup", return_value->value.lval); +} + +MGD_FUNCTION(get_sitegroup) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardSitegroup); + mgd_object_init(return_value, "name", "admingroup", "realm", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_sitegroup_get(&MidgardSitegroup, return_value, 0, "*", "sitegroup", +(*id)->value.lval); +} + +MGD_FUNCTION(update_sitegroup) +{ + zval **zv_id, **zv_name, **zv_admingroup, **zv_realm, *self; + int group; + int id, admingroup; + + RETVAL_FALSE; + CHECK_MGD; + + if (!mgd_isroot(mgd_handle())) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", zv_id) + || !MGD_PROPFIND(self, "name", zv_name) + || !MGD_PROPFIND(self, "admingroup", zv_admingroup) + || !MGD_PROPFIND(self, "realm", zv_realm) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if ((ZEND_NUM_ARGS() != 4) + || + (zend_get_parameters_ex + (4, &zv_id, &zv_name, &zv_admingroup, + &zv_realm) != SUCCESS)) WRONG_PARAM_COUNT; + } + + convert_to_string_ex(zv_name); + convert_to_string_ex(zv_realm); + convert_to_long_ex(zv_admingroup); + convert_to_long_ex(zv_id); + + id = (*zv_id)->value.lval; + admingroup = (*zv_admingroup)->value.lval; + + if (id == 0) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + group = mgd_exists_id(mgd_handle(), "sitegroup", "name=$q", + (*zv_name)->value.str.val); + if (group != 0 && group != id) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + /* check admingroup == sitegroup || admingroup == 0 */ + if (admingroup != 0 + && !mgd_exists_bool(mgd_handle(), "grp", "id=$d and sitegroup=$d", + admingroup, id) + ) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + + php_midgard_update(return_value, + "sitegroup", + "name=$q, admingroup=$d, realm=$q", + id, + (*zv_name)->value.str.val, + admingroup, (*zv_realm)->value.str.val); + PHP_UPDATE_REPLIGARD("sitegroup", id); +} + +MGD_FUNCTION(delete_sitegroup) +{ + IDINIT; + CHECK_MGD; + + if (!mgd_isroot(mgd_handle())) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (mgd_global_exists(mgd_handle(), "sitegroup=$d", id)) +RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + php_midgard_delete(return_value, "sitegroup", id); + PHP_DELETE_REPLIGARD("sitegroup", id); +} + +MGD_FUNCTION(oop_sitegroup_get) +{ +zval *self = NULL; +zval **pv_table, **pv_id; +int sitegroup; + + CHECK_MGD; + + if ((self=getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (zend_hash_find(self->value.obj.properties, "__table__", 10, + (void **) &pv_table) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + if (zend_hash_find(self->value.obj.properties, "id", 3, + (void **) &pv_id) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + convert_to_string_ex(pv_table); + convert_to_long_ex(pv_id); + + if (strcmp((*pv_table)->value.str.val, "sitegroup") == 0) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } + + sitegroup = mgd_idfield(mgd_handle(), "sitegroup", + (*pv_table)->value.str.val,(*pv_id)->value.lval); + + php_midgard_sitegroup_get(&MidgardSitegroup, return_value, + 0, "*", "sitegroup", sitegroup); +} + +MGD_FUNCTION(oop_sitegroup_set) +{ + zval *self; + zval **zv_sitegroup; + zval **zv_table, **zv_id; + + CHECK_MGD; + + if (!mgd_isroot(mgd_handle())) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if ((self = getThis()) == NULL) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + if (ZEND_NUM_ARGS() != 1) { WRONG_PARAM_COUNT; } + + if (zend_hash_find(self->value.obj.properties, "__table__", 10, + (void **) &zv_table) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + if (zend_hash_find(self->value.obj.properties, "id", 3, + (void **) &zv_id) != SUCCESS) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_OBJECT); + } + + convert_to_string_ex(zv_table); + convert_to_long_ex(zv_id); + + if (strcmp((*zv_table)->value.str.val, "sitegroup") == 0) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + + if (zend_get_parameters_ex(1, &zv_sitegroup) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(zv_sitegroup); + + if ((*zv_sitegroup)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "sitegroup", "id=$d", + (*zv_sitegroup)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + } + + php_midgard_update(return_value, + (*zv_table)->value.str.val, + "sitegroup=$d", (*zv_id)->value.lval, + (*zv_sitegroup)->value.lval); + PHP_UPDATE_REPLIGARD((*zv_table)->value.str.val, (*zv_id)->value.lval); +} + +MidgardProperty MidgardSitegroupProperties [] = { + { IS_STRING, "name" }, + { IS_LONG, "admingroup" }, + { IS_STRING, "realm" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(sitegroup) +static zend_function_entry MidgardSitegroupMethods[] = { +// MidgardSitegroup class constructor +// PHP_FALIAS(midgardsitegroup, mgd_ctor_sitegroup, NULL) + PHP_FALIAS(create, mgd_create_sitegroup, NULL) + PHP_FALIAS(update, mgd_update_sitegroup, NULL) + PHP_FALIAS(delete, mgd_delete_sitegroup, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + MIDGARD_OOP_PARAMETER_METHODS + MIDGARD_OOP_ATTACHMENT_METHODS + { NULL, NULL, NULL} +}; +MidgardClass MidgardSitegroup = { + "MidgardSitegroup", + "sitegroup", + MidgardSitegroupMethods, + {}, + mgd_sitegroup_call_function_handler, + mgd_sitegroup_get_property_handler, + mgd_sitegroup_set_property_handler, + MidgardSitegroupProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardSitegroup, sitegroup) + +#endif Index: php4/ext/midgard/snippet.c diff -u /dev/null php4/ext/midgard/snippet.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/snippet.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,315 @@ +/* $Id: snippet.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(snippet_exists) +{ + zval **file; + int upval, idval; + midgard *mgd = mgd_handle(); // DG: GLOBAL(midgard_module_env).mgd; + + RETVAL_FALSE; + if (ZEND_NUM_ARGS() == 1) { + if( zend_get_parameters_ex(1,&file) == FAILURE ) { + WRONG_PARAM_COUNT; + } else { + convert_to_string_ex(file); + } + } else WRONG_PARAM_COUNT; + + if (MGD_PARSE_COMMON_PATH(mgd, (*file)->value.str.val, + "snippetdir", "snippet", &idval, &upval)) + return; + + if(idval) RETURN_TRUE; +} + +MGD_FUNCTION(list_snippets) +{ + IDINIT; + CHECK_MGD; + php_midgard_select(&MidgardSnippet, return_value, +"id,name,author,creator,created,revisor,revised,revision", "snippet", "up=$d", +"name", id); +} + +MGD_FUNCTION(get_snippet) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardSnippet); + mgd_object_init(return_value, "up", "name", "code", "doc", "author", +NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + if(!(*id)->value.lval) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + php_midgard_get(&MidgardSnippet, return_value, +"id,up,name,code,doc,author,creator,created,revisor,revised,revision", "snippet", +(*id)->value.lval); +} + +MGD_FUNCTION(get_snippet_by_name) +{ + zval **snippetdir, **name; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &snippetdir, &name) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(snippetdir); + convert_to_string_ex(name); + + if(!(*snippetdir)->value.lval || !(*name)->value.str.len) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + php_midgard_get_by_name(&MidgardSnippet, return_value, +"id,up,name,code,doc,author,creator,revisor,revised,revision", "snippet", "up", + (*snippetdir)->value.lval,(*name)->value.str.val); +} + +MGD_FUNCTION(create_snippet) +{ + zval **snippetdir, **name, **code, **doc, **author, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "up", snippetdir) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "code", code) + || !MGD_PROPFIND(self, "doc", doc) + || !MGD_PROPFIND(self, "author", author) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + self = NULL; + if (ZEND_NUM_ARGS() != 5 + || zend_get_parameters_ex(5, &snippetdir, &name, &code, &doc, + &author) == FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(snippetdir); + convert_to_string_ex(name); + convert_to_string_ex(code); + convert_to_string_ex(doc); + convert_to_string_ex(author); + + if (!mgd_exists_id + (mgd_handle(), "snippetdir", "id=$d", + (*snippetdir)->value.lval)) RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*snippetdir)->value.lval != 0 + && !mgd_exists_id(mgd_handle(), "snippetdir", + "id=$d AND sitegroup IN (0,$d)", + (*snippetdir)->value.lval, + mgd_sitegroup(mgd_handle()))) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + if (!issnippetdirowner((*snippetdir)->value.lval) + || mgd_exists_id(mgd_handle(), "snippet", "up=$d AND name=$q", + (*snippetdir)->value.lval, (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_create(return_value, "snippet", + +"up,name,code,doc,author,creator,created,revisor,revised,revision", + "$d,$q,$q,$q,$q,$d,Now(),$d,Now(),0", + (*snippetdir)->value.lval, (*name)->value.str.val, + (*code)->value.str.val, (*doc)->value.str.val, + (*author)->value.str.val, mgd_user(mgd_handle()), + mgd_user(mgd_handle())); + + PHP_CREATE_REPLIGARD("snippet", return_value->value.lval); +} + +MGD_FUNCTION(update_snippet) +{ + zval **id, **name, **code, **doc, **author, *self; + int up; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "code", code) + || !MGD_PROPFIND(self, "doc", doc) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(code); + convert_to_string_ex(doc); + author = NULL; + if (mgd_isadmin(mgd_handle())) { + if (!MGD_PROPFIND(self, "author", author)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + convert_to_string_ex(author); + } + } + else { + switch (ZEND_NUM_ARGS()) { + case 4: + if (zend_get_parameters_ex + (4, &id, &name, &code, &doc) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(code); + convert_to_string_ex(doc); + author = NULL; + break; + + case 5: + if (!mgd_isadmin(mgd_handle()) + || zend_get_parameters_ex(5, &id, &name, &code, + &doc, &author) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(code); + convert_to_string_ex(doc); + convert_to_string_ex(author); + break; + + default: + WRONG_PARAM_COUNT; + } + } + + if (!mgd_exists_id(mgd_handle(), "snippet", "id=$d", (*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_NOT_EXISTS); + + if (!issnippetdirowner + (up = + mgd_idfield(mgd_handle(), "up", "snippet", + (*id)->value.lval))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if (mgd_exists_id + (mgd_handle(), "snippet", "id!=$d AND up=$d AND name=$q", + (*id)->value.lval, up, (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + + if (author) + php_midgard_update(return_value, "snippet", + +"name=$q,code=$q,doc=$q,author=$q,revisor=$d,revised=Now(),revision=revision+1", + (*id)->value.lval, (*name)->value.str.val, + (*code)->value.str.val, (*doc)->value.str.val, + (*author)->value.str.val, + mgd_user(mgd_handle())); + else + php_midgard_update(return_value, "snippet", + +"name=$q,code=$q,doc=$q,revisor=$d,revised=Now(),revision=revision+1", + (*id)->value.lval, (*name)->value.str.val, + (*code)->value.str.val, (*doc)->value.str.val, + mgd_user(mgd_handle())); + PHP_UPDATE_REPLIGARD("snippet", (*id)->value.lval); +} + +MGD_FUNCTION(delete_snippet) +{ + IDINIT; + CHECK_MGD; + + if (mgd_has_dependants(mgd_handle(), id, "snippet")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!issnippetdirowner(mgd_idfield(mgd_handle(), "up", "snippet", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_delete(return_value, "snippet", id); + PHP_DELETE_REPLIGARD("snippet", id); +} + +MGD_FUNCTION(copy_snippet) +{ + zval **id, **newsnippetdir; + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &newsnippetdir) != + SUCCESS) WRONG_PARAM_COUNT; + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + newsnippetdir = NULL; + break; + default: + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + if (newsnippetdir) + convert_to_long_ex(newsnippetdir); + +#if HAVE_MIDGARD_SITEGROUPS + /* newsnippetdir must be in same SG or be 0 */ + if (newsnippetdir && !mgd_exists_bool(mgd_handle(), "snippetdir,snippet", + "snippetdir.id=$d AND snippet.id=$d" + " AND (snippetdir.sitegroup=snippet.sitegroup" + " OR snippetdir.sitegroup=0" + " OR snippet.sitegroup=0)", + (*newsnippetdir)->value.lval, (*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + RETVAL_LONG(mgd_copy_snippet(mgd_handle(), (*id)->value.lval, + newsnippetdir ? (*newsnippetdir)->value.lval : +0)); + +} + +MGD_MOVE_FUNCTION(snippet,snippetdir,snippet,up); + +MidgardProperty MidgardSnippetProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_STRING, "code" }, + { IS_STRING, "doc" }, + { IS_STRING, "author" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardSnippet, snippet) Index: php4/ext/midgard/snippetdir.c diff -u /dev/null php4/ext/midgard/snippetdir.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/snippetdir.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,323 @@ +/* $Id: snippetdir.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_snippetdir_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(issnippetdirowner(id)); +} + +MGD_FUNCTION(list_snippetdirs) +{ + zval **id; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 1 + || zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + + php_midgard_select(&MidgardSnippetdir, return_value, "id,name", "snippetdir", +"up=$d", "name", (*id)->value.lval); +} + +MGD_FUNCTION(get_snippetdir) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardSnippetdir); + mgd_object_init(return_value, "name", "description", "owner", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + + php_midgard_get(&MidgardSnippetdir, return_value, "id,up,name,description,owner", + "snippetdir", (*id)->value.lval); +} + +MGD_FUNCTION(get_snippetdir_by_path) +{ + zval **path; + int id, up; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + object_init(return_value); + return; + case 1: + if (zend_get_parameters_ex(1, &path) == SUCCESS) { + convert_to_string_ex(path); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + if(!MGD_PARSE_COMMON_PATH(mgd_handle(), (*path)->value.str.val, "snippetdir", +"snippetdir", &id, &up)) { + php_midgard_get(&MidgardSnippetdir, return_value, +"id,up,name,description,owner", "snippetdir", id); + return; + } +} + +static int snippetdir_owner_id = 0; +static int snippetdir_copy_hook(midgard *mgd, const char *table, const char *name, +int up, int id, int flag) { + if((flag == MIDGARD_PATH_ELEMENT_EXISTS)) { + return id; + } + if(flag == MIDGARD_PATH_ELEMENT_NOTEXISTS) { + if (!issnippetdirowner(up) || + mgd_exists_id(mgd_handle(), "topic", "up=$d AND name=$q", up, name)) return 0; + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if (up != 0 && !mgd_exists_id(mgd_handle(), "snippetdir", + "id=$d", + up)) return 0; + /* owner must be in same SG or be 0 */ + /* TODO: should we in fact allow owner == 0 for non-root? */ + if (snippetdir_owner_id != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d", + snippetdir_owner_id)) return 0; +#endif + id = mgd_create(mgd, table, "name,up,owner", "$q,$d,$d", name, + up,snippetdir_owner_id); + PHP_CREATE_REPLIGARD_VOID(table,id); + return id; + } + return 0; +} + +MGD_FUNCTION(create_snippetdir) +{ + zval **up, **name, **description, **owner, *self; + int id; + + RETVAL_FALSE; + CHECK_MGD; + + up = NULL; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + + if (!MGD_PROPFIND(self, "up", up)) + up = NULL; + } + else { + switch (ZEND_NUM_ARGS()) { + case 3: + if (zend_get_parameters_ex + (ht, 3, &name, &description, + &owner) != SUCCESS) WRONG_PARAM_COUNT; + break; + case 4: + if (zend_get_parameters_ex + (4, &up, &name, &description, + &owner) != SUCCESS) WRONG_PARAM_COUNT; + break; + default: + WRONG_PARAM_COUNT; + } + } + if (up) + convert_to_long_ex(up); + convert_to_string_ex(name); + convert_to_string_ex(description); + convert_to_long_ex(owner); + snippetdir_owner_id = (*owner)->value.lval; + if (up) { +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 + && !mgd_exists_id(mgd_handle(), "snippetdir", "id=$d", + (*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* owner must be in same SG or be 0 */ + /* TODO: should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d", + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + if (!issnippetdirowner((*up)->value.lval) + || mgd_exists_id(mgd_handle(), "snippetdir", + "up=$d AND name=$q", (*up)->value.lval, + (*name)->value.str.val)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + + php_midgard_create(return_value, "snippetdir", + "name,up,owner, description", "$q,$d,$d,$q", + (*name)->value.str.val, (*up)->value.lval, + snippetdir_owner_id, + (*description)->value.str.val); + + PHP_CREATE_REPLIGARD("snippetdir", return_value->value.lval); + } + else { + if (!mgd_parse_path_with_hook + (mgd_handle(), (*name)->value.str.val, "snippetdir", NULL, NULL, + NULL, NULL, &id, snippetdir_copy_hook)) { + + RETURN_LONG(id); + } + } +} + +MGD_FUNCTION(update_snippetdir) +{ + zval **id, **name, **description, **owner, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 4 + || zend_get_parameters_ex(4, &id, &name, &description, + &owner) != SUCCESS) WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(description); + convert_to_long_ex(owner); + if (!issnippetdirowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (mgd_exists_id + (mgd_handle(), "snippetdir", "id!=$d AND up=$d AND name=$q", + (*id)->value.lval, mgd_idfield(mgd_handle(), "up", "snippetdir", + (*id)->value.lval), + (*name)->value.str.val)) RETURN_FALSE_BECAUSE(MGD_ERR_DUPLICATE); + +#if HAVE_MIDGARD_SITEGROUPS + /* owner must be in same SG or be 0 */ + /* should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "snippetdir,grp", + "snippetdir.id=$d AND grp.id=$d" + " AND (snippetdir.sitegroup=grp.sitegroup" + " OR snippetdir.sitegroup=0" + " OR grp.sitegroup=0)", + (*id)->value.lval, + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + php_midgard_update(return_value, "snippetdir", + "name=$q, owner=$d, description=$q", (*id)->value.lval, + (*name)->value.str.val, (*owner)->value.lval, + (*description)->value.str.val); + PHP_UPDATE_REPLIGARD("snippetdir", (*id)->value.lval); +} + +MGD_FUNCTION(delete_snippetdir) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(),id,"snippetdir")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!issnippetdirowner(id)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + if (mgd_exists_id(mgd_handle(), "snippetdir", "up=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if (mgd_exists_id(mgd_handle(), "snippet", "up=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + php_midgard_delete(return_value, "snippetdir", id); + PHP_DELETE_REPLIGARD("snippetdir", id); +} + +MGD_FUNCTION(delete_snippetdir_tree) +{ + IDINIT; + CHECK_MGD; + RETVAL_FALSE; + if (!issnippetdirowner(mgd_idfield(mgd_handle(), "up", "snippetdir", id))) +RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if(mgd_delete_snippetdir(mgd_handle(), id)) { RETVAL_TRUE; } +} + +MGD_FUNCTION(copy_snippetdir) +{ + zval **id, **path; int id_r, id_v; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &path) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + convert_to_string_ex(path); + + /* Create destination snippetdir */ + if(!mgd_parse_path_with_hook(mgd_handle(), (*path)->value.str.val, "snippetdir", +NULL, NULL, + NULL, NULL, &id_v, snippetdir_copy_hook)) { + id_r = mgd_copy_snippetdir(mgd_handle(), (*id)->value.lval); + if(id_r) { + php_midgard_update(return_value, "snippetdir", "up=$i", id_r, id_v); + PHP_UPDATE_REPLIGARD("snippetdir",id_r); + } + } + +} + +MGD_MOVE_FUNCTION(snippetdir,snippetdir,snippetdir,up); + +MidgardProperty MidgardSnippetdirProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_STRING, "description" }, + { IS_LONG, "owner" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardSnippetdir, snippetdir) Index: php4/ext/midgard/style.c diff -u /dev/null php4/ext/midgard/style.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/style.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,238 @@ +/* $Id: style.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_style_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(isstyleowner(id)); +} + +MGD_FUNCTION(list_styles) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_select(&MidgardStyle, return_value, "id,name", "style", NULL, +"name"); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_select(&MidgardStyle, return_value, "id,name", "style", "up=$d", +"name", + (*id)->value.lval); +} + +MGD_FUNCTION(get_style) +{ + zval **id; + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardStyle); + mgd_object_init(return_value, "up", "name", "owner", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + break; + } /* else fall through */ + default: + WRONG_PARAM_COUNT; + } + php_midgard_get(&MidgardStyle, return_value, "id,up,name,owner", "style", +(*id)->value.lval); +} + +MGD_FUNCTION(get_style_by_name) +{ + zval **style; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 1 + || zend_get_parameters_ex(1, &style) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_string_ex(style); + php_midgard_get_by_name_only(&MidgardStyle, return_value, "id,up,name,owner", +"style", + (*style)->value.str.val); +} + +MGD_FUNCTION(create_style) +{ + zval **up, **name, **owner, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &up, &name, &owner) == FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_string_ex(name); + convert_to_long_ex(owner); + + if (!isstyleowner((*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "style", + "id=$d", + (*up)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + /* owner must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d", + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_create(return_value, "style", "up,name,owner", "$d,$q,$d", + (*up)->value.lval, (*name)->value.str.val, + (*owner)->value.lval); + + PHP_CREATE_REPLIGARD("style", return_value->value.lval); +} + +MGD_FUNCTION(update_style) +{ + zval **id, **name, **owner, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "owner", owner) + ) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 3 + || zend_get_parameters_ex(3, &id, &name, &owner) == FAILURE) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_long_ex(owner); + + if (!isstyleowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* owner must be in same SG or be 0 */ + if ((*owner)->value.lval != 0 && !mgd_exists_bool(mgd_handle(), "style,grp", + "style.id=$d AND grp.id=$d" + " AND +(style.sitegroup=grp.sitegroup" + " OR style.sitegroup=0" + " OR grp.sitegroup=0)", + (*id)->value.lval, + (*owner)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + php_midgard_update(return_value, "style", "name=$q,owner=$d", + (*id)->value.lval, (*name)->value.str.val, + (*owner)->value.lval); + PHP_UPDATE_REPLIGARD("style", (*id)->value.lval); +} + +MGD_FUNCTION(delete_style) +{ + IDINIT; + CHECK_MGD; + if(mgd_has_dependants(mgd_handle(), id, "style")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_exists_id(mgd_handle(), "host", "style=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_exists_id(mgd_handle(), "page", "style=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_exists_id(mgd_handle(), "style", "up=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_exists_id(mgd_handle(), "element", "style=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!isstyleowner(id)) RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "style", id); + PHP_DELETE_REPLIGARD("style", id); +} + + +MGD_FUNCTION(copy_style) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(mgd_copy_style(mgd_handle(), id)); +} + +MGD_FUNCTION(delete_style_tree) +{ + IDINIT; + CHECK_MGD; + if (!isstyleowner(mgd_idfield(mgd_handle(), "up", "style", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if(mgd_exists_id(mgd_handle(), "host", "style=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_exists_id(mgd_handle(), "page", "style=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if(mgd_delete_style(mgd_handle(), id)) + RETVAL_TRUE; +} + +MGD_MOVE_FUNCTION(style,style,style,up) + +MidgardProperty MidgardStyleProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_LONG, "owner" }, + { 0, NULL } +}; + +MIDGARD_CLASS(MidgardStyle, style) Index: php4/ext/midgard/topic.c diff -u /dev/null php4/ext/midgard/topic.c:1.3 --- /dev/null Sat Feb 17 15:21:54 2001 +++ php4/ext/midgard/topic.c Sat Feb 17 15:21:50 2001 @@ -0,0 +1,464 @@ +/* $Id: topic.c,v 1.3 2001/02/17 23:21:50 emile Exp $ +Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]> +Copyright (C) 2000 The Midgard Project ry +Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]> + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mgd_internal.h" +#include "mgd_oop.h" + +MGD_FUNCTION(is_topic_owner) +{ + IDINIT; + CHECK_MGD; + RETVAL_LONG(istopicowner(id)); +} + +static const char *topic_sort(const char *order) +{ + static struct + { + const char *order, *sort; + } + sort[] = + { + { + "alpha", "name ASC"} + , { + "reverse alpha", "name DESC"} + , { + "score", "score ASC,name ASC"} + , { + "reverse score", "score DESC,name ASC"} + , { + "revised", "revised ASC"} + , { + "reverse revised", "revised DESC"} + , { + "created", "created ASC"} + , { + "reverse created", "created DESC"} + , { + NULL, "score DESC,name"} + }; + int i; + + for (i = 0; sort[i].order; i++) + if (strcmp(order, sort[i].order) == 0) + return sort[i].sort; + + return sort[i].sort; +} + +MGD_FUNCTION(list_topics) +{ + const char *sortv = NULL; + zval **id, **sortn; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &sortn) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(sortn); + sortv = topic_sort((*sortn)->value.str.val); + break; + } + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + sortv = "score DESC,name"; + break; + } + default: + wrong_param_count(); + } + +#if 0 + if (!istopicreader(id)) + return; +#endif + + php_midgard_select(&MidgardTopic, return_value, + "id,score,name,owner,extra,description,code,created," + "revised,creator,revisor", + "topic", "up=$d", sortv, (*id)->value.lval); +} + +MGD_FUNCTION(is_in_topic_tree) +{ + zval **root, **topic; + int *ids, i; + + RETVAL_FALSE; + CHECK_MGD; + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &root, &topic) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(root); + convert_to_long_ex(topic); + +#if 0 + if (!istopicreader((*topic)->value.lval)) + return; +#endif + + ids = mgd_tree(mgd_handle(), "topic", (*root)->value.lval, 0, NULL); + if (ids) + for (i = 0; ids[i]; i++) + if (ids[i] == (*topic)->value.lval) + RETURN_TRUE; +} + +MGD_FUNCTION(get_topic) +{ + zval **id, **name; + + CHECK_MGD; + + switch (ZEND_NUM_ARGS()) { + case 0: + php_midgard_bless(return_value, &MidgardTopic); + mgd_object_init(return_value, "id", "up", "name", + "extra", "owner", "score", + "description", "revised", "created", + "revisor", "creator", "revision", + "code", NULL); + return; + case 1: + if (zend_get_parameters_ex(1, &id) == SUCCESS) { + convert_to_long_ex(id); + php_midgard_get(&MidgardTopic, + return_value, + +"id,up,score,name,description,extra,owner,code," + "creator,Unix_timestamp(created) as +created," + "revisor,Unix_timestamp(revised) as +revised,revision", + "topic", (*id)->value.lval); + } + else { + WRONG_PARAM_COUNT; + } + break; + case 2: + if (zend_get_parameters_ex(2, &id, &name) == SUCCESS) { + convert_to_long_ex(id); + convert_to_string_ex(name); + php_midgard_get_by_name + (&MidgardTopic, return_value, + "id,up,score,name,description,extra,owner,code," + "creator,Unix_timestamp(created) as created," + "revisor,Unix_timestamp(revised) as revised," + "revision", "topic", "up", + (*id)->value.lval, (*name)->value.str.val); + } + else { + WRONG_PARAM_COUNT; + } + break; + default: + WRONG_PARAM_COUNT; + } +} + +MGD_FUNCTION(get_topic_by_name) +{ + /* EEH: just an alias */ + php_if_mgd_get_topic(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} + +MGD_FUNCTION(create_topic) +{ + zval **up, **name, **description, **extra, **owner, **code; + zval *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "up", up) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + || !MGD_PROPFIND(self, "code", code)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 6 + || zend_get_parameters_ex(6, &up, &name, &description, + &extra, &owner, &code) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(up); + convert_to_string_ex(name); + convert_to_string_ex(description); + convert_to_string_ex(extra); + convert_to_long_ex(owner); + convert_to_string_ex(code); + + if (!istopicowner((*up)->value.lval) + || mgd_exists_id(mgd_handle(), "topic", "up=$d AND name=$q", + (*up)->value.lval, (*name)->value.str.val)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + +#if HAVE_MIDGARD_SITEGROUPS + /* up must be in same SG or be 0 */ + if ((*up)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "topic", + "id=$d AND sitegroup IN (0,$d)", + (*up)->value.lval, + mgd_sitegroup(mgd_handle()))) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } + /* owner must be in same SG or be 0 */ + /* TODO: should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 && !mgd_exists_id(mgd_handle(), "grp", + "id=$d AND sitegroup IN (0,$d)", + (*owner)->value.lval, + mgd_sitegroup(mgd_handle + ()))) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + php_midgard_create(return_value, "topic", + "up,name,description,extra,owner,code," + "creator,created,revisor,revised,revision", + "$d,$q,$q,$q,$d,$q,$d,Now(),$d,Now(),0", + (*up)->value.lval, (*name)->value.str.val, + (*description)->value.str.val, + (*extra)->value.str.val, (*owner)->value.lval, + (*code)->value.str.val, mgd_user(mgd_handle()), + mgd_user(mgd_handle())); + PHP_CREATE_REPLIGARD("topic", return_value->value.lval); +} + +MGD_FUNCTION(update_topic) +{ + zval **id, **name, **description, **extra, **owner, **code, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (!MGD_PROPFIND(self, "id", id) + || !MGD_PROPFIND(self, "name", name) + || !MGD_PROPFIND(self, "description", description) + || !MGD_PROPFIND(self, "extra", extra) + || !MGD_PROPFIND(self, "owner", owner) + || !MGD_PROPFIND(self, "code", code)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 6 + || zend_get_parameters_ex(6, &id, &name, &description, + &extra, &owner, &code) != SUCCESS) { + WRONG_PARAM_COUNT; + } + } + + convert_to_long_ex(id); + convert_to_string_ex(name); + convert_to_string_ex(description); + convert_to_string_ex(extra); + convert_to_string_ex(code); + convert_to_long_ex(owner); + + if (!istopicowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + +#if HAVE_MIDGARD_SITEGROUPS + /* owner must be in same SG or be 0 */ + /* should we in fact allow owner == 0 for non-root? */ + if ((*owner)->value.lval != 0 + && !mgd_exists_bool(mgd_handle(), "topic,grp", + "topic.id=$d AND grp.id=$d" + " AND (topic.sitegroup=grp.sitegroup" + " OR topic.sitegroup=0" + " OR grp.sitegroup=0)", + (*id)->value.lval, + (*owner)->value.lval)) { + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); + } +#endif + + php_midgard_update(return_value, "topic", + "name=$q,description=$q,extra=$q,owner=$d,code=$q," + "revisor=$d,revised=Now(),revision=revision+1", + (*id)->value.lval, (*name)->value.str.val, + (*description)->value.str.val, + (*extra)->value.str.val, (*owner)->value.lval, + (*code)->value.str.val, mgd_user(mgd_handle())); + PHP_UPDATE_REPLIGARD("topic", (*id)->value.lval); +} + +MGD_FUNCTION(update_topic_score) +{ + zval **id, **score, *self; + + RETVAL_FALSE; + CHECK_MGD; + + if ((self = getThis()) != NULL) { + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &score) != + SUCCESS) { + WRONG_PARAM_COUNT; + } + if (!MGD_PROPFIND(self, "id", id)) { + RETURN_FALSE_BECAUSE(MGD_ERR_INVALID_OBJECT); + } + } + else { + if (ZEND_NUM_ARGS() != 2 + || zend_get_parameters_ex(2, &id, &score) != SUCCESS) + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(id); + convert_to_long_ex(score); + + if (!istopicowner((*id)->value.lval)) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + + php_midgard_update(return_value, "topic", "score=$d", (*id)->value.lval, + (*score)->value.lval); + PHP_UPDATE_REPLIGARD("topic", (*id)->value.lval); +} + +MGD_FUNCTION(delete_topic) +{ + IDINIT; + CHECK_MGD; + if (mgd_has_dependants(mgd_handle(), id, "topic")) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + if (mgd_exists_id(mgd_handle(), "article", "topic=$d", id)) + RETURN_FALSE_BECAUSE(MGD_ERR_HAS_DEPENDANTS); + + if (!istopicowner(mgd_idfield(mgd_handle(), "up", "topic", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + php_midgard_delete(return_value, "topic", id); + PHP_DELETE_REPLIGARD("topic", id); +} + +MGD_FUNCTION(copy_topic) +{ + zval **id, **root; + int id_r; + int new_root; + + RETVAL_FALSE; + CHECK_MGD; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_get_parameters_ex(2, &id, &root) != + SUCCESS) WRONG_PARAM_COUNT; + convert_to_long_ex(root); + new_root = (*root)->value.lval; + break; + case 1: + if (zend_get_parameters_ex(1, &id) != SUCCESS) + WRONG_PARAM_COUNT; + convert_to_long_ex(id); + new_root = mgd_idfield(mgd_handle(), "up", +"topic",(*id)->value.lval); + break; + default: + WRONG_PARAM_COUNT; + } + convert_to_long_ex(id); + + /* if new_root is 0 or if not owner, access denied (unless isadmin) */ + if (!istopicowner(new_root)) { + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + } + +#if HAVE_MIDGARD_SITEGROUPS + /* root must be in same SG or be 0 */ + if (new_root != 0 && + !mgd_exists_bool(mgd_handle(), "topic src, topic tgt", + "src.id=$d AND tgt.id=$d" + " AND (src.sitegroup=tgt.sitegroup" + " OR src.sitegroup=0" " OR tgt.sitegroup=0)", + (*id)->value.lval, new_root)) + RETURN_FALSE_BECAUSE(MGD_ERR_SITEGROUP_VIOLATION); +#endif + + id_r = mgd_copy_topic(mgd_handle(), (*id)->value.lval); + if (id_r) { + php_midgard_update(return_value, "topic", "up=$i", id_r, + new_root); + PHP_UPDATE_REPLIGARD("topic", id_r); + } + RETVAL_LONG(new_root); +} + +MGD_FUNCTION(delete_topic_tree) +{ + IDINIT; + CHECK_MGD; + if (!istopicowner(mgd_idfield(mgd_handle(), "up", "topic", id))) + RETURN_FALSE_BECAUSE(MGD_ERR_ACCESS_DENIED); + if (mgd_delete_topic(mgd_handle(), id)) + RETVAL_TRUE; +} + +MGD_MOVE_FUNCTION(topic, topic, topic, up) + +MidgardProperty MidgardTopicProperties [] = { + { IS_LONG, "up" }, + { IS_STRING, "name" }, + { IS_STRING, "extra" }, + { IS_STRING, "description" }, + { IS_STRING, "code" }, + { IS_LONG, "owner" }, + { IS_LONG, "score" }, + { IS_LONG, "revised" }, + { IS_LONG, "created" }, + { IS_LONG, "revisor" }, + { IS_LONG, "creator" }, + { IS_LONG, "revision" }, + { 0, NULL } +}; + +MIDGARD_HANDLERS_DECL(topic) +static zend_function_entry MidgardTopicMethods[] = { + PHP_FALIAS(midgardtopic, mgd_ctor_topic, NULL) + PHP_FALIAS(create, mgd_create_topic, NULL) + PHP_FALIAS(update, mgd_update_topic, NULL) + PHP_FALIAS(delete, mgd_delete_topic, NULL) + PHP_FALIAS(setscore, mgd_update_topic_score, NULL) + PHP_FALIAS(fetch, mgd_oop_list_fetch, NULL) + MIDGARD_OOP_ATTACHMENT_METHODS + MIDGARD_OOP_SITEGROUP_METHODS + MIDGARD_OOP_PARAMETER_METHODS + { NULL, NULL, NULL} +}; +MidgardClass MidgardTopic = { + "MidgardTopic", + "topic", + MidgardTopicMethods, + {}, + mgd_topic_call_function_handler, + mgd_topic_get_property_handler, + mgd_topic_set_property_handler, + MidgardTopicProperties, + NULL +}; +MIDGARD_HANDLERS(MidgardTopic, topic)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]