bugzyrb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +26 -0
- data/LICENSE +20 -0
- data/README.rdoc +97 -0
- data/Rakefile +59 -0
- data/VERSION +1 -0
- data/bin/bugzyrb +4 -0
- data/bugzy.cfg +35 -0
- data/bugzyrb.gemspec +72 -0
- data/lib/bugzyrb.rb +1131 -0
- data/lib/common/cmdapp.rb +280 -0
- data/lib/common/colorconstants.rb +79 -0
- data/lib/common/db.rb +249 -0
- data/lib/common/sed.rb +118 -0
- metadata +158 -0
@@ -0,0 +1,280 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
=begin
|
3
|
+
* Name : cmdapp.rb
|
4
|
+
* Description : some basic command line things
|
5
|
+
* : Moving some methods from todorb.rb here
|
6
|
+
* Author : rkumar
|
7
|
+
* Date : 2010-06-20 11:18
|
8
|
+
* License: Ruby License
|
9
|
+
|
10
|
+
=end
|
11
|
+
require 'common/sed'
|
12
|
+
|
13
|
+
ERRCODE = 1
|
14
|
+
|
15
|
+
module Cmdapp
|
16
|
+
|
17
|
+
##
|
18
|
+
# external dependencies:
|
19
|
+
# @app_default_action - action to run if none specified
|
20
|
+
# @app_file_path - data file we are backing up, or reading into array
|
21
|
+
# @app_serial_path - serial_number file
|
22
|
+
##
|
23
|
+
# check whether this action is mapped to some alias and *changes*
|
24
|
+
# variables@action and @argv if true.
|
25
|
+
# @param [String] action asked by user
|
26
|
+
# @param [Array] rest of args on command line
|
27
|
+
# @return [Boolean] whether it is mapped or not.
|
28
|
+
#
|
29
|
+
def check_aliases action, args
|
30
|
+
return false unless @aliases
|
31
|
+
ret = @aliases[action]
|
32
|
+
if ret
|
33
|
+
a = ret.shift
|
34
|
+
b = [*ret, *args]
|
35
|
+
@action = a
|
36
|
+
@argv = b
|
37
|
+
#puts " #{@action} ; argv: #{@argv} "
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
##
|
43
|
+
# runs method after checking if valid or alias.
|
44
|
+
# If not found prints help.
|
45
|
+
# @return [0, ERRCODE] success 0.
|
46
|
+
def run
|
47
|
+
@action = @argv[0] || @app_default_action
|
48
|
+
@action = @action.downcase
|
49
|
+
|
50
|
+
|
51
|
+
ret = 0
|
52
|
+
@argv.shift
|
53
|
+
if respond_to? @action
|
54
|
+
ret = send(@action, @argv)
|
55
|
+
else
|
56
|
+
# check aliases
|
57
|
+
if check_aliases @action, @argv
|
58
|
+
ret = send(@action, @argv)
|
59
|
+
else
|
60
|
+
help @argv
|
61
|
+
ret = ERRCODE
|
62
|
+
end
|
63
|
+
end
|
64
|
+
ret ||= 0
|
65
|
+
ret = 0 if ret != ERRCODE
|
66
|
+
return ret
|
67
|
+
end
|
68
|
+
# not required if using Subcommand
|
69
|
+
def help args
|
70
|
+
if @actions.nil?
|
71
|
+
if defined? @commands
|
72
|
+
unless @commands.empty?
|
73
|
+
@actions = @commands
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
if @actions
|
78
|
+
puts "Actions are "
|
79
|
+
@actions.each_pair { |name, val| puts "#{name}\t#{val}" }
|
80
|
+
end
|
81
|
+
puts " "
|
82
|
+
if @aliases
|
83
|
+
puts "Aliases are "
|
84
|
+
@aliases.each_pair { |name, val| puts "#{name}:\t#{val.join(' ')}" }
|
85
|
+
end
|
86
|
+
0
|
87
|
+
end
|
88
|
+
##
|
89
|
+
def alias_command name, *args
|
90
|
+
@aliases ||= {}
|
91
|
+
@aliases[name.to_s] = args
|
92
|
+
end
|
93
|
+
def add_action name, descr
|
94
|
+
@actions ||= {}
|
95
|
+
@actions[name.to_s] = desc
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# reads serial_number file, returns serialno for this app
|
100
|
+
# and increments the serial number and writes back.
|
101
|
+
def _get_serial_number
|
102
|
+
require 'fileutils'
|
103
|
+
appname = @appname
|
104
|
+
filename = @app_serial_path || "serial_numbers"
|
105
|
+
h = {}
|
106
|
+
# check if serial file existing in curr dir. Else create
|
107
|
+
if File.exists?(filename)
|
108
|
+
File.open(filename).each { |line|
|
109
|
+
#sn = $1 if line.match regex
|
110
|
+
x = line.split ":"
|
111
|
+
h[x[0]] = x[1].chomp
|
112
|
+
}
|
113
|
+
end
|
114
|
+
sn = h[appname] || 1
|
115
|
+
# update the sn in file
|
116
|
+
nsn = sn.to_i + 1
|
117
|
+
# this will create if not exists in addition to storing if it does
|
118
|
+
h[appname] = nsn
|
119
|
+
# write back to file
|
120
|
+
File.open(filename, "w") do |f|
|
121
|
+
h.each_pair {|k,v| f.print "#{k}:#{v}\n"}
|
122
|
+
end
|
123
|
+
return sn
|
124
|
+
end
|
125
|
+
##
|
126
|
+
# After doing a redo of the numbering, we need to reset the numbers for that app
|
127
|
+
def _set_serial_number number
|
128
|
+
appname = @appname
|
129
|
+
pattern = Regexp.new "^#{appname}:.*$"
|
130
|
+
filename = @app_serial_path || "serial_numbers"
|
131
|
+
# during testing redo this file does not exist, so i get errors
|
132
|
+
if !File.exists? filename
|
133
|
+
_get_serial_number
|
134
|
+
end
|
135
|
+
_backup filename
|
136
|
+
change_row filename, pattern, "#{appname}:#{number}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def _backup filename=@app_file_path
|
140
|
+
require 'fileutils'
|
141
|
+
FileUtils.cp filename, "#{filename}.org"
|
142
|
+
end
|
143
|
+
def die text
|
144
|
+
$stderr.puts text
|
145
|
+
exit ERRCODE
|
146
|
+
end
|
147
|
+
# prints messages to stderr
|
148
|
+
# All messages should go to stderr.
|
149
|
+
# Keep stdout only for output which can be used by other programs
|
150
|
+
def message text
|
151
|
+
$stderr.puts text
|
152
|
+
end
|
153
|
+
# print to stderr only if verbose set
|
154
|
+
def verbose text
|
155
|
+
message(text) if @options[:verbose]
|
156
|
+
end
|
157
|
+
# print to stderr only if verbose set
|
158
|
+
def warning text
|
159
|
+
print_red("WARNING: #{text}")
|
160
|
+
end
|
161
|
+
def print_red text
|
162
|
+
message "#{RED}#{text}#{CLEAR}"
|
163
|
+
end
|
164
|
+
def print_green text
|
165
|
+
message "#{GREEN}#{text}#{CLEAR}"
|
166
|
+
end
|
167
|
+
|
168
|
+
##
|
169
|
+
# load data into array as item and task
|
170
|
+
# @see save_array to write
|
171
|
+
def load_array
|
172
|
+
#return if $valid_array
|
173
|
+
$valid_array = false
|
174
|
+
@data = []
|
175
|
+
File.open(@app_file_path).each do |line|
|
176
|
+
# FIXME: use @app_delim
|
177
|
+
row = line.chomp.split "\t"
|
178
|
+
@data << row
|
179
|
+
end
|
180
|
+
$valid_array = true
|
181
|
+
end
|
182
|
+
##
|
183
|
+
# saves the task array to disk
|
184
|
+
# Please use load_array to load, and not populate
|
185
|
+
def save_array
|
186
|
+
raise "Cannot save array! Please use load_array to load" if $valid_array == false
|
187
|
+
|
188
|
+
File.open(@app_file_path, "w") do |file|
|
189
|
+
# FIXME: use join with @app_delim
|
190
|
+
@data.each { |row| file.puts "#{row[0]}\t#{row[1]}" }
|
191
|
+
end
|
192
|
+
end
|
193
|
+
##
|
194
|
+
# retrieve version info updated by jeweler.
|
195
|
+
# Typically used by --version option of any command.
|
196
|
+
# @return [String, nil] version as string, or nil if file not found
|
197
|
+
def version_info
|
198
|
+
# thanks to Roger Pack on ruby-forum for how to get to the version
|
199
|
+
# file
|
200
|
+
filename = File.open(File.dirname(__FILE__) + "/../../VERSION")
|
201
|
+
v = nil
|
202
|
+
if File.exists?(filename)
|
203
|
+
v = File.open(filename).read.chomp if File.exists?(filename)
|
204
|
+
#else
|
205
|
+
#$stderr.puts "could not locate file #{filename}. "
|
206
|
+
#puts `pwd`
|
207
|
+
end
|
208
|
+
v
|
209
|
+
end
|
210
|
+
|
211
|
+
# reads multiple lines of input until EOF (Ctrl-d)
|
212
|
+
# and returns as a string.
|
213
|
+
# Add newline after each line
|
214
|
+
# @return [String, nil] newline delimited string, or nil
|
215
|
+
def get_lines
|
216
|
+
lines = nil
|
217
|
+
#$stdin.flush
|
218
|
+
$stdin.each_line do |line|
|
219
|
+
line.chomp!
|
220
|
+
if line =~ /^bye$/
|
221
|
+
break
|
222
|
+
end
|
223
|
+
if lines
|
224
|
+
lines << "\n" + line
|
225
|
+
else
|
226
|
+
lines = line
|
227
|
+
end
|
228
|
+
end
|
229
|
+
return lines
|
230
|
+
end
|
231
|
+
|
232
|
+
|
233
|
+
# edits given text using EDITOR
|
234
|
+
# @param [String] text to edit
|
235
|
+
# @return [String, nil] edited string, or nil if no change
|
236
|
+
def edit_text text
|
237
|
+
# 2010-06-29 10:24
|
238
|
+
require 'fileutils'
|
239
|
+
require 'tempfile'
|
240
|
+
ed = ENV['EDITOR'] || "vim"
|
241
|
+
temp = Tempfile.new "tmp"
|
242
|
+
File.open(temp,"w"){ |f| f.write text }
|
243
|
+
mtime = File.mtime(temp.path)
|
244
|
+
#system("#{ed} #{temp.path}")
|
245
|
+
system(ed, temp.path)
|
246
|
+
|
247
|
+
newmtime = File.mtime(temp.path)
|
248
|
+
newstr = nil
|
249
|
+
if mtime < newmtime
|
250
|
+
# check timestamp, if updated ..
|
251
|
+
#newstr = ""
|
252
|
+
#File.open(temp,"r"){ |f| f.each {|r| newstr << r } }
|
253
|
+
newstr = File.read(temp)
|
254
|
+
#puts "I got: #{newstr}"
|
255
|
+
else
|
256
|
+
#puts "user quit without saving"
|
257
|
+
end
|
258
|
+
return newstr
|
259
|
+
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# reads up template, and substirutes values from myhash
|
263
|
+
# @param [String] template text
|
264
|
+
# @param [Hash] values to replace in template
|
265
|
+
# @return [String] template output
|
266
|
+
# NOTE: probably better to use rdoc/template which can handle arrays as well.
|
267
|
+
def template_replace template, myhash
|
268
|
+
#tmpltext=File::read(template);
|
269
|
+
|
270
|
+
t = template.dup
|
271
|
+
t.gsub!( /##(.*?)##/ ) {
|
272
|
+
#raise "Key '#{$1}' found in template but the value has not been set" unless ( myhash.has_key?( $1 ) )
|
273
|
+
myhash[ $1 ].to_s
|
274
|
+
}
|
275
|
+
t
|
276
|
+
end
|
277
|
+
|
278
|
+
|
279
|
+
|
280
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Color constants so we can print onto console using print or puts
|
4
|
+
# @example
|
5
|
+
# string = "hello ruby"
|
6
|
+
# puts " #{RED}#{BOLD}#{UNDERLINE}#{string}#{CLEAR}"
|
7
|
+
#
|
8
|
+
# http://wiki.bash-hackers.org/scripting/terminalcodes
|
9
|
+
# ripped off highline gem
|
10
|
+
module ColorConstants
|
11
|
+
|
12
|
+
# Embed in a String to clear all previous ANSI sequences. This *MUST* be
|
13
|
+
# done before the program exits!
|
14
|
+
#
|
15
|
+
CLEAR = "\e[0m"
|
16
|
+
# An alias for CLEAR.
|
17
|
+
RESET = CLEAR
|
18
|
+
NORMAL = CLEAR
|
19
|
+
# Erase the current line of terminal output.
|
20
|
+
ERASE_LINE = "\e[K"
|
21
|
+
# Erase the character under the cursor.
|
22
|
+
ERASE_CHAR = "\e[P"
|
23
|
+
# The start of an ANSI bold sequence.
|
24
|
+
BOLD = "\e[1m"
|
25
|
+
# The start of an ANSI dark sequence. (Terminal support uncommon.)
|
26
|
+
DARK = "\e[2m"
|
27
|
+
DIM = DARK
|
28
|
+
# The start of an ANSI underline sequence.
|
29
|
+
UNDERLINE = "\e[4m"
|
30
|
+
# An alias for UNDERLINE.
|
31
|
+
UNDERSCORE = UNDERLINE
|
32
|
+
# The start of an ANSI blink sequence. (Terminal support uncommon.)
|
33
|
+
BLINK = "\e[5m"
|
34
|
+
# The start of an ANSI reverse sequence.
|
35
|
+
REVERSE = "\e[7m"
|
36
|
+
# The start of an ANSI concealed sequence. (Terminal support uncommon.)
|
37
|
+
CONCEALED = "\e[8m"
|
38
|
+
|
39
|
+
# added from http://understudy.net/custom.html
|
40
|
+
BOLD_OFF = "\e[22m"
|
41
|
+
UNDERILNE_OFF = "\e[24m"
|
42
|
+
BLINK_OFF = "\e[25m"
|
43
|
+
REVERSE_OFF = "\e[27m"
|
44
|
+
|
45
|
+
# Set the terminal's foreground ANSI color to black.
|
46
|
+
BLACK = "\e[30m"
|
47
|
+
# Set the terminal's foreground ANSI color to red.
|
48
|
+
RED = "\e[31m"
|
49
|
+
# Set the terminal's foreground ANSI color to green.
|
50
|
+
GREEN = "\e[32m"
|
51
|
+
# Set the terminal's foreground ANSI color to yellow.
|
52
|
+
YELLOW = "\e[33m"
|
53
|
+
# Set the terminal's foreground ANSI color to blue.
|
54
|
+
BLUE = "\e[34m"
|
55
|
+
# Set the terminal's foreground ANSI color to magenta.
|
56
|
+
MAGENTA = "\e[35m"
|
57
|
+
# Set the terminal's foreground ANSI color to cyan.
|
58
|
+
CYAN = "\e[36m"
|
59
|
+
# Set the terminal's foreground ANSI color to white.
|
60
|
+
WHITE = "\e[37m"
|
61
|
+
|
62
|
+
# Set the terminal's background ANSI color to black.
|
63
|
+
ON_BLACK = "\e[40m"
|
64
|
+
# Set the terminal's background ANSI color to red.
|
65
|
+
ON_RED = "\e[41m"
|
66
|
+
# Set the terminal's background ANSI color to green.
|
67
|
+
ON_GREEN = "\e[42m"
|
68
|
+
# Set the terminal's background ANSI color to yellow.
|
69
|
+
ON_YELLOW = "\e[43m"
|
70
|
+
# Set the terminal's background ANSI color to blue.
|
71
|
+
ON_BLUE = "\e[44m"
|
72
|
+
# Set the terminal's background ANSI color to magenta.
|
73
|
+
ON_MAGENTA = "\e[45m"
|
74
|
+
# Set the terminal's background ANSI color to cyan.
|
75
|
+
ON_CYAN = "\e[46m"
|
76
|
+
# Set the terminal's background ANSI color to white.
|
77
|
+
ON_WHITE = "\e[47m"
|
78
|
+
|
79
|
+
end
|
data/lib/common/db.rb
ADDED
@@ -0,0 +1,249 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
require 'rubygems'
|
3
|
+
require 'sqlite3'
|
4
|
+
require 'pp'
|
5
|
+
require 'arrayfields'
|
6
|
+
module Database
|
7
|
+
class DB
|
8
|
+
attr_accessor :db
|
9
|
+
|
10
|
+
def initialize dbname="bugzy.sqlite"
|
11
|
+
raise "#{dbname} does not exist. Try --help" unless File.exists? dbname
|
12
|
+
@db = SQLite3::Database.new(dbname)
|
13
|
+
$now = Time.now
|
14
|
+
$num = rand(100)
|
15
|
+
$default_user = ENV['LOGNAME'] || ENV['USER']
|
16
|
+
end
|
17
|
+
|
18
|
+
# returns many rows
|
19
|
+
# @param [Fixnum] id for table with 1:n rows
|
20
|
+
# @return [Array, nil] array if rows, else nil
|
21
|
+
def select table
|
22
|
+
#puts " --- #{table} --- "
|
23
|
+
@db.type_translation = true
|
24
|
+
rows = []
|
25
|
+
@db.execute( "select * from #{table} " ) do |row|
|
26
|
+
if block_given?
|
27
|
+
yield row
|
28
|
+
else
|
29
|
+
rows << row
|
30
|
+
end
|
31
|
+
end
|
32
|
+
return nil if rows.empty?
|
33
|
+
return rows
|
34
|
+
end
|
35
|
+
# returns many rows
|
36
|
+
# @param [String] sql statement
|
37
|
+
# @return [Array, nil] array if rows, else nil
|
38
|
+
def run text
|
39
|
+
#puts " --- #{text} --- "
|
40
|
+
@db.type_translation = true
|
41
|
+
rows = []
|
42
|
+
@db.execute( text ) do |row|
|
43
|
+
if block_given?
|
44
|
+
yield row
|
45
|
+
else
|
46
|
+
rows << row
|
47
|
+
end
|
48
|
+
end
|
49
|
+
return nil if rows.empty?
|
50
|
+
return rows
|
51
|
+
end
|
52
|
+
def select_where table, *wherecond
|
53
|
+
#puts " --- #{table} --- #{wherecond} "
|
54
|
+
@db.type_translation = true
|
55
|
+
wherestr = nil
|
56
|
+
rows = []
|
57
|
+
if wherecond and !wherecond.empty?
|
58
|
+
fields, values = separate_field_values wherecond
|
59
|
+
#wherestr = "" unless wherestr
|
60
|
+
wherestr = " where #{fields.join(" and ")} "
|
61
|
+
if wherestr
|
62
|
+
#puts " wherestr #{wherestr}, #{values} "
|
63
|
+
#stmt = @db.prepare("select * from #{table} #{wherestr} ", *values)
|
64
|
+
@db.execute( "select * from #{table} #{wherestr}", *values ) do |row|
|
65
|
+
if block_given?
|
66
|
+
yield row
|
67
|
+
else
|
68
|
+
rows << row
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
return nil if rows.empty?
|
74
|
+
return rows
|
75
|
+
end
|
76
|
+
##
|
77
|
+
# insert a issue or bug report into the database
|
78
|
+
# @params
|
79
|
+
# @return [Fixnum] last row id
|
80
|
+
def bugs_insert(status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by = $default_user)
|
81
|
+
# id = $num
|
82
|
+
# status = "CODE"
|
83
|
+
# severity = "CODE"
|
84
|
+
# type = "CODE"
|
85
|
+
# assigned_to = "CODE"
|
86
|
+
# start_date = $now
|
87
|
+
# due_date = $now
|
88
|
+
# comment_count = $num
|
89
|
+
# priority = "CODE"
|
90
|
+
# title = "CODE"
|
91
|
+
# description = "Some long text"
|
92
|
+
# fix = "Some long text"
|
93
|
+
# date_created = $now
|
94
|
+
# date_modified = $now
|
95
|
+
@db.execute(" insert into bugs ( status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
96
|
+
status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by )
|
97
|
+
rowid = @db.get_first_value( "select last_insert_rowid();")
|
98
|
+
return rowid
|
99
|
+
end
|
100
|
+
## takes a hash and creates an insert statement for table and inserts data.
|
101
|
+
# Advantage is that as we add columns, this will add the column to the insert, so we
|
102
|
+
# don't need to keep modifying in many places.
|
103
|
+
# @param [String] name of table to insert data into
|
104
|
+
# @param [Hash] values to insert, keys must be table column names
|
105
|
+
# @return [Fixnum] newly inserted rowid
|
106
|
+
def table_insert_hash table, hash
|
107
|
+
str = "INSERT INTO #{table} ("
|
108
|
+
qstr = [] # question marks
|
109
|
+
fields = [] # field names
|
110
|
+
bind_vars = [] # values to insert
|
111
|
+
hash.each_pair { |name, val|
|
112
|
+
fields << name
|
113
|
+
bind_vars << val
|
114
|
+
qstr << "?"
|
115
|
+
}
|
116
|
+
fstr = fields.join(",")
|
117
|
+
str << fstr
|
118
|
+
str << ") values ("
|
119
|
+
str << qstr.join(",")
|
120
|
+
str << ")"
|
121
|
+
puts str
|
122
|
+
@db.execute(str, *bind_vars)
|
123
|
+
rowid = @db.get_first_value( "select last_insert_rowid();")
|
124
|
+
return rowid
|
125
|
+
end
|
126
|
+
def max_bug_id
|
127
|
+
id = @db.get_first_value( "select max(id) from bugs;")
|
128
|
+
return id
|
129
|
+
end
|
130
|
+
def sql_comments_insert id, comment, created_by = $default_user
|
131
|
+
#date_created = date_cr | Time.now
|
132
|
+
@db.execute("insert into comments (id, comment, created_by) values (?,?,?)", id, comment, created_by )
|
133
|
+
rowid = @db.get_first_value( "select last_insert_rowid();")
|
134
|
+
return rowid
|
135
|
+
end
|
136
|
+
def sql_logs_insert id, field, log, created_by = $default_user
|
137
|
+
#date_created = date_cr | Time.now
|
138
|
+
@db.execute("insert into log (id, field, log, created_by) values (?,?,?,?)", id, field, log, created_by )
|
139
|
+
end
|
140
|
+
def sql_delete_bug id
|
141
|
+
message "deleting #{id}"
|
142
|
+
@db.execute( "delete from bugs where id = ?", id )
|
143
|
+
@db.execute( "delete from comments where id = ?", id )
|
144
|
+
@db.execute( "delete from log where id = ?", id )
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
##
|
149
|
+
# update a row from bugs based on id, giving one fieldname and value
|
150
|
+
# @param [Fixnum] id unique key
|
151
|
+
# @param [String] fieldname
|
152
|
+
# @param [String] value to update
|
153
|
+
# @example sql_bugs_update 9, :name, "Roger"
|
154
|
+
def sql_update table, id, field, value
|
155
|
+
@db.execute( "update #{table} set #{field} = ?, date_modified = ? where id = ?", value,$now, id)
|
156
|
+
end
|
157
|
+
|
158
|
+
# update a row from bugs based on id, can give multiple fieldnames and values
|
159
|
+
# @param [Fixnum] id unique key
|
160
|
+
# @return [Array] alternating fieldname and value
|
161
|
+
# @example sql_bugs_update_mult 9, :name, "Roger", :age, 29, :country, "SWI"
|
162
|
+
def sql_bugs_update_mult id, *fv
|
163
|
+
fields = []
|
164
|
+
values = []
|
165
|
+
fv << "date_modified"
|
166
|
+
fv << $now
|
167
|
+
fv.each_with_index do |f, i|
|
168
|
+
if i % 2 == 0
|
169
|
+
fields << "#{f} = ?"
|
170
|
+
else
|
171
|
+
values << f
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
print( "update bugs set #{fields.join(" ,")} where id = ?", *values, id)
|
176
|
+
@db.execute( "update bugs set #{fields.join(" ,")} where id = ?", *values, id)
|
177
|
+
end
|
178
|
+
#
|
179
|
+
# return a single row from table based on rowid
|
180
|
+
# @param [String] table name
|
181
|
+
# @param [Fixnum] rowid
|
182
|
+
# @return [Array] resultset (based on arrayfield)
|
183
|
+
def sql_select_rowid table, id
|
184
|
+
# @db.results_as_hash = true
|
185
|
+
return nil if id.nil? or table.nil?
|
186
|
+
row = @db.get_first_row( "select * from #{table} where rowid = ?", id )
|
187
|
+
return row
|
188
|
+
end
|
189
|
+
|
190
|
+
def separate_field_values array
|
191
|
+
fields = []
|
192
|
+
values = []
|
193
|
+
array.each_with_index do |f, i|
|
194
|
+
if i % 2 == 0
|
195
|
+
fields << "#{f} = ?"
|
196
|
+
else
|
197
|
+
values << f
|
198
|
+
end
|
199
|
+
end
|
200
|
+
return fields, values
|
201
|
+
end
|
202
|
+
def dummy
|
203
|
+
id = $num
|
204
|
+
status = "OPEN"
|
205
|
+
severity = "CRI"
|
206
|
+
type = "BUG"
|
207
|
+
assigned_to = "rahul"
|
208
|
+
start_date = $now
|
209
|
+
due_date = $now
|
210
|
+
comment_count = 0
|
211
|
+
priority = "A"
|
212
|
+
title = "some title"
|
213
|
+
description = "Some long text fro this bug too"
|
214
|
+
fix = nil #"Some long text"
|
215
|
+
date_created = $now
|
216
|
+
date_modified = $now
|
217
|
+
created_by = $default_user
|
218
|
+
bugs_insert(status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by)
|
219
|
+
#bugs_insert(id, status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, date_created, date_modified)
|
220
|
+
end
|
221
|
+
|
222
|
+
end # class
|
223
|
+
end # module
|
224
|
+
if __FILE__ == $PROGRAM_NAME
|
225
|
+
include Database
|
226
|
+
# some tests. change bugs with real name
|
227
|
+
db = DB.new
|
228
|
+
db.dummy
|
229
|
+
puts "\n------------ all row -----\n"
|
230
|
+
#db.select "bugs" do |r|
|
231
|
+
#puts r
|
232
|
+
##puts r.join(" | ")
|
233
|
+
#end
|
234
|
+
res = db.select "bugs"
|
235
|
+
if res
|
236
|
+
puts "count: #{res.count}"
|
237
|
+
#puts res.public_methods
|
238
|
+
res.each do |e|
|
239
|
+
puts e.join(" | ")
|
240
|
+
end
|
241
|
+
end
|
242
|
+
db.sql_update "bugs", 1, "fix", "A fix added at #{$now}"
|
243
|
+
db.sql_bugs_update_mult 1, "title", "a new title #{$num}", "description", "a new description #{$num}"
|
244
|
+
puts "\n------------ one row -----\n "
|
245
|
+
db.select_where "bugs", "id", 1 do |r|
|
246
|
+
puts r.join(" | ")
|
247
|
+
end
|
248
|
+
|
249
|
+
end # if
|