og 0.27.0 → 0.28.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/ProjectInfo +2 -2
- data/README +8 -4
- data/Rakefile +1 -1
- data/doc/AUTHORS +1 -1
- data/doc/RELEASES +81 -0
- data/examples/README +7 -0
- data/lib/glue/cacheable.rb +152 -0
- data/lib/glue/hierarchical.rb +5 -4
- data/lib/glue/optimistic_locking.rb +0 -1
- data/lib/glue/orderable.rb +46 -44
- data/lib/glue/taggable.rb +7 -4
- data/lib/glue/timestamped.rb +1 -1
- data/lib/og.rb +13 -6
- data/lib/og/entity.rb +226 -9
- data/lib/og/evolution.rb +2 -2
- data/lib/og/ez/clause.rb +147 -0
- data/lib/og/ez/condition.rb +181 -0
- data/lib/og/manager.rb +31 -30
- data/lib/og/relation.rb +5 -5
- data/lib/og/relation/has_many.rb +3 -1
- data/lib/og/relation/joins_many.rb +1 -1
- data/lib/og/store.rb +6 -3
- data/lib/og/store/kirby.rb +3 -5
- data/lib/og/store/mysql.rb +0 -1
- data/lib/og/store/sql.rb +43 -7
- data/lib/og/store/sqlite.rb +97 -11
- data/lib/og/store/sqlite2.rb +231 -0
- data/lib/og/test/testcase.rb +1 -1
- data/lib/og/vendor/mysql.rb +103 -25
- data/test/glue/tc_revisable.rb +11 -11
- data/test/og/CONFIG.rb +20 -8
- data/test/og/mixin/tc_hierarchical.rb +5 -3
- data/test/og/mixin/tc_optimistic_locking.rb +6 -4
- data/test/og/mixin/tc_orderable.rb +22 -22
- data/test/og/mixin/tc_taggable.rb +15 -11
- data/test/og/mixin/tc_timestamped.rb +4 -2
- data/test/og/multi_validations_model.rb +8 -0
- data/test/og/store/tc_filesys.rb +15 -12
- data/test/og/store/tc_kirby.rb +14 -11
- data/test/og/tc_accumulator.rb +1 -3
- data/test/og/tc_cacheable.rb +58 -0
- data/test/og/tc_delete_all.rb +13 -16
- data/test/og/tc_ez.rb +33 -0
- data/test/og/tc_finder.rb +2 -4
- data/test/og/tc_inheritance.rb +3 -3
- data/test/og/tc_inheritance2.rb +2 -3
- data/test/og/tc_join.rb +3 -2
- data/test/og/tc_multi_validations.rb +3 -3
- data/test/og/tc_multiple.rb +3 -6
- data/test/og/tc_override.rb +19 -13
- data/test/og/tc_polymorphic.rb +1 -3
- data/test/og/tc_resolve.rb +32 -0
- data/test/og/tc_reverse.rb +27 -28
- data/test/og/tc_scoped.rb +2 -4
- data/test/og/tc_select.rb +1 -3
- data/test/og/tc_store.rb +3 -8
- data/test/og/tc_validation.rb +2 -2
- data/test/og/tc_validation2.rb +56 -58
- data/test/og/tc_validation_loop.rb +2 -5
- metadata +15 -7
- data/lib/og/vendor/mysql411.rb +0 -306
data/test/og/tc_select.rb
CHANGED
data/test/og/tc_store.rb
CHANGED
@@ -66,18 +66,13 @@ class TCOgStore < Test::Unit::TestCase # :nodoc: all
|
|
66
66
|
many_to_many Bugger
|
67
67
|
end
|
68
68
|
|
69
|
+
$og1.manage_classes(User, Category, Article, NewArticle, Comment, Bugger)
|
70
|
+
|
69
71
|
def setup
|
70
|
-
@og =
|
71
|
-
end
|
72
|
-
|
73
|
-
def teardown
|
74
|
-
@og.store.close
|
75
|
-
@og.store.class.destroy(@og.options)
|
76
|
-
@og = nil
|
72
|
+
@og = $og1
|
77
73
|
end
|
78
74
|
|
79
75
|
def test_og
|
80
|
-
@og = Og.setup($og_config)
|
81
76
|
features_test
|
82
77
|
# conversions_test
|
83
78
|
end
|
data/test/og/tc_validation.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
2
|
|
3
|
-
$DBG = true
|
3
|
+
# $DBG = true
|
4
4
|
require 'rubygems'
|
5
5
|
require 'facets'
|
6
6
|
|
@@ -18,7 +18,7 @@ class TC_ValidateUnique < Test::Unit::TestCase # :nodoc: all
|
|
18
18
|
validate_unique :app_name
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
$og1.manage_class Framework
|
22
22
|
|
23
23
|
def setup
|
24
24
|
@framework = Framework.new
|
data/test/og/tc_validation2.rb
CHANGED
@@ -1,81 +1,79 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
$: << path + '/glue/lib'
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
|
+
|
4
3
|
require 'test/unit'
|
5
4
|
require 'og'
|
6
5
|
|
7
6
|
module UnitTestClasses
|
8
|
-
class NoValidation
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
class NoValidation
|
8
|
+
property :prop, String
|
9
|
+
|
10
|
+
def initialize(prop)
|
11
|
+
@prop = prop
|
12
|
+
end
|
13
13
|
end
|
14
|
-
end
|
15
14
|
|
16
|
-
class UniqueValidation < NoValidation
|
17
|
-
|
18
|
-
|
19
|
-
end
|
15
|
+
class UniqueValidation < NoValidation
|
16
|
+
property :slop, String
|
17
|
+
validate_unique :prop, :slop
|
18
|
+
end
|
20
19
|
|
21
|
-
class ValueValidation < NoValidation
|
22
|
-
|
23
|
-
end
|
20
|
+
class ValueValidation < NoValidation
|
21
|
+
validate_value :prop
|
22
|
+
end
|
24
23
|
|
25
|
-
class ConfirmValidation < NoValidation
|
26
|
-
|
27
|
-
end
|
24
|
+
class ConfirmValidation < NoValidation
|
25
|
+
validate_confirmation :prop
|
26
|
+
end
|
28
27
|
|
29
|
-
class FormatValidation < NoValidation
|
30
|
-
|
31
|
-
end
|
28
|
+
class FormatValidation < NoValidation
|
29
|
+
validate_format :prop, :format => /^\w\d\w-\d\w\d$/
|
30
|
+
end
|
32
31
|
|
33
|
-
class MinValidation < NoValidation
|
34
|
-
|
35
|
-
end
|
32
|
+
class MinValidation < NoValidation
|
33
|
+
validate_length :prop, :min => 4
|
34
|
+
end
|
36
35
|
|
37
|
-
class MaxValidation < NoValidation
|
38
|
-
|
39
|
-
end
|
36
|
+
class MaxValidation < NoValidation
|
37
|
+
validate_length :prop, :max => 8
|
38
|
+
end
|
40
39
|
|
41
|
-
class RangeValidation < NoValidation
|
42
|
-
|
43
|
-
end
|
40
|
+
class RangeValidation < NoValidation
|
41
|
+
validate_length :prop, :range => 10..20
|
42
|
+
end
|
44
43
|
|
45
|
-
class LengthValidation < NoValidation
|
46
|
-
|
47
|
-
end
|
44
|
+
class LengthValidation < NoValidation
|
45
|
+
validate_length :prop, :length => 8
|
46
|
+
end
|
48
47
|
|
49
|
-
class InclusionValidation < NoValidation
|
50
|
-
|
51
|
-
end
|
48
|
+
class InclusionValidation < NoValidation
|
49
|
+
validate_inclusion :prop, :in => %w{ Male Female }
|
50
|
+
end
|
52
51
|
|
53
|
-
class NumericValidation < NoValidation
|
54
|
-
|
55
|
-
|
52
|
+
class NumericValidation < NoValidation
|
53
|
+
property :prop, Fixnum
|
54
|
+
validate_numeric :prop, :integer => true
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
end
|
56
|
+
prop_accessor :prop2, Float
|
57
|
+
validate_numeric :prop2
|
58
|
+
end
|
60
59
|
|
61
|
-
class RelatedClass
|
62
|
-
|
63
|
-
|
64
|
-
end
|
60
|
+
class RelatedClass
|
61
|
+
prop_accessor :test, String
|
62
|
+
belongs_to :relation_validation, RelationValidation
|
63
|
+
end
|
65
64
|
|
66
|
-
class RelationValidation < NoValidation
|
67
|
-
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
65
|
+
class RelationValidation < NoValidation
|
66
|
+
has_many :relations, RelatedClass
|
67
|
+
validate_related :relations
|
68
|
+
end
|
71
69
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
$og1.manage_classes(NoValidation, UniqueValidation, ValueValidation,
|
71
|
+
ConfirmValidation, FormatValidation, MinValidation,
|
72
|
+
MaxValidation, RangeValidation, LengthValidation,
|
73
|
+
InclusionValidation, NumericValidation, RelatedClass,
|
74
|
+
RelationValidation)
|
77
75
|
|
78
|
-
|
76
|
+
end
|
79
77
|
|
80
78
|
module Test::Unit::Assertions
|
81
79
|
# Assert than an Og object is successfully saved and is error free.
|
@@ -1,3 +1,4 @@
|
|
1
|
+
=begin
|
1
2
|
require 'test/unit'
|
2
3
|
|
3
4
|
require 'rubygems'
|
@@ -10,8 +11,6 @@ class ManagedClass
|
|
10
11
|
validate_unique :thing
|
11
12
|
end
|
12
13
|
|
13
|
-
Og.start
|
14
|
-
|
15
14
|
class TC_Loop < Test::Unit::TestCase
|
16
15
|
def setup
|
17
16
|
@thing_1 = ManagedClass.new
|
@@ -28,9 +27,7 @@ class TC_Loop < Test::Unit::TestCase
|
|
28
27
|
# }
|
29
28
|
end
|
30
29
|
|
31
|
-
def teardown
|
32
|
-
ManagedClass.all.each { |i| i.delete }
|
33
|
-
end
|
34
30
|
end
|
35
31
|
|
36
32
|
# * Bryan Soto <bryan.a.soto@gmail.com>
|
33
|
+
=end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: og
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.28.0
|
7
|
+
date: 2006-02-06 00:00:00 +02:00
|
8
8
|
summary: State of the art object-relational mapping system.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -15,7 +15,7 @@ description:
|
|
15
15
|
autorequire:
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
18
|
-
has_rdoc:
|
18
|
+
has_rdoc: false
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">"
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/og/errors.rb
|
64
64
|
- lib/og/entity.rb
|
65
65
|
- lib/og/collection.rb
|
66
|
+
- lib/og/ez
|
66
67
|
- lib/og/markers.rb
|
67
68
|
- lib/og/relation/many_to_many.rb
|
68
69
|
- lib/og/relation/refers_to.rb
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- lib/og/relation/belongs_to.rb
|
73
74
|
- lib/og/relation/all.rb
|
74
75
|
- lib/og/store/alpha
|
76
|
+
- lib/og/store/sqlite2.rb
|
75
77
|
- lib/og/store/sqlite.rb
|
76
78
|
- lib/og/store/sql.rb
|
77
79
|
- lib/og/store/psql.rb
|
@@ -83,9 +85,10 @@ files:
|
|
83
85
|
- lib/og/store/alpha/filesys.rb
|
84
86
|
- lib/og/test/testcase.rb
|
85
87
|
- lib/og/test/assertions.rb
|
86
|
-
- lib/og/vendor/mysql411.rb
|
87
88
|
- lib/og/vendor/mysql.rb
|
88
89
|
- lib/og/vendor/README
|
90
|
+
- lib/og/ez/clause.rb
|
91
|
+
- lib/og/ez/condition.rb
|
89
92
|
- lib/glue/taggable.rb
|
90
93
|
- lib/glue/tree.rb
|
91
94
|
- lib/glue/hierarchical.rb
|
@@ -94,6 +97,7 @@ files:
|
|
94
97
|
- lib/glue/orderable.rb
|
95
98
|
- lib/glue/optimistic_locking.rb
|
96
99
|
- lib/glue/searchable.rb
|
100
|
+
- lib/glue/cacheable.rb
|
97
101
|
- test/og
|
98
102
|
- test/glue
|
99
103
|
- test/og/mixin
|
@@ -108,7 +112,7 @@ files:
|
|
108
112
|
- test/og/tc_polymorphic.rb
|
109
113
|
- test/og/tc_multiple.rb
|
110
114
|
- test/og/tc_join.rb
|
111
|
-
- test/og/
|
115
|
+
- test/og/tc_resolve.rb
|
112
116
|
- test/og/tc_inheritance.rb
|
113
117
|
- test/og/CONFIG.rb
|
114
118
|
- test/og/tc_scoped.rb
|
@@ -116,8 +120,12 @@ files:
|
|
116
120
|
- test/og/tc_validation.rb
|
117
121
|
- test/og/tc_accumulator.rb
|
118
122
|
- test/og/tc_inheritance2.rb
|
119
|
-
- test/og/
|
123
|
+
- test/og/tc_validation2.rb
|
120
124
|
- test/og/tc_validation_loop.rb
|
125
|
+
- test/og/tc_cacheable.rb
|
126
|
+
- test/og/tc_multi_validations.rb
|
127
|
+
- test/og/multi_validations_model.rb
|
128
|
+
- test/og/tc_ez.rb
|
121
129
|
- test/og/mixin/tc_timestamped.rb
|
122
130
|
- test/og/mixin/tc_taggable.rb
|
123
131
|
- test/og/mixin/tc_orderable.rb
|
@@ -146,5 +154,5 @@ dependencies:
|
|
146
154
|
requirements:
|
147
155
|
- - "="
|
148
156
|
- !ruby/object:Gem::Version
|
149
|
-
version: 0.
|
157
|
+
version: 0.28.0
|
150
158
|
version:
|
data/lib/og/vendor/mysql411.rb
DELETED
@@ -1,306 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# mysq411.rb - 0.1 - Matt Mower <self@mattmower.com>
|
3
|
-
#
|
4
|
-
# The native Ruby MySQL client (mysql.rb) by Tomita Masahiro does not (yet) handle the new MySQL
|
5
|
-
# protocol introduced in MySQL 4.1.1. This protocol introduces a new authentication scheme as
|
6
|
-
# well as modifications to the client/server exchanges themselves.
|
7
|
-
#
|
8
|
-
# mysql411.rb modifies the Mysql class to add MySQL 4.1.x support. It modifies the connection
|
9
|
-
# algorithm to detect a 4.1.1 server and respond with the new authentication scheme, otherwise using
|
10
|
-
# the original one. Similarly for the changes to packet structures and field definitions, etc...
|
11
|
-
#
|
12
|
-
# It redefines serveral methods which behave differently depending upon the server context. The
|
13
|
-
# way I have implemented this is to alias the old method, create a new alternative method, and redefine
|
14
|
-
# the original method as a selector which calls the appropriate method based upon the server version.
|
15
|
-
# There may have been a neater way to do this.
|
16
|
-
#
|
17
|
-
# In general I've tried not to change the original code any more than necessary, i.e. even where I
|
18
|
-
# redefine a method I have made the smallest number of changes possible, rather than rewriting from
|
19
|
-
# scratch.
|
20
|
-
#
|
21
|
-
# *Caveat Lector* This code passes all current ActiveRecord unit tests however this is no guarantee that
|
22
|
-
# full & correct MySQL 4.1 support has been achieved.
|
23
|
-
#
|
24
|
-
|
25
|
-
require 'digest/sha1'
|
26
|
-
|
27
|
-
#
|
28
|
-
# Extend the Mysql class to work with MySQL 4.1.1+ servers. After version
|
29
|
-
# 4.1.1 the password hashing function (and some other connection details) have
|
30
|
-
# changed rendering the previous Mysql class unable to connect:
|
31
|
-
#
|
32
|
-
#
|
33
|
-
|
34
|
-
class Mysql
|
35
|
-
CLIENT_PROTOCOL_41 = 512
|
36
|
-
CLIENT_SECURE_CONNECTION = 32768
|
37
|
-
|
38
|
-
def real_connect( host=nil, user=nil, passwd=nil, db=nil, port=nil, socket=nil, flag=nil )
|
39
|
-
@server_status = SERVER_STATUS_AUTOCOMMIT
|
40
|
-
|
41
|
-
if( host == nil || host == "localhost" ) && defined? UNIXSocket
|
42
|
-
unix_socket = socket || ENV["MYSQL_UNIX_PORT"] || MYSQL_UNIX_ADDR
|
43
|
-
sock = UNIXSocket::new( unix_socket )
|
44
|
-
@host_info = Error::err( Error::CR_LOCALHOST_CONNECTION )
|
45
|
-
@unix_socket = unix_socket
|
46
|
-
else
|
47
|
-
sock = TCPSocket::new(host, port||ENV["MYSQL_TCP_PORT"]||(Socket::getservbyname("mysql","tcp") rescue MYSQL_PORT))
|
48
|
-
@host_info = sprintf Error::err(Error::CR_TCP_CONNECTION), host
|
49
|
-
end
|
50
|
-
|
51
|
-
@host = host ? host.dup : nil
|
52
|
-
sock.setsockopt Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true
|
53
|
-
@net = Net::new sock
|
54
|
-
|
55
|
-
a = read
|
56
|
-
|
57
|
-
@protocol_version = a.slice!(0)
|
58
|
-
@server_version, a = a.split(/\0/,2)
|
59
|
-
|
60
|
-
# Store the version number components for speedy comparison
|
61
|
-
version, ostag = @server_version.split( /-/, 2 )
|
62
|
-
@major_ver, @minor_ver, @revision_num = version.split( /\./ ).map { |v| v.to_i }
|
63
|
-
|
64
|
-
@thread_id, @scramble_buff = a.slice!(0,13).unpack("La8")
|
65
|
-
if a.size >= 2 then
|
66
|
-
@server_capabilities, = a.slice!(0,2).unpack("v")
|
67
|
-
end
|
68
|
-
if a.size >= 16 then
|
69
|
-
@server_language, @server_status = a.unpack("cv")
|
70
|
-
end
|
71
|
-
|
72
|
-
# Set the flags we'll send back to the server
|
73
|
-
flag = 0 if flag == nil
|
74
|
-
flag |= @client_flag | CLIENT_CAPABILITIES
|
75
|
-
flag |= CLIENT_CONNECT_WITH_DB if db
|
76
|
-
|
77
|
-
if version_meets_minimum?( 4, 1, 1 )
|
78
|
-
# In 4.1.1+ the seed comes in two parts which must be combined
|
79
|
-
a.slice!( 0, 16 )
|
80
|
-
seed_part_2 = a.slice!( 0, 12 );
|
81
|
-
@scramble_buff << seed_part_2
|
82
|
-
|
83
|
-
flag |= CLIENT_FOUND_ROWS
|
84
|
-
flag |= CLIENT_PROTOCOL_41
|
85
|
-
flag |= CLIENT_SECURE_CONNECTION if @server_capabilities & CLIENT_SECURE_CONNECTION;
|
86
|
-
|
87
|
-
if db && @server_capabilities & CLIENT_CONNECT_WITH_DB != 0
|
88
|
-
@db = db.dup
|
89
|
-
end
|
90
|
-
|
91
|
-
scrambled_password = scramble411( passwd, @scramble_buff, @protocol_version==9 )
|
92
|
-
data = make_client_auth_packet_41( flag, user, scrambled_password, db )
|
93
|
-
else
|
94
|
-
scrambled_password = scramble( passwd, @scramble_buff, @protocol_version == 9 )
|
95
|
-
data = Net::int2str(flag)+Net::int3str(@max_allowed_packet)+(user||"")+"\0"+scrambled_password
|
96
|
-
if db and @server_capabilities & CLIENT_CONNECT_WITH_DB != 0 then
|
97
|
-
data << "\0"+db
|
98
|
-
@db = db.dup
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
write data
|
103
|
-
read
|
104
|
-
self
|
105
|
-
end
|
106
|
-
alias :connect :real_connect
|
107
|
-
|
108
|
-
# Pack the authentication information into depending upon whether an initial database has
|
109
|
-
# been specified
|
110
|
-
def make_client_auth_packet_41( flag, user, password, db )
|
111
|
-
if db && @server_capabilities & CLIENT_CONNECT_WITH_DB != 0
|
112
|
-
template = "VVcx23a#{user.size+1}cA#{password.size}a#{db.size+1}"
|
113
|
-
else
|
114
|
-
template = "VVcx23a#{user.size+1}cA#{password.size}x"
|
115
|
-
end
|
116
|
-
|
117
|
-
[ flag, @max_allowed_packet, @server_language, user, password.size, password, db ].pack( template )
|
118
|
-
end
|
119
|
-
|
120
|
-
def version_meets_minimum?( major, minor, revision )
|
121
|
-
@major_ver >= major && @minor_ver >= minor && @revision_num >= revision
|
122
|
-
end
|
123
|
-
|
124
|
-
# SERVER: public_seed=create_random_string()
|
125
|
-
# send(public_seed)
|
126
|
-
#
|
127
|
-
# CLIENT: recv(public_seed)
|
128
|
-
# hash_stage1=sha1("password")
|
129
|
-
# hash_stage2=sha1(hash_stage1)
|
130
|
-
# reply=xor(hash_stage1, sha1(public_seed,hash_stage2)
|
131
|
-
#
|
132
|
-
# #this three steps are done in scramble()
|
133
|
-
#
|
134
|
-
# send(reply)
|
135
|
-
#
|
136
|
-
#
|
137
|
-
# SERVER: recv(reply)
|
138
|
-
# hash_stage1=xor(reply, sha1(public_seed,hash_stage2))
|
139
|
-
# candidate_hash2=sha1(hash_stage1)
|
140
|
-
# check(candidate_hash2==hash_stage2)
|
141
|
-
def scramble411( password, seed, old_ver )
|
142
|
-
return "" if password == nil or password == ""
|
143
|
-
raise "old version password is not implemented" if old_ver
|
144
|
-
|
145
|
-
# print "Seed Bytes = "
|
146
|
-
# seed.each_byte { |b| print "0x#{b.to_s( 16 )}, " }
|
147
|
-
# puts
|
148
|
-
|
149
|
-
stage1 = Digest::SHA1.digest( password )
|
150
|
-
stage2 = Digest::SHA1.digest( stage1 )
|
151
|
-
|
152
|
-
dgst = Digest::SHA1.new
|
153
|
-
dgst << seed
|
154
|
-
dgst << stage2
|
155
|
-
stage3 = dgst.digest
|
156
|
-
|
157
|
-
# stage1.zip( stage3 ).map { |a, b| (a ^ b).chr }.join
|
158
|
-
scrambled = ( 0 ... stage3.size ).map { |i| stage3[i] ^ stage1[i] }
|
159
|
-
scrambled = scrambled.map { |x| x.chr }
|
160
|
-
scrambled.join
|
161
|
-
end
|
162
|
-
|
163
|
-
def change_user(user="", passwd="", db="")
|
164
|
-
scrambled_password = version_meets_minimum?( 4, 1, 1 ) ? scramble411( passwd, @scramble_buff, @protocol_version==9 ) : scramble( passwd, @scramble_buff, @protocol_version==9 )
|
165
|
-
data = user+"\0"+scrambled_password+"\0"+db
|
166
|
-
command COM_CHANGE_USER, data
|
167
|
-
@user = user
|
168
|
-
@passwd = passwd
|
169
|
-
@db = db
|
170
|
-
end
|
171
|
-
|
172
|
-
#
|
173
|
-
# The 4.1 protocol changed the length of the END packet
|
174
|
-
#
|
175
|
-
alias_method :old_read_one_row, :read_one_row
|
176
|
-
|
177
|
-
def read_one_row( field_count )
|
178
|
-
if version_meets_minimum?( 4, 1, 1 )
|
179
|
-
read_one_row_41( field_count )
|
180
|
-
else
|
181
|
-
old_read_one_row( field_count )
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def read_one_row_41( field_count )
|
186
|
-
data = read
|
187
|
-
return if data[0] == 254 and data.length < 9
|
188
|
-
rec = []
|
189
|
-
field_count.times do
|
190
|
-
len = get_length data
|
191
|
-
if len == nil then
|
192
|
-
rec << len
|
193
|
-
else
|
194
|
-
rec << data.slice!(0,len)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
rec
|
198
|
-
end
|
199
|
-
|
200
|
-
#
|
201
|
-
# The 4.1 protocol changed the length of the END packet
|
202
|
-
#
|
203
|
-
alias_method :old_skip_result, :skip_result
|
204
|
-
|
205
|
-
def skip_result
|
206
|
-
if version_meets_minimum?( 4, 1, 1 )
|
207
|
-
skip_result_41
|
208
|
-
else
|
209
|
-
old_skip_result
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
def skip_result_41()
|
214
|
-
if @status == :STATUS_USE_RESULT then
|
215
|
-
loop do
|
216
|
-
data = read
|
217
|
-
break if data[0] == 254 and data.length == 1
|
218
|
-
end
|
219
|
-
@status = :STATUS_READY
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
# The field description structure is changed for the 4.1 protocol passing
|
224
|
-
# more data and a different packing form. NOTE: The 4.1 protocol now passes
|
225
|
-
# back a "catalog" name for each field which is a new feature. Since AR has
|
226
|
-
# nowhere to put it I'm throwing it away. Possibly this is not the best
|
227
|
-
# idea?
|
228
|
-
#
|
229
|
-
alias_method :old_unpack_fields, :unpack_fields
|
230
|
-
|
231
|
-
def unpack_fields( data, long_flag_protocol )
|
232
|
-
if version_meets_minimum?( 4, 1, 1 )
|
233
|
-
unpack_fields_41( data, long_flag_protocol )
|
234
|
-
else
|
235
|
-
old_unpack_fields( data, long_flag_protocol )
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
def unpack_fields_41( data, long_flag_protocol )
|
240
|
-
ret = []
|
241
|
-
|
242
|
-
data.each do |f|
|
243
|
-
catalog_name = f[0]
|
244
|
-
database_name = f[1]
|
245
|
-
table_name_alias = f[2]
|
246
|
-
table_name = f[3]
|
247
|
-
column_name_alias = f[4]
|
248
|
-
column_name = f[5]
|
249
|
-
|
250
|
-
charset = f[6][0] + f[6][1]*256
|
251
|
-
length = f[6][2] + f[6][3]*256 + f[6][4]*256*256 + f[6][5]*256*256*256
|
252
|
-
type = f[6][6]
|
253
|
-
flags = f[6][7] + f[6][8]*256
|
254
|
-
decimals = f[6][9]
|
255
|
-
def_value = f[7]
|
256
|
-
max_length = 0
|
257
|
-
|
258
|
-
ret << Field::new(table_name, table_name, column_name_alias, length, type, flags, decimals, def_value, max_length)
|
259
|
-
end
|
260
|
-
ret
|
261
|
-
end
|
262
|
-
|
263
|
-
# In this instance the read_query_result method in mysql is bound to read 5 field parameters which
|
264
|
-
# is expanded to 7 in the 4.1 protocol. So in this case we redefine this entire method in order
|
265
|
-
# to write "read_rows 7" instead of "read_rows 5"!
|
266
|
-
#
|
267
|
-
alias_method :old_read_query_result, :read_query_result
|
268
|
-
|
269
|
-
def read_query_result
|
270
|
-
if version_meets_minimum?( 4, 1, 1 )
|
271
|
-
read_query_result_41
|
272
|
-
else
|
273
|
-
old_read_query_result
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def read_query_result_41
|
278
|
-
data = read
|
279
|
-
@field_count = get_length(data)
|
280
|
-
if @field_count == nil then # LOAD DATA LOCAL INFILE
|
281
|
-
File::open(data) do |f|
|
282
|
-
write f.read
|
283
|
-
end
|
284
|
-
write "" # mark EOF
|
285
|
-
data = read
|
286
|
-
@field_count = get_length(data)
|
287
|
-
end
|
288
|
-
if @field_count == 0 then
|
289
|
-
@affected_rows = get_length(data, true)
|
290
|
-
@insert_id = get_length(data, true)
|
291
|
-
if @server_capabilities & CLIENT_TRANSACTIONS != 0 then
|
292
|
-
a = data.slice!(0,2)
|
293
|
-
@server_status = a[0]+a[1]*256
|
294
|
-
end
|
295
|
-
if data.size > 0 and get_length(data) then
|
296
|
-
@info = data
|
297
|
-
end
|
298
|
-
else
|
299
|
-
@extra_info = get_length(data, true)
|
300
|
-
fields = read_rows 7
|
301
|
-
@fields = unpack_fields(fields, @server_capabilities & CLIENT_LONG_FLAG != 0)
|
302
|
-
@status = :STATUS_GET_RESULT
|
303
|
-
end
|
304
|
-
self
|
305
|
-
end
|
306
|
-
end
|