From 59ca6b6530a652ef0cbf9b32989bf91708308bb7 Mon Sep 17 00:00:00 2001 From: AICells <1713699517@qq.com> Date: Thu, 23 Apr 2020 01:24:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E4=BA=8Ehttp=E8=AF=B7=E6=B1=82URI?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/agHttpCli.hrl | 2 +- src/agApi/agDbMgr.erl | 46 +++++++++++++++++++------------- src/agHttpCli/agHttpCli.erl | 8 +++--- src/agHttpCli/agHttpProtocol.erl | 8 +++--- src/agHttpCli/agMiscUtils.erl | 2 +- 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/include/agHttpCli.hrl b/include/agHttpCli.hrl index f7bfb21..a253f6a 100644 --- a/include/agHttpCli.hrl +++ b/include/agHttpCli.hrl @@ -7,7 +7,7 @@ %% 默认值定义 -define(DEFAULT_BASE_URL, <<"http://127.0.0.1:8529">>). --define(DEFAULT_DBNAME, <<"_system">>). +-define(DEFAULT_DBNAME, <<"tttt">>). -define(DEFAULT_USER, <<"root">>). -define(DEFAULT_PASSWORD, <<"156736">>). -define(DEFAULT_BACKLOG_SIZE, 1024). diff --git a/src/agApi/agDbMgr.erl b/src/agApi/agDbMgr.erl index a2576cf..e435cb1 100644 --- a/src/agApi/agDbMgr.erl +++ b/src/agApi/agDbMgr.erl @@ -7,18 +7,28 @@ %% doc_address:https://www.arangodb.com/docs/stable/http/database-database-management.html -% 数据库信息永久链接 -% 检索有关当前数据库的信息(别名/_ap/database/properties) +% 使用HTTP管理数据库 +% 这是ArangoDB用于管理数据库的HTTP接口的简介。 +% 数据库的HTTP接口提供创建和删除单个数据库的操作。这些映射到标准HTTP方法POST 和DELETE。还有GET方法来检索现有数据库的数组。 +% 请注意,所有数据库管理操作只能通过默认数据库(_system)访问,而不能通过其他数据库访问。 + +% 关于数据库的注意事项 +% 请记住,每个数据库都包含其自己的系统集合,创建数据库时需要对其进行设置。这将使数据库创建花费一些时间。 +% 复制是在 每个数据库级别 或在服务器级别配置的。在每个数据库的设置中,必须在创建新数据库后显式配置任何复制日志记录或申请新数据库,而在使用全局复制应用程序进行服务器级设置的情况下,将自动复制所有数据库。 +% Foxx应用程序也仅在已安装数据库的上下文中可用。新数据库将仅提供对ArangoDB附带的系统应用程序(即当前的Web界面)的访问,而其他的Foxx应用程序则无法访问。为特定数据库明确安装。 + +% 数据库信息 +% 检索有关当前数据库的信息 % GET /_api/database/current % 检索有关当前数据库的信息 % 响应是具有以下属性的JSON对象: % name:当前数据库的名称 -% id:当前数据库的ID -% path:当前数据库的文件系统路径 +% id:当前数据库的ID(字符串格式) +% path:当前数据库的文件系统路径(字符串格式, mmfiles引擎有效) % isSystem:当前数据库是否为_system数据库 -% sharding:此数据库中创建的集合的默认分片方法 -% ReplicationFactor:此数据库中集合的默认复制因子 -% writeConcern:此数据库中集合的默认写关注点 +% sharding:此数据库中创建的集合的默认分片方法(用于新集合的分片方法(仅适用于集群)) +% ReplicationFactor:此数据库中集合的默认复制因子(仅适用于 集群) +% writeConcern:此数据库中集合的默认写关注点 如果同步的副本数量少于此数量,则碎片将拒绝写入(仅适用于集群) % 返回码 % 200:如果成功检索到信息,则返回。 % 400:如果请求无效,则返回。 @@ -45,21 +55,21 @@ visitDbs(PoolNameOrSocket) -> % 400:如果请求无效,则返回。 % 403:如果请求未在_system数据库中执行,则返回。 allDbs(PoolNameOrSocket) -> - agHttpCli:callAgency(PoolNameOrSocket, ?AgGet, <<"/_api/database">>, [], undefined). + agHttpCli:callAgency(PoolNameOrSocket, ?AgGet, <<"/_api/database">>, [], undefined, true). % 创建一个新的数据库 % POST /_api/database % 具有以下属性的JSON对象是必需的: -% name:必须包含一个有效的数据库名称。 -% options:可选对象,可以包含以下属性: -% sharding:用于此数据库中新集合的分片方法。有效值为:“”,“ flexible”或“ single”。前两个是等效的。(仅集群) -% ReplicationFactor:在此数据库中创建的新集合的默认复制因子。特殊值包括“ satellite”和将其禁用复制的“ satellite”(将集合复制到每个数据库服务器)和“ 1”。(仅集群) -% writeConcern:在此数据库中创建的新集合的默认写关注。它确定在不同的DBServer上同步每个分片需要多少个副本。如果集群中的副本数量很少,那么分片将拒绝写入。但是,具有足够最新副本的分片写入将同时成功。writeConcern的值 不能大于ReplicationFactor。(仅集群) -% users:必须是最初为新数据库创建的用户对象数组。对于已经存在的用户,不会更改用户信息。如果未指定users或不包含任何用户,则将使用空字符串密码创建默认用户 root。这确保了新数据库在创建后将可访问。每个用户对象可以包含以下属性: -% username:要创建的用户的登录名 -% passwd:用户密码(字符串)。如果未指定,则默认为空字符串。 -% active:一个标志,指示是否应该激活用户帐户。默认值为true。如果设置为false,则用户将无法登录数据库。 -% extra:带有额外用户信息的JSON对象。Extra中包含的数据 将为用户存储,但ArangoDB不会进一步解释。 +% name:必须包含一个有效的数据库名称。 +% options:可选对象,可以包含以下属性: +% sharding:用于此数据库中新集合的分片方法。有效值为:“”,“ flexible”或“ single”。前两个是等效的。(仅集群) +% ReplicationFactor:在此数据库中创建的新集合的默认复制因子。特殊值包括“ satellite”(卫星),它将复制集合到每个DB-Server;以及1(禁用复制)。(仅集群) +% writeConcern:在此数据库中创建的新集合的默认写关注。它确定在不同的DB服务器上同步每个分片需要多少个副本。如果集群中的副本数量很少,那么分片将拒绝写入。但是,具有足够最新副本的分片写入将同时成功。writeConcern的值 不能大于ReplicationFactor。(仅集群)users:必须是最初为新数据库创建的用户对象数组。对于已经存在的用户,不会更改用户信息。如果未指定users或不包含任何用户,则将使用空字符串密码创建默认用户 root。这确保了新数据库在创建后将可访问。每个用户对象可以包含以下属性: +% users:必须是最初为新数据库创建的用户对象数组。对于已经存在的用户,不会更改用户信息。如果未指定users或不包含任何用户,则将使用空字符串密码创建默认用户 root。这确保了新数据库在创建后将可访问。每个用户对象可以包含以下属性 +% username:要创建的用户的登录名 +% passwd:用户密码(字符串)。如果未指定,则默认为空字符串。 +% active:一个标志,指示是否应该激活用户帐户。默认值为true。如果设置为false,则用户将无法登录数据库。 +% extra:带有额外用户信息的JSON对象。Extra中包含的数据 将为用户存储,但ArangoDB不会进一步解释。 % 创建一个新的数据库 % 响应是一个JSON对象,其属性结果设置为true。 % 注意:仅可以在_system数据库中创建新数据库。 diff --git a/src/agHttpCli/agHttpCli.erl b/src/agHttpCli/agHttpCli.erl index 1081bf0..c2d9bb6 100644 --- a/src/agHttpCli/agHttpCli.erl +++ b/src/agHttpCli/agHttpCli.erl @@ -25,7 +25,7 @@ , connectDb/1 , disConnectDb/1 , getCurDbInfo/1 - , setCurDbName/2 + , useDatabase/2 ]). @@ -264,12 +264,12 @@ setCurDbInfo(Socket, DbName, UserPassword, Host, Protocol) -> getCurDbInfo(Socket) -> erlang:get({'$agDbInfo', Socket}). --spec setCurDbName(socket(), binary()) -> ok. -setCurDbName(Socket, NewDbName) -> +-spec useDatabase(socket(), binary()) -> ok. +useDatabase(Socket, NewDbName) -> case erlang:get({'$agDbInfo', Socket}) of undefined -> ignore; {_DbName, UserPassword, Host, Protocol} -> - erlang:put({'$agDbInfo', Socket}, {<<"_db/", NewDbName/binary>>, UserPassword, Host, Protocol}) + erlang:put({'$agDbInfo', Socket}, {<<"/_db/", NewDbName/binary>>, UserPassword, Host, Protocol}) end, ok. diff --git a/src/agHttpCli/agHttpProtocol.erl b/src/agHttpCli/agHttpProtocol.erl index 120adf6..52de874 100644 --- a/src/agHttpCli/agHttpProtocol.erl +++ b/src/agHttpCli/agHttpProtocol.erl @@ -15,13 +15,13 @@ -spec request(boolean(), body(), method(), host(), binary(), path(), headers()) -> iolist(). request(true, undefined, Method, Host, _DbName, Path, Headers) -> [ - Method, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"_db/_system">>, + Method, <<"/_db/_system">>, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 0\r\n">>, spellHeaders(Headers), <<"\r\n">> ]; request(false, undefined, Method, Host, DbName, Path, Headers) -> [ - Method, Path, <<" HTTP/1.1\r\nHost: ">>, Host, DbName, + Method, DbName, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 0\r\n">>, spellHeaders(Headers), <<"\r\n">> ]; @@ -29,7 +29,7 @@ request(false, Body, Method, Host, DbName, Path, Headers) -> ContentLength = integer_to_binary(iolist_size(Body)), NewHeaders = [{<<"Content-Length">>, ContentLength} | Headers], [ - Method, Path, <<" HTTP/1.1\r\nHost: ">>, Host, DbName, + Method, DbName, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"\r\nContent-Type: application/json; charset=utf-8\r\n">>, spellHeaders(NewHeaders), <<"\r\n">>, Body ]; @@ -37,7 +37,7 @@ request(true, Body, Method, Host, _DbName, Path, Headers) -> ContentLength = integer_to_binary(iolist_size(Body)), NewHeaders = [{<<"Content-Length">>, ContentLength} | Headers], [ - Method, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"_db/_system">>, + Method, <<"/_db/_system">>, Path, <<" HTTP/1.1\r\nHost: ">>, Host, <<"\r\nContent-Type: application/json; charset=utf-8\r\n">>, spellHeaders(NewHeaders), <<"\r\n">>, Body ]. diff --git a/src/agHttpCli/agMiscUtils.erl b/src/agHttpCli/agMiscUtils.erl index 88da2cb..6d1bc42 100644 --- a/src/agHttpCli/agMiscUtils.erl +++ b/src/agHttpCli/agMiscUtils.erl @@ -59,7 +59,7 @@ dbOpts(DbCfgs) -> SocketOpts = ?GET_FROM_LIST(socketOpts, DbCfgs, ?DEFAULT_SOCKET_OPTS), DbOpts = agMiscUtils:parseUrl(BaseUrl), UserPasswordBase64 = {<<"Authorization">>, <<"Basic ", (base64:encode(<>))/binary>>}, - DbOpts#dbOpts{dbName = <<"_db/", DbName/binary>>, userPassword = UserPasswordBase64, poolSize = PoolSize, socketOpts = SocketOpts}. + DbOpts#dbOpts{dbName = <<"/_db/", DbName/binary>>, userPassword = UserPasswordBase64, poolSize = PoolSize, socketOpts = SocketOpts}. -spec agencyOpts(list()) -> agencyOpts(). agencyOpts(AgencyCfgs) ->