ass_maintainer-info_base 0.1.2 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76b566844f8ecfe1c6f46a8683ecd5c976683ada
4
- data.tar.gz: 241193394974bbb8e83bb51c585cccfce7bbe659
3
+ metadata.gz: 50e50193d3052bdea87880539a64bc138c7e2081
4
+ data.tar.gz: '03469ca21025660f741ea514e2dec991f86d14fa'
5
5
  SHA512:
6
- metadata.gz: a9d32a901ca070a19b7bac6a4f06accfdd4b4dee60014e38d4bd6267a106b59c7a99303a6f989b64dcc907ab4ed7eaa6cb89df1545e0e8ef800866ddcf88b153
7
- data.tar.gz: 663ae4abd9c6da3999ffa7bd19a623c05c2fd60787a4e0aadc0d511e8cf3651477ee0352b6848f2ceb2ee8ba321a992f32940b543c624005118ecd466be44a6b
6
+ metadata.gz: 2db4da3e0a521d58b5ffe3f90bf5e0e41932f0d3cad9fb2ba995d9356d7bc31aa52010c64118ed83b995ae72c63e4fa631f8191bf1811aef273e8df91acefe2d
7
+ data.tar.gz: bfa963a1384e6135faa8024fd4ca125adf7250b0f8cffb253a4b15b64f1fab8de1140a5fdb4179a257cb43f010f45f4413eff3ff0538734bdf28f8550fc57e0b
data/.gitignore CHANGED
File without changes
data/.simplecov CHANGED
File without changes
data/.travis.yml CHANGED
File without changes
data/Gemfile CHANGED
File without changes
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
@@ -1,18 +1,36 @@
1
1
  # AssMaintainer::InfoBase
2
2
 
3
+ Gem for juggle with the [1C:Enterprise](http://1c.ru) application instances
4
+ (aka infobase or information base) as easy as possible.
5
+ Main thing of this gem is the class `AssMaintainer::InfoBase` which provides
6
+ features to do it.
3
7
 
4
- Gem provides features for manipulate with 1C:Enterprise applications as easy
5
- as possible.
8
+ In this gem defined two types of 1C application instance:
6
9
 
7
- Main thing of this gem `class AssMaintainer::InfoBase` provides
8
- some methods for manipulate with information base;
10
+ 1. application deployed on a 1C:Enterprise application server aka *server infobase*
11
+ 2. application deployed as a file aka *file infobase*
9
12
 
10
- ## Realase note
13
+ Class `AssMaintainer::InfoBase` implements both types of applications but using
14
+ difference mixins for each of them in constructor. Type of application,
15
+ detects per type of [connection string](https://github.com/leoniv/ass_launcher/blob/master/lib/ass_launcher/support/connection_string.rb).
11
16
 
12
- ### v.0.1.0
17
+ ## Restriction
13
18
 
14
- - Not support infobases deployed on 1C:Enterprise server
15
- - Not support configuration extensions
19
+ Fully work with server infobse possible in Windows(Cygwin)
20
+ x86 Ruby only. Cause of this is in-process OLE server `V83.COMConnector` which
21
+ used for connect to 1C:Enterprise application server when require check for
22
+ infobase exist or get infobase sessions or drop infobase or etc. actions.
23
+
24
+ Furthermore, for fully working with server infobse require logging on a
25
+ 1C:Enterprise application server as a central-server administrator and
26
+ as a cluster administrator.
27
+
28
+ Structure 1C:Enterprise application server is complex and confusing.
29
+ For more info about 1C:Enterprise server look 1C documentation.
30
+
31
+ Some examples for restrictions look in
32
+ [example](./test/ass_maintainer/examples_test.rb) defined as `Restrictions for`
33
+ spec
16
34
 
17
35
  ## Installation
18
36
 
@@ -32,7 +50,7 @@ Or install it yourself as:
32
50
 
33
51
  ## Usage
34
52
 
35
- Small example:
53
+ ### Small example:
36
54
 
37
55
  ```ruby
38
56
  reqiure 'ass_maintainer/info_base'
@@ -43,30 +61,91 @@ reqiure 'ass_maintainer/info_base'
43
61
  connection_string = 'File="infobase_path";'
44
62
 
45
63
  # Get InfoBase instance
46
- ib = AssMaintainer::InfoBase.new('infobase_name', connection_string, read_only)
64
+ ib = AssMaintainer::InfoBase.new('infobase_name', connection_string)
47
65
 
48
66
  # Dump data
49
67
  ib.dump(dump_path)
50
68
 
51
-
52
69
  # As 1C application developer you should make dump of infobase configuration
53
70
 
54
71
  # Dump configuration
55
72
  ib.cfg.dump(cf_dump_path)
56
73
 
57
74
  # ... etc
75
+ ```
76
+
77
+ ### Destructive actions protection
78
+
79
+ On default all instance of `AssMaintainer::InfoBase` marked as `read_only`. If
80
+ infobase is `read_only` all destructive actions denied,
81
+ `MethodDenied` exception will be raised. For control it behavior uses
82
+ `read_only` parameter of constructor.
58
83
 
84
+ ```ruby
85
+ ib = AssMaintainer::InfoBase.new('ib_name', 'File="path"')
86
+ ib.rm! :yes #raised AssMaintainer::InfoBase::MethodDenied
87
+
88
+ ib = AssMaintainer::InfoBase.new('ib_name', 'File="path"', false)
89
+ ib.rm! :yes #=> nil
59
90
  ```
60
91
 
92
+ ### Define 1C:Enterprise version requirement
93
+
94
+ On default using last installed 1C:Enterprise version. But
95
+ `AssMaintainer::InfoBase` provides feature for define 1C:Enterprise version
96
+ manually.
97
+
98
+ Example for define 1C:Enterprise platform requirement
99
+
100
+ ```ruby
101
+ # Define platform version for single instance
102
+ ib = AssMaintainer::InfoBase.new('ib_name', 'File="path"', platform_require: '~> 8.3.10.0')
103
+ ib.platform_require #=> "~> 8.3.10.0"
104
+
105
+ # Define platform verion for all instances
106
+ AssMaintainer::InfoBase.configure do |conf|
107
+ conf.platform_require = '~> 8.3.9.0'
108
+ end
109
+
110
+ ib = AssMaintainer::InfoBase.new('ib_name', 'File="path"')
111
+ ib.platform_require #=> "~> 8.3.9.0"
112
+ ```
113
+
114
+ ### More examples
115
+
61
116
  For more examples see [examples](./test/ass_maintainer/examples_test.rb)
62
117
 
63
118
  ## Test
64
119
 
65
- For running tests require installs 1C:Enterprise platform version defined in constant
66
- `PLATFORM_REQUIRE` from
67
- [test_helper.rb](./test/test_helper.rb)
120
+ For execute all tests require 1C:Enterprise platform installed.
121
+ Version defined in constant `PLATFORM_REQUIRE` in
122
+ [platform_require.rb](./test/test_helper/platform_require.rb)
123
+
124
+ For execute server infobase tests defined in
125
+ [examples](./test/ass_maintainer/examples_test.rb) require:
126
+ - running 1C:Enterprise application server. Version defined in `PLATFORM_REQUIRE`
127
+ - running data base(DBMS) server suitable for 1C:Enterprise.
128
+
129
+ On default, server infobase tests skipped. For execute server infobase tests
130
+ require to pass server parameters in `ENV[ESRV_ENV]` like this:
131
+
132
+ ```
133
+ $export ESRV_ENV="--ragent user:pass@host:port \
134
+ --rmngr user:pass@host:port \
135
+ --dbms MSSQLServer \
136
+ --dbsrv user:pass@localhost\\sqlexpress"
137
+ ```
138
+
139
+ For running local 1C:Enterprise application server instance can use
140
+ [bin/runsrv](bin/runsrv):
141
+
142
+ $bin/runsrv -h
143
+
144
+ But `runsrv` running 1C server only! DBMS server must be already running manually
145
+
146
+ Running all tests:
68
147
 
69
- $export SIMPLECOV=YES && rake test
148
+ $bundler exec rake test SIMPLECOV=YES
70
149
 
71
150
  ## Development
72
151
 
data/Rakefile CHANGED
File without changes
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "ass_launcher", "~> 0.2.0"
22
+ spec.add_dependency "ass_launcher", "~> 0.3"
23
+ spec.add_dependency "ass_ole"
24
+ spec.add_dependency "net-ping", "~> 2.0.0"
23
25
 
24
26
  spec.add_development_dependency "bundler", "~> 1.10"
25
27
  spec.add_development_dependency "rake", "~> 10.0"
@@ -27,5 +29,6 @@ Gem::Specification.new do |spec|
27
29
  spec.add_development_dependency "pry"
28
30
  spec.add_development_dependency "simplecov"
29
31
  spec.add_development_dependency "mocha"
32
+ spec.add_development_dependency "clamp"
30
33
 
31
34
  end
data/bin/runsrv ADDED
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require_relative '../test/test_helper/platform_require'
5
+ require_relative '../test/test_helper/helper'
6
+ require 'net/ping/tcp'
7
+
8
+ module AssMaintainer::InfoBaseTest
9
+ module Tmp
10
+ SRVINFO = File.join Dir.tmpdir, "ass_maintainer_infobase_test.srvinfo"
11
+ end
12
+
13
+ module Server
14
+ PORT = '11540'
15
+ REGPORT = '11541'
16
+ RANGE = '11560:11591'
17
+ RAGENT_ADMIN = 'ragent'
18
+ RAGENT_PASS = '0000'
19
+ RMNGR_ADMIN = 'rmngr'
20
+ RMNGR_PASS = '1111'
21
+
22
+ class Ragent
23
+ BIN = 'ragent.exe'
24
+ attr_reader :platform_require, :port, :regport, :range
25
+
26
+ def initialize(platform_require, port = nil, regport = nil, range = nil)
27
+ @platform_require = platform_require
28
+ @port = port || PORT
29
+ @regport = regport || REGPORT
30
+ @range = range || RANGE
31
+ end
32
+
33
+ def thick
34
+ @thick ||= Helper.thicks(platform_require).last
35
+ end
36
+
37
+ def exists?
38
+ path && File.file?(path)
39
+ end
40
+
41
+ def path
42
+ return unless thick
43
+ @path ||= thick.path.class.new("#{thick.path.dirname}/#{BIN}")
44
+ end
45
+
46
+ def version
47
+ return unless exists?
48
+ thick.version
49
+ end
50
+
51
+ def srvinfo
52
+ return unless exists?
53
+ thick.path.class.new(@srvinfo).realpath.to_s
54
+ end
55
+
56
+ def args
57
+ ['-port', port,
58
+ '-regport', regport,
59
+ '-range', range,
60
+ '-agent',
61
+ '-d', srvinfo]
62
+ end
63
+
64
+ def cmd
65
+ path.to_s
66
+ end
67
+
68
+ def running?
69
+ tcp_ping.ping?
70
+ end
71
+
72
+ def tcp_ping
73
+ @tcp_ping ||= Net::Ping::TCP.new(host, port)
74
+ end
75
+
76
+ def host
77
+ 'localhost'
78
+ end
79
+
80
+ def run(srvinfo, make_admins_)
81
+ @srvinfo = srvinfo
82
+ fail "service on the tcp port `#{port}' is already running" if running?
83
+ fail "`#{BIN}' v#{version} isn't instaled!" unless exists?
84
+ Process.spawn "\"#{cmd}\" #{args.join(' ')}"
85
+ sleep(3)
86
+ make_admins if make_admins_
87
+ end
88
+
89
+ def runtime_new
90
+ Module.new do
91
+ is_ole_runtime :agent
92
+ end
93
+ end
94
+
95
+ def run_ole_runtime
96
+ require 'ass_ole'
97
+ self.class.like_ole_runtime runtime_new
98
+ ole_runtime_get.run "localhost:#{port}", platform_require
99
+ end
100
+
101
+ def make_admins
102
+ run_ole_runtime
103
+ make_rmngr_admin
104
+ make_ragent_admin
105
+ end
106
+
107
+ def make_ragent_admin
108
+ authenticateAgent('', '')
109
+ regAgentAdmin ragent_admin_get
110
+ end
111
+
112
+ def ragent_admin_get
113
+ ai = createClusterAdminInfo
114
+ ai.Name = RAGENT_ADMIN
115
+ ai.Password = RAGENT_PASS
116
+ ai.PasswordAuthAllowed = true
117
+ ai
118
+ end
119
+
120
+ def make_rmngr_admin
121
+ cl = cluster_get
122
+ Authenticate(cl, '', '')
123
+ regClusterAdmin(cl, cluster_admin_get)
124
+ end
125
+
126
+ def cluster_get
127
+ getClusters[0]
128
+ end
129
+
130
+ def cluster_admin_get
131
+ ai = createClusterAdminInfo
132
+ ai.Name = RMNGR_ADMIN
133
+ ai.Password = RMNGR_PASS
134
+ ai.PasswordAuthAllowed = true
135
+ ai
136
+ end
137
+ end
138
+
139
+ require 'clamp'
140
+ class CMD < Clamp::Command
141
+ def prepare_srv_info
142
+ FileUtils.rm_r Tmp::SRVINFO if File.exist? Tmp::SRVINFO
143
+ FileUtils.mkdir_p Tmp::SRVINFO
144
+ Tmp::SRVINFO
145
+ end
146
+
147
+ def exists?
148
+ ragent.exists?
149
+ end
150
+
151
+ def running?
152
+ ragent.running?
153
+ end
154
+
155
+ def ragent
156
+ @ragent ||= Ragent
157
+ .new(PLATFORM_REQUIRE, port, regport, range)
158
+ end
159
+ alias_method :ra, :ragent
160
+
161
+ def srvinfo_get
162
+ return prepare_srv_info if srvinfo == Tmp::SRVINFO
163
+ srvinfo || prepare_srv_info
164
+ end
165
+
166
+ def errno_enotempty_mess
167
+ "rm -r #{srvinfo}: Device or resource busy\n"\
168
+ "Cause of this: \n"\
169
+ " 1) other ragent.exe is running and locking srvinfo directory\n"\
170
+ " 2) other rmngr.exe is running and locking srvinfo directory\n"\
171
+ "Kill suitable ragent.exe and rmngr.exe processes and try again:\n"\
172
+ " #{netstat.join("\n ")}"
173
+ end
174
+
175
+ def netstat
176
+ `netstat -abn -p tcp`.force_encoding('ASCII-8BIT')
177
+ .split("\r\n"*2)
178
+ .map {|i| i.gsub(/\s+/, ' ')}
179
+ .select {|i| i =~ %r{LISTENING.+r(agent|mngr)\.exe}}
180
+ .sort_by {|i| i.split(" ").last}
181
+ end
182
+
183
+ def rmngr_host
184
+ `hostname`.strip
185
+ end
186
+
187
+ def ragent_usr
188
+ "#{Server::RAGENT_ADMIN}:#{Server::RAGENT_PASS}@" if make_admins?
189
+ end
190
+
191
+ def rmngr_usr
192
+ "#{Server::RMNGR_ADMIN}:#{Server::RMNGR_PASS}@" if make_admins?
193
+ end
194
+
195
+ def success_mess
196
+ "for pass ESRV_ENV to test execute:\n"\
197
+ "export ESRV_ENV=\"--ragent #{ragent_usr}#{ra.host}:#{ra.port} \\\n"\
198
+ " --rmngr #{rmngr_usr}#{rmngr_host}:#{ra.regport} \\\n"\
199
+ " --dbms YOUR_DBMS \\\n"\
200
+ " --dbsrv user:pass@your_dbms_host:port\""
201
+ end
202
+
203
+ def execute
204
+ signal_usage_error 'Run in cygwin or windows only!' if Helper.linux?
205
+ ragent.run(srvinfo_get, make_admins?)
206
+ puts success_mess
207
+ rescue RuntimeError => e
208
+ raise Clamp::ExecutionError.new(e.message, '', 1)
209
+ rescue Errno::ENOTEMPTY => e
210
+ raise Clamp::ExecutionError.new(errno_enotempty_mess, '', 1)
211
+ end
212
+
213
+ option '--port', 'PORT', 'ragent.exe tcp port', default: PORT do |s|
214
+ Integer(s)
215
+ end
216
+
217
+ option '--regport', 'PORT', 'rmngr.exe tcp port', default: REGPORT do |s|
218
+ Integer(s)
219
+ end
220
+
221
+ option '--range', 'FROM:TO', 'rphost.exe tcp ports range', default: RANGE do |s|
222
+ from, to = s.split(':')
223
+ "#{Integer(from)}:#{Integer(to)}"
224
+ end
225
+
226
+ parameter '[SRVINFO]', 'path to ragent.exe srvinfo directory', default: Tmp::SRVINFO do |s|
227
+ signal_usage_error "Path `#{s}' not found or isn't directory!" unless File.directory? s
228
+ s
229
+ end
230
+
231
+ option '--plist', :flag, 'show netstat for rphost.exe and rmngr.exe and exit' do
232
+ $stderr.puts netstat.join("\n")
233
+ exit 0
234
+ end
235
+
236
+ option '--[no-]make-admins', :flag, 'default admins for ragent.exe and rmngr.exe will be maked'
237
+ end
238
+ end
239
+ end
240
+
241
+ AssMaintainer::InfoBaseTest::Server::CMD.run
File without changes
@@ -7,26 +7,26 @@ module AssMaintainer
7
7
  # Class for manipulate with 1C:Enterprise application instance aka
8
8
  # +information base+ or +infobase+
9
9
  #
10
- # Instances of this class have dinamicly generated interfaece
10
+ # Instances of this class has dynamically generated interface
11
11
  #
12
12
  # 1C:Enterprise application may be deployed as file (aka file infobase) or
13
13
  # on a 1C:Enterprise server (aka server infobase). In the {#initialize}
14
- # instance of this class will be extended suitable module:
15
- # - server infobase instance will be extend module {ServerIb}
16
- # - file infobase instance will be exten module {FileIb}
14
+ # instance of will be extended by suitable module:
15
+ # - server infobase instance will be extended by {ServerIb} module
16
+ # - file infobase instance will be extended by {FileIb} module
17
17
  #
18
- # Both instance type inherits methods from {Interfaces::InfoBaseWrapper}
18
+ # Both instances types inherits methods from {Interfaces::InfoBase}
19
19
  #
20
- # All instances get methods wrappers for access to {#options} see
20
+ # All instances gets methods for access to {#options} see
21
21
  # {.build_options_wrapper}
22
22
  class InfoBase
23
23
  extend AssLauncher::Api
24
24
  require 'ass_maintainer/info_base/config'
25
25
  require 'ass_maintainer/info_base/interfaces'
26
+ require 'ass_maintainer/info_base/default_maker'
26
27
  require 'ass_maintainer/info_base/file_ib'
27
28
  require 'ass_maintainer/info_base/server_ib'
28
29
  require 'ass_maintainer/info_base/cfg'
29
- require 'ass_maintainer/info_base/default_maker'
30
30
 
31
31
  # :nodoc:
32
32
  class MethodDenied < StandardError
@@ -35,7 +35,7 @@ module AssMaintainer
35
35
  end
36
36
  end
37
37
 
38
- # Deafult port for connect to 1C:Enterprise serever agent
38
+ # Deafult port for connect to 1C:Enterprise server agent
39
39
  DEFAULT_SAGENT_PORT = '1540'
40
40
 
41
41
  # Hooks before and after make and remove infobase. Hooks may be passed as
@@ -57,25 +57,23 @@ module AssMaintainer
57
57
  destroyer: nil
58
58
  }
59
59
 
60
- # - +:latform_require+ Required 1C:Enterprise version
61
- # - +:agent_host+ Host name of 1C:Enterprise server agent
62
- # - +:agent_port+ TCP port of 1C:Enterprise server agent on
60
+ # - +:platform_require+ Required 1C:Enterprise version
61
+ # - +:sagent_host+ Host name of 1C:Enterprise server agent
62
+ # - +:sagent_port+ TCP port of 1C:Enterprise server agent on
63
63
  # default {DEFAULT_SAGENT_PORT}
64
- # - +:agent_usr+ Admin for 1C:Enterprise server agent
65
- # - +:agent_pwd+ Admin password for 1C:Enterprise server agent
66
- # - +:laster_usr+ Admin for 1C:Enterprise claster.
67
- # See {ServerIb#claster_usr}
68
- # - +:laster_pwd+ Pasword Admin for 1C:Enterprise claster.
69
- # See {ServerIb#claster_pwd}
70
- # - +:nlock_code+ Code for connect to locked infobase aka "/UC" parameter
64
+ # - +:sagent_usr+ Admin for 1C:Enterprise server agent
65
+ # - +:sagent_pwd+ Admin password for 1C:Enterprise server agent
66
+ # - +:cluster_usr+ Admin for 1C:Enterprise cluster.
67
+ # - +:cluster_pwd+ Pasword Admin for 1C:Enterprise cluster.
68
+ # - +:unlock_code+ Code for connect to locked infobase aka "/UC" parameter
71
69
  ARGUMENTS = {
72
70
  platform_require: nil,
73
71
  sagent_host: nil,
74
72
  sagent_port: nil,
75
73
  sagent_usr: nil,
76
74
  sagent_pwd: nil,
77
- claster_usr: nil,
78
- claster_pwd: nil,
75
+ cluster_usr: nil,
76
+ cluster_pwd: nil,
79
77
  unlock_code: nil
80
78
  }
81
79
 
@@ -105,7 +103,7 @@ module AssMaintainer
105
103
  # see {#initialize} +options+
106
104
  attr_reader :options
107
105
  # InfoBase is read only
108
- # destructive methods will be fail with {MethodDenied} error
106
+ # destructive methods fails with {MethodDenied} error
109
107
  attr_reader :read_only
110
108
  alias_method :read_only?, :read_only
111
109
 
@@ -117,7 +115,7 @@ module AssMaintainer
117
115
  @name = name
118
116
  @connection_string = self.class.cs(connection_string.to_s)
119
117
  @read_only = read_only
120
- @options = OPTIONS.merge(options)
118
+ @options = validate_options(options)
121
119
  case self.connection_string.is
122
120
  when :file then extend FileIb
123
121
  when :server then extend ServerIb
@@ -126,6 +124,13 @@ module AssMaintainer
126
124
  yield self if block_given?
127
125
  end
128
126
 
127
+ def validate_options(options)
128
+ _opts = options.keys - OPTIONS.keys
129
+ fail ArgumentError, "Unknown options: #{_opts}" unless _opts.empty?
130
+ OPTIONS.merge(options)
131
+ end
132
+ private :validate_options
133
+
129
134
  # Add hook. In all hook whill be passed +self+
130
135
  # @raise [ArgumentError] if invalid hook name or not block given
131
136
  # @param hook [Symbol] hook name
@@ -186,52 +191,6 @@ module AssMaintainer
186
191
  end
187
192
  private :rm_infobase!
188
193
 
189
- # Returns type of infobase
190
- # @return [Symbol] +:file+ or +:server+
191
- def is
192
- connection_string.is
193
- end
194
-
195
- # Check type of infobase
196
- # @param type [Symbol] +:file+ or +:server+
197
- def is?(type)
198
- connection_string.is?(type)
199
- end
200
-
201
- # Set user name
202
- def usr=(user_name)
203
- connection_string.usr = user_name
204
- end
205
-
206
- # User name
207
- # @return [String]
208
- def usr
209
- connection_string.usr
210
- end
211
-
212
- # Set locale
213
- # @param l [String] locale code +en+, +ru+ etc
214
- def locale=(l)
215
- connection_string.locale = l
216
- end
217
-
218
- # Get locale
219
- # @return [String]
220
- def locale
221
- connection_string.locale
222
- end
223
-
224
- # Set user password
225
- def pwd=(password)
226
- connection_string.pwd = password
227
- end
228
-
229
- # User password
230
- # @return [String]
231
- def pwd
232
- connection_string.pwd
233
- end
234
-
235
194
  # @return [AssLauncher::Enterprise::BinaryWrapper::ThickClient]
236
195
  def thick
237
196
  self.class.thicks(platform_require).last ||
@@ -318,7 +277,7 @@ module AssMaintainer
318
277
  # Returns instance for manipuate with
319
278
  # InfoBase database. If infobase not
320
279
  # exists returns nil
321
- # @return [Dbase nil]
280
+ # @return [DbCfg nil]
322
281
  def db_cfg
323
282
  @db_cfg ||= DbCfg.new(self) if exists?
324
283
  end
@@ -331,10 +290,57 @@ module AssMaintainer
331
290
  @cfg ||= Cfg.new(self) if exists?
332
291
  end
333
292
 
334
- require 'forwardable'
335
- extend Forwardable
336
- def_delegators :infobase_wrapper,
337
- *Interfaces::InfoBaseWrapper.instance_methods
293
+ # Returns type of infobase
294
+ # @return [Symbol] +:file+ or +:server+
295
+ def is
296
+ connection_string.is
297
+ end
298
+
299
+ # Check type of infobase
300
+ # @param type [Symbol] +:file+ or +:server+
301
+ def is?(type)
302
+ connection_string.is?(type)
303
+ end
304
+
305
+ # Set user name
306
+ def usr=(user_name)
307
+ connection_string.usr = user_name
308
+ end
309
+ alias_method :user=, :usr=
310
+
311
+ # User name
312
+ # @return [String]
313
+ def usr
314
+ connection_string.usr
315
+ end
316
+ alias_method :user, :usr
317
+
318
+ # Set locale
319
+ # @param l [String] locale code +en+, +ru+ etc
320
+ def locale=(l)
321
+ connection_string.locale = l
322
+ end
323
+
324
+ # Get locale
325
+ # @return [String]
326
+ def locale
327
+ connection_string.locale
328
+ end
329
+
330
+ # Set user password
331
+ def pwd=(password)
332
+ connection_string.pwd = password
333
+ end
334
+ alias_method :password=, :pwd=
335
+
336
+ # User password
337
+ # @return [String]
338
+ def pwd
339
+ connection_string.pwd
340
+ end
341
+ alias_method :password, :pwd
342
+
343
+ include Interfaces::InfoBase
338
344
  end
339
345
  # rubocop:enable Metrics/ClassLength
340
346
  end