@@ -362,6 +362,57 @@ PHP_METHOD(Pdo_Sqlite, setAuthorizer)
362362 RETURN_THROWS ();
363363}
364364
365+ PHP_METHOD (Pdo_Sqlite , backup )
366+ {
367+ zval * destination_object ;
368+ char * source_dbname = "main" , * destination_dbname = "main" ;
369+ size_t source_dbname_len , destination_dbname_len ;
370+ int rc ;
371+
372+ ZEND_PARSE_PARAMETERS_START (1 , 3 )
373+ Z_PARAM_OBJECT_OF_CLASS (destination_object , pdosqlite_ce )
374+ Z_PARAM_OPTIONAL
375+ Z_PARAM_PATH (source_dbname , source_dbname_len )
376+ Z_PARAM_PATH (destination_dbname , destination_dbname_len )
377+ ZEND_PARSE_PARAMETERS_END ();
378+
379+ pdo_dbh_t * dbh = Z_PDO_DBH_P (destination_object );
380+ PDO_CONSTRUCT_CHECK ;
381+ pdo_sqlite_db_handle * destination_db_handle = dbh -> driver_data ;
382+ dbh = Z_PDO_DBH_P (ZEND_THIS );
383+ PDO_CONSTRUCT_CHECK ;
384+ pdo_sqlite_db_handle * source_db_handle = dbh -> driver_data ;
385+
386+ sqlite3_backup * dbBackup = sqlite3_backup_init (destination_db_handle -> db , destination_dbname , source_db_handle -> db , source_dbname );
387+
388+ if (dbBackup ) {
389+ do {
390+ rc = sqlite3_backup_step (dbBackup , -1 );
391+ } while (rc == SQLITE_OK );
392+
393+ /* Release resources allocated by sqlite3_backup_init(). */
394+ rc = sqlite3_backup_finish (dbBackup );
395+ } else {
396+ rc = sqlite3_errcode (source_db_handle -> db );
397+ }
398+
399+ if (rc != SQLITE_OK ) {
400+ if (rc == SQLITE_BUSY ) {
401+ pdo_raise_impl_error (dbh , NULL , "HY000" , "Backup failed: source database is busy" );
402+ } else if (rc == SQLITE_LOCKED ) {
403+ pdo_raise_impl_error (dbh , NULL , "HY000" , "Backup failed: source database is locked" );
404+ } else {
405+ char * message ;
406+ spprintf (& message , 0 , "Backup failed: %s" , sqlite3_errmsg (source_db_handle -> db ));
407+ pdo_raise_impl_error (dbh , NULL , "HY000" , message );
408+ efree (message );
409+ }
410+ RETURN_FALSE ;
411+ }
412+
413+ RETURN_TRUE ;
414+ }
415+
365416static int php_sqlite_collation_callback (void * context , int string1_len , const void * string1 ,
366417 int string2_len , const void * string2 )
367418{
0 commit comments