Skip to content

Commit 8e34dee

Browse files
authored
Merge pull request #81 from sjjian/dev_0_8_0
Dev 0 8 0
2 parents 6a236e6 + 5c1ecea commit 8e34dee

File tree

84 files changed

+2476
-2162
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+2476
-2162
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ openhare is an AI-powered, cross-platform desktop SQL client with multi-database
3333
- **Multi-Database Support**: Effortlessly connect to and manage various SQL databases.
3434

3535
## Framework
36-
1. Application: - [Flutter](https://flutter.dev/), [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge)
36+
1. Application: [Flutter](https://flutter.dev/), [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge)
3737
2. State Management: [Riverpod](https://riverpod.dev/), [GoRouter](https://pub.dev/packages/go_router)
3838
3. UI: [SQL Editor](https://github.com/reqable/re-editor), [HugeIcons](https://github.com/hugeicons/hugeicons-flutter), [Window Manager](https://github.com/leanflutter/window_manager)
3939
4. Storage: [ObjectBox](https://objectbox.io/)

client/analysis_options.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ analyzer:
3333

3434
formatter:
3535
page_width: 120
36+
trailing_commas: preserve
3637

3738
# Additional information about this file can be found at
3839
# https://dart.dev/guides/language/analysis-options

client/lib/l10n/app_en.arb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@
131131
"@display_msg_no_data": {
132132
"description": "No data"
133133
},
134+
"display_msg_execution_success": "Execution successful",
135+
"@display_msg_execution_success": {
136+
"description": "SQL execution success message"
137+
},
134138
"effect_rows": "Effect rows",
135139
"@effect_rows": {
136140
"description": "Effect rows"
@@ -315,6 +319,10 @@
315319
"@button_tooltip_sql_result_download": {
316320
"description": "Button tooltip download SQL result"
317321
},
322+
"button_tooltip_refresh_metadata": "Refresh Database metadata",
323+
"@button_tooltip_refresh_metadata": {
324+
"description": "Button tooltip refresh metadata"
325+
},
318326
"button_tooltip_ai_test": "Test LLM API",
319327
"@button_tooltip_ai_test": {
320328
"description": "Button tooltip test LLM API"

client/lib/l10n/app_zh.arb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"db_base_config": "基础配置",
3333
"field_val_msg_value_reqiured": "值不能为空",
3434
"display_msg_no_data": "暂无数据",
35+
"display_msg_execution_success": "执行成功",
3536
"effect_rows": "影响行数",
3637
"duration": "执行时间",
3738
"query": "语句",
@@ -78,6 +79,7 @@
7879
"button_tooltip_sql_result": "SQL结果视图",
7980
"button_tooltip_ai_chat": "AI对话",
8081
"button_tooltip_sql_result_download": "下载SQL结果",
82+
"button_tooltip_refresh_metadata": "刷新数据库元信息",
8183
"button_tooltip_ai_test": "测试 LLM API",
8284
"metadata_tree_database": "数据库",
8385
"metadata_tree_schema": "模式",

client/lib/main.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ void main(List<String> args) async {
2525

2626
await windowManager.ensureInitialized();
2727

28-
runApp(ProviderScope(
29-
retry: (retryCount, error) => null,
30-
child: App(),
31-
));
28+
runApp(
29+
ProviderScope(
30+
retry: (retryCount, error) => null,
31+
child: App(),
32+
),
33+
);
3234

3335
doWhenWindowReady(() {
3436
const initialSize = Size(1400, 1000);

client/lib/models/ai.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,12 @@ abstract class AIChatMessageToolCallsModel with _$AIChatMessageToolCallsModel {
241241
'success': true,
242242
'affectedRows': result.affectedRows.toString(),
243243
'columns': result.columns
244-
.map((c) => {
245-
'name': c.name,
246-
'type': c.dataType().name,
247-
})
244+
.map(
245+
(c) => {
246+
'name': c.name,
247+
'type': c.dataType().name,
248+
},
249+
)
248250
.toList(),
249251
'rows': result.rows.map((row) {
250252
final rowMap = <String, dynamic>{};

client/lib/models/instances.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,19 @@ abstract class InstanceMetadataModel with _$InstanceMetadataModel {
9191
required List<MetaDataNode> metadata,
9292
required String? version,
9393
}) = _InstanceMetadataModel;
94+
95+
const InstanceMetadataModel._();
96+
97+
List<String> get schemas {
98+
final schemas = List<String>.empty(growable: true);
99+
for (final meta in metadata) {
100+
meta.visitor((node, parent) {
101+
if (node.type == MetaType.schema) {
102+
schemas.add(node.value);
103+
}
104+
return true;
105+
});
106+
}
107+
return schemas;
108+
}
94109
}

client/lib/repositories/ai/agent.dart

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import 'package:client/models/ai.dart';
22
import 'package:client/repositories/repo.dart';
33
import 'package:riverpod_annotation/riverpod_annotation.dart';
4-
import 'package:objectbox/objectbox.dart';
4+
// ignore: unnecessary_import
5+
import 'package:objectbox/objectbox.dart'; // 必须引入, 不然objectbox不能正常使用
56
import 'package:client/repositories/objectbox.g.dart';
67

78
part 'agent.g.dart';
@@ -30,8 +31,8 @@ class LLMApiSettingStorage {
3031
required this.modelName,
3132
DateTime? createdAt,
3233
DateTime? lastChatUsedAt,
33-
}) : createdAt = createdAt ?? DateTime.now(),
34-
lastChatUsedAt = lastChatUsedAt ?? DateTime(1970, 1, 1);
34+
}) : createdAt = createdAt ?? DateTime.now(),
35+
lastChatUsedAt = lastChatUsedAt ?? DateTime(1970, 1, 1);
3536
}
3637

3738
class LLMAgentRepoImpl implements LLMAgentRepo {
@@ -50,16 +51,17 @@ class LLMAgentRepoImpl implements LLMAgentRepo {
5051

5152
LLMAgentModel _toModel(LLMApiSettingStorage setting) {
5253
return LLMAgentModel(
53-
id: LLMAgentId(value: setting.id),
54-
setting: LLMAgentSettingModel(
55-
name: setting.name,
56-
baseUrl: setting.baseUrl,
57-
apiKey: setting.apiKey,
58-
modelName: setting.modelName,
59-
),
60-
status: _getStatus(
61-
LLMAgentId(value: setting.id),
62-
));
54+
id: LLMAgentId(value: setting.id),
55+
setting: LLMAgentSettingModel(
56+
name: setting.name,
57+
baseUrl: setting.baseUrl,
58+
apiKey: setting.apiKey,
59+
modelName: setting.modelName,
60+
),
61+
status: _getStatus(
62+
LLMAgentId(value: setting.id),
63+
),
64+
);
6365
}
6466

6567
@override
@@ -93,12 +95,14 @@ class LLMAgentRepoImpl implements LLMAgentRepo {
9395

9496
@override
9597
void create(LLMAgentSettingModel setting) {
96-
final model = _llmAgentSettingBox.put(LLMApiSettingStorage(
97-
name: setting.name,
98-
baseUrl: setting.baseUrl,
99-
apiKey: setting.apiKey,
100-
modelName: setting.modelName,
101-
));
98+
final model = _llmAgentSettingBox.put(
99+
LLMApiSettingStorage(
100+
name: setting.name,
101+
baseUrl: setting.baseUrl,
102+
apiKey: setting.apiKey,
103+
modelName: setting.modelName,
104+
),
105+
);
102106

103107
_status[LLMAgentId(value: model)] = const LLMAgentStatusModel(state: LLMAgentState.unknown);
104108
}
@@ -125,12 +129,15 @@ class LLMAgentRepoImpl implements LLMAgentRepo {
125129

126130
@override
127131
void updateSetting(LLMAgentId id, LLMAgentSettingModel setting) {
128-
_llmAgentSettingBox.put(LLMApiSettingStorage(
132+
_llmAgentSettingBox.put(
133+
LLMApiSettingStorage(
129134
id: id.value,
130135
name: setting.name,
131136
baseUrl: setting.baseUrl,
132137
apiKey: setting.apiKey,
133-
modelName: setting.modelName));
138+
modelName: setting.modelName,
139+
),
140+
);
134141

135142
// 更新setting后,状态重置为unknown
136143
_status[id] = const LLMAgentStatusModel(state: LLMAgentState.unknown);

client/lib/repositories/instances/instances.dart

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:client/models/instances.dart';
22
import 'package:client/repositories/instances/session_conn.dart';
3-
import 'package:objectbox/objectbox.dart';
3+
// ignore: unnecessary_import
4+
import 'package:objectbox/objectbox.dart'; // 必须引入, 不然objectbox不能正常使用
45
import 'package:client/repositories/objectbox.g.dart';
56
import 'package:client/repositories/repo.dart';
67
import 'package:client/utils/active_set.dart';
@@ -28,9 +29,10 @@ class InstanceStorage {
2829

2930
/// 目的地址:目前支持 host:port 和 dbFile 两种类型
3031
String targetJson;
31-
32+
3233
/// 弃用,现在都存在 target 中
3334
String host;
35+
3436
/// 弃用,现在都存在 target 中
3537
int? port;
3638

@@ -41,7 +43,7 @@ class InstanceStorage {
4143
/// 使用字符串类型存储 custom 的 json 字符串, 使用时进行 json 解析。 原因:ObjectBox 不支持 json 类型。
4244
/// 本来使用的 @Transient 注解加自定义类型,但是更新后好像失效,弃用了。
4345
String customJson;
44-
46+
4547
@Transient()
4648
Map<String, String> get custom {
4749
if (customJson.isEmpty) {
@@ -71,7 +73,7 @@ class InstanceStorage {
7173
required int stDbType,
7274
required this.name,
7375
required this.targetJson,
74-
required this.host,
76+
required this.host,
7577
this.port,
7678
required this.user,
7779
required this.password,
@@ -81,31 +83,30 @@ class InstanceStorage {
8183
ActiveSet<String>? activeSchemas,
8284
DateTime? createdAt,
8385
DateTime? latestOpenAt,
84-
}) : activeSchemas = activeSchemas ?? ActiveSet<String>(List.empty()),
85-
dbType = DatabaseType.values[stDbType],
86-
createdAt = createdAt ?? DateTime.now(),
87-
latestOpenAt = latestOpenAt ?? DateTime(1970, 1, 1); //latestOpenAt 默认值未很早之前的时间
86+
}) : activeSchemas = activeSchemas ?? ActiveSet<String>(List.empty()),
87+
dbType = DatabaseType.values[stDbType],
88+
createdAt = createdAt ?? DateTime.now(),
89+
latestOpenAt = latestOpenAt ?? DateTime(1970, 1, 1); //latestOpenAt 默认值未很早之前的时间
8890

8991
InstanceStorage.fromModel(InstanceModel model)
90-
: id = model.id.value,
91-
dbType = model.dbType,
92-
name = model.name,
93-
targetJson = jsonEncode(model.connectValue.target.toJson()),
94-
host = "deprecated",
95-
user = model.user,
96-
password = model.password,
97-
desc = model.desc,
98-
customJson = jsonEncode(model.custom),
99-
initQuerys = model.initQuerys,
100-
activeSchemas = ActiveSet<String>(model.activeSchemas),
101-
createdAt = model.createdAt,
102-
latestOpenAt = model.latestOpenAt;
92+
: id = model.id.value,
93+
dbType = model.dbType,
94+
name = model.name,
95+
targetJson = jsonEncode(model.connectValue.target.toJson()),
96+
host = "deprecated",
97+
user = model.user,
98+
password = model.password,
99+
desc = model.desc,
100+
customJson = jsonEncode(model.custom),
101+
initQuerys = model.initQuerys,
102+
activeSchemas = ActiveSet<String>(model.activeSchemas),
103+
createdAt = model.createdAt,
104+
latestOpenAt = model.latestOpenAt;
103105

104106
ConnectTarget _parseTarget() {
105107
if (targetJson.trim().isNotEmpty) {
106108
try {
107-
return ConnectTarget.fromJson(
108-
Map<String, dynamic>.from(jsonDecode(targetJson)));
109+
return ConnectTarget.fromJson(Map<String, dynamic>.from(jsonDecode(targetJson)));
109110
} catch (_) {
110111
return ConnectTarget.network(host: "", port: port ?? 0);
111112
}
@@ -162,21 +163,21 @@ class InstanceRepoImpl extends InstanceRepo {
162163
}
163164

164165
@override
165-
// todo: aync
166+
// todo: aync
166167
bool isInstanceExist(String name) {
167168
final instance = getInstanceByName(name);
168169
return instance != null;
169170
}
170171

171172
@override
172-
// todo: aync
173+
// todo: aync
173174
InstanceModel? getInstanceByName(String name) {
174175
final build = _instanceBox.query(InstanceStorage_.name.equals(name)).build();
175176
return build.findFirst()?.toModel();
176177
}
177178

178179
@override
179-
// todo: 替换 getInstance
180+
// todo: 替换 getInstance
180181
InstanceModel? getInstanceById(InstanceId id) {
181182
return _instanceBox.get(id.value)?.toModel();
182183
}

client/lib/repositories/instances/session_conn.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@ class SessionConnRepoImpl extends SessionConnRepo {
2020
@override
2121
SessionConnListModel getConns() {
2222
return SessionConnListModel(
23-
conns: conns.map((key, value) => MapEntry(
24-
ConnId(value: key),
25-
SessionConnModel(
26-
connId: ConnId(value: key),
27-
state: value.state,
28-
errorMsg: value.errorMsg,
29-
),
30-
)),
23+
conns: conns.map(
24+
(key, value) => MapEntry(
25+
ConnId(value: key),
26+
SessionConnModel(
27+
connId: ConnId(value: key),
28+
state: value.state,
29+
errorMsg: value.errorMsg,
30+
),
31+
),
32+
),
3133
);
3234
}
3335

0 commit comments

Comments
 (0)