feat: add cherry-stuido-db project
This commit is contained in:
parent
0dd60cb129
commit
6265d27ebc
@ -9,7 +9,10 @@
|
|||||||
"workspaces": {
|
"workspaces": {
|
||||||
"packages": [
|
"packages": [
|
||||||
"local",
|
"local",
|
||||||
"npm/*"
|
"packages/*"
|
||||||
|
],
|
||||||
|
"nohoist": [
|
||||||
|
"packages/database"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -28,7 +31,8 @@
|
|||||||
"build:linux": "dotenv electron-vite build && electron-builder --linux --publish never",
|
"build:linux": "dotenv electron-vite build && electron-builder --linux --publish never",
|
||||||
"release": "node scripts/version.js",
|
"release": "node scripts/version.js",
|
||||||
"publish": "yarn release patch push",
|
"publish": "yarn release patch push",
|
||||||
"pulish:artifacts": "cd npm/artifacts && npm publish && cd -",
|
"pulish:artifacts": "cd packages/artifacts && npm publish && cd -",
|
||||||
|
"generate:agents": "yarn workspace @cherry-studio/database agents",
|
||||||
"generate:icons": "electron-icon-builder --input=./build/logo.png --output=build"
|
"generate:icons": "electron-icon-builder --input=./build/logo.png --output=build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
3
packages/database/.gitignore
vendored
Normal file
3
packages/database/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
data/*
|
||||||
|
!data/.gitkeep
|
||||||
|
|
||||||
BIN
packages/database/.yarn/install-state.gz
Normal file
BIN
packages/database/.yarn/install-state.gz
Normal file
Binary file not shown.
3
packages/database/README.md
Normal file
3
packages/database/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Cherry Studio Database
|
||||||
|
|
||||||
|
Cherry Studio 依赖的数据文件由这个数据库来生成,数据库文件请联系开发者获取
|
||||||
0
packages/database/data/.gitkeep
Normal file
0
packages/database/data/.gitkeep
Normal file
13
packages/database/package.json
Normal file
13
packages/database/package.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "@cherry-studio/database",
|
||||||
|
"packageManager": "yarn@4.3.1",
|
||||||
|
"dependencies": {
|
||||||
|
"csv-parser": "^3.0.0",
|
||||||
|
"sqlite3": "^5.1.7"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"agents": "node src/agents.js",
|
||||||
|
"email": "yarn csv && node src/email.js",
|
||||||
|
"csv": "node src/csv.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
45
packages/database/src/agents.js
Normal file
45
packages/database/src/agents.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
const sqlite3 = require('sqlite3').verbose()
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
// 连接到数据库
|
||||||
|
const db = new sqlite3.Database('./data/CherryStudio.sqlite3', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error connecting to the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log('Connected to the database.')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 查询数据并转换为JSON
|
||||||
|
db.all('SELECT * FROM agents', [], (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error querying the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将 ID 类型转换为字符串
|
||||||
|
for (const row of rows) {
|
||||||
|
row.id = row.id.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将查询结果转换为JSON字符串
|
||||||
|
const jsonData = JSON.stringify(rows, null, 2)
|
||||||
|
|
||||||
|
// 将JSON数据写入文件
|
||||||
|
fs.writeFile('../../src/renderer/src/config/agents.json', jsonData, (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error writing to file:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log('Data has been written to agents.json')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 关闭数据库连接
|
||||||
|
db.close((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error closing the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log('Database connection closed.')
|
||||||
|
})
|
||||||
|
})
|
||||||
77
packages/database/src/csv.js
Normal file
77
packages/database/src/csv.js
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const csv = require('csv-parser')
|
||||||
|
const sqlite3 = require('sqlite3').verbose()
|
||||||
|
|
||||||
|
// 连接到 SQLite 数据库
|
||||||
|
const db = new sqlite3.Database('./data/CherryStudio.sqlite3', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error opening database', err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log('Connected to the SQLite database.')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 创建一个数组来存储 CSV 数据
|
||||||
|
const results = []
|
||||||
|
|
||||||
|
// 读取 CSV 文件
|
||||||
|
fs.createReadStream('./data/data.csv')
|
||||||
|
.pipe(csv())
|
||||||
|
.on('data', (data) => results.push(data))
|
||||||
|
.on('end', () => {
|
||||||
|
// 准备 SQL 插入语句,使用 INSERT OR IGNORE
|
||||||
|
const stmt = db.prepare('INSERT OR IGNORE INTO emails (email, github, sent) VALUES (?, ?, ?)')
|
||||||
|
|
||||||
|
// 插入每一行数据
|
||||||
|
let inserted = 0
|
||||||
|
let skipped = 0
|
||||||
|
let emptyEmail = 0
|
||||||
|
|
||||||
|
db.serialize(() => {
|
||||||
|
// 开始一个事务以提高性能
|
||||||
|
db.run('BEGIN TRANSACTION')
|
||||||
|
|
||||||
|
results.forEach((row) => {
|
||||||
|
// 检查 email 是否为空
|
||||||
|
if (!row.email || row.email.trim() === '') {
|
||||||
|
emptyEmail++
|
||||||
|
return // 跳过这一行
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt.run(row.email, row['user-href'], 0, function (err) {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error inserting row', err)
|
||||||
|
} else {
|
||||||
|
if (this.changes === 1) {
|
||||||
|
inserted++
|
||||||
|
} else {
|
||||||
|
skipped++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 提交事务
|
||||||
|
db.run('COMMIT', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error committing transaction', err)
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
`Insertion complete. Inserted: ${inserted}, Skipped (duplicate): ${skipped}, Skipped (empty email): ${emptyEmail}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 完成插入
|
||||||
|
stmt.finalize()
|
||||||
|
|
||||||
|
// 关闭数据库连接
|
||||||
|
db.close((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error closing database', err)
|
||||||
|
} else {
|
||||||
|
console.log('Database connection closed.')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
36
packages/database/src/email.js
Normal file
36
packages/database/src/email.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
const sqlite3 = require('sqlite3').verbose()
|
||||||
|
|
||||||
|
// 连接到数据库
|
||||||
|
const db = new sqlite3.Database('./data/CherryStudio.sqlite3', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error connecting to the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 查询数据并转换为JSON
|
||||||
|
db.all('SELECT * FROM emails WHERE sent = 0', [], (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error querying the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
console.log(row.email)
|
||||||
|
// Update row set sent = 1
|
||||||
|
db.run('UPDATE emails SET sent = 1 WHERE id = ?', [row.id], (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error updating the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭数据库连接
|
||||||
|
db.close((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error closing the database:', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
1643
packages/database/yarn.lock
Normal file
1643
packages/database/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user