diff options
Diffstat (limited to 'geo-replication/syncdaemon/libgfchangelog.py')
| -rw-r--r-- | geo-replication/syncdaemon/libgfchangelog.py | 62 | 
1 files changed, 55 insertions, 7 deletions
diff --git a/geo-replication/syncdaemon/libgfchangelog.py b/geo-replication/syncdaemon/libgfchangelog.py index ec563b36f29..0fa32a73499 100644 --- a/geo-replication/syncdaemon/libgfchangelog.py +++ b/geo-replication/syncdaemon/libgfchangelog.py @@ -13,6 +13,10 @@ from ctypes import CDLL, create_string_buffer, get_errno  from ctypes.util import find_library +class ChangelogException(OSError): +    pass + +  class Changes(object):      libgfc = CDLL(find_library("gfchangelog"), use_errno=True) @@ -21,9 +25,9 @@ class Changes(object):          return get_errno()      @classmethod -    def raise_oserr(cls): +    def raise_changelog_err(cls):          errn = cls.geterrno() -        raise OSError(errn, os.strerror(errn)) +        raise ChangelogException(errn, os.strerror(errn))      @classmethod      def _get_api(cls, call): @@ -35,19 +39,19 @@ class Changes(object):                                                      log_file,                                                      log_level, retries)          if ret == -1: -            cls.raise_oserr() +            cls.raise_changelog_err()      @classmethod      def cl_scan(cls):          ret = cls._get_api('gf_changelog_scan')()          if ret == -1: -            cls.raise_oserr() +            cls.raise_changelog_err()      @classmethod      def cl_startfresh(cls):          ret = cls._get_api('gf_changelog_start_fresh')()          if ret == -1: -            cls.raise_oserr() +            cls.raise_changelog_err()      @classmethod      def cl_getchanges(cls): @@ -64,7 +68,7 @@ class Changes(object):                  break              changes.append(buf.raw[:ret - 1])          if ret == -1: -            cls.raise_oserr() +            cls.raise_changelog_err()          # cleanup tracker          cls.cl_startfresh()          return sorted(changes, key=clsort) @@ -73,4 +77,48 @@ class Changes(object):      def cl_done(cls, clfile):          ret = cls._get_api('gf_changelog_done')(clfile)          if ret == -1: -            cls.raise_oserr() +            cls.raise_changelog_err() + +    @classmethod +    def cl_history_scan(cls): +        ret = cls._get_api('gf_history_changelog_scan')() +        if ret == -1: +            cls.raise_changelog_err() + +        return ret + +    @classmethod +    def cl_history_changelog(cls, changelog_path, start, end): +        ret = cls._get_api('gf_history_changelog')(changelog_path, start, end) +        if ret == -1: +            cls.raise_changelog_err() + +        return ret + +    @classmethod +    def cl_history_startfresh(cls): +        ret = cls._get_api('gf_history_changelog_start_fresh')() +        if ret == -1: +            cls.raise_changelog_err() + +    @classmethod +    def cl_history_getchanges(cls): +        changes = [] +        buf = create_string_buffer('\0', 4096) +        call = cls._get_api('gf_history_changelog_next_change') + +        while True: +            ret = call(buf, 4096) +            if ret in (0, -1): +                break +            changes.append(buf.raw[:ret - 1]) +        if ret == -1: +            cls.raise_changelog_err() + +        return changes + +    @classmethod +    def cl_history_done(cls, clfile): +        ret = cls._get_api('gf_history_changelog_done')(clfile) +        if ret == -1: +            cls.raise_changelog_err()  | 
