outback 0.0.14 → 1.1.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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +11 -0
  3. data/LICENSE +21 -0
  4. data/README.md +29 -3
  5. data/lib/outback/archive.rb +6 -17
  6. data/lib/outback/backup.rb +38 -20
  7. data/lib/outback/cli.rb +6 -2
  8. data/lib/outback/configuration.rb +15 -10
  9. data/lib/outback/directory_source.rb +8 -7
  10. data/lib/outback/directory_target.rb +18 -11
  11. data/lib/outback/encryption_processor.rb +34 -0
  12. data/lib/outback/errors.rb +7 -0
  13. data/lib/outback/logging.rb +7 -0
  14. data/lib/outback/mysql_source.rb +9 -9
  15. data/lib/outback/processor.rb +17 -0
  16. data/lib/outback/s3_target.rb +18 -9
  17. data/lib/outback/sftp_target.rb +70 -0
  18. data/lib/outback/source.rb +9 -2
  19. data/lib/outback/source_archive.rb +17 -0
  20. data/lib/outback/support/attr_setter.rb +1 -1
  21. data/lib/outback/support/configurable.rb +5 -3
  22. data/lib/outback/target.rb +52 -14
  23. data/lib/outback/target_archive.rb +30 -0
  24. data/lib/outback/version.rb +3 -0
  25. data/lib/outback.rb +16 -11
  26. data/lib/vendor/enumerable_ext.rb +9 -0
  27. data/lib/{outback/vendor → vendor}/metaclass.rb +1 -1
  28. data/lib/vendor/methodphitamine.rb +28 -0
  29. data/lib/vendor/mysql/charset.rb +325 -0
  30. data/lib/vendor/mysql/constants.rb +165 -0
  31. data/lib/vendor/mysql/error.rb +989 -0
  32. data/lib/vendor/mysql/packet.rb +78 -0
  33. data/lib/vendor/mysql/protocol.rb +770 -0
  34. data/lib/vendor/mysql.rb +1093 -0
  35. data/lib/vendor/numeric_ext.rb +49 -0
  36. data/lib/vendor/string_ext.rb +19 -0
  37. metadata +84 -43
  38. data/MIT-LICENSE +0 -20
  39. data/VERSION +0 -1
  40. data/lib/outback/configuration_error.rb +0 -4
  41. data/lib/outback/directory_archive.rb +0 -8
  42. data/lib/outback/local_archive.rb +0 -6
  43. data/lib/outback/s3_archive.rb +0 -18
  44. data/lib/outback/temp_archive.rb +0 -5
  45. data/lib/outback/vendor/methodphitamine.rb +0 -25
  46. data/lib/outback/vendor/mysql.rb +0 -1214
@@ -1,10 +1,17 @@
1
1
  module Outback
2
2
  class Source
3
3
  include Configurable
4
+ include Logging
5
+
6
+ attr_reader :backup_name
7
+
8
+ def initialize(backup_name)
9
+ @backup_name = backup_name
10
+ end
4
11
 
5
12
  def create_archive(backup_name, timestamp, tmpdir)
6
- # implement in subclasses
13
+ raise NotImplementedError
7
14
  end
8
15
 
9
16
  end
10
- end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Outback
2
+ class SourceArchive < Archive
3
+
4
+ def initialize(filename)
5
+ super(filename)
6
+ @size = @filename.size
7
+ end
8
+
9
+ def open
10
+ filename.open
11
+ end
12
+
13
+ def unlink
14
+ filename.unlink
15
+ end
16
+ end
17
+ end
@@ -21,4 +21,4 @@ module Outback
21
21
  end
22
22
  end
23
23
 
24
- end
24
+ end
@@ -3,11 +3,13 @@ module Outback
3
3
 
4
4
  def self.included(base)
5
5
  base.extend ClassMethods
6
- base.class_attribute :attributes
7
- base.attributes = []
8
6
  end
9
7
 
10
8
  module ClassMethods
9
+ def attributes
10
+ @attributes ||= []
11
+ end
12
+
11
13
  def configure(*args, &block)
12
14
  returning new(*args) do |instance|
13
15
  if block_given?
@@ -28,4 +30,4 @@ module Outback
28
30
  end
29
31
 
30
32
  end
31
- end
33
+ end
@@ -1,22 +1,60 @@
1
1
  module Outback
2
2
  class Target
3
3
  include Configurable
4
-
5
- def outdated_archives(name)
6
- list_archives(name).select(&:outdated?)
7
- end
8
-
9
- def purge!(name)
10
- size = count = 0
11
- outdated_archives(name).each do |archive|
12
- archive_size = archive.size
13
- if archive.purge!
14
- count += 1
15
- size += archive_size
4
+ include Logging
5
+
6
+ attr_reader :backup_name
7
+
8
+ def initialize(backup_name)
9
+ @backup_name = backup_name
10
+ end
11
+
12
+ def purge!
13
+ if purged_archives = connect { purge_archives }
14
+ logger.info "Purged #{purged_archives.size} archives (#{purged_archives.sum(&:size)} bytes) from #{self}"
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def connection
21
+ @connection
22
+ end
23
+
24
+ def connect
25
+ yield
26
+ end
27
+
28
+ def build_archive(filename, size)
29
+ TargetArchive.new(filename, size, self)
30
+ end
31
+
32
+ def list_all_archives
33
+ raise NotImplemented
34
+ end
35
+
36
+ def archives
37
+ list_all_archives.select(&_it.match?(backup_name))
38
+ end
39
+
40
+ def purge_archives
41
+ archives.select do |archive|
42
+ if archive.outdated?
43
+ begin
44
+ logger.debug "purging archive: #{archive}"
45
+ unlink_archive!(archive)
46
+ true
47
+ rescue => e
48
+ logger.error "could not unlink archive #{archive}: #{e} #{e.message}"
49
+ false
50
+ end
16
51
  end
17
52
  end
18
- Outback.info "Purged #{count} archives (#{size} bytes) from #{display_name}"
53
+ end
54
+
55
+ def unlink_archive!(archive)
56
+ raise NotImplemented
19
57
  end
20
58
 
21
59
  end
22
- end
60
+ end
@@ -0,0 +1,30 @@
1
+ module Outback
2
+ class TargetArchive < Archive
3
+ attr_reader :target
4
+
5
+ def initialize(filename, size, target)
6
+ super(filename)
7
+ @size = size
8
+ @target = target
9
+ end
10
+
11
+ def match?(name)
12
+ name == backup_name
13
+ end
14
+
15
+ def ttl
16
+ target && target.ttl
17
+ end
18
+
19
+ def outdated?
20
+ if timestamp && ttl
21
+ Time.now - Time.strptime(timestamp, Outback::TIME_FORMAT) > ttl
22
+ end
23
+ end
24
+
25
+ def to_s
26
+ "#{target}: #{filename}"
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module Outback
2
+ VERSION = '1.1.0'
3
+ end
data/lib/outback.rb CHANGED
@@ -3,35 +3,40 @@ require 'fileutils'
3
3
  require 'tempfile'
4
4
  require 'tmpdir'
5
5
 
6
- require 'active_support/core_ext'
7
-
8
6
  require 's3'
9
7
 
10
- require 'outback/vendor/mysql'
11
- require 'outback/vendor/metaclass'
12
- require 'outback/vendor/methodphitamine'
8
+ require_relative 'vendor/string_ext'
9
+ require_relative 'vendor/numeric_ext'
10
+ require_relative 'vendor/enumerable_ext'
11
+ require_relative 'vendor/mysql'
12
+ require_relative 'vendor/metaclass'
13
+ require_relative 'vendor/methodphitamine'
13
14
 
15
+ require 'outback/version'
14
16
  require 'outback/support/returning'
15
17
  require 'outback/support/attr_setter'
16
18
  require 'outback/support/configurable'
17
19
  require 'outback/support/mysql_ext'
18
20
  require 'outback/support/pathname_ext'
21
+ require 'outback/errors'
22
+ require 'outback/logging'
19
23
  require 'outback/configuration'
20
- require 'outback/configuration_error'
24
+ require 'outback/archive'
21
25
  require 'outback/source'
26
+ require 'outback/source_archive'
22
27
  require 'outback/directory_source'
23
28
  require 'outback/mysql_source'
24
- require 'outback/archive'
25
- require 'outback/temp_archive'
29
+ require 'outback/processor'
30
+ require 'outback/encryption_processor'
26
31
  require 'outback/target'
32
+ require 'outback/target_archive'
27
33
  require 'outback/directory_target'
28
- require 'outback/directory_archive'
29
34
  require 'outback/s3_target'
30
- require 'outback/s3_archive'
35
+ require 'outback/sftp_target'
31
36
  require 'outback/backup'
32
37
 
33
38
  module Outback
34
- VERSION = Pathname.new(__FILE__).dirname.join('..', 'VERSION').read.strip
39
+ TIME_FORMAT = '%Y%m%d%H%M%S'.freeze
35
40
 
36
41
  class << self
37
42
  %w(verbose silent).each do |method|
@@ -0,0 +1,9 @@
1
+ module Enumerable
2
+ def sum(identity = 0, &block)
3
+ if block_given?
4
+ map(&block).sum(identity)
5
+ else
6
+ inject { |sum, element| sum + element } || identity
7
+ end
8
+ end
9
+ end
@@ -12,4 +12,4 @@ class Object
12
12
  def class_def name, &blk
13
13
  class_eval { define_method name, &blk }
14
14
  end
15
- end
15
+ end
@@ -0,0 +1,28 @@
1
+ module Kernel
2
+ protected
3
+
4
+ def its() It.new end
5
+ alias _its its
6
+ alias _it its
7
+ alias it its # RUBY34: deprecated method
8
+ end
9
+
10
+ class It < BasicObject
11
+
12
+ undef_method(*(instance_methods - [:__id__, :__send__]))
13
+
14
+ def initialize
15
+ @methods = []
16
+ end
17
+
18
+ def method_missing(*args, **kwargs, &block)
19
+ @methods << [args, kwargs, block] unless args == [:respond_to?, :to_proc]
20
+ self
21
+ end
22
+
23
+ def to_proc
24
+ ::Kernel.lambda do |obj|
25
+ @methods.inject(obj) { |current, (args, kwargs, block)| current.send(*args, **kwargs, &block) }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,325 @@
1
+ # coding: ascii-8bit
2
+ # Copyright (C) 2008-2012 TOMITA Masahiro
3
+ # mailto:tommy@tmtm.org
4
+
5
+ #
6
+ class Mysql
7
+ # @!attribute [r] number
8
+ # @private
9
+ # @!attribute [r] name
10
+ # @return [String] charset name
11
+ # @!attribute [r] csname
12
+ # @return [String] collation name
13
+ class Charset
14
+ # @private
15
+ # @param [Integer] number
16
+ # @param [String] name
17
+ # @param [String] csname
18
+ def initialize(number, name, csname)
19
+ @number, @name, @csname = number, name, csname
20
+ @unsafe = false
21
+ end
22
+
23
+ attr_reader :number, :name, :csname
24
+
25
+ # @private
26
+ attr_accessor :unsafe
27
+
28
+ # [[charset_number, charset_name, collation_name, default], ...]
29
+ # @private
30
+ CHARSETS = [
31
+ [ 1, "big5", "big5_chinese_ci", true ],
32
+ [ 2, "latin2", "latin2_czech_cs", false],
33
+ [ 3, "dec8", "dec8_swedish_ci", true ],
34
+ [ 4, "cp850", "cp850_general_ci", true ],
35
+ [ 5, "latin1", "latin1_german1_ci", false],
36
+ [ 6, "hp8", "hp8_english_ci", true ],
37
+ [ 7, "koi8r", "koi8r_general_ci", true ],
38
+ [ 8, "latin1", "latin1_swedish_ci", true ],
39
+ [ 9, "latin2", "latin2_general_ci", true ],
40
+ [ 10, "swe7", "swe7_swedish_ci", true ],
41
+ [ 11, "ascii", "ascii_general_ci", true ],
42
+ [ 12, "ujis", "ujis_japanese_ci", true ],
43
+ [ 13, "sjis", "sjis_japanese_ci", true ],
44
+ [ 14, "cp1251", "cp1251_bulgarian_ci", false],
45
+ [ 15, "latin1", "latin1_danish_ci", false],
46
+ [ 16, "hebrew", "hebrew_general_ci", true ],
47
+ [ 17, "filename", "filename", true ],
48
+ [ 18, "tis620", "tis620_thai_ci", true ],
49
+ [ 19, "euckr", "euckr_korean_ci", true ],
50
+ [ 20, "latin7", "latin7_estonian_cs", false],
51
+ [ 21, "latin2", "latin2_hungarian_ci", false],
52
+ [ 22, "koi8u", "koi8u_general_ci", true ],
53
+ [ 23, "cp1251", "cp1251_ukrainian_ci", false],
54
+ [ 24, "gb2312", "gb2312_chinese_ci", true ],
55
+ [ 25, "greek", "greek_general_ci", true ],
56
+ [ 26, "cp1250", "cp1250_general_ci", true ],
57
+ [ 27, "latin2", "latin2_croatian_ci", false],
58
+ [ 28, "gbk", "gbk_chinese_ci", true ],
59
+ [ 29, "cp1257", "cp1257_lithuanian_ci", false],
60
+ [ 30, "latin5", "latin5_turkish_ci", true ],
61
+ [ 31, "latin1", "latin1_german2_ci", false],
62
+ [ 32, "armscii8", "armscii8_general_ci", true ],
63
+ [ 33, "utf8", "utf8_general_ci", true ],
64
+ [ 34, "cp1250", "cp1250_czech_cs", false],
65
+ [ 35, "ucs2", "ucs2_general_ci", true ],
66
+ [ 36, "cp866", "cp866_general_ci", true ],
67
+ [ 37, "keybcs2", "keybcs2_general_ci", true ],
68
+ [ 38, "macce", "macce_general_ci", true ],
69
+ [ 39, "macroman", "macroman_general_ci", true ],
70
+ [ 40, "cp852", "cp852_general_ci", true ],
71
+ [ 41, "latin7", "latin7_general_ci", true ],
72
+ [ 42, "latin7", "latin7_general_cs", false],
73
+ [ 43, "macce", "macce_bin", false],
74
+ [ 44, "cp1250", "cp1250_croatian_ci", false],
75
+ [ 45, "utf8mb4", "utf8mb4_general_ci", true ],
76
+ [ 46, "utf8mb4", "utf8mb4_bin", false],
77
+ [ 47, "latin1", "latin1_bin", false],
78
+ [ 48, "latin1", "latin1_general_ci", false],
79
+ [ 49, "latin1", "latin1_general_cs", false],
80
+ [ 50, "cp1251", "cp1251_bin", false],
81
+ [ 51, "cp1251", "cp1251_general_ci", true ],
82
+ [ 52, "cp1251", "cp1251_general_cs", false],
83
+ [ 53, "macroman", "macroman_bin", false],
84
+ [ 57, "cp1256", "cp1256_general_ci", true ],
85
+ [ 58, "cp1257", "cp1257_bin", false],
86
+ [ 59, "cp1257", "cp1257_general_ci", true ],
87
+ [ 63, "binary", "binary", true ],
88
+ [ 64, "armscii8", "armscii8_bin", false],
89
+ [ 65, "ascii", "ascii_bin", false],
90
+ [ 66, "cp1250", "cp1250_bin", false],
91
+ [ 67, "cp1256", "cp1256_bin", false],
92
+ [ 68, "cp866", "cp866_bin", false],
93
+ [ 69, "dec8", "dec8_bin", false],
94
+ [ 70, "greek", "greek_bin", false],
95
+ [ 71, "hebrew", "hebrew_bin", false],
96
+ [ 72, "hp8", "hp8_bin", false],
97
+ [ 73, "keybcs2", "keybcs2_bin", false],
98
+ [ 74, "koi8r", "koi8r_bin", false],
99
+ [ 75, "koi8u", "koi8u_bin", false],
100
+ [ 77, "latin2", "latin2_bin", false],
101
+ [ 78, "latin5", "latin5_bin", false],
102
+ [ 79, "latin7", "latin7_bin", false],
103
+ [ 80, "cp850", "cp850_bin", false],
104
+ [ 81, "cp852", "cp852_bin", false],
105
+ [ 82, "swe7", "swe7_bin", false],
106
+ [ 83, "utf8", "utf8_bin", false],
107
+ [ 84, "big5", "big5_bin", false],
108
+ [ 85, "euckr", "euckr_bin", false],
109
+ [ 86, "gb2312", "gb2312_bin", false],
110
+ [ 87, "gbk", "gbk_bin", false],
111
+ [ 88, "sjis", "sjis_bin", false],
112
+ [ 89, "tis620", "tis620_bin", false],
113
+ [ 90, "ucs2", "ucs2_bin", false],
114
+ [ 91, "ujis", "ujis_bin", false],
115
+ [ 92, "geostd8", "geostd8_general_ci", true ],
116
+ [ 93, "geostd8", "geostd8_bin", false],
117
+ [ 94, "latin1", "latin1_spanish_ci", false],
118
+ [ 95, "cp932", "cp932_japanese_ci", true ],
119
+ [ 96, "cp932", "cp932_bin", false],
120
+ [ 97, "eucjpms", "eucjpms_japanese_ci", true ],
121
+ [ 98, "eucjpms", "eucjpms_bin", false],
122
+ [ 99, "cp1250", "cp1250_polish_ci", false],
123
+ [128, "ucs2", "ucs2_unicode_ci", false],
124
+ [129, "ucs2", "ucs2_icelandic_ci", false],
125
+ [130, "ucs2", "ucs2_latvian_ci", false],
126
+ [131, "ucs2", "ucs2_romanian_ci", false],
127
+ [132, "ucs2", "ucs2_slovenian_ci", false],
128
+ [133, "ucs2", "ucs2_polish_ci", false],
129
+ [134, "ucs2", "ucs2_estonian_ci", false],
130
+ [135, "ucs2", "ucs2_spanish_ci", false],
131
+ [136, "ucs2", "ucs2_swedish_ci", false],
132
+ [137, "ucs2", "ucs2_turkish_ci", false],
133
+ [138, "ucs2", "ucs2_czech_ci", false],
134
+ [139, "ucs2", "ucs2_danish_ci", false],
135
+ [140, "ucs2", "ucs2_lithuanian_ci", false],
136
+ [141, "ucs2", "ucs2_slovak_ci", false],
137
+ [142, "ucs2", "ucs2_spanish2_ci", false],
138
+ [143, "ucs2", "ucs2_roman_ci", false],
139
+ [144, "ucs2", "ucs2_persian_ci", false],
140
+ [145, "ucs2", "ucs2_esperanto_ci", false],
141
+ [146, "ucs2", "ucs2_hungarian_ci", false],
142
+ [192, "utf8", "utf8_unicode_ci", false],
143
+ [193, "utf8", "utf8_icelandic_ci", false],
144
+ [194, "utf8", "utf8_latvian_ci", false],
145
+ [195, "utf8", "utf8_romanian_ci", false],
146
+ [196, "utf8", "utf8_slovenian_ci", false],
147
+ [197, "utf8", "utf8_polish_ci", false],
148
+ [198, "utf8", "utf8_estonian_ci", false],
149
+ [199, "utf8", "utf8_spanish_ci", false],
150
+ [200, "utf8", "utf8_swedish_ci", false],
151
+ [201, "utf8", "utf8_turkish_ci", false],
152
+ [202, "utf8", "utf8_czech_ci", false],
153
+ [203, "utf8", "utf8_danish_ci", false],
154
+ [204, "utf8", "utf8_lithuanian_ci", false],
155
+ [205, "utf8", "utf8_slovak_ci", false],
156
+ [206, "utf8", "utf8_spanish2_ci", false],
157
+ [207, "utf8", "utf8_roman_ci", false],
158
+ [208, "utf8", "utf8_persian_ci", false],
159
+ [209, "utf8", "utf8_esperanto_ci", false],
160
+ [210, "utf8", "utf8_hungarian_ci", false],
161
+ [211, "utf8", "utf8_sinhala_ci", false],
162
+ [224, "utf8mb4", "utf8mb4_unicode_ci", false],
163
+ [225, "utf8mb4", "utf8mb4_icelandic_ci", false],
164
+ [226, "utf8mb4", "utf8mb4_latvian_ci", false],
165
+ [227, "utf8mb4", "utf8mb4_romanian_ci", false],
166
+ [228, "utf8mb4", "utf8mb4_slovenian_ci", false],
167
+ [229, "utf8mb4", "utf8mb4_polish_ci", false],
168
+ [230, "utf8mb4", "utf8mb4_estonian_ci", false],
169
+ [231, "utf8mb4", "utf8mb4_spanish_ci", false],
170
+ [232, "utf8mb4", "utf8mb4_swedish_ci", false],
171
+ [233, "utf8mb4", "utf8mb4_turkish_ci", false],
172
+ [234, "utf8mb4", "utf8mb4_czech_ci", false],
173
+ [235, "utf8mb4", "utf8mb4_danish_ci", false],
174
+ [236, "utf8mb4", "utf8mb4_lithuanian_ci", false],
175
+ [237, "utf8mb4", "utf8mb4_slovak_ci", false],
176
+ [238, "utf8mb4", "utf8mb4_spanish2_ci", false],
177
+ [239, "utf8mb4", "utf8mb4_roman_ci", false],
178
+ [240, "utf8mb4", "utf8mb4_persian_ci", false],
179
+ [241, "utf8mb4", "utf8mb4_esperanto_ci", false],
180
+ [242, "utf8mb4", "utf8mb4_hungarian_ci", false],
181
+ [243, "utf8mb4", "utf8mb4_sinhala_ci", false],
182
+ [254, "utf8", "utf8_general_cs", false],
183
+ ]
184
+
185
+ # @private
186
+ UNSAFE_CHARSET = [
187
+ "big5", "sjis", "filename", "gbk", "ucs2", "cp932",
188
+ ]
189
+
190
+ # @private
191
+ NUMBER_TO_CHARSET = {}
192
+ # @private
193
+ COLLATION_TO_CHARSET = {}
194
+ # @private
195
+ CHARSET_DEFAULT = {}
196
+ CHARSETS.each do |number, csname, clname, default|
197
+ cs = Charset.new number, csname, clname
198
+ cs.unsafe = true if UNSAFE_CHARSET.include? csname
199
+ NUMBER_TO_CHARSET[number] = cs
200
+ COLLATION_TO_CHARSET[clname] = cs
201
+ CHARSET_DEFAULT[csname] = cs if default
202
+ end
203
+
204
+ # @private
205
+ BINARY_CHARSET_NUMBER = CHARSET_DEFAULT['binary'].number
206
+
207
+ # @private
208
+ # @param [Integer] n
209
+ # @return [Mysql::Charset]
210
+ def self.by_number(n)
211
+ raise ClientError, "unknown charset number: #{n}" unless NUMBER_TO_CHARSET.key? n
212
+ NUMBER_TO_CHARSET[n]
213
+ end
214
+
215
+ # @private
216
+ # @param [String] str
217
+ # @return [Mysql::Charset]
218
+ def self.by_name(str)
219
+ ret = COLLATION_TO_CHARSET[str] || CHARSET_DEFAULT[str]
220
+ raise ClientError, "unknown charset: #{str}" unless ret
221
+ ret
222
+ end
223
+
224
+ if defined? Encoding
225
+
226
+ # @private
227
+ # MySQL Charset -> Ruby's Encodeing
228
+ CHARSET_ENCODING = {
229
+ "armscii8" => nil,
230
+ "ascii" => Encoding::US_ASCII,
231
+ "big5" => Encoding::Big5,
232
+ "binary" => Encoding::ASCII_8BIT,
233
+ "cp1250" => Encoding::Windows_1250,
234
+ "cp1251" => Encoding::Windows_1251,
235
+ "cp1256" => Encoding::Windows_1256,
236
+ "cp1257" => Encoding::Windows_1257,
237
+ "cp850" => Encoding::CP850,
238
+ "cp852" => Encoding::CP852,
239
+ "cp866" => Encoding::IBM866,
240
+ "cp932" => Encoding::Windows_31J,
241
+ "dec8" => nil,
242
+ "eucjpms" => Encoding::EucJP_ms,
243
+ "euckr" => Encoding::EUC_KR,
244
+ "gb2312" => Encoding::EUC_CN,
245
+ "gbk" => Encoding::GBK,
246
+ "geostd8" => nil,
247
+ "greek" => Encoding::ISO_8859_7,
248
+ "hebrew" => Encoding::ISO_8859_8,
249
+ "hp8" => nil,
250
+ "keybcs2" => nil,
251
+ "koi8r" => Encoding::KOI8_R,
252
+ "koi8u" => Encoding::KOI8_U,
253
+ "latin1" => Encoding::ISO_8859_1,
254
+ "latin2" => Encoding::ISO_8859_2,
255
+ "latin5" => Encoding::ISO_8859_9,
256
+ "latin7" => Encoding::ISO_8859_13,
257
+ "macce" => Encoding::MacCentEuro,
258
+ "macroman" => Encoding::MacRoman,
259
+ "sjis" => Encoding::SHIFT_JIS,
260
+ "swe7" => nil,
261
+ "tis620" => Encoding::TIS_620,
262
+ "ucs2" => Encoding::UTF_16BE,
263
+ "ujis" => Encoding::EucJP_ms,
264
+ "utf8" => Encoding::UTF_8,
265
+ "utf8mb4" => Encoding::UTF_8,
266
+ }
267
+
268
+ # @private
269
+ # @param [String] value
270
+ # @return [String]
271
+ def self.to_binary(value)
272
+ value.force_encoding Encoding::ASCII_8BIT
273
+ end
274
+
275
+ # @private
276
+ # convert raw to encoding and convert to Encoding.default_internal
277
+ # @param [String] raw
278
+ # @param [Encoding] encoding
279
+ # @return [String] result
280
+ def self.convert_encoding(raw, encoding)
281
+ raw.force_encoding(encoding).encode
282
+ end
283
+
284
+ # @private
285
+ # retrun corresponding Ruby encoding
286
+ # @return [Encoding] encoding
287
+ def encoding
288
+ enc = CHARSET_ENCODING[@name.downcase]
289
+ raise Mysql::ClientError, "unsupported charset: #{@name}" unless enc
290
+ enc
291
+ end
292
+
293
+ # @private
294
+ # convert encoding to corrensponding to MySQL charset
295
+ # @param [String] value
296
+ # @return [String]
297
+ def convert(value)
298
+ if value.is_a? String and value.encoding != Encoding::ASCII_8BIT
299
+ value = value.encode encoding
300
+ end
301
+ value
302
+ end
303
+
304
+ else
305
+ # for Ruby 1.8
306
+
307
+ def self.to_binary(value)
308
+ value
309
+ end
310
+
311
+ def self.convert_encoding(raw, encoding)
312
+ raw
313
+ end
314
+
315
+ def encoding
316
+ nil
317
+ end
318
+
319
+ def convert(value)
320
+ value
321
+ end
322
+
323
+ end
324
+ end
325
+ end