amalgalite 0.4.2-x86-mswin32-60

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.
Files changed (83) hide show
  1. data/HISTORY +81 -0
  2. data/LICENSE +29 -0
  3. data/README +40 -0
  4. data/bin/amalgalite-pack-into-db +155 -0
  5. data/examples/a.rb +9 -0
  6. data/examples/blob.rb +105 -0
  7. data/examples/bootstrap.rb +36 -0
  8. data/examples/gem-db.rb +94 -0
  9. data/examples/requires.rb +54 -0
  10. data/examples/schema-info.rb +34 -0
  11. data/ext/amalgalite3.c +201 -0
  12. data/ext/amalgalite3.h +121 -0
  13. data/ext/amalgalite3_blob.c +241 -0
  14. data/ext/amalgalite3_constants.c +221 -0
  15. data/ext/amalgalite3_database.c +550 -0
  16. data/ext/amalgalite3_requires_bootstrap.c +210 -0
  17. data/ext/amalgalite3_statement.c +628 -0
  18. data/ext/extconf.rb +19 -0
  19. data/ext/gen_constants.rb +130 -0
  20. data/ext/rbconfig-mingw.rb +178 -0
  21. data/ext/sqlite3.c +97092 -0
  22. data/ext/sqlite3.h +6364 -0
  23. data/ext/sqlite3_options.h +4 -0
  24. data/ext/sqlite3ext.h +372 -0
  25. data/gemspec.rb +55 -0
  26. data/lib/amalgalite.rb +33 -0
  27. data/lib/amalgalite/blob.rb +186 -0
  28. data/lib/amalgalite/boolean.rb +42 -0
  29. data/lib/amalgalite/column.rb +86 -0
  30. data/lib/amalgalite/core_ext/kernel/require.rb +14 -0
  31. data/lib/amalgalite/database.rb +514 -0
  32. data/lib/amalgalite/index.rb +43 -0
  33. data/lib/amalgalite/paths.rb +70 -0
  34. data/lib/amalgalite/profile_tap.rb +130 -0
  35. data/lib/amalgalite/requires.rb +112 -0
  36. data/lib/amalgalite/schema.rb +115 -0
  37. data/lib/amalgalite/sqlite3.rb +6 -0
  38. data/lib/amalgalite/sqlite3/constants.rb +82 -0
  39. data/lib/amalgalite/sqlite3/database/status.rb +69 -0
  40. data/lib/amalgalite/sqlite3/status.rb +61 -0
  41. data/lib/amalgalite/sqlite3/version.rb +38 -0
  42. data/lib/amalgalite/statement.rb +394 -0
  43. data/lib/amalgalite/table.rb +36 -0
  44. data/lib/amalgalite/taps.rb +2 -0
  45. data/lib/amalgalite/taps/console.rb +27 -0
  46. data/lib/amalgalite/taps/io.rb +71 -0
  47. data/lib/amalgalite/trace_tap.rb +35 -0
  48. data/lib/amalgalite/type_map.rb +63 -0
  49. data/lib/amalgalite/type_maps/default_map.rb +167 -0
  50. data/lib/amalgalite/type_maps/storage_map.rb +41 -0
  51. data/lib/amalgalite/type_maps/text_map.rb +23 -0
  52. data/lib/amalgalite/version.rb +37 -0
  53. data/lib/amalgalite/view.rb +26 -0
  54. data/lib/amalgalite3.so +0 -0
  55. data/spec/amalgalite_spec.rb +4 -0
  56. data/spec/blob_spec.rb +81 -0
  57. data/spec/boolean_spec.rb +23 -0
  58. data/spec/database_spec.rb +238 -0
  59. data/spec/default_map_spec.rb +87 -0
  60. data/spec/integeration_spec.rb +111 -0
  61. data/spec/paths_spec.rb +28 -0
  62. data/spec/schema_spec.rb +60 -0
  63. data/spec/spec_helper.rb +25 -0
  64. data/spec/sqlite3/constants_spec.rb +65 -0
  65. data/spec/sqlite3/database_status_spec.rb +36 -0
  66. data/spec/sqlite3/status_spec.rb +18 -0
  67. data/spec/sqlite3/version_spec.rb +14 -0
  68. data/spec/sqlite3_spec.rb +23 -0
  69. data/spec/statement_spec.rb +134 -0
  70. data/spec/storage_map_spec.rb +41 -0
  71. data/spec/tap_spec.rb +59 -0
  72. data/spec/text_map_spec.rb +23 -0
  73. data/spec/type_map_spec.rb +17 -0
  74. data/spec/version_spec.rb +9 -0
  75. data/tasks/announce.rake +39 -0
  76. data/tasks/config.rb +110 -0
  77. data/tasks/distribution.rake +53 -0
  78. data/tasks/documentation.rake +33 -0
  79. data/tasks/extension.rake +100 -0
  80. data/tasks/rspec.rake +32 -0
  81. data/tasks/rubyforge.rake +59 -0
  82. data/tasks/utils.rb +80 -0
  83. metadata +192 -0
@@ -0,0 +1,36 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ module Amalgalite
7
+ #
8
+ # a class representing the meta information about an SQLite table
9
+ #
10
+ class Table
11
+ # the schema object the table is associated with
12
+ attr_accessor :schema
13
+
14
+ # the table name
15
+ attr_reader :name
16
+
17
+ # the original sql that was used to create this table
18
+ attr_reader :sql
19
+
20
+ # hash of Index objects holding the meta informationa about the indexes
21
+ # on this table. The keys of the indexes variable is the index name
22
+ attr_accessor :indexes
23
+
24
+ # a hash of Column objects holding the meta information about the columns
25
+ # in this table. keys are the column names
26
+ attr_accessor :columns
27
+
28
+ def initialize( name, sql )
29
+ @name = name
30
+ @sql = sql
31
+ @indexes = {}
32
+ @columns = {}
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,2 @@
1
+ require 'amalgalite/taps/console'
2
+ require 'amalgalite/taps/io'
@@ -0,0 +1,27 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ require 'amalgalite/taps/io'
7
+
8
+ module Amalgalite::Taps
9
+ #
10
+ # Class provide an IO tap that can write to $stdout
11
+ #
12
+ class Stdout < ::Amalgalite::Taps::IO
13
+ def initialize
14
+ super( $stdout )
15
+ end
16
+ end
17
+
18
+ #
19
+ # This class provide an IO tap that can write to $stderr
20
+ #
21
+ class Stderr < ::Amalgalite::Taps::IO
22
+ def initialize
23
+ super( $stderr )
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,71 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ require 'amalgalite/profile_tap'
7
+ require 'stringio'
8
+
9
+ module Amalgalite
10
+ module Taps
11
+ #
12
+ # An IOTap is an easy way to send all top information to andy IO based
13
+ # object. Both profile and trace tap information can be captured
14
+ # This means you can send the events to STDOUT with:
15
+ #
16
+ # db.profile_tap = db.trace_tap = Amalgalite::Taps::Stdout.new
17
+ #
18
+ #
19
+ class IO
20
+
21
+ attr_reader :profile_tap
22
+ attr_reader :io
23
+
24
+ def initialize( io )
25
+ @io = io
26
+ @profile_tap = ProfileTap.new( self, 'output_profile_event' )
27
+ end
28
+
29
+ def trace( msg )
30
+ io.puts msg
31
+ end
32
+
33
+ # need a profile method, it routes through the profile tap which calls back
34
+ # to output_profile_event
35
+ def profile( msg, time )
36
+ @profile_tap.profile(msg, time)
37
+ end
38
+
39
+ def output_profile_event( msg, time )
40
+ io.puts "#{time} : #{msg}"
41
+ end
42
+
43
+ def dump_profile
44
+ samplers.each do |s|
45
+ io.puts s.to_s
46
+ end
47
+ end
48
+
49
+ def samplers
50
+ profile_tap.samplers
51
+ end
52
+ end
53
+
54
+ #
55
+ # This class provides an IO tap that writes to a StringIO. The result is
56
+ # available via .to_s or .string.
57
+ #
58
+ class StringIO < ::Amalgalite::Taps::IO
59
+ def initialize
60
+ @stringio = ::StringIO.new
61
+ super( @stringio )
62
+ end
63
+
64
+ def to_s
65
+ @stringio.string
66
+ end
67
+ alias :string :to_s
68
+ end
69
+ end
70
+ end
71
+
@@ -0,0 +1,35 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ module Amalgalite
7
+ #
8
+ # A TraceTap receives tracing information from SQLite3. It receives the SQL
9
+ # statement being executed as a +msg+ just before the statement first begins
10
+ # executing.
11
+ #
12
+ # A TraceTap is a wrapper around another object and a method. The Tap object
13
+ # will receive the call to +trace+ and redirect that call to another object
14
+ # and method.
15
+ #
16
+ class TraceTap
17
+
18
+ attr_reader :delegate_obj
19
+ attr_reader :delegate_method
20
+
21
+ def initialize( wrapped_obj, send_to = 'trace' )
22
+ unless wrapped_obj.respond_to?( send_to )
23
+ raise Amalgalite::Error, "#{wrapped_obj.class.name} does not respond to #{send_to.to_s} "
24
+ end
25
+
26
+ @delegate_obj = wrapped_obj
27
+ @delegate_method = send_to
28
+ end
29
+
30
+ def trace( msg )
31
+ delegate_obj.send( delegate_method, msg )
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,63 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+ module Amalgalite
6
+ ##
7
+ # TypeMap defines the protocol used between Ruby and SQLite for mapping
8
+ # binding types, used in prepared statements; and result types, used in
9
+ # returning objects from a query.
10
+ #
11
+ #
12
+ class TypeMap
13
+ ##
14
+ # :call-seq:
15
+ # map.bind_type_of( obj ) -> DataType constant
16
+ #
17
+ # bind_type_of is called during the Statement#bind process to convert the
18
+ # bind parameter to the appropriate SQLite types. This method MUST return
19
+ # one of the valid constants in the namespace
20
+ # Amalgalite::SQLite::Constants::DataType
21
+ #
22
+ def bind_type_of( obj )
23
+ raise NotImplementedError, "bind_type_of has not been implemented"
24
+ end
25
+
26
+ ##
27
+ # :call-seq:
28
+ # map.result_value_of( declared_type, value ) -> String
29
+ #
30
+ # result_value_of is called during the result processing of column values
31
+ # to convert an SQLite database value into the appropriate Ruby class.
32
+ #
33
+ # +declared_type+ is the string from the original CREATE TABLE statment
34
+ # from which the column value originates. It may also be nil if the origin
35
+ # column cannot be determined.
36
+ #
37
+ # +value+ is the SQLite value from the column as either a Ruby String,
38
+ # Integer, Float or Amalgalite::Blob.
39
+ #
40
+ # result_value should return the value that is to be put into the result set
41
+ # for the query. It may do nothing, or it may do massive amounts of
42
+ # conversion.
43
+ def result_value_of( delcared_type, value )
44
+ raise NotImplementedError, "result_value_of has not been implemented"
45
+ end
46
+ end
47
+
48
+ ##
49
+ # The TypeMaps module holds all typemaps that ship with Amagalite. They
50
+ # currently are:
51
+ #
52
+ # DefaultMap:: does a 'best-guess' mapping to convert as many types as
53
+ # possible to known ruby classes from known SQL types.
54
+ # StorageMap:: converts to a limited set of classes directly based
55
+ # upon the SQLite storage types
56
+ # TextMap:: Everything is Text ... everything everything everything
57
+ #
58
+ module TypeMaps
59
+ end
60
+ end
61
+ require 'amalgalite/type_maps/default_map'
62
+ require 'amalgalite/type_maps/storage_map'
63
+ require 'amalgalite/type_maps/text_map'
@@ -0,0 +1,167 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ require 'amalgalite/type_map'
7
+ require 'amalgalite3'
8
+ require 'time'
9
+ require 'date'
10
+
11
+ module Amalgalite::TypeMaps
12
+ ##
13
+ # An Amalgalite::TypeMap that does its best to convert between Ruby classes
14
+ # and known SQL data types.
15
+ #
16
+ # Upon instantiation, DefaultMap generates a conversion map to try to figure
17
+ # out the best way to convert between populate SQL 'types' and ruby classes
18
+ #
19
+ class DefaultMap
20
+ class << self
21
+ def methods_handling_sql_types # :nodoc:
22
+ @methods_handling_sql_types ||= {
23
+ 'date' => %w[ date ],
24
+ 'datetime' => %w[ datetime ],
25
+ 'time' => %w[ timestamp ],
26
+ 'float' => %w[ double real numeric decimal ],
27
+ 'integer' => %w[ integer tinyint smallint int int2 int4 int8 bigint serial bigserial ],
28
+ 'string' => %w[ text char varchar character ],
29
+ 'boolean' => %w[ bool boolean ],
30
+ 'blob' => %w[ binary blob ],
31
+ }
32
+ end
33
+
34
+ # say what method to call to convert an sql type to a ruby type
35
+ #
36
+ def sql_to_method( sql_type ) # :nodoc:
37
+ unless @sql_to_method
38
+ @sql_to_method = {}
39
+ methods_handling_sql_types.each_pair do |method, sql_types|
40
+ sql_types.each { |t| @sql_to_method[t] = method }
41
+ end
42
+ end
43
+ return_method = @sql_to_method[sql_type]
44
+
45
+ # the straight lookup didn't work, try iterating through the types and
46
+ # see what is found
47
+ unless return_method
48
+ @sql_to_method.each_pair do |sql, method|
49
+ if sql_type.index(sql) then
50
+ return_method = method
51
+ break
52
+ end
53
+ end
54
+ end
55
+ return return_method
56
+ end
57
+ end
58
+
59
+ def initialize
60
+ end
61
+
62
+ ##
63
+ # A straight logical mapping (for me at least) of basic Ruby classes to SQLite types, if
64
+ # nothing can be found then default to TEXT.
65
+ #
66
+ def bind_type_of( obj )
67
+ case obj
68
+ when Float
69
+ ::Amalgalite::SQLite3::Constants::DataType::FLOAT
70
+ when Fixnum
71
+ ::Amalgalite::SQLite3::Constants::DataType::INTEGER
72
+ when NilClass
73
+ ::Amalgalite::SQLite3::Constants::DataType::NULL
74
+ when ::Amalgalite::Blob
75
+ ::Amalgalite::SQLite3::Constants::DataType::BLOB
76
+ else
77
+ ::Amalgalite::SQLite3::Constants::DataType::TEXT
78
+ end
79
+ end
80
+
81
+ ##
82
+ # Map the incoming value to an outgoing value. For some incoming values,
83
+ # there will be no change, but for some (i.e. Dates and Times) there is some
84
+ # conversion
85
+ #
86
+ def result_value_of( declared_type, value )
87
+ case value
88
+ when Numeric
89
+ return value
90
+ when NilClass
91
+ return value
92
+ when Amalgalite::Blob
93
+ return value
94
+ when String
95
+ if declared_type then
96
+ conversion_method = DefaultMap.sql_to_method( declared_type.downcase )
97
+ if conversion_method then
98
+ return send(conversion_method, value)
99
+ else
100
+ raise ::Amalgalite::Error, "Unable to convert SQL type of #{declared_type} to a Ruby class"
101
+ end
102
+ else
103
+ # unable to do any other conversion, just return what we have.
104
+ return value
105
+ end
106
+ else
107
+ raise ::Amalgalite::Error, "Unable to convert a class #{value.class.name} with value #{value.inspect}"
108
+ end
109
+ end
110
+
111
+ ##
112
+ # convert a string to a date
113
+ #
114
+ def date( str )
115
+ Date.parse( str )
116
+ end
117
+
118
+ ##
119
+ # convert a string to a datetime
120
+ #
121
+ def datetime( str )
122
+ DateTime.parse( str )
123
+ end
124
+
125
+ ##
126
+ # convert a string to a Time
127
+ #
128
+ def time( str )
129
+ Time.parse( str )
130
+ end
131
+
132
+ ##
133
+ # convert a string to a Float
134
+ #
135
+ def float( str )
136
+ Float( str )
137
+ end
138
+
139
+ ##
140
+ # convert an string to an Integer
141
+ #
142
+ def integer( str )
143
+ Float( str ).to_i
144
+ end
145
+
146
+ ##
147
+ # convert a string to a String, yes redundant I know.
148
+ #
149
+ def string( str )
150
+ str
151
+ end
152
+
153
+ ##
154
+ # convert a string to true of false
155
+ #
156
+ def boolean( str )
157
+ ::Amalgalite::Boolean.to_bool( str )
158
+ end
159
+
160
+ ##
161
+ # convert a string to a blob
162
+ #
163
+ def blob( str )
164
+ ::Amalgalite::Blob.new( :string => str )
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyright (c) 2008 Jeremy Hinegardner
3
+ # All rights reserved. See LICENSE and/or COPYING for details.
4
+ #++
5
+
6
+ require 'amalgalite/type_map'
7
+ require 'amalgalite3'
8
+
9
+ module Amalgalite::TypeMaps
10
+ ##
11
+ # An Amalagliate TypeMap that has a one-to-one conversion between SQLite types
12
+ # and Ruby classes
13
+ #
14
+ class StorageMap < ::Amalgalite::TypeMap
15
+ ##
16
+ # A straight logical mapping (for me at least) of basic Ruby classes to SQLite types, if
17
+ # nothing can be found then default to TEXT.
18
+ #
19
+ def bind_type_of( obj )
20
+ case obj
21
+ when Float
22
+ ::Amalgalite::SQLite3::Constants::DataType::FLOAT
23
+ when Fixnum
24
+ ::Amalgalite::SQLite3::Constants::DataType::INTEGER
25
+ when NilClass
26
+ ::Amalgalite::SQLite3::Constants::DataType::NULL
27
+ when ::Amalgalite::Blob
28
+ ::Amalgalite::SQLite3::Constants::DataType::BLOB
29
+ else
30
+ ::Amalgalite::SQLite3::Constants::DataType::TEXT
31
+ end
32
+ end
33
+
34
+ ##
35
+ # Do no mapping, just return the value as it was retrieved from SQLite.
36
+ #
37
+ def result_value_of( delcared_type, value )
38
+ return value
39
+ end
40
+ end
41
+ end