dohruby 0.1.14 → 0.1.15
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/CHANGELOG +15 -0
- data/lib/doh/core/date.rb +14 -0
- data/lib/doh/logger/{notify_acceptor.rb → email_acceptor.rb} +12 -4
- data/lib/doh/logger/formatter.rb +1 -1
- data/lib/doh/logger/null_interface.rb +1 -0
- data/lib/doh/logger/severity.rb +4 -3
- data/lib/doh/logger/standard_interface.rb +8 -4
- data/lib/doh/mysql/cache_connector.rb +5 -5
- data/lib/doh/mysql/connector_util.rb +1 -1
- data/lib/doh/mysql/current_date.rb +14 -0
- data/lib/doh/mysql/database_creator.rb +49 -27
- data/lib/doh/mysql/db_date.rb +28 -0
- data/lib/doh/mysql/db_null.rb +24 -0
- data/lib/doh/mysql/handle.rb +18 -10
- data/lib/doh/mysql/load_sql.rb +22 -0
- data/lib/doh/mysql/parse.rb +1 -0
- data/lib/doh/mysql/readonly_row.rb +6 -0
- data/lib/doh/mysql.rb +0 -1
- data/test/logger/sample.rb +6 -3
- data/test/logger/tc_acceptor.rb +6 -0
- data/test/logger/tc_formatter.rb +1 -1
- data/test/logger/tc_interface.rb +9 -6
- data/test/mysql/tc_cache_connector.rb +1 -1
- data/test/mysql/tc_hash_util.rb +23 -0
- data/test/mysql/tc_parse.rb +3 -0
- metadata +9 -4
- data/lib/doh/mysql/unquoted.rb +0 -12
    
        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 | 
            -
             | 
| 6 | 
            -
               | 
| 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 || " | 
| 12 | 
            -
                @body_formatter = Formatter.new(body_format | 
| 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)
         | 
    
        data/lib/doh/logger/formatter.rb
    CHANGED
    
    | @@ -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")}
         | 
    
        data/lib/doh/logger/severity.rb
    CHANGED
    
    | @@ -3,9 +3,10 @@ module DohLogger | |
| 3 3 | 
             
            DEBUG = 0
         | 
| 4 4 | 
             
            INFO = 1
         | 
| 5 5 | 
             
            WARN = 2
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 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 {| | 
| 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, : | 
| 8 | 
            +
              attr_accessor :host, :username, :password, :database, :row_builder, :timeout
         | 
| 9 9 |  | 
| 10 | 
            -
              def initialize(host = nil,  | 
| 10 | 
            +
              def initialize(host = nil, username = nil, password = nil, database = nil, row_builder = nil)
         | 
| 11 11 | 
             
                @host = host
         | 
| 12 | 
            -
                @ | 
| 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  | 
| 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, @ | 
| 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 =  | 
| 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}")
         | 
| @@ -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( | 
| 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  | 
| 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  | 
| 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  | 
| 23 | 
            +
              def create_all_databases(drop_first = false)
         | 
| 21 24 | 
             
                dbh = get_nodb_handle
         | 
| 22 | 
            -
                Dir.directories(@data_directory).each {| | 
| 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  | 
| 33 | 
            -
                 | 
| 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  | 
| 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 | 
            -
                 | 
| 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 | 
            -
             | 
| 50 | 
            -
                 | 
| 51 | 
            -
                 | 
| 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  | 
| 58 | 
            -
                 | 
| 59 | 
            -
                 | 
| 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
         | 
    
        data/lib/doh/mysql/handle.rb
    CHANGED
    
    | @@ -23,32 +23,30 @@ class Handle | |
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 25 | 
             
              def query(statement)
         | 
| 26 | 
            -
                 | 
| 27 | 
            -
                 | 
| 28 | 
            -
                 | 
| 29 | 
            -
             | 
| 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 | 
            -
                 | 
| 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 | 
            -
                 | 
| 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 =  | 
| 47 | 
            +
                result_set = generic_query(statement)
         | 
| 50 48 | 
             
                Doh::log.info("selected #{result_set.num_rows} rows")
         | 
| 51 | 
            -
                rows = (row_builder || @row_builder | 
| 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 | 
            +
             | 
    
        data/lib/doh/mysql/parse.rb
    CHANGED
    
    
    
        data/lib/doh/mysql.rb
    CHANGED
    
    
    
        data/test/logger/sample.rb
    CHANGED
    
    | @@ -1,14 +1,16 @@ | |
| 1 1 | 
             
            require 'doh/logger_app'
         | 
| 2 | 
            -
            require 'doh/logger/ | 
| 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 | 
            -
             | 
| 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,  | 
| 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")
         | 
    
        data/test/logger/tc_acceptor.rb
    CHANGED
    
    | @@ -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 |  | 
    
        data/test/logger/tc_formatter.rb
    CHANGED
    
    | @@ -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('/'))
         | 
    
        data/test/logger/tc_interface.rb
    CHANGED
    
    | @@ -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(' | 
| 30 | 
            -
                assert_equal(' | 
| 31 | 
            -
                assert_equal(' | 
| 32 | 
            -
                assert_equal(' | 
| 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(' | 
| 36 | 
            -
                assert_equal(' | 
| 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. | 
| 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 | 
            +
             | 
    
        data/test/mysql/tc_parse.rb
    CHANGED
    
    | @@ -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. | 
| 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- | 
| 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
         |