math/o.c

506 lines
14 KiB
C

//
// Created by zhang on 2024/12/29.
//
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#include "./include/function.h"
#include "./include/extern.h"
#include "./include/curses.h"
#include "./include/sqlite3.h"
extern char Username[15];
extern char class[15];
void myexit() {
endwin();
exit(0);
}
void Login(char *username,char*password,int *recall,char *errmsg){
if(!username[0]){
strcpy(errmsg,"The username is empty!");
*recall=-1;
return;
}
if(!password[0]){
strcpy(errmsg,"The password is empty!");
*recall=-1;
return;
}
sqlite3 *db;
int rc;
// 打开数据库
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
return;
}
// SQL 查询语句:查找用户及其密码
const char *sql = "SELECT password, type FROM users WHERE user = ?;";
sqlite3_stmt *stmt;
// 编译 SQL 语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_close(db);
return;
}
// 绑定查询参数
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW) {
// 查找到用户,获取密码
const char *db_password = (const char *)sqlite3_column_text(stmt, 0);
// 如果密码匹配
if (db_password && strcmp(db_password, password) == 0) {
const char *db_type = (const char *)sqlite3_column_text(stmt, 1);
strcpy(Username,username);
*recall = db_type[0]-'0';
} else {
strcpy(errmsg,"Incorrect username or password.");
*recall=-1;
}
} else {
strcpy(errmsg,"Incorrect username or password.");
*recall=-1;
}
// 绑定查询参数
// 清理资源
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
void Signin(const char *username,const char*password,int *recall,char *errmsg){
if(!username[0]){
strcpy(errmsg,"The username is empty!");
*recall=-1;
return;
}
if(!password[0]){
strcpy(errmsg,"The password is empty!");
*recall=-1;
return;
}
sqlite3 *db;
char *errMsg = 0;
int rc;
// 打开数据库,如果数据库文件不存在则创建它
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
return;
}
const char *sql = "SELECT user FROM users WHERE user = ?;";
sqlite3_stmt *stmt;
// 编译 SQL 语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_close(db);
return;
}
// 绑定查询参数
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW) {
// 查找到用户
strcpy(errmsg,"Username has been used.");
*recall=-1;
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
else sqlite3_finalize(stmt);
char *sql_insert="INSERT INTO users (user,password,type) VALUES (?, ? ,'4');";
sqlite3_stmt *insert;
rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_close(db);
return;
}
// 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
sqlite3_bind_text(insert, 1, username, -1, SQLITE_STATIC);
// 将第二个参数 (password) 绑定到 SQL 语句中的第二个 "?"
sqlite3_bind_text(insert, 2, password, -1, SQLITE_STATIC);
rc = sqlite3_step(insert);
if (rc != SQLITE_DONE) {
strcpy(errmsg,"Error:database error");
sqlite3_free(errMsg);
sqlite3_finalize(insert);
sqlite3_close(db);
*recall=-1;return;
}
sqlite3_free(errMsg);
sqlite3_finalize(insert);
sqlite3_close(db);
*recall=0;
return;
}
void db_create(int *recall,char *errmsg){
sqlite3 *db;
char *errMsg = 0;
int rc;
// 打开数据库,如果数据库文件不存在则创建它
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
strcpy(errmsg,"database error.");
*recall=-1;
return;
}
const char *sql_create_table =
"CREATE TABLE IF NOT EXISTS users "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"user TEXT UNIQUE,"
"password TEXT,"
"type TEXT"
");";
// 执行 SQL 语句
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS tests "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"test_name TEXT,"
"Creater TEXT,"
"class TEXT,"
"problems_count INTEGER"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS timu "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"text TEXT UNIQUE,"
"answer INTEGER"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS stu"
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"majority TEXT,"
"class TEXT,"
"name TEXT,"
"test_index INTEGER,"
"test_name TEXT,"
"user TEXT,"
"score INTEGER"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS students "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"user TEXT UNIQUE,"
"name TEXT,"
"class TEXT,"
"majority TEXT"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS class "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS majority "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sql_create_table="CREATE TABLE IF NOT EXISTS test_include "
"("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"text TEXT ,"
"answer INTEGER,"
"test_index INTEGER"
");";
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
sqlite3_free(errMsg);
sqlite3_close(db);
*recall=-1;return;
}
sqlite3_free(errMsg);
sqlite3_close(db);
}
int stu_type_check(){
sqlite3 *db;
char *errMsg = 0;
int rc;
// 打开数据库,如果数据库文件不存在则创建它
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
sqlite3_close(db);
return -1;
}
const char *sql = "SELECT class FROM students WHERE user = ?;";
sqlite3_stmt *stmt;
// 编译 SQL 语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
sqlite3_finalize(stmt);
sqlite3_close(db);
return -1;
}
// 绑定查询参数
sqlite3_bind_text(stmt, 1, Username, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if(rc==SQLITE_ROW){
char *cl=(const char *)sqlite3_column_text(stmt, 0);
strcpy(class,cl);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 1;
}
else{
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
}
void stu_type_insert(char *name,char *class,char *majority,int *recall,char *errmsg) {
if(!name[0]){
strcpy(errmsg,"The name is empty!");
*recall=-1;
return;
}
if(!class[0]){
strcpy(errmsg,"The class is empty!");
*recall=-1;
return;
}
if(!majority[0]){
strcpy(errmsg,"The majority is empty!");
*recall=-1;
return;
}
sqlite3 *db;
char *errMsg = 0;
int rc;
// 打开数据库,如果数据库文件不存在则创建它
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
return;
}
const char *sql = "SELECT name FROM class WHERE name = ?;";
sqlite3_stmt *stmt;
// 编译 SQL 语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
// 绑定查询参数
sqlite3_bind_text(stmt, 1, class, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if(rc!=SQLITE_ROW){
strcpy(errmsg,"Unaccepted class.");
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
*recall=-1;
return;
}
sql = "SELECT name FROM majority WHERE name = ?;";
// 编译 SQL 语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
// 绑定查询参数
sqlite3_bind_text(stmt, 1, majority, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if(rc!=SQLITE_ROW){
strcpy(errmsg,"Unaccepted majority.");
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
*recall=-1;
return;
}
sql="INSERT INTO students (user,name,class,majority) VALUES(?,?,?,?)";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
sqlite3_bind_text(stmt, 1, Username, -1, SQLITE_STATIC);
sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
sqlite3_bind_text(stmt, 3, class, -1, SQLITE_STATIC);
sqlite3_bind_text(stmt, 4, majority, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
strcpy(errmsg,"Error:database error");
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
*recall=-1;return;
}
sqlite3_free(errMsg);
sqlite3_finalize(stmt);
sqlite3_close(db);
*recall=0;
return;
}
void add(char* test,int *recall,char* errmsg){
if(!test[0]){
*recall=1;
return;
}
double ans;
char *test2[9999];
strcpy(test2,test);
calculate(test2,recall,errmsg,&ans);
if(*recall==-1)return;
sqlite3 *db;
char *errMsg = 0;
int rc;
// 打开数据库,如果数据库文件不存在则创建它
rc = sqlite3_open("./data/msg.db", &db);
if (rc) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
return;
}
char *sql_insert="INSERT INTO timu (text,answer) VALUES (?, ?);";
sqlite3_stmt *insert;
rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
if (rc != SQLITE_OK) {
strcpy(errmsg,"Error:database error.");
*recall=-1;
sqlite3_close(db);
return;
}
// 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
sqlite3_bind_text(insert, 1, test, -1, SQLITE_STATIC);
// 将第二个参数 (password) 绑定到 SQL 语句中的第二个 "?"
sqlite3_bind_double(insert, 2, ans);
rc = sqlite3_step(insert);
if (rc != SQLITE_DONE) {
strcpy(errmsg,"Error:database error");
sqlite3_free(errMsg);
sqlite3_finalize(insert);
sqlite3_close(db);
*recall=-1;return;
}
sqlite3_free(errMsg);
sqlite3_finalize(insert);
sqlite3_close(db);
*recall=0;
return;
}