rdomino 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rdomino.rb +32 -0
- data/lib/rdomino/1modules.rb +77 -0
- data/lib/rdomino/database.rb +380 -0
- data/lib/rdomino/database_collection.rb +43 -0
- data/lib/rdomino/database_directory.rb +20 -0
- data/lib/rdomino/database_library.rb +34 -0
- data/lib/rdomino/databases/testdb.rb +9 -0
- data/lib/rdomino/document.rb +112 -0
- data/lib/rdomino/document_collection.rb +41 -0
- data/lib/rdomino/item.rb +57 -0
- data/lib/rdomino/name.rb +9 -0
- data/lib/rdomino/richtext_item.rb +7 -0
- data/lib/rdomino/server.rb +22 -0
- data/lib/rdomino/session.rb +115 -0
- data/lib/rdomino/version.rb +3 -0
- data/lib/rdomino/view.rb +89 -0
- data/readme.rdoc +1 -0
- data/spec/helper.rb +1 -0
- data/spec/rdomino/database_directory_spec.rb +14 -0
- data/spec/rdomino/database_helper_spec.rb +17 -0
- data/spec/rdomino/database_spec.rb +111 -0
- data/spec/rdomino/datetime_spec.rb +12 -0
- data/spec/rdomino/document_collection_spec.rb +56 -0
- data/spec/rdomino/document_spec.rb +55 -0
- data/spec/rdomino/dxl_spec.rb +16 -0
- data/spec/rdomino/item_spec.rb +26 -0
- data/spec/rdomino/name_spec.rb +13 -0
- data/spec/rdomino/session_spec.rb +46 -0
- data/spec/rdomino/view_spec.rb +43 -0
- metadata +132 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
# Replicated
|
4
|
+
class DatabaseCollection
|
5
|
+
attr_reader :databases
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def create_by_path *db_strings
|
10
|
+
dbs = db_strings.flatten.map do |db_string|
|
11
|
+
Database.new( nil, db_string)
|
12
|
+
end
|
13
|
+
new dbs
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(databases)
|
18
|
+
@databases = databases
|
19
|
+
end
|
20
|
+
|
21
|
+
def each
|
22
|
+
@databases.each do |database|
|
23
|
+
yield database
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_all_documents_by_key(view,key)
|
28
|
+
@databases.each do |database|
|
29
|
+
database[view].get_all_documents_by_key(key).each do|doc|
|
30
|
+
yield database.server, doc
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(m,*args)
|
36
|
+
@databases.map do |database|
|
37
|
+
database.__send__(m,*args)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class DatabaseDirectory
|
4
|
+
include DomObject, Enumerable
|
5
|
+
def initialize(server,pattern=//)
|
6
|
+
@obj = Session.session.getdbdirectory(server)
|
7
|
+
@pattern = pattern
|
8
|
+
end
|
9
|
+
|
10
|
+
def each(pattern=nil)
|
11
|
+
db = @obj.getfirstdatabase(1247) # Any Notes database (NSF, NSG, or NSH file)
|
12
|
+
while db
|
13
|
+
yield(Database.new(nil,db)) if db.filepath.match(@pattern)
|
14
|
+
db = @obj.getnextdatabase
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class DatabaseLibrary
|
4
|
+
|
5
|
+
include Enumerable
|
6
|
+
attr_reader :database,:view
|
7
|
+
|
8
|
+
def initialize(db)
|
9
|
+
@database = Database.new(db)
|
10
|
+
@view = database.get_view("DS2000/all")
|
11
|
+
@databases = {}
|
12
|
+
@views = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(dbkey,key=nil)
|
16
|
+
unless @databases[dbkey]
|
17
|
+
doc = view.get_document_by_key(dbkey)
|
18
|
+
@databases[dbkey] = Database.new(database.server,doc.getItemValue("pathname")[0])
|
19
|
+
end
|
20
|
+
if key
|
21
|
+
unless @views[dbkey]
|
22
|
+
@views[dbkey] = @databases[dbkey].get_view("(DirSync-G2)")
|
23
|
+
puts "| init view in #{dbkey}"
|
24
|
+
end
|
25
|
+
@views[dbkey].get_document_by_key(key)
|
26
|
+
else
|
27
|
+
@databases[dbkey]
|
28
|
+
end
|
29
|
+
#Openbyreplicaid(byval server as string, byval replicaid as string) as variant
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class Document
|
4
|
+
|
5
|
+
include DomObject, Enumerable, DbDcDoc
|
6
|
+
|
7
|
+
def created
|
8
|
+
DateTime.strptime(obj.created,'%Y/%m/%d %H:%M:%S')
|
9
|
+
end
|
10
|
+
|
11
|
+
def replace(h)
|
12
|
+
# puts "#{@obj}.send #{m} #{args.inspect}"
|
13
|
+
h.each do |item,value|
|
14
|
+
@obj.replaceItemValue(item.to_s,value)
|
15
|
+
end
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(item)
|
20
|
+
# puts "#{@obj}.send #{m} #{args.inspect}"
|
21
|
+
@obj.getItemValue(item.to_s)
|
22
|
+
end
|
23
|
+
|
24
|
+
def g(item)
|
25
|
+
get(item)[0]
|
26
|
+
end
|
27
|
+
|
28
|
+
def form
|
29
|
+
getItemValue('Form')[0]
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns array of changed items
|
33
|
+
def update_attributes(h)
|
34
|
+
changed = []
|
35
|
+
h.each do |key,value|
|
36
|
+
unless g(key) == value
|
37
|
+
changed << "#{key}:#{ self.g(key) }->#{value}"
|
38
|
+
@obj.replaceItemValue(key.to_s, value)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
unless changed.empty?
|
42
|
+
save
|
43
|
+
changed.join(', ')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
def pp(by_type=nil)
|
49
|
+
if @obj
|
50
|
+
puts "\n#{self.getItemValue('Form')[0]}"
|
51
|
+
puts " %-22s %-32s" % ['id',id]
|
52
|
+
puts " %-22s %-32s" % ['unid',unid]
|
53
|
+
items = self.items.map{|i| [i.name,i.type,i.text]}.sort_by{|a| ( by_type ? a[1].to_s : "" )+a[0] }
|
54
|
+
items.each do |i|
|
55
|
+
puts " %-22s %-10s %-30s" % i
|
56
|
+
end
|
57
|
+
else
|
58
|
+
puts "empty!"
|
59
|
+
end
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def items
|
64
|
+
@obj.items.map{|i| Item.new(i)}
|
65
|
+
end
|
66
|
+
|
67
|
+
def find_or_create_item(i)
|
68
|
+
replace i => '' unless obj.hasitem i.to_s
|
69
|
+
self.[](i)
|
70
|
+
end
|
71
|
+
|
72
|
+
def [](itemname)
|
73
|
+
Item.new(@obj.getfirstitem(itemname.to_s))
|
74
|
+
end
|
75
|
+
|
76
|
+
def copy_to_database(destination) #as notesdocument
|
77
|
+
Document.new( obj.CopyToDatabase(destination.obj) )
|
78
|
+
end
|
79
|
+
|
80
|
+
def move_to_database(destination)
|
81
|
+
target = copy_to_database(destination)
|
82
|
+
obj.remove(true)
|
83
|
+
target
|
84
|
+
end
|
85
|
+
|
86
|
+
def create_empty_fields(fields)
|
87
|
+
changed = 0
|
88
|
+
fields.each do |field|
|
89
|
+
unless @obj.hasItem(field)
|
90
|
+
@obj.replaceItemValue(field,'')
|
91
|
+
changed += 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
save if changed > 0
|
95
|
+
changed
|
96
|
+
end
|
97
|
+
|
98
|
+
def save( force=true, make_response=false )
|
99
|
+
@obj.save(force, make_response)
|
100
|
+
end
|
101
|
+
|
102
|
+
def id
|
103
|
+
obj.noteid
|
104
|
+
end
|
105
|
+
|
106
|
+
def unid
|
107
|
+
obj.universalid
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class DocumentCollection
|
4
|
+
include DomObject, Enumerable, DcView, DbDcDoc
|
5
|
+
def initialize(o)
|
6
|
+
@obj = o
|
7
|
+
end
|
8
|
+
|
9
|
+
def first
|
10
|
+
Document.new(@obj.getfirstdocument )
|
11
|
+
end
|
12
|
+
|
13
|
+
def last
|
14
|
+
Document.new(@obj.getlastdocument )
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_attributes( hash )
|
18
|
+
message = hash.map { |k,v| "FIELD #{k}:=#{v}"}.join("; ")
|
19
|
+
if obj.count == 0
|
20
|
+
0
|
21
|
+
elsif ask("Should I stamp #{obj.count} Documents in #{obj.parent.title} () ? (y/n)") == "y"
|
22
|
+
update_attributes!( hash )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def each_limit(limit=2)
|
27
|
+
each_with_index do |doc,index|
|
28
|
+
break if index >= limit
|
29
|
+
yield doc
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_attributes!( hash )
|
34
|
+
hash.each do |k,v|
|
35
|
+
obj.stampall(k.to_s, v )
|
36
|
+
end
|
37
|
+
obj.count
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/lib/rdomino/item.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class Item
|
4
|
+
include DomObject
|
5
|
+
TYPES = {16 => :actioncd,
|
6
|
+
17 => :assistantinfo,
|
7
|
+
1084 => :attachment,
|
8
|
+
1076 => :authors,
|
9
|
+
2 => :collation,
|
10
|
+
1024 => :datetimes,
|
11
|
+
1090 => :embeddedobject,
|
12
|
+
256 => :erroritem,
|
13
|
+
1536 => :formula,
|
14
|
+
21 => :html,
|
15
|
+
6 => :icon,
|
16
|
+
20 => :lsobject,
|
17
|
+
25 => :mime_part,
|
18
|
+
1074 => :names,
|
19
|
+
7 => :notelinks,
|
20
|
+
4 => :noterefs,
|
21
|
+
768 => :numbers,
|
22
|
+
1085 => :otherobject,
|
23
|
+
15 => :querycd,
|
24
|
+
1075 => :readers,
|
25
|
+
1282 => :rfc822text,
|
26
|
+
1 => :richtext,
|
27
|
+
8 => :signature,
|
28
|
+
1280 => :text,
|
29
|
+
512 => :unavailable,
|
30
|
+
0 => :unknown,
|
31
|
+
14 => :userdata,
|
32
|
+
1792 => :userid,
|
33
|
+
18 => :viewmapdata,
|
34
|
+
19 => :viewmaplayout}
|
35
|
+
|
36
|
+
def initialize(obj)
|
37
|
+
@obj = obj
|
38
|
+
end
|
39
|
+
|
40
|
+
def type
|
41
|
+
a = @obj.Type
|
42
|
+
TYPES[a] || a
|
43
|
+
end
|
44
|
+
|
45
|
+
def <<(s)
|
46
|
+
obj.AppendToTextList s
|
47
|
+
end
|
48
|
+
|
49
|
+
# RTELEM_TYPE_DOCLINK (5)
|
50
|
+
# RTELEM_TYPE_FILEATTACHMENT (8)
|
51
|
+
# RTELEM_TYPE_OLE (9)
|
52
|
+
# RTELEM_TYPE_SECTION (6)
|
53
|
+
# RTELEM_TYPE_TABLE (1)
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/lib/rdomino/name.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Rdomino
|
2
|
+
class Server
|
3
|
+
class << self
|
4
|
+
def [](a)
|
5
|
+
new(a)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# :days_ago
|
10
|
+
def log(pattern,time)
|
11
|
+
s = "Form='Events'"
|
12
|
+
@log.search(s,time).each{|d|
|
13
|
+
puts d.getItemValue("Eventlist").select{|line| line.match(pattern)}
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(server='BY0000')
|
18
|
+
@log = Session.get["#{server}!!log.nsf"]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module Rdomino
|
2
|
+
|
3
|
+
class Session
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
attr_reader :session
|
8
|
+
|
9
|
+
# This is the entrypoint to the library. Without a parameter it load the RAILS environment
|
10
|
+
# or the test environment
|
11
|
+
# * production,plog
|
12
|
+
# * development: !!imbeh/server/path
|
13
|
+
# * test: !!imbeh/test/server/path
|
14
|
+
#
|
15
|
+
# Session.get 'plog'
|
16
|
+
def get(env = ((defined? RAILS_ENV) ? RAILS_ENV.downcase : "test"), user=nil )
|
17
|
+
@session ||= begin
|
18
|
+
if env.kind_of? Symbol
|
19
|
+
user = env
|
20
|
+
env = "plog"
|
21
|
+
end
|
22
|
+
pw = prepare_notes_ini(user)
|
23
|
+
print "opening domino session in #{env} environment..."
|
24
|
+
s = WIN32OLE.new('Lotus.NotesSession')
|
25
|
+
s.Initialize( pw )
|
26
|
+
puts "#{s.commonUserName} logged in"
|
27
|
+
s
|
28
|
+
end
|
29
|
+
@singleton ||= new(env)
|
30
|
+
end
|
31
|
+
|
32
|
+
def reload!
|
33
|
+
env = @singleton.env
|
34
|
+
@singleton = @session = nil
|
35
|
+
get(env)
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare_notes_ini(user)
|
39
|
+
authentification = YAML.load_file(File.dirname(__FILE__)+"/../config/auth.yml")
|
40
|
+
unless user
|
41
|
+
return (respond_to?(:mypw) ? mypw : ask('Domino password ?') { |q| q.echo = '*' } )
|
42
|
+
end
|
43
|
+
authentification[:me][:pw] = mypw
|
44
|
+
content = nil
|
45
|
+
File.open( authentification[:notes_ini], 'r') { |f| content = f.readlines }
|
46
|
+
File.open( authentification[:notes_ini], 'w') do |f|
|
47
|
+
content.each do |line|
|
48
|
+
key = line.split('=')[0]
|
49
|
+
if authentification[user].keys.include?(key)
|
50
|
+
f.write("#{key}=#{authentification[user][key]}\n")
|
51
|
+
else
|
52
|
+
f.write(line)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
authentification[user][:pw]
|
57
|
+
end
|
58
|
+
|
59
|
+
def addressbooks
|
60
|
+
@addressbooks ||= session.Addressbooks.map{|db| Database.new(nil,db) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def private_addressbooks
|
64
|
+
addressbooks.select{|db| db.Isprivateaddressbook }
|
65
|
+
end
|
66
|
+
|
67
|
+
def locations
|
68
|
+
private_addressbooks[0].open!['search:form="Location"']
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
def initialize(env)
|
74
|
+
@env = env
|
75
|
+
@configuration = YAML.load_file(File.dirname(__FILE__)+"/../config/database.yml")
|
76
|
+
@configuration['test']={}
|
77
|
+
@configuration['development']={}
|
78
|
+
@configuration['production'].each do |k,v|
|
79
|
+
server = v.match(/^([^\/]*)/)[1]
|
80
|
+
path = v.split("!!")[1]
|
81
|
+
@configuration['test'][k] = "!!imbeh\\test\\#{server}\\#{path}" unless @configuration['test'][k]
|
82
|
+
@configuration['development'][k] = "!!imbeh\\#{server}\\#{path}" unless @configuration['development'][k]
|
83
|
+
end
|
84
|
+
@db_view_cache = {} #{ :testdb => { nil => db, :key => view, }, ....}
|
85
|
+
end
|
86
|
+
|
87
|
+
attr_reader :configuration, :env
|
88
|
+
# ses = Session.get "test"
|
89
|
+
# ses[:db], d['server!!path'] => Database
|
90
|
+
# ses[:db,:viewname], d[:name, 'All Documents'] => View
|
91
|
+
# Databases and views will be cached in @@db { :db { nil => LotusDatabase, :view => LotusView, .. }, ...}
|
92
|
+
def [](name, view=nil, key=nil)
|
93
|
+
if value = @db_view_cache[name]
|
94
|
+
db = value[nil]
|
95
|
+
else
|
96
|
+
db = Database.new(name,server_path(name))
|
97
|
+
value = @db_view_cache[name] = { nil => db}
|
98
|
+
end
|
99
|
+
unless cached = value[view]
|
100
|
+
view_string = ( view.kind_of?(Symbol) ? @configuration[name][view] : view )
|
101
|
+
cached = db[ view_string ]
|
102
|
+
@db_view_cache[name][view] = cached if view.kind_of?(Symbol)
|
103
|
+
end
|
104
|
+
( key ?
|
105
|
+
cached.get_document_by_key(key,true) :
|
106
|
+
cached )
|
107
|
+
end
|
108
|
+
|
109
|
+
def server_path(name)
|
110
|
+
name.kind_of?(Symbol) ? @configuration[@env][name] : name
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|