@@ -20,6 +20,7 @@ impl<W: Write> DumpState<W> {
20
20
& mut self ,
21
21
txn : & rusqlite:: Connection ,
22
22
stmt : & str ,
23
+ preserve_rowids : bool ,
23
24
) -> anyhow:: Result < ( ) > {
24
25
let mut stmt = txn. prepare ( stmt) ?;
25
26
let mut rows = stmt. query ( ( ) ) ?;
@@ -67,7 +68,7 @@ impl<W: Write> DumpState<W> {
67
68
68
69
if ty == b"table" {
69
70
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 ) ?;
71
72
let mut insert = String :: new ( ) ;
72
73
write ! ( & mut insert, "INSERT INTO {}" , Quoted ( table_str) ) ?;
73
74
@@ -146,11 +147,12 @@ impl<W: Write> DumpState<W> {
146
147
& self ,
147
148
txn : & rusqlite:: Connection ,
148
149
table : & str ,
150
+ preserve_rowids : bool ,
149
151
) -> anyhow:: Result < ( Option < String > , Vec < String > ) > {
150
152
let mut cols = Vec :: new ( ) ;
151
153
let mut num_primary_keys = 0 ;
152
154
let mut is_integer_primary_key = false ;
153
- let mut preserve_row_id = false ;
155
+ let mut preserve_rowids = preserve_rowids ;
154
156
let mut row_id_col = None ;
155
157
156
158
txn. pragma ( None , "table_info" , table, |row| {
@@ -186,14 +188,14 @@ impl<W: Write> DumpState<W> {
186
188
[ table] ,
187
189
|_| {
188
190
// re-set preserve_row_id if there is a row
189
- preserve_row_id = true ;
191
+ preserve_rowids = true ;
190
192
Ok ( ( ) )
191
193
} ,
192
194
)
193
195
. optional ( ) ?;
194
196
}
195
197
196
- if preserve_row_id {
198
+ if preserve_rowids {
197
199
const ROW_ID_NAMES : [ & str ; 3 ] = [ "rowid" , "_row_id_" , "oid" ] ;
198
200
199
201
for row_id_name in ROW_ID_NAMES {
@@ -430,7 +432,7 @@ fn find_unused_str(haystack: &str, needle1: &str, needle2: &str) -> String {
430
432
}
431
433
}
432
434
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 < ( ) > {
434
436
let mut txn = db. transaction ( ) ?;
435
437
txn. execute ( "PRAGMA writable_schema=ON" , ( ) ) ?;
436
438
let savepoint = txn. savepoint_with_name ( "dump" ) ?;
@@ -451,7 +453,7 @@ pub fn export_dump(db: &mut rusqlite::Connection, writer: impl Write) -> anyhow:
451
453
WHERE type=='table'
452
454
AND sql NOT NULL
453
455
ORDER BY tbl_name='sqlite_sequence', rowid" ;
454
- state. run_schema_dump_query ( & savepoint, q) ?;
456
+ state. run_schema_dump_query ( & savepoint, q, preserve_rowids ) ?;
455
457
456
458
let q = "SELECT sql FROM sqlite_schema AS o
457
459
WHERE sql NOT NULL
@@ -508,7 +510,21 @@ mod test {
508
510
conn. execute ( r#"create table test ("limit")"# , ( ) ) . unwrap ( ) ;
509
511
510
512
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 ( ) ;
512
528
513
529
insta:: assert_snapshot!( std:: str :: from_utf8( & out) . unwrap( ) ) ;
514
530
}
0 commit comments