dohruby 0.1.14 → 0.1.15

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -41,3 +41,18 @@
41
41
  * add new random_array_element for nested array cases
42
42
  *0.1.14* (May 10th, 2008)
43
43
  * add BigDecimal.to_dig
44
+ *0.1.15* (May 21st, 2008)
45
+ * improved logging format of exceptions
46
+ * added DohDb::NULL object to represent a database NULL value
47
+ * added DohDb::today, DohDb::now to represent database functions CURDATE() and NOW()
48
+ * deleted old Unquoted versions of CURDATE() and NOW()
49
+ * return & trace affected rows in DohDb::Handle::query
50
+ * fix typo in doh/mysql/connector_util
51
+ * added database versions of Doh::current_date & Doh::current_datetime
52
+ * added unit tests for DohDb::select_as_hash
53
+ * split out sql file loading from DatabaseCreator to DohDb::load_sql function
54
+ * added new Date functions: days_in_month, weekday?, and date_only
55
+ * added view, insert_sql script support to DatabaseCreator
56
+ * added create_tables function to DatabaseCreator
57
+ * added notify to logger interface
58
+ * add DohDb::ReadOnlyRow::each_pair
data/lib/doh/core/date.rb CHANGED
@@ -1,5 +1,19 @@
1
1
  require 'date'
2
2
 
3
+ class Date
4
+ def self.days_in_month(year, month)
5
+ civil(year, month, -1).mday
6
+ end
7
+
8
+ def weekday?
9
+ (wday > 0) && (wday < 6)
10
+ end
11
+
12
+ def date_only
13
+ self
14
+ end
15
+ end
16
+
3
17
  class DateTime
4
18
  def date_only
5
19
  Date.new(year, month, mday)
@@ -2,14 +2,22 @@ require 'net/smtp'
2
2
 
3
3
  module DohLogger
4
4
 
5
- class NotifyAcceptor
6
- def initialize(smtp_server, from_address, to_addresses, logfile_name, subject_format = nil, body_format = nil)
5
+ def self.exception_email_format
6
+ "%severity: %msg\nlogfile_name: #@logfile_name\nsource_ip: %source_ip\nexception: %exception\nstack:\n%call_stack"
7
+ end
8
+
9
+ def self.exceptionless_email_format
10
+ "%severity: %msg\nlogfile_name: #@logfile_name\nsource_ip: %source_ip\n"
11
+ end
12
+
13
+ class EmailAcceptor
14
+ def initialize(smtp_server, from_address, to_addresses, logfile_name, subject_format = nil, body_format = DohLogger::exception_email_format)
7
15
  @smtp_server = smtp_server
8
16
  @from_address = from_address
9
17
  @to_addresses = to_addresses
10
18
  @logfile_name = logfile_name
11
- @subject_formatter = Formatter.new(subject_format || "notify - %msg")
12
- @body_formatter = Formatter.new(body_format || "notify: %msg\nlogfile_name: #@logfile_name\nsource_ip: %source_ip\nexception: %exception\nstack:\n%call_stack")
19
+ @subject_formatter = Formatter.new(subject_format || "%severity - %msg")
20
+ @body_formatter = Formatter.new(body_format)
13
21
  end
14
22
 
15
23
  def log(event)
@@ -8,7 +8,7 @@ class Formatter
8
8
  @formats = {}
9
9
  register_format('%severity') {|event| DohLogger::severity_string(event.severity)}
10
10
  register_format('%msg') {|event| event.msg}
11
- register_format('%exception') {|event| event.exception.to_s}
11
+ register_format('%exception') {|event| event.exception.class.to_s + ' -- ' + event.exception.to_s}
12
12
  register_format('%time') {|event| event.time.strftime("%H:%M:%S.") << "%03d" % (event.time.usec / 1000)}
13
13
  register_format('%datetime') {|event| event.time.strftime("%Y-%m-%d %H:%M:%S.") << "%03d" % (event.time.usec / 1000)}
14
14
  register_format('%call_stack') {|event| event.call_stack.join("\n")}
@@ -3,6 +3,7 @@ module DohLogger
3
3
  class NullInterface
4
4
  def fatal(*ignore) end
5
5
  def error(*ignore) end
6
+ def notify(*ignore) end
6
7
  def warn(*ignore) end
7
8
  def info(*ignore) end
8
9
  def debug(*ignore) end
@@ -3,9 +3,10 @@ module DohLogger
3
3
  DEBUG = 0
4
4
  INFO = 1
5
5
  WARN = 2
6
- ERROR = 3
7
- FATAL = 4
8
- SEVERITY_OPTIONS = %w(debug info warning ERROR ***FATAL***)
6
+ NOTIFY = 3
7
+ ERROR = 4
8
+ FATAL = 5
9
+ SEVERITY_OPTIONS = %w(debug info warning NOTIFY ERROR ***FATAL***)
9
10
 
10
11
  def self.severity_string(numeric_level)
11
12
  SEVERITY_OPTIONS[numeric_level]
@@ -17,6 +17,10 @@ class StandardInterface
17
17
  add(ERROR, msg, excpt)
18
18
  end
19
19
 
20
+ def notify(msg)
21
+ add(NOTIFY, msg)
22
+ end
23
+
20
24
  def warn(msg)
21
25
  add(WARN, msg)
22
26
  end
@@ -29,14 +33,14 @@ class StandardInterface
29
33
  add(DEBUG, msg)
30
34
  end
31
35
 
32
- def add_acceptor(severity_threshold, acceptor)
33
- @acceptors.push([severity_threshold, acceptor])
36
+ def add_acceptor(severity_threshold, acceptor, exact_severity_only = nil)
37
+ @acceptors.push([severity_threshold, acceptor, exact_severity_only])
34
38
  end
35
-
39
+
36
40
  private
37
41
  def add(severity, msg, excpt = nil)
38
42
  included = []
39
- @acceptors.each {|one| included.push(one[1]) if severity >= one[0]}
43
+ @acceptors.each {|elem| included.push(elem[1]) if (severity >= elem[0] && !elem[2]) || severity == elem[0]}
40
44
  @scheduler.push(included, Event.new(severity, msg, excpt))
41
45
  end
42
46
  end
@@ -5,11 +5,11 @@ require 'doh/mysql/raw_row_builder'
5
5
  module DohDb
6
6
 
7
7
  class CacheConnector
8
- attr_accessor :host, :user, :password, :database, :row_builder, :timeout
8
+ attr_accessor :host, :username, :password, :database, :row_builder, :timeout
9
9
 
10
- def initialize(host = nil, user = nil, password = nil, database = nil, row_builder = nil)
10
+ def initialize(host = nil, username = nil, password = nil, database = nil, row_builder = nil)
11
11
  @host = host
12
- @user = user
12
+ @username = username
13
13
  @password = password
14
14
  @database = database
15
15
  @timeout = 14400
@@ -37,9 +37,9 @@ private
37
37
  end
38
38
 
39
39
  def get_new_handle(database = nil)
40
- Doh::log.info("mysql CacheConnector: connecting to #@host as user #@user, database #@database")
40
+ Doh::log.info("mysql CacheConnector: connecting to #@host as username #@username, database #@database")
41
41
  @last_used = Time.now
42
- Handle.new(Mysql.connect(@host, @user, @password, database || @database), @row_builder)
42
+ Handle.new(Mysql.connect(@host, @username, @password, database || @database), @row_builder)
43
43
  end
44
44
 
45
45
  def passed_timeout?
@@ -3,7 +3,7 @@ module DohDb
3
3
  def self.create_and_connect(connector, new_default_database = nil, drop_first = true)
4
4
  connector.reset
5
5
  connector.database = new_default_database if new_default_database
6
- dbh = conn.request_handle('')
6
+ dbh = connector.request_handle('')
7
7
  dbh.query("DROP DATABASE IF EXISTS #{connector.database}") if drop_first
8
8
  dbh.query("CREATE DATABASE IF NOT EXISTS #{connector.database}")
9
9
  dbh.query("USE #{connector.database}")
@@ -0,0 +1,14 @@
1
+ require 'doh/util/current_date'
2
+ require 'doh/mysql/db_date'
3
+
4
+ module DohDb
5
+
6
+ def self.current_date_db
7
+ Doh::current_date(DohDb::today)
8
+ end
9
+
10
+ def self.current_datetime_db
11
+ Doh::current_datetime(DohDb::now)
12
+ end
13
+
14
+ end
@@ -1,25 +1,34 @@
1
1
  require 'doh/core/dir'
2
2
  require 'doh/mysql/handle'
3
+ require 'doh/mysql/load_sql'
4
+ require 'doh/mysql/connector_instance'
5
+ require 'yaml'
3
6
 
4
7
  module DohDb
5
8
 
6
9
  class DatabaseCreator
7
- def initialize(connector, data_directory)
8
- @connector = connector
10
+ def initialize(data_directory, connector = nil)
9
11
  @data_directory = data_directory
12
+ @connector = connector || DohDb::connector_instance
10
13
  end
11
14
 
12
- def create(dbname, drop_first = false)
15
+ def create_database(dbname, drop_first = false)
13
16
  create_one_database(get_nodb_handle, dbname, dbname, drop_first)
14
17
  end
15
18
 
16
- def create_copy(dest_db, source_db, drop_first = false)
19
+ def create_database_copy(dest_db, source_db, drop_first = false)
17
20
  create_one_database(get_nodb_handle, dest_db, source_db, drop_first)
18
21
  end
19
22
 
20
- def create_all(drop_first = false)
23
+ def create_all_databases(drop_first = false)
21
24
  dbh = get_nodb_handle
22
- Dir.directories(@data_directory).each {|entry| create_one_database(dbh, entry, entry, drop_first)}
25
+ Dir.directories(@data_directory).each {|elem| create_one_database(dbh, elem, elem, drop_first)}
26
+ end
27
+
28
+ def create_tables(database, drop_first, *table_and_view_names)
29
+ views, tables = table_and_view_names.flatten.sort.partition {|name| File.exist?(sql_filename(database, 'views', name))}
30
+ tables.each {|name| create_base_table(database, name, drop_first)}
31
+ views.each {|name| create_view(database, name, drop_first)}
23
32
  end
24
33
 
25
34
  private
@@ -29,34 +38,47 @@ private
29
38
  @connector.request_handle
30
39
  end
31
40
 
32
- def create_one_database(dbh, dest_db, source_db, drop_first)
33
- Doh::log.info("DohDb::DatabaseCreator - creating source database " + source_db + " inside " + dest_db)
34
- dbh.query("DROP DATABASE IF EXISTS " + dest_db) if drop_first
35
-
36
- dbh.query("CREATE DATABASE " + dest_db)
37
- load_sql_files('tables', source_db, dest_db)
38
- load_sql_files('insert_sql', source_db, dest_db)
39
-
40
- @connector.database = dest_db
41
- dbh.query("USE " + dest_db)
41
+ def sql_filename(database, subdir, name)
42
+ File.join(@data_directory, database, subdir, name) + '.sql'
42
43
  end
43
44
 
44
- def load_sql_files(subdir, source_db, dest_db)
45
+ def find_files(source_db, subdir, ext = '.sql')
45
46
  path = File.join(@data_directory, source_db, subdir)
46
47
  return [] unless File.exist?(path)
47
- filenames = Dir.entries(path).find_all {|entry| entry.size > 4 && entry[-4..-1] == '.sql'}.sort.collect {|one| File.join(path, one)}
48
+ Dir.entries(path).find_all {|entry| entry.ends_with(ext)}.sort.collect {|elem| File.join(path, elem)}
49
+ end
50
+
51
+ def view_files(source_db)
52
+ path = File.join(@data_directory, source_db, 'views')
53
+ return [] unless File.exist?(path)
54
+ ordered_filenames = YAML.load_file(File.join(path, 'order.yml')).collect {|uqfn| File.join(path, uqfn) + '.sql'}
55
+ ordered_filenames + (find_files(source_db, 'views') - ordered_filenames)
56
+ end
57
+
58
+ def create_base_table(database, table_name, drop_first)
59
+ DohDb::query("DROP TABLE IF EXISTS #{table_name}") if drop_first
60
+ files = [sql_filename(database, 'tables', table_name)]
61
+ inserts_file = sql_filename(database, 'insert_sql', table_name)
62
+ files.push(inserts_file) if File.exist?(inserts_file)
63
+ DohDb::load_sql_connector(files, DohDb::connector_instance)
64
+ end
48
65
 
49
- mysqlcmd = 'mysql' + mysql_arg(@connector.host, 'h') + mysql_arg(@connector.user, 'u') + mysql_arg(@connector.password, 'p') + ' ' + dest_db
50
- io = IO::popen(mysqlcmd, 'r+')
51
- filenames.each do |flnm|
52
- open(flnm) {|file| io << file.read}
53
- end
54
- io.close
66
+ def create_view(database, view_name, drop_first)
67
+ DohDb::query("DROP VIEW IF EXISTS #{view_name}") if drop_first
68
+ DohDb::load_sql_connector([sql_filename(database, 'views', view_name)], DohDb::connector_instance)
55
69
  end
56
70
 
57
- def mysql_arg(value, optkey)
58
- return '' if value.nil? || value.empty?
59
- ' -' + optkey + value
71
+ def create_one_database(dbh, dest_db, source_db, drop_first)
72
+ Doh::log.info("DohDb::DatabaseCreator - creating source database " + source_db + " inside " + dest_db)
73
+ dbh.query("DROP DATABASE IF EXISTS " + dest_db) if drop_first
74
+
75
+ dbh.query("CREATE DATABASE " + dest_db)
76
+ dbh.query("USE " + dest_db)
77
+ @connector.database = dest_db
78
+
79
+ files = find_files(source_db, 'tables') + find_files(source_db, 'insert_sql') + view_files(source_db)
80
+ DohDb::load_sql_connector(files, @connector, dest_db)
81
+ find_files(source_db, 'insert_scripts', '.rb').each {|filename| load(filename)}
60
82
  end
61
83
  end
62
84
 
@@ -0,0 +1,28 @@
1
+ require 'date'
2
+ require 'doh/mysql/to_sql'
3
+
4
+ module DohDb
5
+
6
+ class DateToday < Date
7
+ def to_sql
8
+ 'CURDATE()'
9
+ end
10
+ end
11
+
12
+ class DateTimeNow < DateTime
13
+ def to_sql
14
+ 'NOW()'
15
+ end
16
+ end
17
+
18
+ def self.today
19
+ day = Date.today
20
+ DateToday.new(day.year, day.month, day.mday)
21
+ end
22
+
23
+ def self.now
24
+ dt = DateTime.now
25
+ DateTimeNow.new(dt.year, dt.month, dt.mday, dt.hour, dt.min, dt.sec)
26
+ end
27
+
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'doh/mysql/to_sql'
2
+ require 'singleton'
3
+
4
+ module DohDb
5
+
6
+ class NullDatabaseValue
7
+ include Singleton
8
+
9
+ def empty?
10
+ true
11
+ end
12
+
13
+ def to_s
14
+ ''
15
+ end
16
+
17
+ def to_sql
18
+ 'NULL'
19
+ end
20
+ end
21
+
22
+ NULL = NullDatabaseValue.instance
23
+
24
+ end
@@ -23,32 +23,30 @@ class Handle
23
23
  end
24
24
 
25
25
  def query(statement)
26
- sqlstr = statement.to_s
27
- Doh::log.info(sqlstr)
28
- @mysqlh.query(sqlstr)
29
- rescue Exception => excpt
30
- Doh::log.error("caught exception during query: #{sqlstr}", excpt)
31
- raise
26
+ generic_query(statement)
27
+ retval = @mysqlh.affected_rows
28
+ Doh::log.info("affected #{retval} rows")
29
+ retval
32
30
  end
33
31
 
34
32
  def update(statement)
35
- query(statement)
33
+ generic_query(statement)
36
34
  retval = @mysqlh.affected_rows
37
35
  Doh::log.info("updated #{retval} rows")
38
36
  retval
39
37
  end
40
38
 
41
39
  def insert(statement)
42
- query(statement)
40
+ generic_query(statement)
43
41
  retval = @mysqlh.insert_id
44
42
  Doh::log.info("insert_id was #{retval}")
45
43
  retval
46
44
  end
47
45
 
48
46
  def select(statement, row_builder = nil)
49
- result_set = query(statement)
47
+ result_set = generic_query(statement)
50
48
  Doh::log.info("selected #{result_set.num_rows} rows")
51
- rows = (row_builder || @row_builder).new.build_rows(result_set)
49
+ rows = (row_builder || @row_builder.new).build_rows(result_set)
52
50
  result_set.free
53
51
  rows
54
52
  end
@@ -79,6 +77,16 @@ class Handle
79
77
  row = select_optional_row(statement, row_builder)
80
78
  row && row.at(0)
81
79
  end
80
+
81
+ private
82
+ def generic_query(statement)
83
+ sqlstr = statement.to_s
84
+ Doh::log.info(sqlstr)
85
+ @mysqlh.query(sqlstr)
86
+ rescue Exception => excpt
87
+ Doh::log.error("caught exception during query: #{sqlstr}", excpt)
88
+ raise
89
+ end
82
90
  end
83
91
 
84
92
  end
@@ -0,0 +1,22 @@
1
+ module DohDb
2
+
3
+ def self.mysql_arg(value, option_specifier)
4
+ return '' if value.to_s.strip.empty?
5
+ ' -' + option_specifier + value
6
+ end
7
+
8
+ def self.load_sql(filenames, host, username, password, database)
9
+ mysqlcmd = 'mysql' + mysql_arg(host, 'h') + mysql_arg(username, 'u') + mysql_arg(password, 'p') + ' ' + database
10
+ io = IO::popen(mysqlcmd, 'r+')
11
+ filenames.each do |elem|
12
+ open(elem) {|file| io << file.read}
13
+ end
14
+ io.close
15
+ end
16
+
17
+ def self.load_sql_connector(filenames, connector, alternate_database = nil)
18
+ load_sql(filenames, connector.host, connector.username, connector.password, alternate_database || connector.database)
19
+ end
20
+
21
+ end
22
+
@@ -14,6 +14,7 @@ def self.parse_bool(str)
14
14
  end
15
15
 
16
16
  def self.parse_datetime(str)
17
+ raise ArgumentError.new("unexpected value: " + str) unless str.size == 19
17
18
  DateTime.parse(str)
18
19
  end
19
20
 
@@ -42,6 +42,12 @@ class ReadOnlyRow
42
42
  to_h.inspect
43
43
  end
44
44
 
45
+ def each_pair
46
+ @keys.size.times do |index|
47
+ yield(@keys.at(index), @values.at(index))
48
+ end
49
+ end
50
+
45
51
  undef id
46
52
  def method_missing(sym, *ignore)
47
53
  key = sym.to_s
data/lib/doh/mysql.rb CHANGED
@@ -2,4 +2,3 @@ require 'doh/mysql/cache_connector'
2
2
  require 'doh/mysql/connector_instance'
3
3
  require 'doh/mysql/handle'
4
4
  require 'doh/mysql/to_sql'
5
- require 'doh/mysql/unquoted'
@@ -1,14 +1,16 @@
1
1
  require 'doh/logger_app'
2
- require 'doh/logger/notify_acceptor'
2
+ require 'doh/logger/email_acceptor'
3
3
 
4
4
  scheduler = DohLogger::DirectScheduler.new
5
5
  console_acceptor = DohLogger::IOStreamAcceptor.new
6
6
  logfile_name = "logger_sample_app.log"
7
7
  file_acceptor = DohLogger::IOStreamAcceptor.new(File.new(logfile_name, "wb"))
8
- notify_acceptor = DohLogger::NotifyAcceptor.new('mail.server.com', 'from@somebody.com', ['recipient_address@gmail.com'], logfile_name)
8
+ error_acceptor = DohLogger::EmailAcceptor.new('localhost', 'from@somebody.com', ['bulbous@gmail.com'], logfile_name)
9
+ notify_acceptor = DohLogger::EmailAcceptor.new('localhost', 'from@somebody.com', ['bulbous@gmail.com'], logfile_name, nil, DohLogger::exceptionless_email_format)
9
10
  intrfc = DohLogger::StandardInterface.new(scheduler)
10
11
  intrfc.add_acceptor(DohLogger::DEBUG, console_acceptor)
11
- intrfc.add_acceptor(DohLogger::ERROR, notify_acceptor)
12
+ intrfc.add_acceptor(DohLogger::ERROR, error_acceptor)
13
+ intrfc.add_acceptor(DohLogger::NOTIFY, notify_acceptor, true)
12
14
  intrfc.add_acceptor(DohLogger::DEBUG, file_acceptor)
13
15
  Doh::set_logger_interface(intrfc)
14
16
 
@@ -16,3 +18,4 @@ Doh::log.debug("hello")
16
18
  Doh::log.info("hello\nagain")
17
19
  Doh::log.info("something else")
18
20
  Doh::log.error("uh oh badness!")
21
+ Doh::log.notify("let me know about this")
@@ -10,10 +10,13 @@ module Doh
10
10
  class TC_Acceptor < Test::Unit::TestCase
11
11
  def setup
12
12
  @ios = StringIO.new
13
+ @ios2 = StringIO.new
13
14
  @sched = DohLogger::DirectScheduler.new
14
15
  @acceptor = DohLogger::IOStreamAcceptor.new(@ios, '%msg', '%msg error')
16
+ @acceptor2 = DohLogger::IOStreamAcceptor.new(@ios2, '%msg', '%msg error')
15
17
  @interface = DohLogger::StandardInterface.new(@sched)
16
18
  @interface.add_acceptor(DohLogger::DEBUG, @acceptor)
19
+ @interface.add_acceptor(DohLogger::WARN, @acceptor2, true)
17
20
  end
18
21
 
19
22
  def test_log
@@ -26,6 +29,9 @@ class TC_Acceptor < Test::Unit::TestCase
26
29
  assert_equal('warn1', events[1])
27
30
  assert_equal('error1 error', events[2])
28
31
  assert_equal('fatal1 error', events[3])
32
+ events2 = @ios2.string.split("\n")
33
+ assert_equal('warn1', events2[0])
34
+ assert_equal(1, events2.size)
29
35
  end
30
36
  end
31
37
 
@@ -29,7 +29,7 @@ class TC_Formatter < Test::Unit::TestCase
29
29
  hsh = format_output_to_hash(@formatter.replace(@event))
30
30
  assert_equal('debug', hsh['severity'])
31
31
  assert_equal('testmessage', hsh['msg'])
32
- assert_equal('', hsh['exception'])
32
+ assert_equal('NilClass -- ', hsh['exception'])
33
33
  assert_equal(@time + '.000', hsh['time'])
34
34
  assert_equal(@datetime + '.000', hsh['datetime'])
35
35
  assert_equal('formatter', hsh['call_stack'].split("\n")[0].before('.rb:').rafter('/'))
@@ -20,20 +20,23 @@ class TC_Interface < Test::Unit::TestCase
20
20
  @interface.debug("debug1")
21
21
  @interface.info("info1")
22
22
  @interface.warn("warn1")
23
+ @interface.notify("notify1")
23
24
  @interface.error("error1")
24
25
  @interface.fatal("fatal1")
25
26
  @interface.error("error2_with_exception", RuntimeError.new("test runtime"))
26
27
  assert_equal('debug1', @all_acceptor.events[0].msg)
27
28
  assert_equal('info1', @all_acceptor.events[1].msg)
28
29
  assert_equal('warn1', @all_acceptor.events[2].msg)
29
- assert_equal('error1', @all_acceptor.events[3].msg)
30
- assert_equal('fatal1', @all_acceptor.events[4].msg)
31
- assert_equal('error2_with_exception', @all_acceptor.events[5].msg)
32
- assert_equal('test runtime', @all_acceptor.events[5].exception.to_s)
30
+ assert_equal('notify1', @all_acceptor.events[3].msg)
31
+ assert_equal('error1', @all_acceptor.events[4].msg)
32
+ assert_equal('fatal1', @all_acceptor.events[5].msg)
33
+ assert_equal('error2_with_exception', @all_acceptor.events[6].msg)
34
+ assert_equal('test runtime', @all_acceptor.events[6].exception.to_s)
33
35
 
34
36
  assert_equal('warn1', @warn_acceptor.events[0].msg)
35
- assert_equal('error1', @warn_acceptor.events[1].msg)
36
- assert_equal('fatal1', @warn_acceptor.events[2].msg)
37
+ assert_equal('notify1', @warn_acceptor.events[1].msg)
38
+ assert_equal('error1', @warn_acceptor.events[2].msg)
39
+ assert_equal('fatal1', @warn_acceptor.events[3].msg)
37
40
  end
38
41
  end
39
42
 
@@ -13,7 +13,7 @@ class TC_CacheConnector < Test::Unit::TestCase
13
13
 
14
14
  def test_stuff
15
15
  sharedcc = DohDb::connector_instance
16
- @cc = DohDb::CacheConnector.new(sharedcc.host, sharedcc.user, sharedcc.password, sharedcc.database, sharedcc.row_builder)
16
+ @cc = DohDb::CacheConnector.new(sharedcc.host, sharedcc.username, sharedcc.password, sharedcc.database, sharedcc.row_builder)
17
17
  @tbl = 'doh_mysql_cache_connector_stuff_test'
18
18
 
19
19
  create_table
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), 'db_unit_test')
2
+ require 'doh/mysql/hash_util'
3
+
4
+ module DohDb
5
+
6
+ class TC_HashUtil < Test::Unit::TestCase
7
+ def test_stuff
8
+ dbh = DohDb::request_handle
9
+ tbl = "doh_mysql_hashutil_stuff_test"
10
+ DohDb::query("CREATE TEMPORARY TABLE #{tbl} (field CHAR(30) NOT NULL, value CHAR(30) NOT NULL)")
11
+ DohDb::query("INSERT INTO #{tbl} SET field = 'some_name', value = 'some_value'")
12
+ DohDb::query("INSERT INTO #{tbl} SET field = 'other_name', value = 'matching_other_value'")
13
+ DohDb::query("INSERT INTO #{tbl} SET field = 'yet_another_name', value = 'strange_value'")
14
+ hash = DohDb::select_as_hash("SELECT field, value FROM #{tbl}")
15
+ DohDb::query("DROP TABLE #{tbl}")
16
+ assert_equal(hash['some_name'], 'some_value')
17
+ assert_equal(hash['other_name'], 'matching_other_value')
18
+ assert_equal(hash['yet_another_name'], 'strange_value')
19
+ end
20
+ end
21
+
22
+ end
23
+
@@ -11,12 +11,15 @@ class TC_Convert < Test::Unit::TestCase
11
11
  end
12
12
 
13
13
  def test_date
14
+ assert_raise(ArgumentError) {DohDb::parse_date('blah')}
14
15
  assert_equal(Date.new(2008,2,14), DohDb::parse_date('2008-02-14'))
15
16
  assert_raise(ArgumentError) {DohDb::parse_date('20080214')}
16
17
  assert_not_equal(Date.new(2008,2,14), DohDb::parse_date('2008-02-15'))
17
18
  end
18
19
 
19
20
  def test_datetime
21
+ assert_raise(ArgumentError) {DohDb::parse_date('blah')}
22
+ assert_raise(ArgumentError) {DohDb::parse_datetime('zzzzzzzzzzzzzzzzzzz')}
20
23
  assert_equal(DateTime.new(2008,2,14,10,20,30), DohDb::parse_datetime('2008-02-14 10:20:30'))
21
24
  assert_not_equal(DateTime.new(2008,2,14,10,20,30), DohDb::parse_datetime('2008-02-14 10:20:31'))
22
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dohruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.14
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Makani & Kem Mason
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-10 00:00:00 -06:00
12
+ date: 2008-05-21 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -49,12 +49,12 @@ files:
49
49
  - lib/doh/data.rb
50
50
  - lib/doh/logger
51
51
  - lib/doh/logger/direct_scheduler.rb
52
+ - lib/doh/logger/email_acceptor.rb
52
53
  - lib/doh/logger/event.rb
53
54
  - lib/doh/logger/formatter.rb
54
55
  - lib/doh/logger/interface.rb
55
56
  - lib/doh/logger/iostream_acceptor.rb
56
57
  - lib/doh/logger/memory_acceptor.rb
57
- - lib/doh/logger/notify_acceptor.rb
58
58
  - lib/doh/logger/null_interface.rb
59
59
  - lib/doh/logger/severity.rb
60
60
  - lib/doh/logger/standard_interface.rb
@@ -65,17 +65,20 @@ files:
65
65
  - lib/doh/mysql/cache_connector.rb
66
66
  - lib/doh/mysql/connector_instance.rb
67
67
  - lib/doh/mysql/connector_util.rb
68
+ - lib/doh/mysql/current_date.rb
68
69
  - lib/doh/mysql/database_creator.rb
70
+ - lib/doh/mysql/db_date.rb
71
+ - lib/doh/mysql/db_null.rb
69
72
  - lib/doh/mysql/default_type_guesser.rb
70
73
  - lib/doh/mysql/error.rb
71
74
  - lib/doh/mysql/handle.rb
72
75
  - lib/doh/mysql/hash_util.rb
76
+ - lib/doh/mysql/load_sql.rb
73
77
  - lib/doh/mysql/parse.rb
74
78
  - lib/doh/mysql/raw_row_builder.rb
75
79
  - lib/doh/mysql/readonly_row.rb
76
80
  - lib/doh/mysql/to_sql.rb
77
81
  - lib/doh/mysql/typed_row_builder.rb
78
- - lib/doh/mysql/unquoted.rb
79
82
  - lib/doh/mysql.rb
80
83
  - lib/doh/unit_test.rb
81
84
  - lib/doh/util
@@ -103,6 +106,7 @@ files:
103
106
  - test/mysql/tc_cache_connector.rb
104
107
  - test/mysql/tc_connector_instance.rb
105
108
  - test/mysql/tc_handle.rb
109
+ - test/mysql/tc_hash_util.rb
106
110
  - test/mysql/tc_parse.rb
107
111
  - test/mysql/tc_readonly_row.rb
108
112
  - README
@@ -146,5 +150,6 @@ test_files:
146
150
  - test/mysql/tc_cache_connector.rb
147
151
  - test/mysql/tc_connector_instance.rb
148
152
  - test/mysql/tc_handle.rb
153
+ - test/mysql/tc_hash_util.rb
149
154
  - test/mysql/tc_parse.rb
150
155
  - test/mysql/tc_readonly_row.rb
@@ -1,12 +0,0 @@
1
- module DohDb
2
-
3
- class Unquoted < String
4
- def to_sql
5
- to_s
6
- end
7
- end
8
-
9
- NOW = Unquoted.new('NOW()')
10
- CURDATE = Unquoted.new('CURDATE()')
11
- TODAY = CURDATE
12
- end