infopark_fiona_connector 6.8.0.beta.200.891.647580e
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/README +5 -0
- data/lib/comment.rb +4 -0
- data/lib/infopark_fiona_connector.rb +23 -0
- data/lib/rails_connector/attr_dict.rb +146 -0
- data/lib/rails_connector/attr_value_provider.bundle +0 -0
- data/lib/rails_connector/attr_value_provider.so +0 -0
- data/lib/rails_connector/attr_value_provider64.so +0 -0
- data/lib/rails_connector/attr_value_provider_loader.rb +11 -0
- data/lib/rails_connector/blob.rb +67 -0
- data/lib/rails_connector/blob_mysql.rb +42 -0
- data/lib/rails_connector/blob_oracle.rb +39 -0
- data/lib/rails_connector/cache_middleware.rb +13 -0
- data/lib/rails_connector/cms_base_model.rb +45 -0
- data/lib/rails_connector/date_attribute.rb +28 -0
- data/lib/rails_connector/default_search_request.rb +6 -0
- data/lib/rails_connector/errors.rb +8 -0
- data/lib/rails_connector/link.rb +135 -0
- data/lib/rails_connector/lucene_search_request.rb +107 -0
- data/lib/rails_connector/named_link.rb +76 -0
- data/lib/rails_connector/news.rb +16 -0
- data/lib/rails_connector/obj.rb +517 -0
- data/lib/rails_connector/permission.rb +41 -0
- data/lib/rails_connector/rack_middlewares.rb +6 -0
- data/lib/rails_connector/ses/verity_accessor.rb +130 -0
- data/lib/rails_connector/verity_search_request.rb +84 -0
- data/lib/rating.rb +2 -0
- metadata +149 -0
data/README
ADDED
data/lib/comment.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rails_connector/rack_middlewares'
|
2
|
+
require 'rails_connector/core_extensions'
|
3
|
+
require "rails_connector/errors"
|
4
|
+
|
5
|
+
module RailsConnector
|
6
|
+
def self.autoload_all_sources
|
7
|
+
source_files = Dir.glob(File.expand_path("../rails_connector/*.rb", __FILE__)).map do |file|
|
8
|
+
File.basename(file)
|
9
|
+
end
|
10
|
+
|
11
|
+
source_files.each do |file|
|
12
|
+
name = file.gsub(".rb", "")
|
13
|
+
autoload name.camelcase, "rails_connector/#{name}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
autoload_all_sources
|
18
|
+
|
19
|
+
autoload :AttrValueProvider, "rails_connector/attr_value_provider_loader"
|
20
|
+
end
|
21
|
+
|
22
|
+
autoload :Comment, "comment"
|
23
|
+
autoload :Rating, "rating"
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module RailsConnector
|
5
|
+
|
6
|
+
# The page related and custom data belonging to a CMS object
|
7
|
+
#
|
8
|
+
# [editor] The login of the current editor of the edited content, if set
|
9
|
+
#
|
10
|
+
# Any custom Attribute can be accessed directly or via [].
|
11
|
+
class AttrDict #:nodoc:
|
12
|
+
include DateAttribute
|
13
|
+
|
14
|
+
def initialize(object, keys_and_values = {}, defs = {})
|
15
|
+
@object = object
|
16
|
+
@blob_dict = keys_and_values.symbolize_keys
|
17
|
+
@attr_defs = defs.symbolize_keys
|
18
|
+
@attr_cache = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def empty?
|
22
|
+
@blob_dict.empty? && @attr_defs.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the title of the content - an HtmlString
|
26
|
+
def title
|
27
|
+
raw = @blob_dict[:title]
|
28
|
+
StringTagging.tag_as_html(raw, self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def sort_keys #:nodoc:
|
32
|
+
[sort_key1, sort_key2, sort_key3]
|
33
|
+
end
|
34
|
+
|
35
|
+
# The body attribute may contain binary data for Obj.binary? or be an HtmlString.
|
36
|
+
def body
|
37
|
+
if object.binary?
|
38
|
+
binary_body.data if binary_body
|
39
|
+
else
|
40
|
+
StringTagging.tag_as_html(textual_body, self)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def body_length
|
45
|
+
if binary_body
|
46
|
+
binary_body.length
|
47
|
+
elsif body
|
48
|
+
body.length
|
49
|
+
else
|
50
|
+
0
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Ensures the body data is in a file and returns its file system path.
|
55
|
+
def body_data_path
|
56
|
+
# TODO: Braucht/will jemand Text gestreamt?
|
57
|
+
return nil unless object.binary?
|
58
|
+
binary_body.path_of_stored_data(object.last_changed) if binary_body
|
59
|
+
end
|
60
|
+
|
61
|
+
def [](key)
|
62
|
+
send key
|
63
|
+
end
|
64
|
+
|
65
|
+
def permitted_groups
|
66
|
+
permission_live_server_read
|
67
|
+
rescue NoMethodError
|
68
|
+
[]
|
69
|
+
end
|
70
|
+
|
71
|
+
def permissions
|
72
|
+
@permissions ||= OpenStruct.new({ :live => permitted_groups })
|
73
|
+
end
|
74
|
+
|
75
|
+
def respond_to?(method_id, include_private=false)
|
76
|
+
super || has_attribute(method_id)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def object
|
82
|
+
@object
|
83
|
+
end
|
84
|
+
|
85
|
+
def blob_dict
|
86
|
+
@blob_dict
|
87
|
+
end
|
88
|
+
|
89
|
+
def attr_defs
|
90
|
+
@attr_defs
|
91
|
+
end
|
92
|
+
|
93
|
+
def textual_body
|
94
|
+
return nil if object.binary?
|
95
|
+
blob_dict[:blob]
|
96
|
+
end
|
97
|
+
|
98
|
+
def binary_body
|
99
|
+
return nil unless object.binary? && has_attribute(:blob)
|
100
|
+
@binary_body ||= Blob.find(blob)
|
101
|
+
rescue RailsConnector::ResourceNotFound
|
102
|
+
nil
|
103
|
+
end
|
104
|
+
|
105
|
+
def method_missing(method_id, *args)
|
106
|
+
raise NoMethodError.new("missing method - #{method_id}") unless args.empty?
|
107
|
+
return attribute_value(method_id.to_s)
|
108
|
+
rescue UnknownAttributeError
|
109
|
+
raise NoMethodError.new("missing method - #{method_id}")
|
110
|
+
end
|
111
|
+
|
112
|
+
def attribute_value(key)
|
113
|
+
raise UnknownAttributeError.new unless has_attribute(key)
|
114
|
+
|
115
|
+
key = key.to_sym
|
116
|
+
raw = blob_dict[key]
|
117
|
+
@attr_cache[key] ||= case type_of(key)
|
118
|
+
when :markdown
|
119
|
+
StringTagging.tag_as_markdown(raw, self)
|
120
|
+
when :html
|
121
|
+
StringTagging.tag_as_html(raw, self)
|
122
|
+
when :date
|
123
|
+
DateAttribute.parse raw if raw
|
124
|
+
when :linklist
|
125
|
+
LinkList.new(raw)
|
126
|
+
else
|
127
|
+
raw
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_attribute(key)
|
132
|
+
key = key.to_sym
|
133
|
+
!(blob_dict[key] || attr_defs[key]).nil?
|
134
|
+
end
|
135
|
+
|
136
|
+
def type_of(key)
|
137
|
+
key = key.to_sym
|
138
|
+
return :linklist if key == :text_links
|
139
|
+
attr_defs[key]['type'].to_sym rescue nil
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class UnknownAttributeError < StandardError # :nodoc:
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,11 @@
|
|
1
|
+
begin
|
2
|
+
require "rails_connector/attr_value_provider64"
|
3
|
+
rescue LoadError => e1
|
4
|
+
begin
|
5
|
+
require "rails_connector/attr_value_provider"
|
6
|
+
rescue LoadError => e2
|
7
|
+
raise "Could neither load attr_value_provider (#{e2.message}) " +
|
8
|
+
"nor attr_value_provider64 (#{e1.message})."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# A binary containing the blob data of a Content or CMS management
|
4
|
+
# data of Attribute (fields), ObjClass (object classes), for example.
|
5
|
+
class Blob < CmsBaseModel #:nodoc:
|
6
|
+
self.primary_key = "blob_name"
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# Does not retrieve the column blob_data.
|
10
|
+
def find_with_excluded_blob_data(*args)
|
11
|
+
args << Hash.new unless Hash === args.last
|
12
|
+
args.last[:select] = 'blob_name, blob_length'
|
13
|
+
find_without_excluded_blob_data(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
alias_method_chain :find, :excluded_blob_data
|
17
|
+
end
|
18
|
+
|
19
|
+
def length
|
20
|
+
blob_length
|
21
|
+
end
|
22
|
+
|
23
|
+
def data
|
24
|
+
@data ||= self.class.find_without_excluded_blob_data(id).blob_data
|
25
|
+
end
|
26
|
+
|
27
|
+
def path_of_stored_data(use_cached_file_if_older_than = Time.now)
|
28
|
+
store_data if !File.exists?(path) || use_cached_file_if_older_than > File.mtime(path)
|
29
|
+
path
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.cache_dir
|
33
|
+
File.join(Rails.root, %w(tmp cache))
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.initialize_blob_streaming_for(adapter_name)
|
37
|
+
# Redefines store_data:
|
38
|
+
case adapter_name
|
39
|
+
when /mysql/i:
|
40
|
+
require "rails_connector/blob_mysql"
|
41
|
+
include BlobMysql
|
42
|
+
when /oracle/i:
|
43
|
+
require "rails_connector/blob_oracle"
|
44
|
+
include BlobOracle
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def path
|
51
|
+
"#{Blob.cache_dir}/#{id}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def store_data
|
55
|
+
store_data_atomically do |f|
|
56
|
+
f << data
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def store_data_atomically(&block)
|
61
|
+
tmp_file = "#{path}.#{Process.pid}"
|
62
|
+
File.open(tmp_file, "w", &block)
|
63
|
+
File.rename(tmp_file, path)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mysql'
|
2
|
+
require 'mysql_blob_streaming'
|
3
|
+
|
4
|
+
module RailsConnector
|
5
|
+
|
6
|
+
module BlobMysql #:nodoc:
|
7
|
+
def self.included(base)
|
8
|
+
base.instance_eval do
|
9
|
+
define_method :store_data do
|
10
|
+
store_data_atomically {|f| fetch_into_file(f)}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def fetch_into_file(file)
|
16
|
+
mysql = connection.instance_variable_get '@connection'
|
17
|
+
stmt = mysql.prepare("SELECT blob_data FROM #{self.class.table_name} WHERE #{self.class.primary_key}=?")
|
18
|
+
|
19
|
+
class << stmt
|
20
|
+
include MysqlBlobStreaming
|
21
|
+
|
22
|
+
attr_accessor :file
|
23
|
+
attr_accessor :logger
|
24
|
+
|
25
|
+
def handle_data(data)
|
26
|
+
@file << data
|
27
|
+
data = nil
|
28
|
+
GC.start
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
stmt.logger = ActiveRecord::Base.logger
|
33
|
+
stmt.logger.debug "Streaming blob from MySQL into #{file.path}"
|
34
|
+
stmt.file = file
|
35
|
+
stmt.execute(id)
|
36
|
+
stmt.stream(1.megabyte)
|
37
|
+
ensure
|
38
|
+
stmt.close if stmt
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
module BlobOracle #:nodoc:
|
4
|
+
def self.included(base)
|
5
|
+
base.instance_eval do
|
6
|
+
define_method :store_data do
|
7
|
+
store_data_atomically {|f| fetch_into_file(f)}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def fetch_into_file(file)
|
13
|
+
blob = blob_handle
|
14
|
+
while data = blob.read(buff_size ||= 1.megabyte)
|
15
|
+
file << data
|
16
|
+
data = nil
|
17
|
+
GC.start
|
18
|
+
end
|
19
|
+
ensure
|
20
|
+
blob.close if blob
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def sql
|
26
|
+
%{
|
27
|
+
SELECT blob_data
|
28
|
+
FROM #{self.class.table_name}
|
29
|
+
WHERE #{self.class.primary_key} = :1
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def blob_handle
|
34
|
+
con = connection.instance_variable_get '@connection'
|
35
|
+
con.exec(sql, id).fetch.first
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# This is the abstract class from which all CMS models derive.
|
4
|
+
# The database connection is set to "infopark_rails_connector_${RAILS_ENV}" and the table prefix is
|
5
|
+
# determined from the instance_name.
|
6
|
+
#
|
7
|
+
# [instance_name] the name of the CMS instance
|
8
|
+
class CmsBaseModel < ActiveRecord::Base #:nodoc:
|
9
|
+
@@instance_name = 'default'
|
10
|
+
cattr_accessor :instance_name
|
11
|
+
self.abstract_class = true
|
12
|
+
|
13
|
+
def self.configure_database(db_connection_spec)
|
14
|
+
establish_connection(db_connection_spec)
|
15
|
+
Blob.initialize_blob_streaming_for(connection.adapter_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns :table_name_with_underscore. All CMS models use this kind of primary key naming.
|
19
|
+
def self.primary_key_prefix_type
|
20
|
+
:table_name_with_underscore
|
21
|
+
end
|
22
|
+
|
23
|
+
# CmsBaseModel and all of its descendants are model classes that can access CMS contents.
|
24
|
+
def self.cms_model?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def readonly?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
# The prefix of the table name is determined by using the instance name followed by an underscore.
|
34
|
+
# Set the instance_name in your environment to the CMS instance name (defaults to 'default').
|
35
|
+
#
|
36
|
+
# CmsBaseModel.instance_name = 'default'
|
37
|
+
#
|
38
|
+
# ActiveRecord::Base::primary_key_prefix_type has no effect here.
|
39
|
+
def table_name_prefix
|
40
|
+
@@instance_name.blank? ? '' : (@@instance_name + '_')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# Adds support for string columns which contain ISO dates
|
4
|
+
module DateAttribute #:nodoc: all
|
5
|
+
module ClassMethods
|
6
|
+
def date_attribute(*names)
|
7
|
+
names.each do |name|
|
8
|
+
module_eval %Q!
|
9
|
+
def #{name}
|
10
|
+
DateAttribute.parse(#{name}_before_type_cast) unless #{name}_before_type_cast.nil?
|
11
|
+
end
|
12
|
+
!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.extend(ClassMethods)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.parse(iso_date_time)
|
22
|
+
Time.from_iso(iso_date_time).localtime
|
23
|
+
rescue ArgumentError
|
24
|
+
raise "The value is not a valid ISO date time: #{iso_date_time.inspect}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|