From 8f68e1d8b4b6d58494eb5118c66baf83ff56b9d4 Mon Sep 17 00:00:00 2001 From: ygl Date: Tue, 1 Nov 2016 02:48:06 +0800 Subject: [PATCH] add new method: backup to Connection --- _sqlite3.py | 11 +++++++++++ _sqlite3_build.py | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/_sqlite3.py b/_sqlite3.py index 04b47c0..59698a0 100644 --- a/_sqlite3.py +++ b/_sqlite3.py @@ -652,6 +652,17 @@ class Connection(object): if rc != _lib.SQLITE_OK: raise OperationalError("Error enabling load extension") + def backup(self, target_conn_obj): + db_name = _ffi.new("char []", "main") + bk_obj = _lib.sqlite3_backup_init(target_conn_obj._db, db_name, self._db, db_name) + if bk_obj: + rc = _lib.SQLITE_OK + while rc == _lib.SQLITE_OK or rc == _lib.SQLITE_BUSY or rc == _lib.SQLITE_LOCKED: + rc = _lib.sqlite3_backup_step(bk_obj, 100) + if rc == _lib.SQLITE_OK or rc == _lib.SQLITE_BUSY or rc == _lib.SQLITE_LOCKED: + _lib.sqlite3_sleep(5) + _lib.sqlite3_backup_finish(bk_obj) + class Cursor(object): __initialized = False diff --git a/_sqlite3_build.py b/_sqlite3_build.py index 58eae30..346c3b0 100644 --- a/_sqlite3_build.py +++ b/_sqlite3_build.py @@ -109,6 +109,7 @@ typedef ... sqlite3; typedef ... sqlite3_stmt; typedef ... sqlite3_context; typedef ... sqlite3_value; +typedef ... sqlite3_backup; typedef int64_t sqlite3_int64; typedef uint64_t sqlite3_uint64; @@ -225,8 +226,15 @@ const void *sqlite3_value_text16le(sqlite3_value*); const void *sqlite3_value_text16be(sqlite3_value*); int sqlite3_value_type(sqlite3_value*); int sqlite3_value_numeric_type(sqlite3_value*); +sqlite3_backup* sqlite3_backup_init(sqlite3*, const char*, sqlite3*, const char*); +int sqlite3_backup_step(sqlite3_backup*, int); +int sqlite3_backup_finish(sqlite3_backup*); +int sqlite3_backup_remaining(sqlite3_backup*); +int sqlite3_backup_pagecount(sqlite3_backup*); +int sqlite3_sleep(int); """) + def _has_load_extension(): """Only available since 3.3.6""" unverified_ffi = _FFI()