Sha256: 64a39867d4db02851871118154dff479d68768364a32a32b0a8feb2791640162

Contents?: true

Size: 1.51 KB

Versions: 24

Compression:

Stored size: 1.51 KB

Contents

# frozen_string_literal: true

require "weakref"

module SQLite3
  # based on Rails's active_support/fork_tracker.rb
  module ForkSafety
    module CoreExt # :nodoc:
      def _fork
        pid = super
        if pid == 0
          ForkSafety.discard
        end
        pid
      end
    end

    @databases = []
    @mutex = Mutex.new
    @suppress = false

    class << self
      def hook! # :nodoc:
        ::Process.singleton_class.prepend(CoreExt)
      end

      def track(database) # :nodoc:
        @mutex.synchronize do
          @databases << WeakRef.new(database)
        end
      end

      def discard # :nodoc:
        warned = @suppress
        @databases.each do |db|
          next unless db.weakref_alive?

          unless db.closed? || db.readonly?
            unless warned
              # If you are here, you may want to read
              # https://github.com/sparklemotion/sqlite3-ruby/pull/558
              warn("Writable sqlite database connection(s) were inherited from a forked process. " \
                   "This is unsafe and the connections are being closed to prevent possible data " \
                   "corruption. Please close writable sqlite database connections before forking.",
                uplevel: 0)
              warned = true
            end
            db.close
          end
        end
        @databases.clear
      end

      # Call to suppress the fork-related warnings.
      def suppress_warnings!
        @suppress = true
      end
    end
  end
end

SQLite3::ForkSafety.hook!

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
sqlite3-2.3.1-x86-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-x86-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-x86_64-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-x86_64-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-x86_64-darwin lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-x64-mingw-ucrt lib/sqlite3/fork_safety.rb
sqlite3-2.3.1 lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-arm-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-arm-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-arm64-darwin lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-aarch64-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.1-aarch64-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x86-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x86-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x86_64-linux-musl lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x86_64-linux-gnu lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x86_64-darwin lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-x64-mingw-ucrt lib/sqlite3/fork_safety.rb
sqlite3-2.3.0 lib/sqlite3/fork_safety.rb
sqlite3-2.3.0-arm-linux-musl lib/sqlite3/fork_safety.rb