2015-10-15 99 views
1

我将BaseX添加到现有的Web应用程序中,并且正在编写代码以将数据导入到该应用程序中。 documentation是清晰的,如何防止意外覆盖已经存在的数据库?

现有的数据库将被覆盖。

寻找这种行为mindboggingly危险,我试图与希望文档是错误的,但不幸的是我的测试证实了它。例如,使用basexclient我可以这样做:

> create db test 
Database 'test' created in 12.03 ms. 
> create db test 
Database 'test' created in 32.43 ms. 
> 

我也可以复制这种行为与Python client,这是我什么,我实际使用我的应用程序。减少我的代码来的要点:

session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin") 
session.create("test", "") 

不要紧test是否存在,如果存在的话,整个事情被覆盖。

我该如何解决这个危险的默认行为?我想避免在生产中出现失误的可能性。

回答

1

在创建数据库之前,您可以发出list command。例如使用命令行客户端,如果数据库不存在:

> list foo 
Database 'foo' was not found. 

而如果数据库存在:

> list test 
Input Path Type Content-Type Size 
------------------------------------ 

这是空的,所以它不显示任何内容,但在数据库至少你没有收到错误信息。当你使用客户端时,你必须检查是否出错。使用Python客户端,你可以这样做:

def exists(session, db): 
    try: 
     session.execute("list " + db) 
    except IOError as ex: 
     if ex.message == "Database '{0}' was not found.".format(db): 
      return False 
     raise 
    return True 

客户提出IOError如果服务器引发错误,这是报告的一个问题一个非常通用的方式。所以你必须测试错误信息来弄清楚发生了什么。我们重新评估错误信息是否与我们的测试相关。这样我们就不会吞噬由无关问题引起的异常。

与该功能你可以这样做:

session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin") 
if exists(session, "test"): 
    raise SomeRelevantException("Oi! You are about to overwrite your database!") 
session.create("test", "")