@@ -20,6 +20,7 @@ impl<W: Write> DumpState<W> {
2020 & mut self ,
2121 txn : & rusqlite:: Connection ,
2222 stmt : & str ,
23+ preserve_rowids : bool ,
2324 ) -> anyhow:: Result < ( ) > {
2425 let mut stmt = txn. prepare ( stmt) ?;
2526 let mut rows = stmt. query ( ( ) ) ?;
@@ -67,7 +68,7 @@ impl<W: Write> DumpState<W> {
6768
6869 if ty == b"table" {
6970 let table_str = std:: str:: from_utf8 ( table) ?;
70- let ( row_id_col, colss) = self . list_table_columns ( txn, table_str) ?;
71+ let ( row_id_col, colss) = self . list_table_columns ( txn, table_str, preserve_rowids ) ?;
7172 let mut insert = String :: new ( ) ;
7273 write ! ( & mut insert, "INSERT INTO {}" , Quoted ( table_str) ) ?;
7374
@@ -146,11 +147,12 @@ impl<W: Write> DumpState<W> {
146147 & self ,
147148 txn : & rusqlite:: Connection ,
148149 table : & str ,
150+ preserve_rowids : bool ,
149151 ) -> anyhow:: Result < ( Option < String > , Vec < String > ) > {
150152 let mut cols = Vec :: new ( ) ;
151153 let mut num_primary_keys = 0 ;
152154 let mut is_integer_primary_key = false ;
153- let mut preserve_row_id = false ;
155+ let mut preserve_rowids = preserve_rowids ;
154156 let mut row_id_col = None ;
155157
156158 txn. pragma ( None , "table_info" , table, |row| {
@@ -186,14 +188,14 @@ impl<W: Write> DumpState<W> {
186188 [ table] ,
187189 |_| {
188190 // re-set preserve_row_id if there is a row
189- preserve_row_id = true ;
191+ preserve_rowids = true ;
190192 Ok ( ( ) )
191193 } ,
192194 )
193195 . optional ( ) ?;
194196 }
195197
196- if preserve_row_id {
198+ if preserve_rowids {
197199 const ROW_ID_NAMES : [ & str ; 3 ] = [ "rowid" , "_row_id_" , "oid" ] ;
198200
199201 for row_id_name in ROW_ID_NAMES {
@@ -430,7 +432,7 @@ fn find_unused_str(haystack: &str, needle1: &str, needle2: &str) -> String {
430432 }
431433}
432434
433- pub fn export_dump ( db : & mut rusqlite:: Connection , writer : impl Write ) -> anyhow:: Result < ( ) > {
435+ pub fn export_dump ( db : & mut rusqlite:: Connection , writer : impl Write , preserve_rowids : bool ) -> anyhow:: Result < ( ) > {
434436 let mut txn = db. transaction ( ) ?;
435437 txn. execute ( "PRAGMA writable_schema=ON" , ( ) ) ?;
436438 let savepoint = txn. savepoint_with_name ( "dump" ) ?;
@@ -451,7 +453,7 @@ pub fn export_dump(db: &mut rusqlite::Connection, writer: impl Write) -> anyhow:
451453WHERE type=='table'
452454AND sql NOT NULL
453455ORDER BY tbl_name='sqlite_sequence', rowid" ;
454- state. run_schema_dump_query ( & savepoint, q) ?;
456+ state. run_schema_dump_query ( & savepoint, q, preserve_rowids ) ?;
455457
456458 let q = "SELECT sql FROM sqlite_schema AS o
457459WHERE sql NOT NULL
@@ -508,7 +510,21 @@ mod test {
508510 conn. execute ( r#"create table test ("limit")"# , ( ) ) . unwrap ( ) ;
509511
510512 let mut out = Vec :: new ( ) ;
511- export_dump ( & mut conn, & mut out) . unwrap ( ) ;
513+ export_dump ( & mut conn, & mut out, false ) . unwrap ( ) ;
514+
515+ insta:: assert_snapshot!( std:: str :: from_utf8( & out) . unwrap( ) ) ;
516+ }
517+
518+ #[ test]
519+ fn table_preserve_rowids ( ) {
520+ let tmp = tempdir ( ) . unwrap ( ) ;
521+ let mut conn = Connection :: open ( tmp. path ( ) . join ( "data" ) ) . unwrap ( ) ;
522+ conn. execute ( r#"create table test ( id TEXT PRIMARY KEY )"# , ( ) ) . unwrap ( ) ;
523+ conn. execute ( r#"insert into test values ( 'a' ), ( 'b' ), ( 'c' )"# , ( ) ) . unwrap ( ) ;
524+ conn. execute ( r#"delete from test where id = 'a'"# , ( ) ) . unwrap ( ) ;
525+
526+ let mut out = Vec :: new ( ) ;
527+ export_dump ( & mut conn, & mut out, true ) . unwrap ( ) ;
512528
513529 insta:: assert_snapshot!( std:: str :: from_utf8( & out) . unwrap( ) ) ;
514530 }
0 commit comments