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()