sqlite3_extend_function 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +15 -0
- data/.rubocop.yml +36 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +10 -0
- data/README.md +32 -3
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/sqlite3_extend_function.rb +7 -9
- data/lib/sqlite3_extend_function/function.rb +20 -555
- data/lib/sqlite3_extend_function/functions.rb +17 -0
- data/lib/sqlite3_extend_function/functions/acos.rb +19 -0
- data/lib/sqlite3_extend_function/functions/ascii.rb +20 -0
- data/lib/sqlite3_extend_function/functions/asin.rb +19 -0
- data/lib/sqlite3_extend_function/functions/atan.rb +19 -0
- data/lib/sqlite3_extend_function/functions/atan2.rb +20 -0
- data/lib/sqlite3_extend_function/functions/bit_length.rb +21 -0
- data/lib/sqlite3_extend_function/functions/btrim.rb +21 -0
- data/lib/sqlite3_extend_function/functions/cbrt.rb +22 -0
- data/lib/sqlite3_extend_function/functions/ceil.rb +21 -0
- data/lib/sqlite3_extend_function/functions/char_length.rb +20 -0
- data/lib/sqlite3_extend_function/functions/chr.rb +20 -0
- data/lib/sqlite3_extend_function/functions/concat.rb +20 -0
- data/lib/sqlite3_extend_function/functions/concat_ws.rb +21 -0
- data/lib/sqlite3_extend_function/functions/cos.rb +19 -0
- data/lib/sqlite3_extend_function/functions/cot.rb +19 -0
- data/lib/sqlite3_extend_function/functions/decode.rb +29 -0
- data/lib/sqlite3_extend_function/functions/degrees.rb +19 -0
- data/lib/sqlite3_extend_function/functions/div.rb +20 -0
- data/lib/sqlite3_extend_function/functions/encode.rb +29 -0
- data/lib/sqlite3_extend_function/functions/exp.rb +22 -0
- data/lib/sqlite3_extend_function/functions/floor.rb +19 -0
- data/lib/sqlite3_extend_function/functions/format.rb +17 -0
- data/lib/sqlite3_extend_function/functions/initcap.rb +24 -0
- data/lib/sqlite3_extend_function/functions/ln.rb +22 -0
- data/lib/sqlite3_extend_function/functions/log.rb +24 -0
- data/lib/sqlite3_extend_function/functions/md5.rb +20 -0
- data/lib/sqlite3_extend_function/functions/mod.rb +21 -0
- data/lib/sqlite3_extend_function/functions/now.rb +15 -0
- data/lib/sqlite3_extend_function/functions/octet_length.rb +20 -0
- data/lib/sqlite3_extend_function/functions/pi.rb +15 -0
- data/lib/sqlite3_extend_function/functions/power.rb +23 -0
- data/lib/sqlite3_extend_function/functions/radians.rb +22 -0
- data/lib/sqlite3_extend_function/functions/sign.rb +22 -0
- data/lib/sqlite3_extend_function/functions/sin.rb +19 -0
- data/lib/sqlite3_extend_function/functions/sqrt.rb +22 -0
- data/lib/sqlite3_extend_function/functions/tan.rb +19 -0
- data/lib/sqlite3_extend_function/functions/trunc.rb +25 -0
- data/lib/sqlite3_extend_function/functions/width_bucket.rb +27 -0
- data/lib/sqlite3_extend_function/version.rb +1 -1
- data/sqlite3_extend_function.gemspec +25 -0
- metadata +52 -62
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Exp
|
6
|
+
module Exp
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer, Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
return if dp.nil?
|
13
|
+
|
14
|
+
result = Math.exp(Float(dp))
|
15
|
+
result.to_i == result ? result.to_i : result
|
16
|
+
rescue ArgumentError
|
17
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: \"#{dp}\""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Floor
|
6
|
+
module Floor
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
Float(dp).floor.to_i unless dp.nil?
|
13
|
+
rescue ArgumentError
|
14
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: \"#{dp}\""
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Format
|
6
|
+
module Format
|
7
|
+
class << self
|
8
|
+
# @param [String] formartstr
|
9
|
+
# @param [Array<Object>] args
|
10
|
+
# @return [String]
|
11
|
+
def call(formartstr, *args)
|
12
|
+
formartstr % args
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Initcap
|
6
|
+
module Initcap
|
7
|
+
class << self
|
8
|
+
# @param [String] str
|
9
|
+
# @return [String]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(str)
|
12
|
+
return if str.nil?
|
13
|
+
|
14
|
+
str.split(/([a-zA-Z0-9]*|[^a-zA-Z0-9]*)/).map.with_index do |s, i|
|
15
|
+
i.odd? ? s.downcase.capitalize : s
|
16
|
+
end.join
|
17
|
+
rescue StandardError
|
18
|
+
raise SQLite3::SQLException, 'No function matches the given name and argument types. ' \
|
19
|
+
'You might need to add explicit type casts.'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Ln
|
6
|
+
module Ln
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer, Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
return if dp.nil?
|
13
|
+
|
14
|
+
result = Math.log(Float(dp))
|
15
|
+
result.to_i == result ? result.to_i : result
|
16
|
+
rescue ArgumentError
|
17
|
+
raise SQLite3::SQLException, 'cannot take logarithm of a negative number'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Log
|
6
|
+
module Log
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] y
|
9
|
+
# @param [Integer, Float, NilClass] x
|
10
|
+
# @return [Integer, Float]
|
11
|
+
# @raise [SQLite3::SQLException]
|
12
|
+
def call(y, x = nil)
|
13
|
+
return if y.nil?
|
14
|
+
return Math.log(x, y) unless x.nil?
|
15
|
+
|
16
|
+
result = Math.log10(Float(y))
|
17
|
+
result.to_i == result ? result.to_i : result
|
18
|
+
rescue ArgumentError
|
19
|
+
raise SQLite3::SQLException, 'invalid input syntax for type numeric'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Md5
|
6
|
+
module Md5
|
7
|
+
class << self
|
8
|
+
# @param [String] str
|
9
|
+
# @return [String]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(str)
|
12
|
+
Digest::MD5.hexdigest(str) unless str.nil?
|
13
|
+
rescue StandardError
|
14
|
+
raise SQLite3::SQLException, 'No function matches the given name and argument types. ' \
|
15
|
+
'You might need to add explicit type casts.'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Mod
|
6
|
+
module Mod
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] y
|
9
|
+
# @param [Integer, Float] x
|
10
|
+
# @return [Integer]
|
11
|
+
# @raise [SQLite3::SQLException]
|
12
|
+
def call(y, x = nil)
|
13
|
+
Float(y).modulo(Float(x)).to_i
|
14
|
+
rescue ArgumentError
|
15
|
+
raise SQLite3::SQLException,
|
16
|
+
'Could not choose a best candidate function. You might need to add explicit type casts.'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Now
|
6
|
+
module Now
|
7
|
+
class << self
|
8
|
+
# @return [String]
|
9
|
+
def call
|
10
|
+
Time.now.strftime('%Y-%m-%d %H:%M:%S.%6N%:z')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::OctetLength
|
6
|
+
module OctetLength
|
7
|
+
class << self
|
8
|
+
# @param [String] str
|
9
|
+
# @return [Integer]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(str)
|
12
|
+
str.bytesize
|
13
|
+
rescue ArgumentError
|
14
|
+
raise SQLite3::SQLException, 'No function matches the given name and argument types. ' \
|
15
|
+
'You might need to add explicit type casts.'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Power
|
6
|
+
module Power
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] a
|
9
|
+
# @param [Integer, Float] b
|
10
|
+
# @return [Integer, Float]
|
11
|
+
# @raise [SQLite3::SQLException]
|
12
|
+
def call(a, b)
|
13
|
+
return if a.nil? || b.nil?
|
14
|
+
|
15
|
+
result = Float(a)**Float(b)
|
16
|
+
result.to_i == result ? result.to_i : result
|
17
|
+
rescue ArgumentError
|
18
|
+
raise SQLite3::SQLException, 'invalid input syntax for type double precision'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Radians
|
6
|
+
module Radians
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer, Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
return if dp.nil?
|
13
|
+
|
14
|
+
result = Float(dp) * Math::PI / 180
|
15
|
+
result.to_i == result ? result.to_i : result
|
16
|
+
rescue ArgumentError
|
17
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: \"#{dp}\""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Sign
|
6
|
+
module Sign
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
return if dp.nil?
|
13
|
+
|
14
|
+
value = Float(dp)
|
15
|
+
(value.zero? && 0) || (value.positive? && 1) || -1
|
16
|
+
rescue ArgumentError
|
17
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: \"#{dp}\""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Sin
|
6
|
+
module Sin
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] x
|
9
|
+
# @return [Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(x)
|
12
|
+
Math.sin(Float(x))
|
13
|
+
rescue ArgumentError
|
14
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: #{x}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Sqrt
|
6
|
+
module Sqrt
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] dp
|
9
|
+
# @return [Integer, Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(dp)
|
12
|
+
return if dp.nil?
|
13
|
+
|
14
|
+
result = Math.sqrt(Float(dp))
|
15
|
+
result.to_i == result ? result.to_i : result
|
16
|
+
rescue ArgumentError
|
17
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: \"#{dp}\""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Tan
|
6
|
+
module Tan
|
7
|
+
class << self
|
8
|
+
# @param [Float, Integer] x
|
9
|
+
# @return [Float]
|
10
|
+
# @raise [SQLite3::SQLException]
|
11
|
+
def call(x)
|
12
|
+
Math.tan(Float(x))
|
13
|
+
rescue ArgumentError
|
14
|
+
raise SQLite3::SQLException, "invalid input syntax for type double precision: #{x}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::Trunc
|
6
|
+
module Trunc
|
7
|
+
class << self
|
8
|
+
# @param [Integer, Float] v
|
9
|
+
# @param [Integer] s
|
10
|
+
# @return [Integer, Float]
|
11
|
+
# @raise [SQLite3::SQLException]
|
12
|
+
def call(v, s = 0)
|
13
|
+
return if v.nil?
|
14
|
+
raise ArgumentError if s.is_a?(Integer)
|
15
|
+
|
16
|
+
dec = BigDecimal(s.zero? ? '1.0' : (1.0 / (10**s)).to_s)
|
17
|
+
result = (v / dec).to_i * dec
|
18
|
+
result.to_i == result ? result.to_i : result.to_f
|
19
|
+
rescue ArgumentError
|
20
|
+
raise SQLite3::SQLException, 'invalid input syntax for type double precision'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLite3ExtendFunction
|
4
|
+
module Functions
|
5
|
+
# SQLite3ExtendFunction::Functions::WidthBucket
|
6
|
+
module WidthBucket
|
7
|
+
class << self
|
8
|
+
# @param [Float, Integer] operand
|
9
|
+
# @param [Integer, Float] b1
|
10
|
+
# @param [Integer, Float] b2
|
11
|
+
# @param [Integer] count
|
12
|
+
# @return [Integer]
|
13
|
+
# @raise [SQLite3::SQLException]
|
14
|
+
def call(operand, b1, b2, count)
|
15
|
+
raise ArgumentError unless count.positive?
|
16
|
+
|
17
|
+
result = (Float(operand) / ((Float(b2) - Float(b1)) / Float(count))).ceil
|
18
|
+
result = count + 1 if result > count
|
19
|
+
result = 0 if result.negative?
|
20
|
+
result.to_i
|
21
|
+
rescue ArgumentError
|
22
|
+
raise SQLite3::SQLException, 'ArgumentError'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/sqlite3_extend_function/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'sqlite3_extend_function'
|
7
|
+
spec.version = SQLite3ExtendFunction::VERSION
|
8
|
+
spec.authors = %w[shoma07]
|
9
|
+
spec.email = %w[23730734+shoma07@users.noreply.github.com]
|
10
|
+
spec.homepage = 'https://github.com/shoma07/sqlite3_extend_function'
|
11
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
|
12
|
+
spec.summary = 'Add some user-defined functions to SQL when using SQLie3.'
|
13
|
+
spec.description = 'Add some user-defined functions to SQL when using SQLie3.'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
18
|
+
spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
end
|
25
|
+
end
|