File: linkExtension16.pyx

package info (click to toggle)
pytables 2.3.1-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 14,624 kB
  • sloc: python: 55,641; xml: 15,737; ansic: 5,805; sh: 460; makefile: 234
file content (156 lines) | stat: -rw-r--r-- 4,238 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
################### #####################################################
#
#       License: BSD
#       Created: December 11, 2009
#       Author:  Francesc Alted - faltet@pytables.com
#
#       $Id: linkExtension.pyx 4270 2009-12-02 19:42:05Z faltet $
#
########################################################################

"""Pyrex functions and classes for supporting links in HDF5.
"""

from tables.exceptions import HDF5ExtError

from hdf5Extension cimport Node

from definitions cimport \
     size_t, hid_t, herr_t, hbool_t, time_t, H5G_obj_t, \
     malloc, free, \
     H5G_UNKNOWN, H5G_GROUP, H5G_DATASET, H5G_TYPE, H5G_LINK


__version__ = "$Revision: 4270 $"


#----------------------------------------------------------------------

# External declarations

cdef extern from "H5Gpublic.h":

  cdef enum H5G_link_t:
    H5G_LINK_ERROR      = -1,
    H5G_LINK_HARD       = 0,
    H5G_LINK_SOFT       = 1

  ctypedef struct H5G_stat_t:
    unsigned long fileno[2]
    unsigned long objno[2]
    unsigned nlink
    H5G_obj_t type
    time_t mtime
    size_t linklen
    #H5O_stat_t ohdr            # Object header information

  herr_t H5Glink (hid_t file_id, H5G_link_t link_type,
                  char *current_name, char *new_name)

  herr_t H5Glink2(hid_t curr_loc_id, char *current_name, H5G_link_t link_type,
                  hid_t new_loc_id, char *new_name)

  herr_t H5Gunlink(hid_t file_id, char *name)

  herr_t H5Gget_objinfo(hid_t loc_id, char *name, hbool_t follow_link,
                        H5G_stat_t *statbuf)

  herr_t H5Gget_linkval(hid_t loc_id, char *name, size_t size, char *value)



#----------------------------------------------------------------------

# Helper functions

def _g_createHardLink(parentNode, name, targetNode):
  """Create a hard link in the file."""
  cdef herr_t ret

  ret = H5Glink2(targetNode._v_parent._v_objectID, targetNode._v_name,
                 H5G_LINK_HARD, parentNode._v_objectID, name)
  if ret < 0:
    raise HDF5ExtError("failed to create HDF5 hard link")


#----------------------------------------------------------------------

# Public classes

cdef class Link(Node):
  """Extension class from which all link extensions inherits."""

  def _g_copy(self, newParent, newName, recursive, _log=True, **kwargs):
    """Private part for the _f_copy() method."""
    cdef object stats

    # Update statistics if needed.
    stats = kwargs.get('stats', None)
    if stats is not None:
      stats['links'] += 1



cdef class SoftLink(Link):
  """Extension class representing a soft link."""

  def _g_create(self):
    """Create the link in file."""
    cdef herr_t ret

    ret = H5Glink(self.parent_id, H5G_LINK_SOFT, self.target, self.name)
    if ret < 0:
      raise HDF5ExtError("failed to create HDF5 soft link")

    return 0  # Object ID is zero'ed, as HDF5 does not assign one for links


  def _g_open(self):
    """Open the link in file."""
    cdef herr_t ret
    cdef H5G_stat_t link_buff
    cdef size_t val_size
    cdef char *linkval    # most be enough for most uses

    ret = H5Gget_objinfo(self.parent_id, self.name, 0, &link_buff)
    if ret < 0:
      raise HDF5ExtError("failed to get info about soft link")

    val_size = link_buff.linklen
    linkval = <char *>malloc(val_size)

    ret = H5Gget_linkval(self.parent_id, self.name, val_size, linkval)
    if ret < 0:
      raise HDF5ExtError("failed to get target value")

    self.target = linkval

    # Release resources
    free(linkval)
    return 0  # Object ID is zero'ed, as HDF5 does not assign one for links


  def _g_copy(self, newParent, newName, recursive, _log=True, **kwargs):
    """Private part for the _f_copy() method."""
    cdef herr_t ret

    # The only link that will be using this code is the soft link
    ret = H5Glink(newParent._v_objectID, H5G_LINK_SOFT, self.target, newName)
    if ret < 0:
      raise HDF5ExtError("failed to copy HDF5 link")

    # Update statistics
    super(SoftLink, self)._g_copy(newParent, newName, recursive,
                                  _log=True, **kwargs)

    return newParent._v_file.getNode(newParent, newName)




## Local Variables:
## mode: python
## py-indent-offset: 2
## tab-width: 2
## fill-column: 78
## End: