oklahoma_mixer 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +10 -0
 - data/TODO.rdoc +3 -3
 - data/lib/oklahoma_mixer.rb +14 -5
 - data/lib/oklahoma_mixer/b_tree_database.rb +185 -0
 - data/lib/oklahoma_mixer/b_tree_database/c.rb +45 -0
 - data/lib/oklahoma_mixer/cursor.rb +43 -0
 - data/lib/oklahoma_mixer/cursor/c.rb +45 -0
 - data/lib/oklahoma_mixer/fixed_length_database.rb +95 -0
 - data/lib/oklahoma_mixer/fixed_length_database/c.rb +62 -0
 - data/lib/oklahoma_mixer/hash_database.rb +84 -54
 - data/lib/oklahoma_mixer/hash_database/c.rb +3 -96
 - data/lib/oklahoma_mixer/utilities.rb +110 -5
 - data/test/b_tree_binary_data_test.rb +45 -0
 - data/test/b_tree_tuning_test.rb +132 -0
 - data/test/binary_data_test.rb +3 -13
 - data/test/cursor_based_iteration_test.rb +151 -0
 - data/test/duplicate_storage_test.rb +107 -0
 - data/test/fixed_length_tuning_test.rb +77 -0
 - data/test/getting_and_setting_by_id_test.rb +288 -0
 - data/test/getting_and_setting_keys_test.rb +37 -3
 - data/test/iteration_test.rb +2 -76
 - data/test/key_range_test.rb +161 -0
 - data/test/order_test.rb +122 -0
 - data/test/shared_binary_data.rb +14 -0
 - data/test/shared_iteration.rb +99 -0
 - data/test/shared_tuning.rb +91 -0
 - data/test/test_helper.rb +10 -11
 - data/test/top_level_interface_test.rb +12 -0
 - data/test/tuning_test.rb +11 -87
 - metadata +27 -2
 
| 
         @@ -0,0 +1,62 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module OklahomaMixer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class FixedLengthDatabase < HashDatabase
         
     | 
| 
      
 3 
     | 
    
         
            +
                module C  # :nodoc:
         
     | 
| 
      
 4 
     | 
    
         
            +
                  extend OklahomaMixer::Utilities::FFIDSL
         
     | 
| 
      
 5 
     | 
    
         
            +
                  
         
     | 
| 
      
 6 
     | 
    
         
            +
                  IDS = enum :FDBIDMIN,  -1,
         
     | 
| 
      
 7 
     | 
    
         
            +
                             :FDBIDPREV, -2,
         
     | 
| 
      
 8 
     | 
    
         
            +
                             :FDBIDMAX,  -3,
         
     | 
| 
      
 9 
     | 
    
         
            +
                             :FDBIDNEXT, -4
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  prefix :tcfdb
         
     | 
| 
      
 12 
     | 
    
         
            +
                  
         
     | 
| 
      
 13 
     | 
    
         
            +
                  def_core_database_consts_and_funcs
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  func :name    => :tune,
         
     | 
| 
      
 16 
     | 
    
         
            +
                       :args    => [:pointer, :int32, :int64],
         
     | 
| 
      
 17 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 18 
     | 
    
         
            +
                  func :name    => :optimize,
         
     | 
| 
      
 19 
     | 
    
         
            +
                       :args    => [:pointer, :int32, :int64],
         
     | 
| 
      
 20 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  func :name    => :put,
         
     | 
| 
      
 23 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :pointer, :int],
         
     | 
| 
      
 24 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 25 
     | 
    
         
            +
                  func :name    => :putkeep,
         
     | 
| 
      
 26 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :pointer, :int],
         
     | 
| 
      
 27 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 28 
     | 
    
         
            +
                  func :name    => :putcat,
         
     | 
| 
      
 29 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :pointer, :int],
         
     | 
| 
      
 30 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 31 
     | 
    
         
            +
                  call :name    => :TCPDPROC,
         
     | 
| 
      
 32 
     | 
    
         
            +
                       :args    => [:pointer, :int, :pointer, :pointer],
         
     | 
| 
      
 33 
     | 
    
         
            +
                       :returns => :pointer
         
     | 
| 
      
 34 
     | 
    
         
            +
                  func :name    => :putproc,
         
     | 
| 
      
 35 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :pointer, :int, :TCPDPROC, :pointer],
         
     | 
| 
      
 36 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 37 
     | 
    
         
            +
                  func :name    => :addint,
         
     | 
| 
      
 38 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :int],
         
     | 
| 
      
 39 
     | 
    
         
            +
                       :returns => :int
         
     | 
| 
      
 40 
     | 
    
         
            +
                  func :name    => :adddouble,
         
     | 
| 
      
 41 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :double],
         
     | 
| 
      
 42 
     | 
    
         
            +
                       :returns => :double
         
     | 
| 
      
 43 
     | 
    
         
            +
                  func :name    => :out,
         
     | 
| 
      
 44 
     | 
    
         
            +
                       :args    => [:pointer, :int64],
         
     | 
| 
      
 45 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 46 
     | 
    
         
            +
                  func :name    => :get,
         
     | 
| 
      
 47 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :pointer],
         
     | 
| 
      
 48 
     | 
    
         
            +
                       :returns => :pointer
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  func :name    => :iterinit,
         
     | 
| 
      
 51 
     | 
    
         
            +
                       :args    => :pointer,
         
     | 
| 
      
 52 
     | 
    
         
            +
                       :returns => :bool
         
     | 
| 
      
 53 
     | 
    
         
            +
                  func :name    => :iternext,
         
     | 
| 
      
 54 
     | 
    
         
            +
                       :args    => :pointer,
         
     | 
| 
      
 55 
     | 
    
         
            +
                       :returns => :uint64
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  func :name    => :range,
         
     | 
| 
      
 58 
     | 
    
         
            +
                       :args    => [:pointer, :int64, :int64, :int, :pointer],
         
     | 
| 
      
 59 
     | 
    
         
            +
                       :returns => :pointer
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -4,17 +4,17 @@ module OklahomaMixer 
     | 
|
| 
       4 
4 
     | 
    
         
             
                ### Constants ###
         
     | 
| 
       5 
5 
     | 
    
         
             
                #################
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                MODES = { "r" => : 
     | 
| 
       8 
     | 
    
         
            -
                          "w" => : 
     | 
| 
       9 
     | 
    
         
            -
                          "c" => : 
     | 
| 
       10 
     | 
    
         
            -
                          "t" => : 
     | 
| 
       11 
     | 
    
         
            -
                          "e" => : 
     | 
| 
       12 
     | 
    
         
            -
                          "f" => : 
     | 
| 
       13 
     | 
    
         
            -
                          "s" => : 
     | 
| 
       14 
     | 
    
         
            -
                OPTS  = { "l" => : 
     | 
| 
       15 
     | 
    
         
            -
                          "d" => : 
     | 
| 
       16 
     | 
    
         
            -
                          "b" => : 
     | 
| 
       17 
     | 
    
         
            -
                          "t" => : 
     | 
| 
      
 7 
     | 
    
         
            +
                MODES = { "r" => :OREADER,
         
     | 
| 
      
 8 
     | 
    
         
            +
                          "w" => :OWRITER,
         
     | 
| 
      
 9 
     | 
    
         
            +
                          "c" => :OCREAT,
         
     | 
| 
      
 10 
     | 
    
         
            +
                          "t" => :OTRUNC,
         
     | 
| 
      
 11 
     | 
    
         
            +
                          "e" => :ONOLCK,
         
     | 
| 
      
 12 
     | 
    
         
            +
                          "f" => :OLCKNB,
         
     | 
| 
      
 13 
     | 
    
         
            +
                          "s" => :OTSYNC }
         
     | 
| 
      
 14 
     | 
    
         
            +
                OPTS  = { "l" => :TLARGE,
         
     | 
| 
      
 15 
     | 
    
         
            +
                          "d" => :TDEFLATE,
         
     | 
| 
      
 16 
     | 
    
         
            +
                          "b" => :TBZIP,
         
     | 
| 
      
 17 
     | 
    
         
            +
                          "t" => :TTCBS }
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                ###################
         
     | 
| 
       20 
20 
     | 
    
         
             
                ### File System ###
         
     | 
| 
         @@ -24,24 +24,20 @@ module OklahomaMixer 
     | 
|
| 
       24 
24 
     | 
    
         
             
                  options              = args.last.is_a?(Hash)   ? args.last  : { }
         
     | 
| 
       25 
25 
     | 
    
         
             
                  mode                 = !args.first.is_a?(Hash) ? args.first : nil
         
     | 
| 
       26 
26 
     | 
    
         
             
                  @path                = path
         
     | 
| 
       27 
     | 
    
         
            -
                  @db                  =  
     | 
| 
      
 27 
     | 
    
         
            +
                  @db                  = lib.new
         
     | 
| 
       28 
28 
     | 
    
         
             
                  self.default         = options[:default]
         
     | 
| 
       29 
29 
     | 
    
         
             
                  @in_transaction      = false
         
     | 
| 
       30 
30 
     | 
    
         
             
                  @abort               = false
         
     | 
| 
       31 
31 
     | 
    
         
             
                  @nested_transactions = options[:nested_transactions]
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                  try(:setmutex) if options[:mutex]
         
     | 
| 
       34 
     | 
    
         
            -
                   
     | 
| 
       35 
     | 
    
         
            -
                    optimize(options.merge(:tune => true))
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
                  {:rcnum => :cache, :xmsiz => nil, :dfunit => nil}.each do |option, func|
         
     | 
| 
       38 
     | 
    
         
            -
                    if i = options[option]
         
     | 
| 
       39 
     | 
    
         
            -
                      try("set#{func || option}", i.to_i)
         
     | 
| 
       40 
     | 
    
         
            -
                    end
         
     | 
| 
       41 
     | 
    
         
            -
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                  tune(options)
         
     | 
| 
       42 
35 
     | 
    
         | 
| 
       43 
36 
     | 
    
         
             
                  warn "mode option supersedes mode argument" if mode and options[:mode]
         
     | 
| 
       44 
37 
     | 
    
         
             
                  try(:open, path, to_enum_int(options.fetch(:mode, mode || "wc"), :mode))
         
     | 
| 
      
 38 
     | 
    
         
            +
                rescue Exception
         
     | 
| 
      
 39 
     | 
    
         
            +
                  close if defined?(@db) and @db
         
     | 
| 
      
 40 
     | 
    
         
            +
                  raise
         
     | 
| 
       45 
41 
     | 
    
         
             
                end
         
     | 
| 
       46 
42 
     | 
    
         | 
| 
       47 
43 
     | 
    
         
             
                def optimize(options)
         
     | 
| 
         @@ -55,7 +51,7 @@ module OklahomaMixer 
     | 
|
| 
       55 
51 
     | 
    
         
             
                attr_reader :path
         
     | 
| 
       56 
52 
     | 
    
         | 
| 
       57 
53 
     | 
    
         
             
                def file_size
         
     | 
| 
       58 
     | 
    
         
            -
                   
     | 
| 
      
 54 
     | 
    
         
            +
                  lib.fsiz(@db)
         
     | 
| 
       59 
55 
     | 
    
         
             
                end
         
     | 
| 
       60 
56 
     | 
    
         | 
| 
       61 
57 
     | 
    
         
             
                def flush
         
     | 
| 
         @@ -94,35 +90,37 @@ module OklahomaMixer 
     | 
|
| 
       94 
90 
     | 
    
         
             
                end
         
     | 
| 
       95 
91 
     | 
    
         | 
| 
       96 
92 
     | 
    
         
             
                def store(key, value, mode = nil)
         
     | 
| 
       97 
     | 
    
         
            -
                  k 
     | 
| 
      
 93 
     | 
    
         
            +
                  k      = cast_key_in(key)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  v      = cast_value_in(value) unless mode == :add and not block_given?
         
     | 
| 
       98 
95 
     | 
    
         
             
                  result = value
         
     | 
| 
       99 
96 
     | 
    
         
             
                  if block_given?
         
     | 
| 
       100 
97 
     | 
    
         
             
                    warn "block supersedes mode argument" unless mode.nil?
         
     | 
| 
       101 
98 
     | 
    
         
             
                    callback = lambda { |old_value_pointer, old_size, returned_size, _|
         
     | 
| 
       102 
     | 
    
         
            -
                      old_value 
     | 
| 
       103 
     | 
    
         
            -
                      replacement = yield(key, old_value, value) 
     | 
| 
       104 
     | 
    
         
            -
                      returned_size.put_int(0,  
     | 
| 
       105 
     | 
    
         
            -
                       
     | 
| 
      
 99 
     | 
    
         
            +
                      old_value         = old_value_pointer.get_bytes(0, old_size)
         
     | 
| 
      
 100 
     | 
    
         
            +
                      replacement, size = cast_value_in(yield(key, old_value, value))
         
     | 
| 
      
 101 
     | 
    
         
            +
                      returned_size.put_int(0, size)
         
     | 
| 
      
 102 
     | 
    
         
            +
                      pointer = Utilities.malloc(size)
         
     | 
| 
      
 103 
     | 
    
         
            +
                      pointer.put_bytes(0, replacement) unless pointer.address.zero?
         
     | 
| 
      
 104 
     | 
    
         
            +
                      pointer
         
     | 
| 
       106 
105 
     | 
    
         
             
                    }
         
     | 
| 
       107 
     | 
    
         
            -
                    try(:putproc, k,  
     | 
| 
      
 106 
     | 
    
         
            +
                    try(:putproc, k, v, callback, nil)
         
     | 
| 
       108 
107 
     | 
    
         
             
                  else
         
     | 
| 
       109 
     | 
    
         
            -
                     
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
                     
     | 
| 
       114 
     | 
    
         
            -
                      try(: 
     | 
| 
       115 
     | 
    
         
            -
                     
     | 
| 
       116 
     | 
    
         
            -
                      try(:putasync, k, k.size, v, v.size)
         
     | 
| 
       117 
     | 
    
         
            -
                    when :add
         
     | 
| 
      
 108 
     | 
    
         
            +
                    if mode == :keep
         
     | 
| 
      
 109 
     | 
    
         
            +
                      result = try(:putkeep, k, v, :no_error => {21 => false})
         
     | 
| 
      
 110 
     | 
    
         
            +
                    elsif mode == :cat
         
     | 
| 
      
 111 
     | 
    
         
            +
                      try(:putcat, k, v)
         
     | 
| 
      
 112 
     | 
    
         
            +
                    elsif mode == :async and self.class == HashDatabase
         
     | 
| 
      
 113 
     | 
    
         
            +
                      try(:putasync, k, v)
         
     | 
| 
      
 114 
     | 
    
         
            +
                    elsif mode == :add
         
     | 
| 
       118 
115 
     | 
    
         
             
                      result = case value
         
     | 
| 
       119 
     | 
    
         
            -
                               when Float then try( :adddouble, k,  
     | 
| 
      
 116 
     | 
    
         
            +
                               when Float then try( :adddouble, k, value,
         
     | 
| 
       120 
117 
     | 
    
         
             
                                                    :failure => lambda { |n| n.nan? } )
         
     | 
| 
       121 
     | 
    
         
            -
                               else            try( :addint, k,  
     | 
| 
      
 118 
     | 
    
         
            +
                               else            try( :addint, k, value.to_i,
         
     | 
| 
       122 
119 
     | 
    
         
             
                                                    :failure => Utilities::INT_MIN )
         
     | 
| 
       123 
120 
     | 
    
         
             
                               end
         
     | 
| 
       124 
121 
     | 
    
         
             
                    else
         
     | 
| 
       125 
     | 
    
         
            -
                       
     | 
| 
      
 122 
     | 
    
         
            +
                      warn "unsupported mode for database type" if mode
         
     | 
| 
      
 123 
     | 
    
         
            +
                      try(:put, k, v)
         
     | 
| 
       126 
124 
     | 
    
         
             
                    end
         
     | 
| 
       127 
125 
     | 
    
         
             
                  end
         
     | 
| 
       128 
126 
     | 
    
         
             
                  result
         
     | 
| 
         @@ -130,8 +128,7 @@ module OklahomaMixer 
     | 
|
| 
       130 
128 
     | 
    
         
             
                alias_method :[]=, :store
         
     | 
| 
       131 
129 
     | 
    
         | 
| 
       132 
130 
     | 
    
         
             
                def fetch(key, *default)
         
     | 
| 
       133 
     | 
    
         
            -
                   
     | 
| 
       134 
     | 
    
         
            -
                  if value = try( :read_from_func, :get, k, k.size,
         
     | 
| 
      
 131 
     | 
    
         
            +
                  if value = try( :read_from_func, :get, cast_key_in(key),
         
     | 
| 
       135 
132 
     | 
    
         
             
                                  :failure => nil, :no_error => {22 => nil} )
         
     | 
| 
       136 
133 
     | 
    
         
             
                    value
         
     | 
| 
       137 
134 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -166,7 +163,7 @@ module OklahomaMixer 
     | 
|
| 
       166 
163 
     | 
    
         
             
                def keys(options = { })
         
     | 
| 
       167 
164 
     | 
    
         
             
                  prefix = options.fetch(:prefix, "").to_s
         
     | 
| 
       168 
165 
     | 
    
         
             
                  limit  = options.fetch(:limit,  -1)
         
     | 
| 
       169 
     | 
    
         
            -
                  list   = ArrayList.new( 
     | 
| 
      
 166 
     | 
    
         
            +
                  list   = ArrayList.new(lib.fwmkeys(@db, prefix, prefix.size, limit))
         
     | 
| 
       170 
167 
     | 
    
         
             
                  list.to_a
         
     | 
| 
       171 
168 
     | 
    
         
             
                ensure
         
     | 
| 
       172 
169 
     | 
    
         
             
                  list.free if list
         
     | 
| 
         @@ -182,8 +179,7 @@ module OklahomaMixer 
     | 
|
| 
       182 
179 
     | 
    
         | 
| 
       183 
180 
     | 
    
         
             
                def delete(key, &missing_handler)
         
     | 
| 
       184 
181 
     | 
    
         
             
                  value = fetch(key, &missing_handler)
         
     | 
| 
       185 
     | 
    
         
            -
                   
     | 
| 
       186 
     | 
    
         
            -
                  try(:out, k, k.size, :no_error => {22 => nil})
         
     | 
| 
      
 182 
     | 
    
         
            +
                  try(:out, cast_key_in(key), :no_error => {22 => nil})
         
     | 
| 
       187 
183 
     | 
    
         
             
                  value
         
     | 
| 
       188 
184 
     | 
    
         
             
                rescue IndexError
         
     | 
| 
       189 
185 
     | 
    
         
             
                  nil
         
     | 
| 
         @@ -205,7 +201,7 @@ module OklahomaMixer 
     | 
|
| 
       205 
201 
     | 
    
         
             
                alias_method :member?,  :include?
         
     | 
| 
       206 
202 
     | 
    
         | 
| 
       207 
203 
     | 
    
         
             
                def size
         
     | 
| 
       208 
     | 
    
         
            -
                   
     | 
| 
      
 204 
     | 
    
         
            +
                  lib.rnum(@db)
         
     | 
| 
       209 
205 
     | 
    
         
             
                end
         
     | 
| 
       210 
206 
     | 
    
         
             
                alias_method :length, :size
         
     | 
| 
       211 
207 
     | 
    
         | 
| 
         @@ -251,6 +247,15 @@ module OklahomaMixer 
     | 
|
| 
       251 
247 
     | 
    
         
             
                  end
         
     | 
| 
       252 
248 
     | 
    
         
             
                end
         
     | 
| 
       253 
249 
     | 
    
         | 
| 
      
 250 
     | 
    
         
            +
                def to_hash(set_default = true)
         
     | 
| 
      
 251 
     | 
    
         
            +
                  default = @default && lambda { |hash, key| @default[key] } if set_default
         
     | 
| 
      
 252 
     | 
    
         
            +
                  hash    = Hash.new(&default)
         
     | 
| 
      
 253 
     | 
    
         
            +
                  each do |key, value|
         
     | 
| 
      
 254 
     | 
    
         
            +
                    hash[key] ||= value
         
     | 
| 
      
 255 
     | 
    
         
            +
                  end
         
     | 
| 
      
 256 
     | 
    
         
            +
                  hash
         
     | 
| 
      
 257 
     | 
    
         
            +
                end
         
     | 
| 
      
 258 
     | 
    
         
            +
                
         
     | 
| 
       254 
259 
     | 
    
         
             
                ####################
         
     | 
| 
       255 
260 
     | 
    
         
             
                ### Transactions ###
         
     | 
| 
       256 
261 
     | 
    
         
             
                ####################
         
     | 
| 
         @@ -296,21 +301,26 @@ module OklahomaMixer 
     | 
|
| 
       296 
301 
     | 
    
         
             
                #######
         
     | 
| 
       297 
302 
     | 
    
         
             
                private
         
     | 
| 
       298 
303 
     | 
    
         
             
                #######
         
     | 
| 
      
 304 
     | 
    
         
            +
             
     | 
| 
      
 305 
     | 
    
         
            +
                def lib
         
     | 
| 
      
 306 
     | 
    
         
            +
                  @c ||= self.class.const_get(:C)
         
     | 
| 
      
 307 
     | 
    
         
            +
                end
         
     | 
| 
       299 
308 
     | 
    
         | 
| 
       300 
309 
     | 
    
         
             
                def try(func, *args)
         
     | 
| 
       301 
310 
     | 
    
         
             
                  options  = args.last.is_a?(Hash) ? args.pop : { }
         
     | 
| 
       302 
311 
     | 
    
         
             
                  failure  = options.fetch(:failure, false)
         
     | 
| 
       303 
312 
     | 
    
         
             
                  no_error = options.fetch(:no_error, { })
         
     | 
| 
       304 
     | 
    
         
            -
                  result   = func == :read_from_func 
     | 
| 
       305 
     | 
    
         
            -
                              
     | 
| 
       306 
     | 
    
         
            -
                              
     | 
| 
       307 
     | 
    
         
            -
                  if  
     | 
| 
       308 
     | 
    
         
            -
                    error_code =  
     | 
| 
      
 313 
     | 
    
         
            +
                  result   = func == :read_from_func                                ?
         
     | 
| 
      
 314 
     | 
    
         
            +
                             lib.read_from_func(args[0], @db, *args[1..-1].flatten) :
         
     | 
| 
      
 315 
     | 
    
         
            +
                             lib.send(func, @db, *args.flatten)
         
     | 
| 
      
 316 
     | 
    
         
            +
                  if failure.is_a?(Proc) ? failure[result] : result == failure
         
     | 
| 
      
 317 
     | 
    
         
            +
                    error_code = lib.ecode(@db)
         
     | 
| 
       309 
318 
     | 
    
         
             
                    if no_error.include? error_code
         
     | 
| 
       310 
319 
     | 
    
         
             
                      no_error[error_code]
         
     | 
| 
       311 
320 
     | 
    
         
             
                    else
         
     | 
| 
       312 
     | 
    
         
            -
                      error_message =  
     | 
| 
       313 
     | 
    
         
            -
                      fail Error::CabinetError, 
     | 
| 
      
 321 
     | 
    
         
            +
                      error_message = lib.errmsg(error_code)
         
     | 
| 
      
 322 
     | 
    
         
            +
                      fail Error::CabinetError,
         
     | 
| 
      
 323 
     | 
    
         
            +
                           "#{error_message} (error code #{error_code})"
         
     | 
| 
       314 
324 
     | 
    
         
             
                    end
         
     | 
| 
       315 
325 
     | 
    
         
             
                  else
         
     | 
| 
       316 
326 
     | 
    
         
             
                    result
         
     | 
| 
         @@ -321,15 +331,35 @@ module OklahomaMixer 
     | 
|
| 
       321 
331 
     | 
    
         
             
                  return str_or_int if str_or_int.is_a? Integer
         
     | 
| 
       322 
332 
     | 
    
         
             
                  const = "#{name.to_s.upcase}S"
         
     | 
| 
       323 
333 
     | 
    
         
             
                  names = self.class.const_get(const)
         
     | 
| 
       324 
     | 
    
         
            -
                  enum  =  
     | 
| 
      
 334 
     | 
    
         
            +
                  enum  = lib.const_get(const)
         
     | 
| 
       325 
335 
     | 
    
         
             
                  str_or_int.to_s.downcase.scan(/./m).inject(0) do |int, c|
         
     | 
| 
       326 
336 
     | 
    
         
             
                    if n = names[c]
         
     | 
| 
       327 
     | 
    
         
            -
                      int | enum[n]
         
     | 
| 
      
 337 
     | 
    
         
            +
                      int | enum["#{self.class.to_s[/([HBFT])\w+\z/, 1]}DB#{n}".to_sym]
         
     | 
| 
       328 
338 
     | 
    
         
             
                    else
         
     | 
| 
       329 
339 
     | 
    
         
             
                      warn "skipping unrecognized #{name}"
         
     | 
| 
       330 
340 
     | 
    
         
             
                      int
         
     | 
| 
       331 
341 
     | 
    
         
             
                    end
         
     | 
| 
       332 
342 
     | 
    
         
             
                  end
         
     | 
| 
       333 
343 
     | 
    
         
             
                end
         
     | 
| 
      
 344 
     | 
    
         
            +
                
         
     | 
| 
      
 345 
     | 
    
         
            +
                def tune(options)
         
     | 
| 
      
 346 
     | 
    
         
            +
                  if self.class == HashDatabase and
         
     | 
| 
      
 347 
     | 
    
         
            +
                     options.values_at(:bnum, :apow, :fpow, :opts).any?
         
     | 
| 
      
 348 
     | 
    
         
            +
                    optimize(options.merge(:tune => true))
         
     | 
| 
      
 349 
     | 
    
         
            +
                  end
         
     | 
| 
      
 350 
     | 
    
         
            +
                  {:rcnum => :cache, :xmsiz => nil, :dfunit => nil}.each do |option, func|
         
     | 
| 
      
 351 
     | 
    
         
            +
                    next if func == :cache and self.class != HashDatabase
         
     | 
| 
      
 352 
     | 
    
         
            +
                    if i = options[option]
         
     | 
| 
      
 353 
     | 
    
         
            +
                      try("set#{func || option}", i.to_i)
         
     | 
| 
      
 354 
     | 
    
         
            +
                    end
         
     | 
| 
      
 355 
     | 
    
         
            +
                  end
         
     | 
| 
      
 356 
     | 
    
         
            +
                end
         
     | 
| 
      
 357 
     | 
    
         
            +
                
         
     | 
| 
      
 358 
     | 
    
         
            +
                def cast_to_bytes_and_length(object)
         
     | 
| 
      
 359 
     | 
    
         
            +
                  bytes = object.to_s
         
     | 
| 
      
 360 
     | 
    
         
            +
                  [bytes, bytes.length]
         
     | 
| 
      
 361 
     | 
    
         
            +
                end
         
     | 
| 
      
 362 
     | 
    
         
            +
                alias_method :cast_key_in,   :cast_to_bytes_and_length
         
     | 
| 
      
 363 
     | 
    
         
            +
                alias_method :cast_value_in, :cast_to_bytes_and_length
         
     | 
| 
       334 
364 
     | 
    
         
             
              end
         
     | 
| 
       335 
365 
     | 
    
         
             
            end
         
     | 
| 
         @@ -3,109 +3,26 @@ module OklahomaMixer 
     | 
|
| 
       3 
3 
     | 
    
         
             
                module C  # :nodoc:
         
     | 
| 
       4 
4 
     | 
    
         
             
                  extend OklahomaMixer::Utilities::FFIDSL
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                  MODES = enum :HDBOREADER,  1 << 0,
         
     | 
| 
       7 
     | 
    
         
            -
                               :HDBOWRITER,  1 << 1,
         
     | 
| 
       8 
     | 
    
         
            -
                               :HDBOCREAT,   1 << 2,
         
     | 
| 
       9 
     | 
    
         
            -
                               :HDBOTRUNC,   1 << 3,
         
     | 
| 
       10 
     | 
    
         
            -
                               :HDBONOLCK,   1 << 4,
         
     | 
| 
       11 
     | 
    
         
            -
                               :HDBOLCKNB,   1 << 5,
         
     | 
| 
       12 
     | 
    
         
            -
                               :HDBOTSYNC,   1 << 6
         
     | 
| 
       13 
     | 
    
         
            -
                  OPTS  = enum :HDBTLARGE,   1 << 0,
         
     | 
| 
       14 
     | 
    
         
            -
                               :HDBTDEFLATE, 1 << 1,
         
     | 
| 
       15 
     | 
    
         
            -
                               :HDBTBZIP,    1 << 2,
         
     | 
| 
       16 
     | 
    
         
            -
                               :HDBTTCBS,    1 << 3
         
     | 
| 
       17 
     | 
    
         
            -
                  
         
     | 
| 
       18 
6 
     | 
    
         
             
                  prefix :tchdb
         
     | 
| 
       19 
7 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
       21 
     | 
    
         
            -
                  func :name    => :open,
         
     | 
| 
       22 
     | 
    
         
            -
                       :args    => [:pointer, :string, MODES],
         
     | 
| 
       23 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       24 
     | 
    
         
            -
                  func :name    => :sync,
         
     | 
| 
       25 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       26 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       27 
     | 
    
         
            -
                  func :name    => :fsiz,
         
     | 
| 
       28 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       29 
     | 
    
         
            -
                       :returns => :uint64
         
     | 
| 
       30 
     | 
    
         
            -
                  func :name    => :copy,
         
     | 
| 
       31 
     | 
    
         
            -
                       :args    => [:pointer, :string],
         
     | 
| 
       32 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       33 
     | 
    
         
            -
                  func :name    => :defrag,
         
     | 
| 
       34 
     | 
    
         
            -
                       :args    => [:pointer, :int64],
         
     | 
| 
       35 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
      
 8 
     | 
    
         
            +
                  def_hash_database_consts_and_funcs
         
     | 
| 
       36 
9 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                  func :name    => :ecode,
         
     | 
| 
       38 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       39 
     | 
    
         
            -
                       :returns => :int
         
     | 
| 
       40 
     | 
    
         
            -
                  func :name    => :errmsg,
         
     | 
| 
       41 
     | 
    
         
            -
                       :args    => :int,
         
     | 
| 
       42 
     | 
    
         
            -
                       :returns => :string
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                  func :name    => :setmutex,
         
     | 
| 
       45 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       46 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       47 
10 
     | 
    
         
             
                  func :name    => :tune,
         
     | 
| 
       48 
11 
     | 
    
         
             
                       :args    => [:pointer, :int64, :int8, :int8, OPTS],
         
     | 
| 
       49 
12 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       50 
13 
     | 
    
         
             
                  func :name    => :setcache,
         
     | 
| 
       51 
14 
     | 
    
         
             
                       :args    => [:pointer, :int32],
         
     | 
| 
       52 
15 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       53 
     | 
    
         
            -
                  func :name    => :setxmsiz,
         
     | 
| 
       54 
     | 
    
         
            -
                       :args    => [:pointer, :int64],
         
     | 
| 
       55 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       56 
     | 
    
         
            -
                  func :name    => :setdfunit,
         
     | 
| 
       57 
     | 
    
         
            -
                       :args    => [:pointer, :int32],
         
     | 
| 
       58 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       59 
16 
     | 
    
         
             
                  func :name    => :optimize,
         
     | 
| 
       60 
17 
     | 
    
         
             
                       :args    => [:pointer, :int64, :int8, :int8, OPTS],
         
     | 
| 
       61 
18 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
                  func :name    => :put,
         
     | 
| 
       64 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
       65 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       66 
     | 
    
         
            -
                  func :name    => :putkeep,
         
     | 
| 
       67 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
       68 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       69 
     | 
    
         
            -
                  func :name    => :putcat,
         
     | 
| 
       70 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
       71 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
      
 19 
     | 
    
         
            +
                       
         
     | 
| 
       72 
20 
     | 
    
         
             
                  func :name    => :putasync,
         
     | 
| 
       73 
21 
     | 
    
         
             
                       :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
       74 
22 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       75 
     | 
    
         
            -
                  call :name    => :TCPDPROC,
         
     | 
| 
       76 
     | 
    
         
            -
                       :args    => [:pointer, :int, :pointer, :pointer],
         
     | 
| 
       77 
     | 
    
         
            -
                       :returns => :pointer
         
     | 
| 
       78 
     | 
    
         
            -
                  func :name    => :putproc,
         
     | 
| 
       79 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :pointer, :int, :TCPDPROC,
         
     | 
| 
       80 
     | 
    
         
            -
                                    :pointer],
         
     | 
| 
       81 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       82 
     | 
    
         
            -
                  func :name    => :addint,
         
     | 
| 
       83 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :int],
         
     | 
| 
       84 
     | 
    
         
            -
                       :returns => :int
         
     | 
| 
       85 
     | 
    
         
            -
                  func :name    => :adddouble,
         
     | 
| 
       86 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :double],
         
     | 
| 
       87 
     | 
    
         
            -
                       :returns => :double
         
     | 
| 
       88 
     | 
    
         
            -
                  func :name    => :out,
         
     | 
| 
       89 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int],
         
     | 
| 
       90 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       91 
     | 
    
         
            -
                  func :name    => :get,
         
     | 
| 
       92 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :pointer],
         
     | 
| 
       93 
     | 
    
         
            -
                       :returns => :pointer
         
     | 
| 
       94 
     | 
    
         
            -
                  func :name    => :vanish,
         
     | 
| 
       95 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       96 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       97 
     | 
    
         
            -
                  func :name    => :vanish,
         
     | 
| 
       98 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       99 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       100 
     | 
    
         
            -
                  func :name    => :fwmkeys,
         
     | 
| 
       101 
     | 
    
         
            -
                       :args    => [:pointer, :pointer, :int, :int],
         
     | 
| 
       102 
     | 
    
         
            -
                       :returns => :pointer
         
     | 
| 
       103 
     | 
    
         
            -
                  func :name    => :rnum,
         
     | 
| 
       104 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       105 
     | 
    
         
            -
                       :returns => :uint64
         
     | 
| 
       106 
23 
     | 
    
         | 
| 
       107 
24 
     | 
    
         
             
                  func :name    => :iterinit,
         
     | 
| 
       108 
     | 
    
         
            -
                       :args    =>  
     | 
| 
      
 25 
     | 
    
         
            +
                       :args    => :pointer,
         
     | 
| 
       109 
26 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       110 
27 
     | 
    
         
             
                  func :name    => :iternext,
         
     | 
| 
       111 
28 
     | 
    
         
             
                       :args    => [:pointer, :pointer],
         
     | 
| 
         @@ -113,16 +30,6 @@ module OklahomaMixer 
     | 
|
| 
       113 
30 
     | 
    
         
             
                  func :name    => :iternext3,
         
     | 
| 
       114 
31 
     | 
    
         
             
                       :args    => [:pointer, :pointer, :pointer],
         
     | 
| 
       115 
32 
     | 
    
         
             
                       :returns => :bool
         
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
                  func :name    => :tranbegin,
         
     | 
| 
       118 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       119 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       120 
     | 
    
         
            -
                  func :name    => :trancommit,
         
     | 
| 
       121 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       122 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       123 
     | 
    
         
            -
                  func :name    => :tranabort,
         
     | 
| 
       124 
     | 
    
         
            -
                       :args    => :pointer,
         
     | 
| 
       125 
     | 
    
         
            -
                       :returns => :bool
         
     | 
| 
       126 
33 
     | 
    
         
             
                end
         
     | 
| 
       127 
34 
     | 
    
         
             
              end
         
     | 
| 
       128 
35 
     | 
    
         
             
            end
         
     | 
| 
         @@ -22,6 +22,12 @@ module OklahomaMixer 
     | 
|
| 
       22 
22 
     | 
    
         
             
                    defined?(@prefix) and @prefix
         
     | 
| 
       23 
23 
     | 
    
         
             
                  end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                  def const(name, values)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    const_set( name, enum( *(0...values.size).map { |i|
         
     | 
| 
      
 27 
     | 
    
         
            +
                      ["#{prefix.to_s[2..-1].upcase}#{values[i]}".to_sym, 1 << i]
         
     | 
| 
      
 28 
     | 
    
         
            +
                    }.flatten ) )
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  
         
     | 
| 
       25 
31 
     | 
    
         
             
                  def func(details)
         
     | 
| 
       26 
32 
     | 
    
         
             
                    args =  [ ]
         
     | 
| 
       27 
33 
     | 
    
         
             
                    args << details.fetch(:alias, details[:name])
         
     | 
| 
         @@ -57,12 +63,108 @@ module OklahomaMixer 
     | 
|
| 
       57 
63 
     | 
    
         
             
                    func :name    => :del,
         
     | 
| 
       58 
64 
     | 
    
         
             
                         :args    => :pointer
         
     | 
| 
       59 
65 
     | 
    
         
             
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  
         
     | 
| 
      
 67 
     | 
    
         
            +
                  def def_core_database_consts_and_funcs
         
     | 
| 
      
 68 
     | 
    
         
            +
                    const :MODES, %w[OREADER OWRITER OCREAT OTRUNC ONOLCK OLCKNB OTSYNC]
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    def_new_and_del_funcs
         
     | 
| 
      
 71 
     | 
    
         
            +
                    
         
     | 
| 
      
 72 
     | 
    
         
            +
                    func :name    => :open,
         
     | 
| 
      
 73 
     | 
    
         
            +
                         :args    => [:pointer, :string, const_get(:MODES)],
         
     | 
| 
      
 74 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 75 
     | 
    
         
            +
                    func :name    => :sync,
         
     | 
| 
      
 76 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 77 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 78 
     | 
    
         
            +
                    func :name    => :fsiz,
         
     | 
| 
      
 79 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 80 
     | 
    
         
            +
                         :returns => :uint64
         
     | 
| 
      
 81 
     | 
    
         
            +
                    func :name    => :copy,
         
     | 
| 
      
 82 
     | 
    
         
            +
                         :args    => [:pointer, :string],
         
     | 
| 
      
 83 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                    func :name    => :ecode,
         
     | 
| 
      
 86 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 87 
     | 
    
         
            +
                         :returns => :int
         
     | 
| 
      
 88 
     | 
    
         
            +
                    func :name    => :errmsg,
         
     | 
| 
      
 89 
     | 
    
         
            +
                         :args    => :int,
         
     | 
| 
      
 90 
     | 
    
         
            +
                         :returns => :string
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                    func :name    => :setmutex,
         
     | 
| 
      
 93 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 94 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                    func :name    => :vanish,
         
     | 
| 
      
 97 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 98 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 99 
     | 
    
         
            +
                    func :name    => :rnum,
         
     | 
| 
      
 100 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 101 
     | 
    
         
            +
                         :returns => :uint64
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                    func :name    => :tranbegin,
         
     | 
| 
      
 104 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 105 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 106 
     | 
    
         
            +
                    func :name    => :trancommit,
         
     | 
| 
      
 107 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 108 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 109 
     | 
    
         
            +
                    func :name    => :tranabort,
         
     | 
| 
      
 110 
     | 
    
         
            +
                         :args    => :pointer,
         
     | 
| 
      
 111 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 112 
     | 
    
         
            +
                  end
         
     | 
| 
      
 113 
     | 
    
         
            +
                  
         
     | 
| 
      
 114 
     | 
    
         
            +
                  def def_hash_database_consts_and_funcs
         
     | 
| 
      
 115 
     | 
    
         
            +
                    const :OPTS, %w[TLARGE TDEFLATE TBZIP TTCBS]
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                    def_core_database_consts_and_funcs
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                    func :name    => :defrag,
         
     | 
| 
      
 120 
     | 
    
         
            +
                         :args    => [:pointer, :int64],
         
     | 
| 
      
 121 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                    func :name    => :setxmsiz,
         
     | 
| 
      
 124 
     | 
    
         
            +
                         :args    => [:pointer, :int64],
         
     | 
| 
      
 125 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 126 
     | 
    
         
            +
                    func :name    => :setdfunit,
         
     | 
| 
      
 127 
     | 
    
         
            +
                         :args    => [:pointer, :int32],
         
     | 
| 
      
 128 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                    func :name    => :put,
         
     | 
| 
      
 131 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
      
 132 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 133 
     | 
    
         
            +
                    func :name    => :putkeep,
         
     | 
| 
      
 134 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
      
 135 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 136 
     | 
    
         
            +
                    func :name    => :putcat,
         
     | 
| 
      
 137 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :pointer, :int],
         
     | 
| 
      
 138 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 139 
     | 
    
         
            +
                    call :name    => :TCPDPROC,
         
     | 
| 
      
 140 
     | 
    
         
            +
                         :args    => [:pointer, :int, :pointer, :pointer],
         
     | 
| 
      
 141 
     | 
    
         
            +
                         :returns => :pointer
         
     | 
| 
      
 142 
     | 
    
         
            +
                    func :name    => :putproc,
         
     | 
| 
      
 143 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :pointer, :int, :TCPDPROC,
         
     | 
| 
      
 144 
     | 
    
         
            +
                                      :pointer],
         
     | 
| 
      
 145 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 146 
     | 
    
         
            +
                    func :name    => :addint,
         
     | 
| 
      
 147 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :int],
         
     | 
| 
      
 148 
     | 
    
         
            +
                         :returns => :int
         
     | 
| 
      
 149 
     | 
    
         
            +
                    func :name    => :adddouble,
         
     | 
| 
      
 150 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :double],
         
     | 
| 
      
 151 
     | 
    
         
            +
                         :returns => :double
         
     | 
| 
      
 152 
     | 
    
         
            +
                    func :name    => :out,
         
     | 
| 
      
 153 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int],
         
     | 
| 
      
 154 
     | 
    
         
            +
                         :returns => :bool
         
     | 
| 
      
 155 
     | 
    
         
            +
                    func :name    => :get,
         
     | 
| 
      
 156 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :pointer],
         
     | 
| 
      
 157 
     | 
    
         
            +
                         :returns => :pointer
         
     | 
| 
      
 158 
     | 
    
         
            +
                    func :name    => :fwmkeys,
         
     | 
| 
      
 159 
     | 
    
         
            +
                         :args    => [:pointer, :pointer, :int, :int],
         
     | 
| 
      
 160 
     | 
    
         
            +
                         :returns => :pointer
         
     | 
| 
      
 161 
     | 
    
         
            +
                  end
         
     | 
| 
       60 
162 
     | 
    
         
             
                end
         
     | 
| 
       61 
163 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
                int_min = `getconf INT_MIN 2>&1`[/-\d+/]
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                  warn "set OKMixer::Utilities::INT_MIN before using counters"
         
     | 
| 
      
 164 
     | 
    
         
            +
                unless int_min = `getconf INT_MIN 2>&1`[/-\d+/]
         
     | 
| 
      
 165 
     | 
    
         
            +
                  warn "set OKMixer::Utilities::INT_MIN before using the :add storage mode"
         
     | 
| 
       65 
166 
     | 
    
         
             
                end
         
     | 
| 
      
 167 
     | 
    
         
            +
                INT_MIN = int_min && int_min.to_i
         
     | 
| 
       66 
168 
     | 
    
         | 
| 
       67 
169 
     | 
    
         
             
                def self.temp_int
         
     | 
| 
       68 
170 
     | 
    
         
             
                  int = FFI::MemoryPointer.new(:int)
         
     | 
| 
         @@ -82,7 +184,10 @@ module OklahomaMixer 
     | 
|
| 
       82 
184 
     | 
    
         | 
| 
       83 
185 
     | 
    
         
             
                prefix :tc
         
     | 
| 
       84 
186 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                func :name 
     | 
| 
       86 
     | 
    
         
            -
                     :args 
     | 
| 
      
 187 
     | 
    
         
            +
                func :name    => :malloc,
         
     | 
| 
      
 188 
     | 
    
         
            +
                     :args    => :size_t,
         
     | 
| 
      
 189 
     | 
    
         
            +
                     :returns => :pointer
         
     | 
| 
      
 190 
     | 
    
         
            +
                func :name    => :free,
         
     | 
| 
      
 191 
     | 
    
         
            +
                     :args    => :pointer
         
     | 
| 
       87 
192 
     | 
    
         
             
              end
         
     | 
| 
       88 
193 
     | 
    
         
             
            end
         
     |