Line data Source code
1 : //
2 : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
3 : //
4 : // Copyright: See COPYING file that comes with this distribution
5 : //
6 :
7 : #ifndef VSET_VSET_BUFFER_PERSISTENT_FILESYNC_AD_OPEN_HPP
8 : #define VSET_VSET_BUFFER_PERSISTENT_FILESYNC_AD_OPEN_HPP
9 :
10 : #include <fas/system/nullptr.hpp>
11 : #include <vset/buffer/tags.hpp>
12 : #include <vset/buffer/persistent/tags.hpp>
13 : #include <vset/buffer/persistent/filesync/tags.hpp>
14 : #include <string.h>
15 : #include <string>
16 :
17 : namespace vset { namespace buffer { namespace persistent{ namespace filesync{
18 :
19 3 : struct ad_open
20 : {
21 : template<typename T>
22 3 : void operator()( T& t)
23 : {
24 3 : std::string file_name = t.get_aspect().template get<_file_name_>();
25 3 : this->operator()(t, file_name );
26 3 : }
27 :
28 : template<typename T>
29 10 : void operator()( T& t, const std::string& file_name)
30 : {
31 10 : t.get_aspect().template get<_close_>()(t);
32 10 : t.get_aspect().template get<_file_name_>() = file_name;
33 10 : t.get_aspect().template get<_open_file_>()(t);
34 10 : size_t file_size = t.get_aspect().template get<_file_size_>()(t);
35 : typedef typename T::aspect::template advice_cast<_head_type_>::type head_type;
36 10 : head_type* head = fas_nullptr;
37 10 : if ( file_size < sizeof(head_type) )
38 : {
39 2 : size_t buffer_size = sizeof(head_type);
40 2 : char *data = new char[sizeof(head_type)];
41 2 : head = new (data) head_type();
42 2 : t.get_aspect().template get<_buffer_size_>() = buffer_size;
43 2 : t.get_aspect().template get<_buffer_>() = data;
44 2 : head->set_size(0);
45 2 : head->set_capacity(0);
46 : }
47 : else
48 : {
49 8 : head_type header;
50 8 : t.get_aspect().template get<_read_file_>()(t, reinterpret_cast<char*>(&header), sizeof(head_type), 0);
51 8 : size_t buffer_size = header.offset() + header.capacity();
52 8 : char *data = new char[buffer_size];
53 8 : memset(data, 0, buffer_size);
54 8 : memcpy(data, &header, sizeof(head_type) );
55 8 : t.get_aspect().template get<_buffer_size_>() = buffer_size;
56 8 : t.get_aspect().template get<_read_file_>()(t, data + header.offset(), header.size(), header.offset());
57 8 : t.get_aspect().template get<_buffer_>() = data;
58 8 : head = t.get_aspect().template get<_head_>()(t);
59 : }
60 10 : t.get_aspect().template get<_size_value_>() = head->size();
61 10 : t.get_aspect().template get<_capacity_value_>() = head->capacity();
62 10 : }
63 : };
64 :
65 : }}}}
66 :
67 : #endif
|