Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Initial move from Doctrine/CouchDB namespace into its own subproject.

  • Loading branch information...
commit 86c480de76fb2e0eeab976ae462b7e72c9259e5d 0 parents
Benjamin Eberlei beberlei authored

Showing 46 changed files with 3,891 additions and 0 deletions. Show diff stats Hide diff stats

  1. +1 0  .gitignore
  2. +502 0 LICENSE
  3. +21 0 composer.json
  4. +11 0 composer.lock
  5. +265 0 lib/Doctrine/CouchDB/Attachment.php
  6. +498 0 lib/Doctrine/CouchDB/CouchDBClient.php
  7. +65 0 lib/Doctrine/CouchDB/CouchDBException.php
  8. +88 0 lib/Doctrine/CouchDB/HTTP/AbstractHTTPClient.php
  9. +39 0 lib/Doctrine/CouchDB/HTTP/Client.php
  10. +19 0 lib/Doctrine/CouchDB/HTTP/ErrorResponse.php
  11. +68 0 lib/Doctrine/CouchDB/HTTP/HTTPException.php
  12. +82 0 lib/Doctrine/CouchDB/HTTP/LoggingClient.php
  13. +67 0 lib/Doctrine/CouchDB/HTTP/Response.php
  14. +260 0 lib/Doctrine/CouchDB/HTTP/SocketClient.php
  15. +127 0 lib/Doctrine/CouchDB/HTTP/StreamClient.php
  16. +23 0 lib/Doctrine/CouchDB/JsonDecodeException.php
  17. +44 0 lib/Doctrine/CouchDB/Tools/Console/Command/CompactDatabaseCommand.php
  18. +47 0 lib/Doctrine/CouchDB/Tools/Console/Command/CompactViewCommand.php
  19. +51 0 lib/Doctrine/CouchDB/Tools/Console/Command/MigrationCommand.php
  20. +62 0 lib/Doctrine/CouchDB/Tools/Console/Command/ReplicationCancelCommand.php
  21. +67 0 lib/Doctrine/CouchDB/Tools/Console/Command/ReplicationStartCommand.php
  22. +44 0 lib/Doctrine/CouchDB/Tools/Console/Command/ViewCleanupCommand.php
  23. +84 0 lib/Doctrine/CouchDB/Tools/Console/Helper/CouchDBHelper.php
  24. +71 0 lib/Doctrine/CouchDB/Tools/Migrations/AbstractMigration.php
  25. +71 0 lib/Doctrine/CouchDB/Utils/BulkUpdater.php
  26. +25 0 lib/Doctrine/CouchDB/Version.php
  27. +129 0 lib/Doctrine/CouchDB/View/AbstractQuery.php
  28. +51 0 lib/Doctrine/CouchDB/View/DesignDocument.php
  29. +60 0 lib/Doctrine/CouchDB/View/FolderDesignDocument.php
  30. +122 0 lib/Doctrine/CouchDB/View/LuceneQuery.php
  31. +46 0 lib/Doctrine/CouchDB/View/LuceneResult.php
  32. +209 0 lib/Doctrine/CouchDB/View/Query.php
  33. +48 0 lib/Doctrine/CouchDB/View/Result.php
  34. +24 0 phpunit.xml.dist
  35. +38 0 tests/Doctrine/Tests/CouchDB/CouchDBFunctionalTestCase.php
  36. +168 0 tests/Doctrine/Tests/CouchDB/Functional/CouchDBClientTest.php
  37. +14 0 tests/Doctrine/Tests/CouchDB/TestUtil.php
  38. +36 0 tests/Doctrine/Tests/Models/CMS/CmsAddress.php
  39. +33 0 tests/Doctrine/Tests/Models/CMS/CmsArticle.php
  40. +38 0 tests/Doctrine/Tests/Models/CMS/CmsGroup.php
  41. +35 0 tests/Doctrine/Tests/Models/CMS/CmsNode.php
  42. +81 0 tests/Doctrine/Tests/Models/CMS/CmsUser.php
  43. +15 0 tests/Doctrine/Tests/Models/CMS/CmsUserRights.php
  44. +16 0 tests/Doctrine/Tests/Models/CMS/_files/rewrites.json
  45. +5 0 tests/Doctrine/Tests/Models/CMS/_files/views/username/map.js
  46. +21 0 tests/TestInit.php
1  .gitignore
... ... @@ -0,0 +1 @@
  1 +vendor
502 LICENSE
... ... @@ -0,0 +1,502 @@
  1 + GNU LESSER GENERAL PUBLIC LICENSE
  2 + Version 2.1, February 1999
  3 +
  4 + Copyright (C) 1991, 1999 Free Software Foundation, Inc.
  5 + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  6 + Everyone is permitted to copy and distribute verbatim copies
  7 + of this license document, but changing it is not allowed.
  8 +
  9 +[This is the first released version of the Lesser GPL. It also counts
  10 + as the successor of the GNU Library Public License, version 2, hence
  11 + the version number 2.1.]
  12 +
  13 + Preamble
  14 +
  15 + The licenses for most software are designed to take away your
  16 +freedom to share and change it. By contrast, the GNU General Public
  17 +Licenses are intended to guarantee your freedom to share and change
  18 +free software--to make sure the software is free for all its users.
  19 +
  20 + This license, the Lesser General Public License, applies to some
  21 +specially designated software packages--typically libraries--of the
  22 +Free Software Foundation and other authors who decide to use it. You
  23 +can use it too, but we suggest you first think carefully about whether
  24 +this license or the ordinary General Public License is the better
  25 +strategy to use in any particular case, based on the explanations below.
  26 +
  27 + When we speak of free software, we are referring to freedom of use,
  28 +not price. Our General Public Licenses are designed to make sure that
  29 +you have the freedom to distribute copies of free software (and charge
  30 +for this service if you wish); that you receive source code or can get
  31 +it if you want it; that you can change the software and use pieces of
  32 +it in new free programs; and that you are informed that you can do
  33 +these things.
  34 +
  35 + To protect your rights, we need to make restrictions that forbid
  36 +distributors to deny you these rights or to ask you to surrender these
  37 +rights. These restrictions translate to certain responsibilities for
  38 +you if you distribute copies of the library or if you modify it.
  39 +
  40 + For example, if you distribute copies of the library, whether gratis
  41 +or for a fee, you must give the recipients all the rights that we gave
  42 +you. You must make sure that they, too, receive or can get the source
  43 +code. If you link other code with the library, you must provide
  44 +complete object files to the recipients, so that they can relink them
  45 +with the library after making changes to the library and recompiling
  46 +it. And you must show them these terms so they know their rights.
  47 +
  48 + We protect your rights with a two-step method: (1) we copyright the
  49 +library, and (2) we offer you this license, which gives you legal
  50 +permission to copy, distribute and/or modify the library.
  51 +
  52 + To protect each distributor, we want to make it very clear that
  53 +there is no warranty for the free library. Also, if the library is
  54 +modified by someone else and passed on, the recipients should know
  55 +that what they have is not the original version, so that the original
  56 +author's reputation will not be affected by problems that might be
  57 +introduced by others.
  58 +
  59 + Finally, software patents pose a constant threat to the existence of
  60 +any free program. We wish to make sure that a company cannot
  61 +effectively restrict the users of a free program by obtaining a
  62 +restrictive license from a patent holder. Therefore, we insist that
  63 +any patent license obtained for a version of the library must be
  64 +consistent with the full freedom of use specified in this license.
  65 +
  66 + Most GNU software, including some libraries, is covered by the
  67 +ordinary GNU General Public License. This license, the GNU Lesser
  68 +General Public License, applies to certain designated libraries, and
  69 +is quite different from the ordinary General Public License. We use
  70 +this license for certain libraries in order to permit linking those
  71 +libraries into non-free programs.
  72 +
  73 + When a program is linked with a library, whether statically or using
  74 +a shared library, the combination of the two is legally speaking a
  75 +combined work, a derivative of the original library. The ordinary
  76 +General Public License therefore permits such linking only if the
  77 +entire combination fits its criteria of freedom. The Lesser General
  78 +Public License permits more lax criteria for linking other code with
  79 +the library.
  80 +
  81 + We call this license the "Lesser" General Public License because it
  82 +does Less to protect the user's freedom than the ordinary General
  83 +Public License. It also provides other free software developers Less
  84 +of an advantage over competing non-free programs. These disadvantages
  85 +are the reason we use the ordinary General Public License for many
  86 +libraries. However, the Lesser license provides advantages in certain
  87 +special circumstances.
  88 +
  89 + For example, on rare occasions, there may be a special need to
  90 +encourage the widest possible use of a certain library, so that it becomes
  91 +a de-facto standard. To achieve this, non-free programs must be
  92 +allowed to use the library. A more frequent case is that a free
  93 +library does the same job as widely used non-free libraries. In this
  94 +case, there is little to gain by limiting the free library to free
  95 +software only, so we use the Lesser General Public License.
  96 +
  97 + In other cases, permission to use a particular library in non-free
  98 +programs enables a greater number of people to use a large body of
  99 +free software. For example, permission to use the GNU C Library in
  100 +non-free programs enables many more people to use the whole GNU
  101 +operating system, as well as its variant, the GNU/Linux operating
  102 +system.
  103 +
  104 + Although the Lesser General Public License is Less protective of the
  105 +users' freedom, it does ensure that the user of a program that is
  106 +linked with the Library has the freedom and the wherewithal to run
  107 +that program using a modified version of the Library.
  108 +
  109 + The precise terms and conditions for copying, distribution and
  110 +modification follow. Pay close attention to the difference between a
  111 +"work based on the library" and a "work that uses the library". The
  112 +former contains code derived from the library, whereas the latter must
  113 +be combined with the library in order to run.
  114 +
  115 + GNU LESSER GENERAL PUBLIC LICENSE
  116 + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  117 +
  118 + 0. This License Agreement applies to any software library or other
  119 +program which contains a notice placed by the copyright holder or
  120 +other authorized party saying it may be distributed under the terms of
  121 +this Lesser General Public License (also called "this License").
  122 +Each licensee is addressed as "you".
  123 +
  124 + A "library" means a collection of software functions and/or data
  125 +prepared so as to be conveniently linked with application programs
  126 +(which use some of those functions and data) to form executables.
  127 +
  128 + The "Library", below, refers to any such software library or work
  129 +which has been distributed under these terms. A "work based on the
  130 +Library" means either the Library or any derivative work under
  131 +copyright law: that is to say, a work containing the Library or a
  132 +portion of it, either verbatim or with modifications and/or translated
  133 +straightforwardly into another language. (Hereinafter, translation is
  134 +included without limitation in the term "modification".)
  135 +
  136 + "Source code" for a work means the preferred form of the work for
  137 +making modifications to it. For a library, complete source code means
  138 +all the source code for all modules it contains, plus any associated
  139 +interface definition files, plus the scripts used to control compilation
  140 +and installation of the library.
  141 +
  142 + Activities other than copying, distribution and modification are not
  143 +covered by this License; they are outside its scope. The act of
  144 +running a program using the Library is not restricted, and output from
  145 +such a program is covered only if its contents constitute a work based
  146 +on the Library (independent of the use of the Library in a tool for
  147 +writing it). Whether that is true depends on what the Library does
  148 +and what the program that uses the Library does.
  149 +
  150 + 1. You may copy and distribute verbatim copies of the Library's
  151 +complete source code as you receive it, in any medium, provided that
  152 +you conspicuously and appropriately publish on each copy an
  153 +appropriate copyright notice and disclaimer of warranty; keep intact
  154 +all the notices that refer to this License and to the absence of any
  155 +warranty; and distribute a copy of this License along with the
  156 +Library.
  157 +
  158 + You may charge a fee for the physical act of transferring a copy,
  159 +and you may at your option offer warranty protection in exchange for a
  160 +fee.
  161 +
  162 + 2. You may modify your copy or copies of the Library or any portion
  163 +of it, thus forming a work based on the Library, and copy and
  164 +distribute such modifications or work under the terms of Section 1
  165 +above, provided that you also meet all of these conditions:
  166 +
  167 + a) The modified work must itself be a software library.
  168 +
  169 + b) You must cause the files modified to carry prominent notices
  170 + stating that you changed the files and the date of any change.
  171 +
  172 + c) You must cause the whole of the work to be licensed at no
  173 + charge to all third parties under the terms of this License.
  174 +
  175 + d) If a facility in the modified Library refers to a function or a
  176 + table of data to be supplied by an application program that uses
  177 + the facility, other than as an argument passed when the facility
  178 + is invoked, then you must make a good faith effort to ensure that,
  179 + in the event an application does not supply such function or
  180 + table, the facility still operates, and performs whatever part of
  181 + its purpose remains meaningful.
  182 +
  183 + (For example, a function in a library to compute square roots has
  184 + a purpose that is entirely well-defined independent of the
  185 + application. Therefore, Subsection 2d requires that any
  186 + application-supplied function or table used by this function must
  187 + be optional: if the application does not supply it, the square
  188 + root function must still compute square roots.)
  189 +
  190 +These requirements apply to the modified work as a whole. If
  191 +identifiable sections of that work are not derived from the Library,
  192 +and can be reasonably considered independent and separate works in
  193 +themselves, then this License, and its terms, do not apply to those
  194 +sections when you distribute them as separate works. But when you
  195 +distribute the same sections as part of a whole which is a work based
  196 +on the Library, the distribution of the whole must be on the terms of
  197 +this License, whose permissions for other licensees extend to the
  198 +entire whole, and thus to each and every part regardless of who wrote
  199 +it.
  200 +
  201 +Thus, it is not the intent of this section to claim rights or contest
  202 +your rights to work written entirely by you; rather, the intent is to
  203 +exercise the right to control the distribution of derivative or
  204 +collective works based on the Library.
  205 +
  206 +In addition, mere aggregation of another work not based on the Library
  207 +with the Library (or with a work based on the Library) on a volume of
  208 +a storage or distribution medium does not bring the other work under
  209 +the scope of this License.
  210 +
  211 + 3. You may opt to apply the terms of the ordinary GNU General Public
  212 +License instead of this License to a given copy of the Library. To do
  213 +this, you must alter all the notices that refer to this License, so
  214 +that they refer to the ordinary GNU General Public License, version 2,
  215 +instead of to this License. (If a newer version than version 2 of the
  216 +ordinary GNU General Public License has appeared, then you can specify
  217 +that version instead if you wish.) Do not make any other change in
  218 +these notices.
  219 +
  220 + Once this change is made in a given copy, it is irreversible for
  221 +that copy, so the ordinary GNU General Public License applies to all
  222 +subsequent copies and derivative works made from that copy.
  223 +
  224 + This option is useful when you wish to copy part of the code of
  225 +the Library into a program that is not a library.
  226 +
  227 + 4. You may copy and distribute the Library (or a portion or
  228 +derivative of it, under Section 2) in object code or executable form
  229 +under the terms of Sections 1 and 2 above provided that you accompany
  230 +it with the complete corresponding machine-readable source code, which
  231 +must be distributed under the terms of Sections 1 and 2 above on a
  232 +medium customarily used for software interchange.
  233 +
  234 + If distribution of object code is made by offering access to copy
  235 +from a designated place, then offering equivalent access to copy the
  236 +source code from the same place satisfies the requirement to
  237 +distribute the source code, even though third parties are not
  238 +compelled to copy the source along with the object code.
  239 +
  240 + 5. A program that contains no derivative of any portion of the
  241 +Library, but is designed to work with the Library by being compiled or
  242 +linked with it, is called a "work that uses the Library". Such a
  243 +work, in isolation, is not a derivative work of the Library, and
  244 +therefore falls outside the scope of this License.
  245 +
  246 + However, linking a "work that uses the Library" with the Library
  247 +creates an executable that is a derivative of the Library (because it
  248 +contains portions of the Library), rather than a "work that uses the
  249 +library". The executable is therefore covered by this License.
  250 +Section 6 states terms for distribution of such executables.
  251 +
  252 + When a "work that uses the Library" uses material from a header file
  253 +that is part of the Library, the object code for the work may be a
  254 +derivative work of the Library even though the source code is not.
  255 +Whether this is true is especially significant if the work can be
  256 +linked without the Library, or if the work is itself a library. The
  257 +threshold for this to be true is not precisely defined by law.
  258 +
  259 + If such an object file uses only numerical parameters, data
  260 +structure layouts and accessors, and small macros and small inline
  261 +functions (ten lines or less in length), then the use of the object
  262 +file is unrestricted, regardless of whether it is legally a derivative
  263 +work. (Executables containing this object code plus portions of the
  264 +Library will still fall under Section 6.)
  265 +
  266 + Otherwise, if the work is a derivative of the Library, you may
  267 +distribute the object code for the work under the terms of Section 6.
  268 +Any executables containing that work also fall under Section 6,
  269 +whether or not they are linked directly with the Library itself.
  270 +
  271 + 6. As an exception to the Sections above, you may also combine or
  272 +link a "work that uses the Library" with the Library to produce a
  273 +work containing portions of the Library, and distribute that work
  274 +under terms of your choice, provided that the terms permit
  275 +modification of the work for the customer's own use and reverse
  276 +engineering for debugging such modifications.
  277 +
  278 + You must give prominent notice with each copy of the work that the
  279 +Library is used in it and that the Library and its use are covered by
  280 +this License. You must supply a copy of this License. If the work
  281 +during execution displays copyright notices, you must include the
  282 +copyright notice for the Library among them, as well as a reference
  283 +directing the user to the copy of this License. Also, you must do one
  284 +of these things:
  285 +
  286 + a) Accompany the work with the complete corresponding
  287 + machine-readable source code for the Library including whatever
  288 + changes were used in the work (which must be distributed under
  289 + Sections 1 and 2 above); and, if the work is an executable linked
  290 + with the Library, with the complete machine-readable "work that
  291 + uses the Library", as object code and/or source code, so that the
  292 + user can modify the Library and then relink to produce a modified
  293 + executable containing the modified Library. (It is understood
  294 + that the user who changes the contents of definitions files in the
  295 + Library will not necessarily be able to recompile the application
  296 + to use the modified definitions.)
  297 +
  298 + b) Use a suitable shared library mechanism for linking with the
  299 + Library. A suitable mechanism is one that (1) uses at run time a
  300 + copy of the library already present on the user's computer system,
  301 + rather than copying library functions into the executable, and (2)
  302 + will operate properly with a modified version of the library, if
  303 + the user installs one, as long as the modified version is
  304 + interface-compatible with the version that the work was made with.
  305 +
  306 + c) Accompany the work with a written offer, valid for at
  307 + least three years, to give the same user the materials
  308 + specified in Subsection 6a, above, for a charge no more
  309 + than the cost of performing this distribution.
  310 +
  311 + d) If distribution of the work is made by offering access to copy
  312 + from a designated place, offer equivalent access to copy the above
  313 + specified materials from the same place.
  314 +
  315 + e) Verify that the user has already received a copy of these
  316 + materials or that you have already sent this user a copy.
  317 +
  318 + For an executable, the required form of the "work that uses the
  319 +Library" must include any data and utility programs needed for
  320 +reproducing the executable from it. However, as a special exception,
  321 +the materials to be distributed need not include anything that is
  322 +normally distributed (in either source or binary form) with the major
  323 +components (compiler, kernel, and so on) of the operating system on
  324 +which the executable runs, unless that component itself accompanies
  325 +the executable.
  326 +
  327 + It may happen that this requirement contradicts the license
  328 +restrictions of other proprietary libraries that do not normally
  329 +accompany the operating system. Such a contradiction means you cannot
  330 +use both them and the Library together in an executable that you
  331 +distribute.
  332 +
  333 + 7. You may place library facilities that are a work based on the
  334 +Library side-by-side in a single library together with other library
  335 +facilities not covered by this License, and distribute such a combined
  336 +library, provided that the separate distribution of the work based on
  337 +the Library and of the other library facilities is otherwise
  338 +permitted, and provided that you do these two things:
  339 +
  340 + a) Accompany the combined library with a copy of the same work
  341 + based on the Library, uncombined with any other library
  342 + facilities. This must be distributed under the terms of the
  343 + Sections above.
  344 +
  345 + b) Give prominent notice with the combined library of the fact
  346 + that part of it is a work based on the Library, and explaining
  347 + where to find the accompanying uncombined form of the same work.
  348 +
  349 + 8. You may not copy, modify, sublicense, link with, or distribute
  350 +the Library except as expressly provided under this License. Any
  351 +attempt otherwise to copy, modify, sublicense, link with, or
  352 +distribute the Library is void, and will automatically terminate your
  353 +rights under this License. However, parties who have received copies,
  354 +or rights, from you under this License will not have their licenses
  355 +terminated so long as such parties remain in full compliance.
  356 +
  357 + 9. You are not required to accept this License, since you have not
  358 +signed it. However, nothing else grants you permission to modify or
  359 +distribute the Library or its derivative works. These actions are
  360 +prohibited by law if you do not accept this License. Therefore, by
  361 +modifying or distributing the Library (or any work based on the
  362 +Library), you indicate your acceptance of this License to do so, and
  363 +all its terms and conditions for copying, distributing or modifying
  364 +the Library or works based on it.
  365 +
  366 + 10. Each time you redistribute the Library (or any work based on the
  367 +Library), the recipient automatically receives a license from the
  368 +original licensor to copy, distribute, link with or modify the Library
  369 +subject to these terms and conditions. You may not impose any further
  370 +restrictions on the recipients' exercise of the rights granted herein.
  371 +You are not responsible for enforcing compliance by third parties with
  372 +this License.
  373 +
  374 + 11. If, as a consequence of a court judgment or allegation of patent
  375 +infringement or for any other reason (not limited to patent issues),
  376 +conditions are imposed on you (whether by court order, agreement or
  377 +otherwise) that contradict the conditions of this License, they do not
  378 +excuse you from the conditions of this License. If you cannot
  379 +distribute so as to satisfy simultaneously your obligations under this
  380 +License and any other pertinent obligations, then as a consequence you
  381 +may not distribute the Library at all. For example, if a patent
  382 +license would not permit royalty-free redistribution of the Library by
  383 +all those who receive copies directly or indirectly through you, then
  384 +the only way you could satisfy both it and this License would be to
  385 +refrain entirely from distribution of the Library.
  386 +
  387 +If any portion of this section is held invalid or unenforceable under any
  388 +particular circumstance, the balance of the section is intended to apply,
  389 +and the section as a whole is intended to apply in other circumstances.
  390 +
  391 +It is not the purpose of this section to induce you to infringe any
  392 +patents or other property right claims or to contest validity of any
  393 +such claims; this section has the sole purpose of protecting the
  394 +integrity of the free software distribution system which is
  395 +implemented by public license practices. Many people have made
  396 +generous contributions to the wide range of software distributed
  397 +through that system in reliance on consistent application of that
  398 +system; it is up to the author/donor to decide if he or she is willing
  399 +to distribute software through any other system and a licensee cannot
  400 +impose that choice.
  401 +
  402 +This section is intended to make thoroughly clear what is believed to
  403 +be a consequence of the rest of this License.
  404 +
  405 + 12. If the distribution and/or use of the Library is restricted in
  406 +certain countries either by patents or by copyrighted interfaces, the
  407 +original copyright holder who places the Library under this License may add
  408 +an explicit geographical distribution limitation excluding those countries,
  409 +so that distribution is permitted only in or among countries not thus
  410 +excluded. In such case, this License incorporates the limitation as if
  411 +written in the body of this License.
  412 +
  413 + 13. The Free Software Foundation may publish revised and/or new
  414 +versions of the Lesser General Public License from time to time.
  415 +Such new versions will be similar in spirit to the present version,
  416 +but may differ in detail to address new problems or concerns.
  417 +
  418 +Each version is given a distinguishing version number. If the Library
  419 +specifies a version number of this License which applies to it and
  420 +"any later version", you have the option of following the terms and
  421 +conditions either of that version or of any later version published by
  422 +the Free Software Foundation. If the Library does not specify a
  423 +license version number, you may choose any version ever published by
  424 +the Free Software Foundation.
  425 +
  426 + 14. If you wish to incorporate parts of the Library into other free
  427 +programs whose distribution conditions are incompatible with these,
  428 +write to the author to ask for permission. For software which is
  429 +copyrighted by the Free Software Foundation, write to the Free
  430 +Software Foundation; we sometimes make exceptions for this. Our
  431 +decision will be guided by the two goals of preserving the free status
  432 +of all derivatives of our free software and of promoting the sharing
  433 +and reuse of software generally.
  434 +
  435 + NO WARRANTY
  436 +
  437 + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
  438 +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
  439 +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
  440 +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
  441 +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
  442 +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  443 +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
  444 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
  445 +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  446 +
  447 + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
  448 +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
  449 +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
  450 +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
  451 +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
  452 +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
  453 +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
  454 +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
  455 +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  456 +DAMAGES.
  457 +
  458 + END OF TERMS AND CONDITIONS
  459 +
  460 + How to Apply These Terms to Your New Libraries
  461 +
  462 + If you develop a new library, and you want it to be of the greatest
  463 +possible use to the public, we recommend making it free software that
  464 +everyone can redistribute and change. You can do so by permitting
  465 +redistribution under these terms (or, alternatively, under the terms of the
  466 +ordinary General Public License).
  467 +
  468 + To apply these terms, attach the following notices to the library. It is
  469 +safest to attach them to the start of each source file to most effectively
  470 +convey the exclusion of warranty; and each file should have at least the
  471 +"copyright" line and a pointer to where the full notice is found.
  472 +
  473 + <one line to give the library's name and a brief idea of what it does.>
  474 + Copyright (C) <year> <name of author>
  475 +
  476 + This library is free software; you can redistribute it and/or
  477 + modify it under the terms of the GNU Lesser General Public
  478 + License as published by the Free Software Foundation; either
  479 + version 2.1 of the License, or (at your option) any later version.
  480 +
  481 + This library is distributed in the hope that it will be useful,
  482 + but WITHOUT ANY WARRANTY; without even the implied warranty of
  483 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  484 + Lesser General Public License for more details.
  485 +
  486 + You should have received a copy of the GNU Lesser General Public
  487 + License along with this library; if not, write to the Free Software
  488 + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  489 +
  490 +Also add information on how to contact you by electronic and paper mail.
  491 +
  492 +You should also get your employer (if you work as a programmer) or your
  493 +school, if any, to sign a "copyright disclaimer" for the library, if
  494 +necessary. Here is a sample; alter the names:
  495 +
  496 + Yoyodyne, Inc., hereby disclaims all copyright interest in the
  497 + library `Frob' (a library for tweaking knobs) written by James Random Hacker.
  498 +
  499 + <signature of Ty Coon>, 1 April 1990
  500 + Ty Coon, President of Vice
  501 +
  502 +That's all there is to it!
21 composer.json
... ... @@ -0,0 +1,21 @@
  1 +{
  2 + "name": "doctrine/couchdb",
  3 + "type": "library",
  4 + "description": "CouchDB Client",
  5 + "keywords": ["persistence", "couchdb"],
  6 + "homepage": "http://www.doctrine-project.org",
  7 + "license": "LGPL",
  8 + "authors": [
  9 + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
  10 + {"name": "Lukas Kahwe Smith", "email": "smith@pooteeweet.org"}
  11 + ],
  12 + "require": {
  13 + "php": ">=5.3.2",
  14 + "doctrine/common": ">=2.2.0"
  15 + },
  16 + "autoload": {
  17 + "psr-0": {
  18 + "Doctrine\\CouchDB": "lib/"
  19 + }
  20 + }
  21 +}
11 composer.lock
... ... @@ -0,0 +1,11 @@
  1 +{
  2 + "hash": "a9de4852bde016fcab7c17df42f9506a",
  3 + "packages": [
  4 + {
  5 + "package": "doctrine/common",
  6 + "version": "dev-master",
  7 + "source-reference": "f157be8c4f1ba713730cf66066eaac2bdfa1c1cc"
  8 + }
  9 + ],
  10 + "aliases": []
  11 +}
265 lib/Doctrine/CouchDB/Attachment.php
... ... @@ -0,0 +1,265 @@
  1 +<?php
  2 +/*
  3 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  4 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  5 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  6 + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  7 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  8 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  9 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  10 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  11 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  12 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  13 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14 + *
  15 + * This software consists of voluntary contributions made by many individuals
  16 + * and is licensed under the LGPL. For more information, see
  17 + * <http://www.doctrine-project.org>.
  18 + */
  19 +
  20 +
  21 +namespace Doctrine\CouchDB;
  22 +
  23 +use Doctrine\CouchDB\HTTP\Client;
  24 +use Doctrine\CouchDB\HTTP\HTTPException;
  25 +
  26 +/**
  27 + * An attachment is a special embedded document that exists inside CouchDB.
  28 + * It is created inside the "Attachments" object for each attachment that is found.
  29 + *
  30 + * TODO: This is a very inefficient first version implementation that saves both
  31 + * binary and base64 data of everything if possible to ease the API.
  32 + *
  33 + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
  34 + * @link www.doctrine-project.com
  35 + * @since 1.0
  36 + * @author Benjamin Eberlei <kontakt@beberlei.de>
  37 + */
  38 +class Attachment
  39 +{
  40 + /**
  41 + * Content-Type of the Attachment
  42 + *
  43 + * If this is false on putting a new attachment into the database the
  44 + * generic "application/octet-stream" type will be used.
  45 + *
  46 + * @var string
  47 + */
  48 + private $contentType = false;
  49 +
  50 + /**
  51 + * Base64 Encoded tring of the Data.
  52 + *
  53 + * @var string
  54 + */
  55 + private $data;
  56 +
  57 + /**
  58 + * @var string
  59 + */
  60 + private $binaryData;
  61 +
  62 + /**
  63 + * This attachment only represented as stub, which means the attachment is standalone and not inline.
  64 + *
  65 + * WARNING: Never change this variable from true to false if you don't provide data.
  66 + * CouchDB otherwise quits with an error: {"error":"unknown_error","reason":"function_clause"}
  67 + *
  68 + * @var bool
  69 + */
  70 + private $stub = true;
  71 +
  72 + /**
  73 + * Size of the attachment.
  74 + *
  75 + * @var int
  76 + */
  77 + private $length = 0;
  78 +
  79 + /**
  80 + * Revision Position field of this Attachment.
  81 + *
  82 + * @var int
  83 + */
  84 + private $revpos = 0;
  85 +
  86 + /**
  87 + * @var Client
  88 + */
  89 + private $httpClient;
  90 +
  91 + /**
  92 + * @var string
  93 + */
  94 + private $path;
  95 +
  96 + /**
  97 + * Get the content-type of this attachment.
  98 + *
  99 + * @return string
  100 + */
  101 + public function getContentType()
  102 + {
  103 + return $this->contentType;
  104 + }
  105 +
  106 + /**
  107 + * Get the length of the base64 encoded representation of this attachment.
  108 + *
  109 + * @return int
  110 + */
  111 + public function getLength()
  112 + {
  113 + if (!$this->stub && !is_int($this->length)) {
  114 + $this->length = strlen($this->data);
  115 + }
  116 + return $this->length;
  117 + }
  118 +
  119 + /**
  120 + * Get the raw data of this attachment.
  121 + *
  122 + * @return string
  123 + */
  124 + public function getRawData()
  125 + {
  126 + $this->lazyLoad();
  127 +
  128 + return $this->binaryData;
  129 + }
  130 +
  131 + /**
  132 + * @return string
  133 + */
  134 + public function getBase64EncodedData()
  135 + {
  136 + $this->lazyLoad();
  137 +
  138 + return $this->data;
  139 + }
  140 +
  141 + /**
  142 + * Lazy Load Data from CouchDB if necessary
  143 + *
  144 + * @return void
  145 + */
  146 + private function lazyLoad()
  147 + {
  148 + if ($this->stub) {
  149 + $response = $this->httpClient->request('GET', $this->path, null, true); // raw request
  150 + if ($response->status != 200) {
  151 + throw HTTPException::fromResponse($this->path, $response);
  152 + }
  153 + $this->stub = false;
  154 + $this->binaryData = $response->body;
  155 + $this->data = \base64_encode($this->binaryData);
  156 + }
  157 + }
  158 +
  159 + public function isLoaded()
  160 + {
  161 + return !$this->stub;
  162 + }
  163 +
  164 + /**
  165 + * Number of times an attachment was alreaady saved with the document, indicating in which revision it was added.
  166 + *
  167 + * @return int
  168 + */
  169 + public function getRevPos()
  170 + {
  171 + return $this->revpos;
  172 + }
  173 +
  174 + /**
  175 + * Attachments are special in how they need to be persisted depending on stub or not.
  176 + *
  177 + * TODO: Is this really necessary with all this special logic? Having attahments as special
  178 + * case without special code would be really awesome.
  179 + *
  180 + * @return string
  181 + */
  182 + public function toArray()
  183 + {
  184 + if ($this->stub) {
  185 + $json = array('stub' => true);
  186 + } else {
  187 + $json = array('data' => $this->getBase64EncodedData());
  188 + if ($this->contentType) {
  189 + $json['content_type'] = $this->contentType;
  190 + }
  191 + }
  192 + return $json;
  193 + }
  194 +
  195 + /**
  196 + * @param string $binaryData
  197 + * @param string $base64Data
  198 + * @param string $contentType
  199 + * @param int $length
  200 + * @param int $revPos
  201 + * @param Client $httpClient
  202 + * @param string $path
  203 + */
  204 + final private function __construct($binaryData = null, $base64Data = null, $contentType = false, $length = false, $revPos = false, $httpClient = null, $path = null)
  205 + {
  206 + if ($binaryData || $base64Data) {
  207 + $this->binaryData = $binaryData;
  208 + $this->data = $base64Data;
  209 + $this->stub = false;
  210 + } else {
  211 + $this->stub = true;
  212 + }
  213 + $this->contentType = $contentType;
  214 + $this->length = $length;
  215 + $this->revpos = $revPos;
  216 + $this->httpClient = $httpClient;
  217 + $this->path = $path;
  218 + }
  219 +
  220 + /**
  221 + * Create an Attachment from a string or resource of binary data.
  222 + *
  223 + * WARNING: Changes to the file handle after calling this method will *NOT* be recognized anymore.
  224 + *
  225 + * @param string|resource $data
  226 + * @param string $contentType
  227 + * @return Attachment
  228 + */
  229 + static public function createFromBinaryData($data, $contentType = false)
  230 + {
  231 + if (\is_resource($data)) {
  232 + $data = \stream_get_contents($data);
  233 + }
  234 +
  235 + return new self($data, \base64_encode($data), $contentType);
  236 + }
  237 +
  238 + /**
  239 + * Create an attachment from base64 data.
  240 + *
  241 + * @param string $data
  242 + * @param string $contentType
  243 + * @param int $revpos
  244 + * @return Attachment
  245 + */
  246 + static public function createFromBase64Data($data, $contentType = false, $revpos = false)
  247 + {
  248 + return new self(\base64_decode($data), $data, $contentType, false, $revpos);
  249 + }
  250 +
  251 + /**
  252 + * Create a stub attachment that has lazy loading capabilities.
  253 + *
  254 + * @param string $contentType
  255 + * @param int $length
  256 + * @param int $revPos
  257 + * @param Client $httpClient
  258 + * @param string $path
  259 + * @return Attachment
  260 + */
  261 + static public function createStub($contentType, $length, $revPos, Client $httpClient, $path)
  262 + {
  263 + return new self(null, null, $contentType, $length, $revPos, $httpClient, $path);
  264 + }
  265 +}
498 lib/Doctrine/CouchDB/CouchDBClient.php
... ... @@ -0,0 +1,498 @@
  1 +<?php
  2 +/*
  3 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  4 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  5 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  6 + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  7 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  8 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  9 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  10 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  11 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  12 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  13 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14 + *
  15 + * This software consists of voluntary contributions made by many individuals
  16 + * and is licensed under the LGPL. For more information, see
  17 + * <http://www.doctrine-project.org>.
  18 + */
  19 +
  20 +namespace Doctrine\CouchDB;
  21 +
  22 +use Doctrine\CouchDB\HTTP\Client;
  23 +use Doctrine\CouchDB\HTTP\HTTPException;
  24 +use Doctrine\CouchDB\Utils\BulkUpdater;
  25 +use Doctrine\CouchDB\View\DesignDocument;
  26 +
  27 +/**
  28 + * CouchDB client class
  29 + *
  30 + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
  31 + * @link www.doctrine-project.com
  32 + * @since 1.0
  33 + * @author Benjamin Eberlei <kontakt@beberlei.de>
  34 + * @author Lukas Kahwe Smith <smith@pooteeweet.org>
  35 + */
  36 +class CouchDBClient
  37 +{
  38 + /**
  39 + * Name of the CouchDB database
  40 + *
  41 + * @string
  42 + */
  43 + private $databaseName;
  44 +
  45 + /**
  46 + * The underlying HTTP Connection of the used DocumentManager.
  47 + *
  48 + * @var Doctrine\ODM\CouchDB\HTTP\Client
  49 + */
  50 + private $httpClient;
  51 +
  52 + /**
  53 + * CouchDB Version
  54 + *
  55 + * @var string
  56 + */
  57 + private $version = null;
  58 +
  59 + static private $clients = array(
  60 + 'socket' => 'Doctrine\CouchDB\HTTP\SocketClient',
  61 + 'stream' => 'Doctrine\CouchDB\HTTP\StreamClient',
  62 + );
  63 +
  64 + /**
  65 + * Factory method for CouchDBClients
  66 + *
  67 + * @param array $options
  68 + * @return CouchDBClient
  69 + */
  70 + static public function create(array $options)
  71 + {
  72 + if (!isset($options['dbname'])) {
  73 + throw new \InvalidArgumentException("'dbname' is a required option to create a CouchDBClient");
  74 + }
  75 +
  76 + $defaults = array('type' => 'socket', 'host' => 'localhost', 'port' => 5984, 'user' => null, 'password' => null, 'ip' => null, 'logging' => false);
  77 + $options = array_merge($defaults, $options);
  78 +
  79 + if (!isset(self::$clients[$options['type']])) {
  80 + throw new \InvalidArgumentException(sprintf('There is no client implementation registered for %s, valid options are %s',
  81 + $options['type'], array_keys(self::$clients)
  82 + ));
  83 + }
  84 + $connectionClass = self::$clients[$options['type']];
  85 + $connection = new $connectionClass($options['host'], $options['port'], $options['user'], $options['password'], $options['ip']);
  86 + if ($options['logging'] === true) {
  87 + $connection = new HTTP\LoggingClient($connection);
  88 + }
  89 + return new self($connection, $options['dbname']);
  90 + }
  91 +
  92 + /**
  93 + * @param Client $client
  94 + * @param string $databaseName
  95 + */
  96 + public function __construct(Client $client, $databaseName)
  97 + {
  98 + $this->httpClient = $client;
  99 + $this->databaseName = $databaseName;
  100 + }
  101 +
  102 + public function setHttpClient(Client $client)
  103 + {
  104 + $this->httpClient = $client;
  105 + }
  106 +
  107 + /**
  108 + * @return HttpClient
  109 + */
  110 + public function getHttpClient()
  111 + {
  112 + return $this->httpClient;
  113 + }
  114 +
  115 + public function getDatabase()
  116 + {
  117 + return $this->databaseName;
  118 + }
  119 +
  120 + /**
  121 + * Let CouchDB generate an array of UUIDs.
  122 + *
  123 + * @param int $count
  124 + * @return array
  125 + */
  126 + public function getUuids($count = 1)
  127 + {
  128 + $count = (int)$count;
  129 + $response = $this->httpClient->request('GET', '/_uuids?count=' . $count);
  130 +
  131 + if ($response->status != 200) {
  132 + throw new CouchDBException("Could not retrieve UUIDs from CouchDB.");
  133 + }
  134 +
  135 + return $response->body['uuids'];
  136 + }
  137 +
  138 + /**
  139 + * Find a document by ID and return the HTTP response.
  140 + *
  141 + * @param string $id
  142 + * @return Response
  143 + */
  144 + public function findDocument($id)
  145 + {
  146 + $documentPath = '/' . $this->databaseName . '/' . urlencode($id);
  147 + return $this->httpClient->request( 'GET', $documentPath );
  148 + }
  149 +
  150 + /**
  151 + * Find many documents by passing their ids and return the HTTP response.
  152 + *
  153 + * @param array $ids
  154 + * @return array
  155 + */
  156 + public function findDocuments(array $ids, $limit = null, $offset = null)
  157 + {
  158 + $allDocsPath = '/' . $this->databaseName . '/_all_docs?include_docs=true';
  159 + if ($limit) {
  160 + $allDocsPath .= '&limit=' . (int)$limit;
  161 + }
  162 + if ($offset) {
  163 + $allDocsPath .= '&skip=' . (int)$offset;
  164 + }
  165 +
  166 + return $this->httpClient->request('POST', $allDocsPath, json_encode(
  167 + array('keys' => array_values($ids)))
  168 + );
  169 + }
  170 +
  171 + /**
  172 + * Get all documents
  173 + *
  174 + * @param int|null $limit
  175 + * @param string|null $startKey
  176 + * @return array
  177 + */
  178 + public function allDocs($limit = null, $startKey = null)
  179 + {
  180 + $allDocsPath = '/' . $this->databaseName . '/_all_docs?include_docs=true';
  181 + if ($limit) {
  182 + $allDocsPath .= '&limit=' . (int)$limit;
  183 + }
  184 + if ($startKey) {
  185 + $allDocsPath .= '&startkey="' . (string)$startKey.'"';
  186 + }
  187 + return $this->httpClient->request('GET', $allDocsPath);
  188 + }
  189 +
  190 + /**
  191 + * Get the current version of CouchDB.
  192 + *
  193 + * @throws HTTPException
  194 + * @return string
  195 + */
  196 + public function getVersion()
  197 + {
  198 + if ($this->version === null) {
  199 + $response = $this->httpClient->request('GET', '/');
  200 + if ($response->status != 200) {
  201 + throw HTTPException::fromResponse('/', $response);
  202 + }
  203 +
  204 + $this->version = $response->body['version'];
  205 + }
  206 + return $this->version;
  207 + }
  208 +
  209 + /**
  210 + * Get all databases
  211 + *
  212 + * @throws HTTPException
  213 + * @return array
  214 + */
  215 + public function getAllDatabases()
  216 + {
  217 + $response = $this->httpClient->request('GET', '/_all_dbs');
  218 + if ($response->status != 200) {
  219 + throw HTTPException::fromResponse('/_all_dbs', $response);
  220 + }
  221 +
  222 + return $response->body;
  223 + }
  224 +
  225 + /**
  226 + * Create a new database
  227 + *
  228 + * @throws HTTPException
  229 + * @param string $name
  230 + * @return void
  231 + */
  232 + public function createDatabase($name)
  233 + {
  234 + $response = $this->httpClient->request('PUT', '/' . urlencode($name));
  235 +
  236 + if ($response->status != 201) {
  237 + throw HTTPException::fromResponse('/' . urlencode($name), $response);
  238 + }
  239 + }
  240 +
  241 + /**
  242 + * Drop a database
  243 + *
  244 + * @throws HTTPException
  245 + * @param string $name
  246 + * @return void
  247 + */
  248 + public function deleteDatabase($name)
  249 + {
  250 + $response = $this->httpClient->request('DELETE', '/' . urlencode($name));
  251 +
  252 + if ($response->status != 200 && $response->status != 404) {
  253 + throw HTTPException::fromResponse('/' . urlencode($name), $response);
  254 + }
  255 + }
  256 +
  257 + /**
  258 + * Get Information about a database.
  259 + *
  260 + * @param string $name
  261 + * @return array
  262 + */
  263 + public function getDatabaseInfo($name)
  264 + {
  265 + $response = $this->httpClient->request('GET', '/' . $this->databaseName);
  266 +
  267 + if ($response->status != 200) {
  268 + throw HTTPException::fromResponse('/' . urlencode($name), $response);
  269 + }
  270 +
  271 + return $response->body;
  272 + }
  273 +
  274 + /**
  275 + * Get changes.
  276 + *
  277 + * @param array $params
  278 + * @return array
  279 + */
  280 + public function getChanges(array $params = null)
  281 + {
  282 + $path = '/' . $this->databaseName . '/_changes';
  283 + $response = $this->httpClient->request('GET', $path, $params);
  284 +
  285 + if ($response->status != 200) {
  286 + throw HTTPException::fromResponse($path, $response);
  287 + }
  288 +
  289 + return $response->body;
  290 + }
  291 +
  292 + /**
  293 + * Create a bulk updater instance.
  294 + *
  295 + * @return BulkUpdater
  296 + */
  297 + public function createBulkUpdater()
  298 + {
  299 + return new BulkUpdater($this->httpClient, $this->databaseName);
  300 + }
  301 +
  302 + /**
  303 + * Execute a POST request against CouchDB inserting a new document, leaving the server to generate a uuid.
  304 + *
  305 + * @param array $data
  306 + * @return array<id, rev>
  307 + */
  308 + public function postDocument(array $data)
  309 + {
  310 + $path = '/' . $this->databaseName;
  311 + $response = $this->httpClient->request('POST', $path, json_encode($data));
  312 +
  313 + if ($response->status != 201) {
  314 + throw HTTPException::fromResponse($path, $response);
  315 + }
  316 +
  317 + return array($response->body['id'], $response->body['rev']);
  318 + }
  319 +
  320 + /**
  321 + * Execute a PUT request against CouchDB inserting or updating a document.
  322 + *
  323 + * @param array $data
  324 + * @param string $id
  325 + * @param string|null $rev
  326 + * @return array<id, rev>
  327 + */
  328 + public function putDocument($data, $id, $rev = null)
  329 + {
  330 + $data['_id'] = $id;
  331 + if ($rev) {
  332 + $data['_rev'] = $rev;
  333 + }
  334 +
  335 + $path = '/' . $this->databaseName . '/' . urlencode($id);
  336 + $response = $this->httpClient->request('PUT', $path, json_encode($data));
  337 +
  338 + if ($response->status != 201) {
  339 + throw HTTPException::fromResponse($path, $response);
  340 + }
  341 +
  342 + return array($response->body['id'], $response->body['rev']);
  343 + }
  344 +
  345 + /**
  346 + * Delete a document.
  347 + *
  348 + * @param string $id
  349 + * @param string $rev
  350 + * @return void
  351 + */