1 Star 0 Fork 0

oldboy/myDatabase

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Database.cpp 6.92 KB
一键复制 编辑 原始数据 按行查看 历史
oldboy 提交于 2024-03-19 15:57 . 上传代码
#include "Database.h"
string Path = "data"; //该程序所有生成文件的文件夹路径
Database::Database(string name) :databaseName(name){}
//获取书库名称
const string& Database::getDatabaseName() const
{
return databaseName;
}
//获取表名列表
const vector<string>& Database::getTableNames() const
{
return tableNames;
}
//找到某表的位置
size_t Database::getIndexOfTable(string tableName)
{
size_t index = -1;
for (size_t i = 0; i < tables.size(); i++)
{
if (tables[i]->getTableName() == tableName)
{
index = i;
}
}
return index;
}
//创建表格
void Database::createTable(string tableName)
{
if (!tableNames.empty())
{
if (find(tableNames.begin(), tableNames.end(), tableName) != tableNames.end())
{
cout << "已经存在表: " << tableName << endl;
return;
}
}
tables.push_back(make_shared<Table>(tableName));
tableNames.push_back(tableName);
}
//删除表格
void Database::dropTable(string tableName)
{
auto it = find(tableNames.begin(), tableNames.end(), tableName);
if (it != tableNames.end())
{
for (int i = 0; i < tables.size(); i++)
{
if (tables[i]->getTableName() == tableName)
{
tables.erase(tables.begin() + i);
tableNames.erase(it);
string filePath = Path + "/" + databaseName + "/" + tableName + ".txt";
// 删除文件
if (remove(filePath.c_str()) != 0)
{
//删除了定义上的表,但没能成功删除文件夹中的文件,对程序没有影响
}
else
{
//cout << "文件已删除: " << filePath << endl;
}
break;
}
}
}
}
//查询表格结构
vector<vector<string>> Database::descTable(string tableName)
{
vector<vector<string>> results;
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
vector<string>result;
result.push_back("不存在表: "+tableName);
results.push_back(result);
}
else
{
results = tables[i]->desc();
}
return results;
}
//更改表名
void Database::alterTableName(string tableName, string newTableName)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " <<tableName<<endl;
}
else
{
tables[i]->rename(newTableName);
for (size_t j = 0; j<tableNames.size();j++)
{
if (tableNames[j] == tableName)
{
tableNames[j] = newTableName;
break;
}
}
string filePath = Path + "/" + databaseName + "/" + tableName + ".txt";
// 删除文件
if (remove(filePath.c_str()) != 0)
{
//没能成功删除文件夹中的旧文件,对程序没有影响
}
else
{
//cout << "文件已删除: " << filePath << endl;
}
}
}
//增加列
void Database::addColumnToTable(string tableName, string columnName, string dataType)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->addNewColumn(columnName,dataType);
}
}
//删除列
void Database::dropColumnInTable(string tableName, string columnName)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->dropColumn(columnName);
}
}
//插入一行数据
void Database::insertIntoTable(string tableName, vector<string> values)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->insertRow(values);
}
}
//删除一行数据
void Database::deleteFromTable(string tableName, ConditionForColumn condition)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->deleteRowsByCondition(condition);
}
}
//查询数据
vector<vector<string>> Database::selectFromTable(string tableName,
vector<string> columnNames, ConditionForColumn condition)
{
vector<vector<string>> results;
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
vector<string>result;
results.push_back(result);
}
else
{
results = tables[i]->selectRowsInColumnsByCondition(columnNames, condition);
}
return results;
}
//更改数据
void Database::updateValueInTable(string tableName, string columnName,
string newVal, ConditionForColumn condition)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->updateValueInColumnByCondition(columnName, newVal, condition);
}
return;
}
//创建索引
void Database::createIndexInTable(string tableName, string ColumnName)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->createIndexOnColumn(ColumnName);
}
return;
}
//删除索引
void Database::removeIndexInTable(string tableName, string ColumnName)
{
size_t i = getIndexOfTable(tableName);
if (i == -1)
{
cout << "不存在表: " << tableName << endl;
}
else
{
tables[i]->removeIndexOnColumn(ColumnName);
}
return;
}
//保存数据库
void Database::saveDatabase(string dataPath)
{
string path = dataPath + "/" + databaseName;
ofstream out;
out.open((path + "/" + "tableNames.txt").c_str());
if (out.is_open())
{
//cout << "创建成功:" << (path + "/" + "tableNames.txt").c_str() << endl;
for (string tableName : tableNames)
{
//cout << "保存表名:" << tableName << '\n';
out << tableName << '\n';
}
out.close();
}
else
{
//cout << "创建失败:" << (path + "/" + "tableNames.txt").c_str() << endl;
return;
}
for (shared_ptr<Table>table : tables)
{
string tablePath = path + "/" + table->getTableName() + ".txt";
table->saveTable(tablePath);
}
}
//加载数据库
void Database::loadDatabase(string dataPath)
{
string path = dataPath + "/" + databaseName;
ifstream in;
in.open((path + "/" + "tableNames.txt").c_str());
if (in.is_open())
{
//cout << "读取成功:" << (path + "/" + "tableNames.txt").c_str() << endl;
string tableName;
while (in >> tableName)
{
createTable(tableName);
}
in.close();
}
else
{
//cout << "读取失败:" << (path + "/" + "tableNames.txt").c_str() << endl;
return;
}
for (shared_ptr<Table>table : tables)
{
string tablePath = path + "/" + table->getTableName() + ".txt";
table->loadTable(tablePath);
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/mmollaoyye/myDatabase.git
git@gitee.com:mmollaoyye/myDatabase.git
mmollaoyye
myDatabase
myDatabase
master

搜索帮助

Cb406eda 1850385 E526c682 1850385