libpgdump 1.0.0

A Rust library for reading and writing PostgreSQL dump files
Documentation

libpgdump

A Rust library for reading and writing PostgreSQL dump files.

Currently supports the custom format (pg_dump -Fc), with planned support for tar and directory formats.

Usage

Add to your Cargo.toml:

[dependencies]
libpgdump = "0.1"

Load an existing dump

use libpgdump;

let dump = libpgdump::load("backup.dump").unwrap();

println!("Database: {}", dump.dbname());
println!("Server:   {}", dump.server_version());
println!("Entries:  {}", dump.entries().len());

// Iterate over table data
for row in dump.table_data("public", "users").unwrap() {
    println!("{row}");  // tab-separated COPY format
}

// Look up a specific entry
if let Some(entry) = dump.lookup_entry("TABLE", "public", "users") {
    println!("Definition: {}", entry.defn.as_deref().unwrap_or(""));
}

Create a new dump

use libpgdump;

let mut dump = libpgdump::new("mydb", "UTF8", "17.0").unwrap();

// Add a table definition
let table_id = dump.add_entry(
    "TABLE",
    Some("public"), Some("users"), Some("postgres"),
    Some("CREATE TABLE public.users (\n    id integer NOT NULL,\n    name text\n);\n"),
    Some("DROP TABLE public.users;\n"),
    None, &[],
).unwrap();

// Add table data
let data_id = dump.add_entry(
    "TABLE DATA",
    Some("public"), Some("users"), Some("postgres"),
    None, None,
    Some("COPY public.users (id, name) FROM stdin;\n"),
    &[table_id],
).unwrap();

dump.set_entry_data(data_id, b"1\tAlice\n2\tBob\n".to_vec()).unwrap();

// Save with gzip compression
dump.set_compression(libpgdump::CompressionAlgorithm::Gzip);
dump.save("output.dump").unwrap();

Inspect entries

use libpgdump;

let dump = libpgdump::load("backup.dump").unwrap();

for entry in dump.entries() {
    println!(
        "{:>4} {:20} {:10} {}",
        entry.dump_id,
        entry.desc,
        entry.namespace.as_deref().unwrap_or(""),
        entry.tag.as_deref().unwrap_or(""),
    );
}

Error handling

use libpgdump::{self, Error};

match libpgdump::load("backup.dump") {
    Ok(dump) => println!("Loaded {} entries", dump.entries().len()),
    Err(Error::InvalidHeader(msg)) => eprintln!("Not a valid dump: {msg}"),
    Err(Error::UnsupportedVersion(v)) => eprintln!("Unsupported version: {v}"),
    Err(e) => eprintln!("Error: {e}"),
}

Supported features

  • Read/write custom format (-Fc) archives
  • Compression: none, gzip, lz4, and zstd
  • Archive versions 1.12.0 through 1.16.0 (PostgreSQL 9.0–18)
  • Version-aware parsing: handles all format variations across versions
  • 60+ object types: tables, indexes, views, functions, constraints, extensions, etc.
  • Large object (blob) support
  • Programmatic dump creation: build dumps from scratch with the builder API

Archive format reference

The custom format is a binary archive containing:

Component Description
Header Magic bytes (PGDMP), version, sizes, format, compression
Metadata Timestamp, database name, server version, pg_dump version
TOC Table of contents with entry definitions and dependencies
Data blocks Compressed or uncompressed table data and large objects

Minimum Rust version

Rust 1.88 or later (edition 2024).

License

BSD-3-Clause