From 941f1a52d428d1ca69c0ee979050608d4528d516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moses=20Palm=C3=A9r?= Date: Sat, 20 Aug 2011 22:08:13 +0200 Subject: [PATCH] Allow _.*/.* IDs when putting documents This makes it possible to put design documents on CouchDB. --- .gitignore | 1 + couchdb-glib/couchdb-database.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 94e4725..4d02e26 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ configure *.bak *~ *.pc +*.vapi depcomp install-sh libtool diff --git a/couchdb-glib/couchdb-database.c b/couchdb-glib/couchdb-database.c index cbbe0b6..ffed105 100644 --- a/couchdb-glib/couchdb-database.c +++ b/couchdb-glib/couchdb-database.c @@ -19,6 +19,8 @@ * Boston, MA 02110-1301, USA. */ +#include + #include #include #include "couchdb-glib.h" @@ -652,10 +654,19 @@ couchdb_database_put_document (CouchdbDatabase *database, body = couchdb_document_to_string (document); parser = json_parser_new (); if (id) { + char *last_id; char *encoded_docid; - encoded_docid = soup_uri_encode (id, NULL); - url = g_strdup_printf ("%s/%s/%s", couchdb_session_get_uri (database->priv->session), database->priv->dbname, encoded_docid); + /* Allow one sub-level in the ID string for i. e. design documents */ + last_id = *id == '_' ? strchr(id, '/') : NULL; + if (last_id == NULL) { + encoded_docid = soup_uri_encode (id, NULL); + url = g_strdup_printf ("%s/%s/%s", couchdb_session_get_uri (database->priv->session), database->priv->dbname, encoded_docid); + } + else { + encoded_docid = soup_uri_encode (last_id + 1, NULL); + url = g_strdup_printf ("%s/%s/%.*s/%s", couchdb_session_get_uri (database->priv->session), database->priv->dbname, last_id - id, id, encoded_docid); + } send_ok = couchdb_session_send_message (database->priv->session, SOUP_METHOD_PUT, url, body, parser, error); g_free (encoded_docid); -- 1.7.4.1