knjrbfw 0.0.7 → 0.0.8
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/Gemfile +3 -1
- data/VERSION +1 -1
- data/knjrbfw.gemspec +14 -4
- data/lib/knj/amixer.rb +148 -0
- data/lib/knj/arrayext.rb +14 -5
- data/lib/knj/autoload.rb +63 -57
- data/lib/knj/autoload/backups/facets_dictionary.rb +2 -2
- data/lib/knj/autoload/erubis.rb +2 -0
- data/lib/knj/cmd_gen.rb +71 -0
- data/lib/knj/compiler.rb +2 -2
- data/lib/knj/datarow.rb +138 -38
- data/lib/knj/datestamp.rb +2 -2
- data/lib/knj/datet.rb +72 -17
- data/lib/knj/erb/include.rb +5 -5
- data/lib/knj/errors.rb +4 -1
- data/lib/knj/eruby.rb +25 -11
- data/lib/knj/event_filemod.rb +27 -26
- data/lib/knj/event_handler.rb +8 -8
- data/lib/knj/exchangerates.rb +1 -1
- data/lib/knj/facebook_connect.rb +37 -0
- data/lib/knj/gettext_threadded.rb +4 -3
- data/lib/knj/google_sitemap.rb +1 -1
- data/lib/knj/hash_methods.rb +1 -1
- data/lib/knj/http.rb +35 -19
- data/lib/knj/http2.rb +249 -0
- data/lib/knj/image.rb +128 -0
- data/lib/knj/jruby-gtk2/gtk2.rb +1 -1
- data/lib/knj/knj.rb +1 -1
- data/lib/knj/knj_controller.rb +0 -2
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +3 -3
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -11
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +2 -2
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +71 -14
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +17 -14
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +5 -5
- data/lib/knj/knjdb/libknjdb.rb +33 -16
- data/lib/knj/knjdb/libknjdb_row.rb +8 -8
- data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +1 -1
- data/lib/knj/mount.rb +6 -6
- data/lib/knj/mutexcl.rb +2 -2
- data/lib/knj/objects.rb +286 -73
- data/lib/knj/opts.rb +11 -4
- data/lib/knj/os.rb +16 -3
- data/lib/knj/php.rb +73 -26
- data/lib/knj/php_parser/php_parser.rb +1 -77
- data/lib/knj/retry.rb +4 -4
- data/lib/knj/rhodes/rhodes.rb +106 -0
- data/lib/knj/sshrobot/sshrobot.rb +1 -1
- data/lib/knj/strings.rb +72 -0
- data/lib/knj/sysuser.rb +1 -1
- data/lib/knj/tests/test_http2.rb +18 -0
- data/lib/knj/thread.rb +1 -5
- data/lib/knj/thread2.rb +3 -3
- data/lib/knj/threadhandler.rb +2 -2
- data/lib/knj/threadpool.rb +4 -4
- data/lib/knj/translations.rb +2 -17
- data/lib/knj/unix_proc.rb +3 -3
- data/lib/knj/web.rb +156 -77
- data/lib/knj/webscripts/image.rhtml +22 -3
- data/lib/knj/x11vnc.rb +3 -3
- data/spec/amixer_spec.rb +27 -0
- data/spec/knjrbfw_spec.rb +70 -12
- data/testfiles/image.jpg +0 -0
- metadata +32 -14
- data/Gemfile.lock +0 -32
data/lib/knj/http2.rb
ADDED
@@ -0,0 +1,249 @@
|
|
1
|
+
class Knj::Http2
|
2
|
+
attr_reader :cookies
|
3
|
+
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
@cookies = {}
|
7
|
+
@debug = @args[:debug]
|
8
|
+
|
9
|
+
if !@args[:port]
|
10
|
+
if @args[:ssl]
|
11
|
+
@args[:port] = 443
|
12
|
+
else
|
13
|
+
@args[:port] = 80
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if @args[:nl]
|
18
|
+
@nl = @args[:nl]
|
19
|
+
else
|
20
|
+
@nl = "\r\n"
|
21
|
+
end
|
22
|
+
|
23
|
+
if @args[:user_agent]
|
24
|
+
@uagent = @args[:user_agent]
|
25
|
+
else
|
26
|
+
@uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
|
27
|
+
end
|
28
|
+
|
29
|
+
raise "No host was given." if !@args[:host]
|
30
|
+
|
31
|
+
@sock_plain = TCPSocket.new(@args[:host], @args[:port])
|
32
|
+
|
33
|
+
if @args[:ssl]
|
34
|
+
require "openssl"
|
35
|
+
|
36
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
37
|
+
#ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
38
|
+
#ssl_context.ca_file = CA_FILE
|
39
|
+
|
40
|
+
@sock_ssl = OpenSSL::SSL::SSLSocket.new(@sock_plain, ssl_context)
|
41
|
+
@sock_ssl.sync_close = true
|
42
|
+
@sock_ssl.connect
|
43
|
+
|
44
|
+
@sock = @sock_ssl
|
45
|
+
else
|
46
|
+
@sock = @sock_plain
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get(addr)
|
51
|
+
header_str = "GET /#{addr} HTTP/1.1#{@nl}"
|
52
|
+
header_str += self.header_str(
|
53
|
+
"Host" => @args[:host],
|
54
|
+
"Connection" => "Keep-Alive",
|
55
|
+
"User-Agent" => @uagent
|
56
|
+
)
|
57
|
+
header_str += "#{@nl}"
|
58
|
+
|
59
|
+
@sock.puts(header_str)
|
60
|
+
return self.read_response
|
61
|
+
end
|
62
|
+
|
63
|
+
def post(addr, pdata = {})
|
64
|
+
praw = ""
|
65
|
+
pdata.each do |key, val|
|
66
|
+
praw += "&" if praw != ""
|
67
|
+
praw += "#{Knj::Web.urlenc(key)}=#{Knj::Web.urlenc(val)}"
|
68
|
+
end
|
69
|
+
|
70
|
+
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
71
|
+
header_str += self.header_str(
|
72
|
+
"Host" => @args[:host],
|
73
|
+
"Connection" => "Keep-Alive",
|
74
|
+
"User-Agent" => @uagent,
|
75
|
+
"Content-Length" => praw.length
|
76
|
+
)
|
77
|
+
header_str += "#{@nl}"
|
78
|
+
header_str += praw
|
79
|
+
|
80
|
+
@sock.puts(header_str)
|
81
|
+
return self.read_response
|
82
|
+
end
|
83
|
+
|
84
|
+
def header_str(headers_hash)
|
85
|
+
if @cookies.length > 0
|
86
|
+
cstr = ""
|
87
|
+
|
88
|
+
first = true
|
89
|
+
@cookies.each do |cookie_name, cookie_data|
|
90
|
+
cstr += "; " if !first
|
91
|
+
first = false if first
|
92
|
+
|
93
|
+
cstr += "#{Knj::Web.urlenc(cookie_data["name"])}=#{Knj::Web.urlenc(cookie_data["value"])}"
|
94
|
+
end
|
95
|
+
|
96
|
+
headers_hash["Cookie"] = cstr
|
97
|
+
end
|
98
|
+
|
99
|
+
headers_str = ""
|
100
|
+
|
101
|
+
headers_hash.each do |key, val|
|
102
|
+
headers_str += "#{key}: #{val}#{@nl}"
|
103
|
+
end
|
104
|
+
|
105
|
+
return headers_str
|
106
|
+
end
|
107
|
+
|
108
|
+
def read_response
|
109
|
+
@mode = "headers"
|
110
|
+
@resp = Knj::Http2::Response.new
|
111
|
+
|
112
|
+
loop do
|
113
|
+
print "Reading next line.\n" if @debug
|
114
|
+
line = @sock.gets
|
115
|
+
break if line.to_s == ""
|
116
|
+
|
117
|
+
if @mode == "headers" and line == @nl
|
118
|
+
break if @resp.header("content-length") == "0"
|
119
|
+
@mode = "body"
|
120
|
+
next
|
121
|
+
end
|
122
|
+
|
123
|
+
if @mode == "headers"
|
124
|
+
self.parse_header(line)
|
125
|
+
elsif @mode == "body"
|
126
|
+
stat = self.parse_body(line)
|
127
|
+
break if stat == "break"
|
128
|
+
next if stat == "next"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
#Release variables.
|
133
|
+
resp = @resp
|
134
|
+
@resp = nil
|
135
|
+
@mode = nil
|
136
|
+
|
137
|
+
if resp.args[:code] == "302" and resp.header?("location")
|
138
|
+
uri = URI.parse(resp.header("location"))
|
139
|
+
|
140
|
+
args = {:host => uri.host}
|
141
|
+
args[:ssl] = true if uri.scheme == "https"
|
142
|
+
args[:port] = uri.port if uri.port
|
143
|
+
|
144
|
+
if !args[:host] or args[:host] == @args[:host]
|
145
|
+
return self.get(resp.header("location"))
|
146
|
+
else
|
147
|
+
http = Knj::Http2.new(args)
|
148
|
+
return http.get(uri.path)
|
149
|
+
end
|
150
|
+
else
|
151
|
+
return resp
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def parse_header(line)
|
156
|
+
if match = line.match(/^(.+?):\s*(.+)#{@nl}$/)
|
157
|
+
key = match[1].to_s.downcase
|
158
|
+
|
159
|
+
if key == "set-cookie"
|
160
|
+
Knj::Web.parse_set_cookies(match[2]).each do |cookie_data|
|
161
|
+
@cookies[cookie_data["name"]] = cookie_data
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
@resp.headers[key] = [] if !@resp.headers.key?(key)
|
166
|
+
@resp.headers[key] << match[2]
|
167
|
+
elsif match = line.match(/^HTTP\/([\d\.]+)\s+(\d+)\s+(.+)$/)
|
168
|
+
@resp.args[:code] = match[2]
|
169
|
+
@resp.args[:http_version] = match[1]
|
170
|
+
else
|
171
|
+
raise "Could not understand header string: '#{line}'."
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def parse_body(line)
|
176
|
+
if @resp.args[:http_version] = "1.1"
|
177
|
+
return "break" if @resp.header("content-length") == "0"
|
178
|
+
|
179
|
+
if @resp.header("transfer-encoding").to_s.downcase == "chunked"
|
180
|
+
len = line.strip.hex
|
181
|
+
|
182
|
+
print "Content-Length: #{@resp.header("content-length")}\n" if @debug
|
183
|
+
print "Current body length: #{@resp.args[:body].length}\n" if @debug
|
184
|
+
print "Chunk length: #{len}\n" if @debug
|
185
|
+
|
186
|
+
print "Reading chunked.\n" if @debug
|
187
|
+
if len > 0
|
188
|
+
read = @sock.read(len)
|
189
|
+
return "break" if read == "" or read == @nl
|
190
|
+
@resp.args[:body] += read
|
191
|
+
end
|
192
|
+
|
193
|
+
print "Reading trailing NL.\n" if @debug
|
194
|
+
nl = @sock.gets
|
195
|
+
if len == 0
|
196
|
+
if nl == @nl
|
197
|
+
return "break"
|
198
|
+
else
|
199
|
+
raise "Dont know what to do :'-("
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
#print "Test: '#{nl}'\n"
|
204
|
+
raise "Should have read newline but didnt: '#{nl}'." if nl != @nl
|
205
|
+
else
|
206
|
+
@resp.args[:body] += line.to_s
|
207
|
+
return "break" if @resp.header?("content-length") and @resp.args[:body].length >= @resp.header("content-length").to_i
|
208
|
+
end
|
209
|
+
else
|
210
|
+
raise "Dont know how to read HTTP version: '#{@resp.args[:http_version]}'."
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
class Knj::Http2::Response
|
216
|
+
attr_reader :args
|
217
|
+
|
218
|
+
def initialize(args = {})
|
219
|
+
@args = args
|
220
|
+
@args[:headers] = {} if !@args.key?(:headers)
|
221
|
+
@args[:body] = "" if !@args.key?(:body)
|
222
|
+
end
|
223
|
+
|
224
|
+
def headers
|
225
|
+
return @args[:headers]
|
226
|
+
end
|
227
|
+
|
228
|
+
def header(key)
|
229
|
+
return false if !@args[:headers].key?(key)
|
230
|
+
return @args[:headers][key].first.to_s
|
231
|
+
end
|
232
|
+
|
233
|
+
def header?(key)
|
234
|
+
return true if @args[:headers].key?(key) and @args[:headers][key].first.to_s.length > 0
|
235
|
+
return false
|
236
|
+
end
|
237
|
+
|
238
|
+
def code
|
239
|
+
return @args[:code]
|
240
|
+
end
|
241
|
+
|
242
|
+
def http_version
|
243
|
+
return @args[:http_version]
|
244
|
+
end
|
245
|
+
|
246
|
+
def body
|
247
|
+
return @args[:body]
|
248
|
+
end
|
249
|
+
end
|
data/lib/knj/image.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
class Knj::Image
|
2
|
+
#This function can make rounded transparent corners on an image with a given radius. Further more it can also draw borders around the entire image in a given color and take the border into account.
|
3
|
+
def self.rounded_corners(args)
|
4
|
+
raise "No or invalid ':img' given." if !args[:img]
|
5
|
+
raise "No or invalid ':radius' given." if args[:radius].to_i <= 0
|
6
|
+
|
7
|
+
pic = args[:img]
|
8
|
+
|
9
|
+
r = args[:radius].to_i
|
10
|
+
r_half = r / 2
|
11
|
+
r2 = r * r
|
12
|
+
d = r * 2
|
13
|
+
|
14
|
+
center_x = r - 1
|
15
|
+
center_y = 1
|
16
|
+
|
17
|
+
coords = {}
|
18
|
+
0.upto(r) do |x|
|
19
|
+
y = center_y + Math.sqrt(r2 - ((x - center_x) * (x - center_x)))
|
20
|
+
coords[x] = y.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
if args[:border]
|
24
|
+
draw = Magick::Draw.new
|
25
|
+
draw.stroke(args[:border_color])
|
26
|
+
draw.stroke_width(1)
|
27
|
+
|
28
|
+
0.upto(args[:border] - 1) do |x|
|
29
|
+
draw.line(x, 0, x, pic.rows)
|
30
|
+
draw.line(pic.columns-x-1, 0, pic.columns-x-1, pic.rows)
|
31
|
+
|
32
|
+
draw.line(0, x, pic.columns, x)
|
33
|
+
draw.line(0, pic.rows-x-1, pic.columns, pic.rows-x-1)
|
34
|
+
end
|
35
|
+
|
36
|
+
draw.draw(pic)
|
37
|
+
end
|
38
|
+
|
39
|
+
borders = [] if args[:border]
|
40
|
+
|
41
|
+
1.upto(4) do |count|
|
42
|
+
r.times do |x|
|
43
|
+
border_from = nil
|
44
|
+
border_to = nil
|
45
|
+
border_mode = nil
|
46
|
+
|
47
|
+
case count
|
48
|
+
when 1
|
49
|
+
x_from = x
|
50
|
+
|
51
|
+
y_from = 0
|
52
|
+
y_to = r - coords[x]
|
53
|
+
|
54
|
+
if borders and x > 0 and x < r_half
|
55
|
+
border_from = y_to
|
56
|
+
border_to = r - coords[x - 1]
|
57
|
+
border_to = 1 if border_to < 1
|
58
|
+
|
59
|
+
#top left
|
60
|
+
borders << {:x => x_from, :yf => border_from, :yt => border_to}
|
61
|
+
borders << {:y => x_from, :xf => border_from, :xt => border_to}
|
62
|
+
|
63
|
+
#top right
|
64
|
+
borders << {:x => pic.columns - x - 1, :yf => border_from, :yt => border_to}
|
65
|
+
borders << {:y => x_from, :xf => pic.columns - border_to, :xt => pic.columns - border_from}
|
66
|
+
|
67
|
+
#bottom left
|
68
|
+
borders << {:x => x_from, :yf => pic.rows - border_to, :yt => pic.rows - border_from}
|
69
|
+
borders << {:y => pic.rows - x - 1, :xf => border_from, :xt => border_to}
|
70
|
+
|
71
|
+
#bottom right
|
72
|
+
borders << {:x => pic.columns - x - 1, :yf => pic.rows - border_to, :yt => pic.rows - border_from}
|
73
|
+
borders << {:y => pic.rows - x - 1, :xf => pic.columns - border_to, :xt => pic.columns - border_from}
|
74
|
+
end
|
75
|
+
when 2
|
76
|
+
x_from = pic.columns - r + x
|
77
|
+
|
78
|
+
y_from = 0
|
79
|
+
y_to = r - coords[r - x - 1]
|
80
|
+
when 3
|
81
|
+
x_from = x
|
82
|
+
|
83
|
+
y_from = pic.rows - r + coords[x]
|
84
|
+
y_to = pic.rows - y_from
|
85
|
+
when 4
|
86
|
+
x_from = pic.columns - r + x
|
87
|
+
|
88
|
+
y_from = pic.rows - r + coords[r - x - 1]
|
89
|
+
y_to = pic.rows - y_from
|
90
|
+
end
|
91
|
+
|
92
|
+
next if y_to <= 0
|
93
|
+
|
94
|
+
#Make corners transparent.
|
95
|
+
pixels = pic.get_pixels(x_from, y_from, 1, y_to)
|
96
|
+
pixels.each do |pixel|
|
97
|
+
pixel.opacity = Magick::TransparentOpacity
|
98
|
+
end
|
99
|
+
|
100
|
+
pic.store_pixels(x_from, y_from, 1, y_to, pixels)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if borders
|
105
|
+
borders.each do |border|
|
106
|
+
if border.key?(:x)
|
107
|
+
count_from = border[:yf]
|
108
|
+
count_to = border[:yt]
|
109
|
+
elsif border.key?(:y)
|
110
|
+
count_from = border[:xf]
|
111
|
+
count_to = border[:xt]
|
112
|
+
end
|
113
|
+
|
114
|
+
count_from.upto(count_to - 1) do |coord|
|
115
|
+
pixel = Magick::Pixel.from_color(args[:border_color])
|
116
|
+
|
117
|
+
if border.key?(:x)
|
118
|
+
pic.pixel_color(border[:x], coord, pixel)
|
119
|
+
elsif border.key?(:y)
|
120
|
+
pic.pixel_color(coord, border[:y], pixel)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
pic.matte = true
|
127
|
+
end
|
128
|
+
end
|
data/lib/knj/jruby-gtk2/gtk2.rb
CHANGED
@@ -44,7 +44,7 @@ module Gtk
|
|
44
44
|
"org.gnome.gtk.Window" => org.gnome.gtk.Window
|
45
45
|
}
|
46
46
|
def self.evalob(evalobstr)
|
47
|
-
if !@evalobs.
|
47
|
+
if !@evalobs.key?(evalobstr)
|
48
48
|
print "Not statically written: #{evalobstr}\n"
|
49
49
|
@evalobs[evalobstr] = eval(evalobstr)
|
50
50
|
end
|
data/lib/knj/knj.rb
CHANGED
data/lib/knj/knj_controller.rb
CHANGED
@@ -12,7 +12,7 @@ class KnjDB_mysql
|
|
12
12
|
@esc_col = "`"
|
13
13
|
@mutex = Mutex.new
|
14
14
|
|
15
|
-
if @knjdb.opts.
|
15
|
+
if @knjdb.opts.key?(:port)
|
16
16
|
@port = @knjdb.opts[:port].to_i
|
17
17
|
else
|
18
18
|
@port = 3306
|
@@ -43,7 +43,7 @@ class KnjDB_mysql
|
|
43
43
|
|
44
44
|
pos_args = [:as, :async, :cast_booleans, :database_timezone, :application_timezone, :cache_rows, :connect_flags, :cast]
|
45
45
|
pos_args.each do |key|
|
46
|
-
args[key] = @knjdb.opts[key] if @knjdb.opts.
|
46
|
+
args[key] = @knjdb.opts[key] if @knjdb.opts.key?(key)
|
47
47
|
end
|
48
48
|
|
49
49
|
@conn = Mysql2::Client.new(args)
|
@@ -175,7 +175,7 @@ class KnjDB_mysql
|
|
175
175
|
end
|
176
176
|
else
|
177
177
|
data = self.query("SELECT LAST_INSERT_ID() AS id").fetch
|
178
|
-
return data[:id] if data.
|
178
|
+
return data[:id] if data.key?(:id)
|
179
179
|
raise "Could not figure out last inserted ID."
|
180
180
|
end
|
181
181
|
end
|
@@ -10,7 +10,7 @@ class KnjDB_mysql::Columns
|
|
10
10
|
def data_sql(data)
|
11
11
|
raise "No type given." if !data["type"]
|
12
12
|
|
13
|
-
data["maxlength"] = 255 if data["type"] == "varchar" and !data.
|
13
|
+
data["maxlength"] = 255 if data["type"] == "varchar" and !data.key?("maxlength")
|
14
14
|
|
15
15
|
sql = "`#{data["name"]}` #{data["type"]}"
|
16
16
|
sql += "(#{data["maxlength"]})" if data["maxlength"]
|
@@ -18,13 +18,13 @@ class KnjDB_mysql::Columns
|
|
18
18
|
sql += " AUTO_INCREMENT" if data["autoincr"]
|
19
19
|
sql += " NOT NULL" if !data["null"]
|
20
20
|
|
21
|
-
if data.
|
21
|
+
if data.key?("default_func")
|
22
22
|
sql += " DEFAULT #{data["default_func"]}"
|
23
|
-
elsif data.
|
23
|
+
elsif data.key?("default") and data["default"] != false
|
24
24
|
sql += " DEFAULT '#{@db.escape(data["default"])}'"
|
25
25
|
end
|
26
26
|
|
27
|
-
sql += " COMMENT '#{@db.escape(data["comment"])}'" if data.
|
27
|
+
sql += " COMMENT '#{@db.escape(data["comment"])}'" if data.key?("comment")
|
28
28
|
sql += " AFTER `#{@db.esc_col(data["after"])}`" if data["after"] and !data["first"]
|
29
29
|
sql += " FIRST" if data["first"]
|
30
30
|
|
@@ -116,15 +116,15 @@ class KnjDB_mysql::Columns::Column
|
|
116
116
|
table_escape = "#{@args[:driver].escape_table}#{@args[:driver].esc_table(@args[:table].name)}#{@args[:driver].escape_table}"
|
117
117
|
newdata = data.clone
|
118
118
|
|
119
|
-
newdata["name"] = self.name if !newdata.
|
120
|
-
newdata["type"] = self.type if !newdata.
|
121
|
-
newdata["maxlength"] = self.maxlength if !newdata.
|
122
|
-
newdata["null"] = self.null? if !newdata.
|
123
|
-
newdata["default"] = self.default if !newdata.
|
124
|
-
newdata.delete("primarykey") if newdata.
|
119
|
+
newdata["name"] = self.name if !newdata.key?("name")
|
120
|
+
newdata["type"] = self.type if !newdata.key?("type")
|
121
|
+
newdata["maxlength"] = self.maxlength if !newdata.key?("maxlength") and self.maxlength
|
122
|
+
newdata["null"] = self.null? if !newdata.key?("null")
|
123
|
+
newdata["default"] = self.default if !newdata.key?("default")
|
124
|
+
newdata.delete("primarykey") if newdata.key?("primarykey")
|
125
125
|
|
126
126
|
type_s = newdata["type"].to_s
|
127
127
|
@db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.cols.data_sql(newdata)}")
|
128
|
-
@args[:table].list = nil if data.
|
128
|
+
@args[:table].list = nil if data.key?("name") and data["name"] != self.name
|
129
129
|
end
|
130
130
|
end
|