databases.service.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import {
  2. CreateDatabaseRequest,
  3. ListDatabasesRequest,
  4. DescribeDatabaseRequest,
  5. DescribeDatabaseResponse,
  6. DropDatabasesRequest,
  7. AlterDatabaseRequest,
  8. } from '@zilliz/milvus2-sdk-node';
  9. import { throwErrorFromSDK } from '../utils/Error';
  10. import { clientCache } from '../app';
  11. import { DatabaseObject } from '../types';
  12. import { SimpleQueue } from '../utils';
  13. export class DatabasesService {
  14. async createDatabase(clientId: string, data: CreateDatabaseRequest) {
  15. const { milvusClient } = clientCache.get(clientId);
  16. const res = await milvusClient.createDatabase(data);
  17. throwErrorFromSDK(res);
  18. return res;
  19. }
  20. async describeDatabase(clientId: string, data: DescribeDatabaseRequest) {
  21. const { milvusClient } = clientCache.get(clientId);
  22. const res = await milvusClient.describeDatabase(data);
  23. throwErrorFromSDK(res.status);
  24. return res as DescribeDatabaseResponse;
  25. }
  26. async listDatabase(
  27. clientId: string,
  28. data?: ListDatabasesRequest
  29. ): Promise<DatabaseObject[]> {
  30. const { milvusClient, database } = clientCache.get(clientId);
  31. const res = await milvusClient.listDatabases(data);
  32. // test if the user has permission to access the database, loop through all databases
  33. // and check if the user has permission to access the database
  34. const availableDatabases: DatabaseObject[] = [];
  35. for (let i = 0; i < res.db_names.length; i++) {
  36. try {
  37. await milvusClient.use({ db_name: res.db_names[i] });
  38. await milvusClient.listDatabases(data);
  39. const collections = await milvusClient.showCollections();
  40. const dbName = res.db_names[i];
  41. const dbObject = await this.describeDatabase(clientId, {
  42. db_name: dbName,
  43. });
  44. availableDatabases.push({
  45. name: res.db_names[i],
  46. collections: collections.data.map(c => c.name),
  47. createdTime: (res as any).created_timestamp[i] || -1,
  48. ...dbObject,
  49. });
  50. } catch (e) {
  51. // ignore
  52. }
  53. }
  54. // recover current database
  55. await milvusClient.use({ db_name: database });
  56. throwErrorFromSDK(res.status);
  57. return availableDatabases;
  58. }
  59. async dropDatabase(clientId: string, data: DropDatabasesRequest) {
  60. const { milvusClient } = clientCache.get(clientId);
  61. const res = await milvusClient.dropDatabase(data);
  62. throwErrorFromSDK(res);
  63. return res;
  64. }
  65. async use(clientId: string, db_name: string) {
  66. const currentClient = clientCache.get(clientId);
  67. // clear collectionsQueue when switching database
  68. currentClient.collectionsQueue.stop();
  69. currentClient.collectionsQueue = new SimpleQueue<string>();
  70. return await await currentClient.milvusClient.use({ db_name });
  71. }
  72. async hasDatabase(clientId: string, data: string) {
  73. const dbs = await this.listDatabase(clientId);
  74. return dbs.map(d => d.name).indexOf(data) !== -1;
  75. }
  76. async alterDatabase(clientId: string, data: AlterDatabaseRequest) {
  77. const { milvusClient } = clientCache.get(clientId);
  78. const res = await milvusClient.alterDatabase(data);
  79. throwErrorFromSDK(res);
  80. return res;
  81. }
  82. }