Beispiel #1
0
 def tearDownClass(cls):
     # アカウント情報をもとにDBとユーザを削除
     if cls.db_server_connect:
         for connection in cls.connections:
             # cls.clientはpymongo経由でDB削除
             cls.client.drop_database(connection['database'])
             # cls.testdb.dbはedman側の接続オブジェクト経由でユーザ(自分自身)の削除
             db = DB(connection)
             testdb = db.get_db
             testdb.command("dropUser", connection['user'])
Beispiel #2
0
    def setUpClass(cls):
        # 設定読み込み
        settings = configparser.ConfigParser()
        settings.read(Path.cwd() / 'ini' / 'test_db.ini')
        cls.test_ini = dict([i for i in settings['DB'].items()])
        cls.test_ini['port'] = int(cls.test_ini['port'])

        # DB作成のため、pymongoから接続
        cls.client = MongoClient(cls.test_ini['host'], cls.test_ini['port'])

        # 接続確認
        try:
            cls.client.admin.command('ismaster')
            cls.db_server_connect = True
            print('Use DB.')
        except py_errors.ConnectionFailure:
            cls.db_server_connect = False
            print('Do not use DB.')

        if cls.db_server_connect:
            # adminで認証
            cls.client[cls.test_ini['admin_db']].authenticate(
                cls.test_ini['admin_user'], cls.test_ini['admin_password'])
            # DB作成
            cls.client[cls.test_ini['db']].command(
                "createUser",
                cls.test_ini['user'],
                pwd=cls.test_ini['password'],
                roles=[
                    {
                        'role': 'dbOwner',
                        'db': cls.test_ini['db'],
                    },
                ],
            )
            # ユーザ側認証
            cls.client[cls.test_ini['db']].authenticate(
                cls.test_ini['user'], cls.test_ini['password'])

            # edmanのDB接続オブジェクト作成
            con = {
                'host': cls.test_ini['host'],
                'port': cls.test_ini['port'],
                'database': cls.test_ini['db'],
                'auth_database': cls.test_ini['db'],
                'user': cls.test_ini['user'],
                'password': cls.test_ini['password']
            }
            db = DB(con)
            cls.testdb = db.get_db
            cls.search = Search(db)
        else:
            cls.search = Search()
Beispiel #3
0
    def test_admin_insert(self):
        if not self.db_server_connect:
            return

        # 管理者権限で各ユーザのDBに入力
        connections = copy.deepcopy(self.connections)
        test_results = {}
        for connection in connections:
            connection['auth_database'] = 'admin'
            connection['user'] = '******'
            connection['password'] = '******'
            db = DB(connection)
            insert_data = [
                {'test_admin_insert': {'database': connection['database']}}
            ]
            result = db.insert(insert_data)
            result_oid = result[0]['test_admin_insert'][0]
            # print(result_oid)  # debug
            test_results.update({connection['database']: result_oid})
        # print(test_results)  # debug

        # 各ユーザがDBからデータを取り出してテスト
        for connection in self.connections:
            db = DB(connection)
            result_doc = db.doc('test_admin_insert',
                                test_results[connection['database']],
                                None)
            # print(result_doc['database'], connection['database'])  # debug
            with self.subTest(connection=connection):
                self.assertEqual(result_doc['database'],
                                 connection['database'])
Beispiel #4
0
    def test_auth(self):
        if not self.db_server_connect:
            return

        # 自分のアカウントを利用して、他人のデータベースに接続する(失敗になる)

        dbnames = [connection['database'] for connection in self.connections]

        for connection in self.connections:
            # 自分以外のデータベース名のリストを作成
            tmp_dbnames = copy.deepcopy(dbnames)
            if connection['database'] in tmp_dbnames:
                tmp_dbnames.remove(connection['database'])

            # 他人のデータベースに接続を試みる
            for dbname in tmp_dbnames:
                tmp_connection = copy.deepcopy(connection)
                tmp_connection['database'] = dbname
                with self.assertRaises(SystemExit):
                    _ = DB(tmp_connection)
Beispiel #5
0
    description='特定コレクション内のembデータの特定のキーに対してref化を行うスクリプト')
parser.add_argument('collection')
parser.add_argument('pullout_key')
parser.add_argument('-e', '--exclusion_keys', nargs='*')
# parser.add_argument('-d', '--dir',
#                     help='Dir of report files.',
#                     default=None)
args = parser.parse_args()

# 結果を記録する場合はパスの存在を調べる
# if args.dir is not None:
#     p = Path(args.dir)
#     if not p.exists() and not p.is_dir():
#         sys.exit('パスが不正です')

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
exclusion = tuple(
    args.exclusion_keys if args.exclusion_keys is not None else [])
result = db.loop_exclusion_key_and_ref(args.collection, args.pullout_key,
                                       exclusion)

# 結果を保存する
# if args.dir is not None:
#     jm = JsonManager()
#     jm.save(result, args.dir, 'pullout', date=True)
Beispiel #6
0
# コマンドライン引数処理
parser = argparse.ArgumentParser(description='DBから検索したデータをコンバートしてDBに入れるスクリプト')
# parser.add_argument('-c', '--collection', help='collection name.')
parser.add_argument('objectid', help='objectid str.')
# parser.add_argument('-s', '--structure', default='ref',
#                     help='Select ref(Reference, default) or emb(embedded).')
parser.add_argument('new_collection', help='new collection name.')
args = parser.parse_args()

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
# 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと
collection = db.find_collection_from_objectid(args.objectid)

# 対象のドキュメントがrefかembかを調べる
# (ただし、子要素が存在しないドキュメントの場合は必ずembと表示される)
current_structure = db.get_structure(collection, args.objectid)
print(f'このドキュメントは {current_structure} 形式です')
structures = ['emb', 'ref']
structures.remove(current_structure)

while True:
    convert_selected = input(f'{structures[0]}に変更しますか? y/n(exit) >> ')
    if convert_selected == 'y':
        result = db.structure(collection, args.objectid, structures[0],
                              args.new_collection)
Beispiel #7
0
parser = argparse.ArgumentParser(description='ドキュメントの項目を削除するスクリプト')
# parser.add_argument('-c', '--collection', help='collection name.')
parser.add_argument('objectid', help='objectid str.')
# クエリは structureがembの時だけ
parser.add_argument('-q',
                    '--query',
                    default=None,
                    help='Ref is ObjectId or Emb is query list strings.')
args = parser.parse_args()

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)

# 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと
collection = db.find_collection_from_objectid(args.objectid)

# ドキュメント構造の取得
structure = db.get_structure(collection, args.objectid)

# クエリの変換
query = Action.file_query_eval(args.query, structure)

# ドキュメント取得
doc = db.doc(collection, args.objectid, query)
doc_keys = list(doc.keys())

# 項目を画面表示
Beispiel #8
0
parser.add_argument('-q',
                    '--query',
                    default=None,
                    help='Ref is ObjectId or Emb is query list strings.')
parser.add_argument('-c',
                    '--compress',
                    action='store_true',
                    help='gzip compress.Default is not compressed.')
args = parser.parse_args()

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
file = File(db.get_db)

# 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと
collection = db.find_collection_from_objectid(args.objectid)

# ドキュメント構造の取得
structure = db.get_structure(collection, args.objectid)

# クエリの変換
query = Action.file_query_eval(args.query, structure)

if file.add_file_reference(collection, args.objectid,
                           Action.files_read(args.path), structure, query,
                           args.compress):
    print('更新しました')
Beispiel #9
0
# 構造はrefかembのどちらか ※モジュール内でも判断できる
if not (args.structure == 'ref' or args.structure == 'emb'):
    parser.error("--structure requires 'ref' or 'emb'.")

# 結果を記録する場合はパスの存在を調べる
if args.result_dir is not None:
    p = Path(args.result_dir)
    if not p.exists() and not p.is_dir():
        sys.exit('パスが不正です')

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
jm = JsonManager()
convert = Convert()
json_files = Action.files_read(args.path, 'json')

for file in Action.file_gen(json_files):
    # Ednman用にjsonをコンバート
    converted_edman = convert.dict_to_edman(file, mode=args.structure)
    # コンバート結果を保存する場合
    # jm.save({'converted_edman': converted_edman}, args.result_dir,
    #         name='edman_json_list', date=True)

    # DBへインサート
    inserted_report = db.insert(converted_edman)

    if args.result_dir is not None:
Beispiel #10
0
parser.add_argument('-p', '--parent_depth', type=int, default=0)
parser.add_argument('-c', '--child_depth', type=int, default=0)
parser.add_argument('-o', '--out_file_name',
                    help='generate json, Name output file.',
                    default='search_result')
parser.add_argument('-d', '--dir', help='generate json file, dir path',
                    default='.')
args = parser.parse_args()
# クエリおよびクエリファイルはどちらかは必須
if not args.query and not args.query_file:
    parser.error("query or query_file is mandatory.")

# クエリ入力値変換
query = Action.query_eval(args.query if args.query else args.query_file.read())

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
search = Search(db)

# 検索
search_result = search.find(args.collection, query, args.parent_depth,
                            args.child_depth)

# 検索結果をjsonファイルとして保存
jm = JsonManager()
jm.save(search_result, args.dir, name=args.out_file_name, date=True)
Beispiel #11
0
from edman import DB

# Ctrl-Cを押下された時の対策
signal.signal(signal.SIGINT, lambda sig, frame: sys.exit('\n'))

# コマンドライン引数処理
parser = argparse.ArgumentParser(description='ドキュメントを削除するスクリプト')
# parser.add_argument('-c', '--collection', help='collection name.')
parser.add_argument('objectid', help='objectid str.')
args = parser.parse_args()

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

db = DB(con)
# 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと
collection = db.find_collection_from_objectid(args.objectid)

# 指定のドキュメントの文書構造を取得
structure = db.get_structure(collection, args.objectid)

# 削除処理
result = db.delete(args.objectid, collection, structure)

if result:
    print('削除成功')
else:
    print('削除失敗')
Beispiel #12
0
args = parser.parse_args()
# 構造はrefかembのどちらか
if not (args.structure == 'ref' or args.structure == 'emb'):
    parser.error("structure requires 'ref' or 'emb'.")

# iniファイル読み込み
settings = configparser.ConfigParser()
settings.read(Path.cwd() / 'ini' / 'db.ini')
con = dict([i for i in settings['DB'].items()])

# ファイル読み込み
try:
    amend_data = json.load(args.amend_file)
except json.JSONDecodeError:
    sys.exit(f'File is not json format.')
except IOError:
    sys.exit('file read error.')

#  DB接続
db = DB(con)

# 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと
collection = db.find_collection_from_objectid(args.objectid)

# アップデート処理
result = db.update(collection, args.objectid, amend_data, args.structure)
if result:
    print('アップデート成功')
else:
    print('アップデート失敗')