content: // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
  //  This source code is licensed under both the GPLv2 (found in the
  //  COPYING file in the root directory) and Apache 2.0 License
  //  (found in the LICENSE.Apache file in the root directory).
  
  package org.rocksdb;
  
  /**
   * Provides Checkpoint functionality. Checkpoints
   * provide persistent snapshots of RocksDB databases.
   */
  public class Checkpoint extends RocksObject {
  
    /**
     * Creates a Checkpoint object to be used for creating open-able
     * snapshots.
     *
     * @param db {@link RocksDB} instance.
     * @return a Checkpoint instance.
     *
     * @throws java.lang.IllegalArgumentException if {@link RocksDB}
     *     instance is null.
     * @throws java.lang.IllegalStateException if {@link RocksDB}
     *     instance is not initialized.
     */
    public static Checkpoint create(final RocksDB db) {
      if (db == null) {
        throw new IllegalArgumentException(
            "RocksDB instance shall not be null.");
      } else if (!db.isOwningHandle()) {
        throw new IllegalStateException(
            "RocksDB instance must be initialized.");
      }
      Checkpoint checkpoint = new Checkpoint(db);
      return checkpoint;
    }
  
    /**
     * <p>Builds an open-able snapshot of RocksDB on the same disk, which
     * accepts an output directory on the same disk, and under the directory
     * (1) hard-linked SST files pointing to existing live SST files
     * (2) a copied manifest files and other files</p>
     *
     * @param checkpointPath path to the folder where the snapshot is going
     *     to be stored.
     * @throws RocksDBException thrown if an error occurs within the native
     *     part of the library.
     */
    public void createCheckpoint(final String checkpointPath)
        throws RocksDBException {
      createCheckpoint(nativeHandle_, checkpointPath);
    }
  
    private Checkpoint(final RocksDB db) {
      super(newCheckpoint(db.nativeHandle_));
      this.db_ = db;
    }
  
    private final RocksDB db_;
  
    private static native long newCheckpoint(long dbHandle);
    @Override protected final native void disposeInternal(final long handle);
  
    private native void createCheckpoint(long handle, String checkpointPath)
        throws RocksDBException;
  }
  