[ 
https://issues.apache.org/jira/browse/COUCHDB-769?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15081113#comment-15081113
 ] 

ASF GitHub Bot commented on COUCHDB-769:
----------------------------------------

Github user rnewson commented on a diff in the pull request:

    https://github.com/apache/couchdb-fabric/pull/33#discussion_r48727510
  
    --- Diff: src/fabric_att_handler.erl ---
    @@ -0,0 +1,136 @@
    +% Licensed under the Apache License, Version 2.0 (the "License"); you may 
not
    +% use this file except in compliance with the License. You may obtain a 
copy of
    +% the License at
    +%
    +%   http://www.apache.org/licenses/LICENSE-2.0
    +%
    +% Unless required by applicable law or agreed to in writing, software
    +% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    +% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    +% License for the specific language governing permissions and limitations 
under
    +% the License.
    +
    +-module(fabric_att_handler).
    +
    +-include_lib("fabric/include/fabric.hrl").
    +-include_lib("couch/include/couch_db.hrl").
    +
    +-export([att_store/2, att/3, container/2, att_store/5, external_store/0]).
    +
    +
    +%% ====================================================================
    +%% External API functions. Exposes a generic API that can be used with 
    +%% other backend drivers
    +%% ====================================================================
    +
    +att_store(FileName, Db, ContentLen, MimeType, Req) ->
    +    ContainerName = container_name(Db),
    +    couch_log:debug("Going to store ~p of length is ~p," 
    +                   ++ " ~p in the container: ~n",[FileName, ContentLen,
    +                                                  ContainerName]),
    +    %TO-DO: No chunk reader. All kept in the memory. Should be fixed.
    +    Data = couch_httpd:recv(Req, ContentLen),
    +    case (get_backend_driver()):put_object(ContainerName, FileName, 
MimeType,
    +                                           [], Data) of
    +        {ok,{"201",NewUrl}} ->
    +            couch_log:debug("Object ~p created.Response code is 201 ~n",
    +                            [FileName]),
    +            case (get_backend_driver()):head_object(ContainerName, 
FileName) of
    +                {ok, {ObjectSize, EtagMD5}} ->
    +                    {ok, {unicode:characters_to_binary(NewUrl, unicode, 
utf8),
    +                          ObjectSize, EtagMD5, 
(get_backend_driver()):store_id()}};
    +                {error, _} ->
    +                    {error, Data}
    +            end;
    +        {error, _} ->
    +            {error, Data}
    +    end.
    +
    +att_store(Db, #doc{}=Doc) ->
    +  att_store(Db, [Doc]);
    +att_store(Db, Docs) when is_list(Docs) ->
    +    DbName = container_name(Db),
    +    [#doc{atts=Atts0} = Doc | Rest] = Docs,
    +    if 
    +        length(Atts0) > 0 ->
    +            Atts = [att_processor(DbName,Att) || Att <- Atts0],
    +            [Doc#doc{atts = Atts} | Rest];
    +        true ->
    +            Docs
    +    end.
    +
    +att(get, Db, Att) ->
    +    DbName = container_name(Db),
    +    [Name,AttLen,AttLenUser] = couch_att:fetch([name, att_len,
    +                                                att_external_size], Att),
    +    couch_log:debug("Going to retrieve ~p. DB length is: ~p, "
    +                   ++ "stored length: ~p~n", [Name, AttLen, AttLenUser]),
    +    NewData = (get_backend_driver()):get_object(DbName, Name),
    +    NewAtt = couch_att:store([{data, NewData}, {att_len, AttLenUser},
    +                              {disk_len, AttLenUser}], Att),
    +    NewAtt;
    +att(delete,Db, Att) ->
    +    DbName = container_name(Db),
    +    [Name] = couch_att:fetch([name],Att),
    +    couch_log:debug("Delete ~p from ~p", [Name, DbName]).
    +
    +container(create,DbName) ->
    +    couch_log:debug("Create container ~p~n", [DbName]),
    +    case (get_backend_driver()):create_container(DbName) of
    +        {ok, {"201", Container}} ->
    +            couch_log:debug("Container ~p created succesfully ~n", 
[Container]),
    +            {ok, Container};
    +        {error, _} ->
    --- End diff --
    
    why is the error type ignored?


> Store large attachments external to the .couch file
> ---------------------------------------------------
>
>                 Key: COUCHDB-769
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-769
>             Project: CouchDB
>          Issue Type: New Feature
>          Components: Database Core
>            Reporter: Robert Newson
>            Assignee: Adam Kocoloski
>         Attachments: external_attachments_alpha.patch
>
>
> For attachment-heavy applications storing the attachments in separate files 
> significantly eases compaction problems.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to