完成所有预设功能,未调试:bug:容易出现数据库锁死。
This commit is contained in:
parent
2a8ed8f1a3
commit
28108cee69
@ -10,12 +10,11 @@ add_executable(o
|
|||||||
include/sqlite3.h
|
include/sqlite3.h
|
||||||
include/sqlite3ext.h
|
include/sqlite3ext.h
|
||||||
include/extern.h
|
include/extern.h
|
||||||
include/myerror.h
|
|
||||||
main.c
|
main.c
|
||||||
sqlite3.c
|
sqlite3.c
|
||||||
login.c
|
|
||||||
ui.c
|
ui.c
|
||||||
signin.c
|
|
||||||
include/ui.h
|
include/ui.h
|
||||||
|
o.c
|
||||||
|
calculate.c
|
||||||
)
|
)
|
||||||
target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}")
|
target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}")
|
204
calculate.c
Normal file
204
calculate.c
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
//参考文章:https://blog.csdn.net/lei20172017/article/details/116404682
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include<windows.h>
|
||||||
|
#define MAX_SIZE 1000
|
||||||
|
/*定义一个运算符栈*/
|
||||||
|
typedef struct {
|
||||||
|
char Operator[MAX_SIZE];
|
||||||
|
int top;
|
||||||
|
} OptorStack;
|
||||||
|
/*定义一个操作数栈*/
|
||||||
|
typedef struct {
|
||||||
|
double Operand[MAX_SIZE];
|
||||||
|
int top;
|
||||||
|
} OpndStack;
|
||||||
|
/*初始化运算符栈*/
|
||||||
|
void InitOptor(OptorStack *S) {
|
||||||
|
S->top = -1;
|
||||||
|
}
|
||||||
|
/*初始化操作数栈*/
|
||||||
|
void InitOpnd(OpndStack *S) {
|
||||||
|
S->top = -1;
|
||||||
|
}
|
||||||
|
/*运算符出栈*/
|
||||||
|
int PopOptor(OptorStack *S,int *recall,char *errmsg) {
|
||||||
|
if(S->top==-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
S->top--;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*操作数出栈*/
|
||||||
|
int PopOpnd(OpndStack *S,int *recall,char *errmsg) {
|
||||||
|
if(S->top==-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
S->top--;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*运算符入栈*/
|
||||||
|
int PushOptor(OptorStack *S,char ch,int *recall,char *errmsg) {
|
||||||
|
if(S->top==MAX_SIZE-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
S->top++;
|
||||||
|
S->Operator[S->top]=ch;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*操作数入栈*/
|
||||||
|
int PushOpnd(OpndStack *S,double ch,int *recall,char *errmsg) {
|
||||||
|
if(S->top==MAX_SIZE-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
S->top++;
|
||||||
|
S->Operand[S->top]=ch;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*取运算符栈栈顶元素*/
|
||||||
|
char GetOptor(OptorStack *S,int *recall,char *errmsg) {
|
||||||
|
if(S->top==-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return S->Operator[S->top];
|
||||||
|
}
|
||||||
|
/*取操作数栈栈顶元素*/
|
||||||
|
double GetOpnd(OpndStack *S,int *recall,char *errmsg) {
|
||||||
|
if(S->top==-1) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return S->Operand[S->top];
|
||||||
|
}
|
||||||
|
/*表达式运算函数*/
|
||||||
|
double Calculate(double a,double b,char op,int *recall,char *errmsg) {
|
||||||
|
double result;
|
||||||
|
if(op=='+') result=a+b;
|
||||||
|
if(op=='-') result=a-b;
|
||||||
|
if(op=='*') result=a*b;
|
||||||
|
if(op=='/') { //要防止除数为0
|
||||||
|
if(b==0) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.The divisor is not 0");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
result=a/b;
|
||||||
|
}
|
||||||
|
return result; //返回结果result
|
||||||
|
}
|
||||||
|
|
||||||
|
int change(char ch) {
|
||||||
|
switch(ch) {
|
||||||
|
case '+':
|
||||||
|
return 0;
|
||||||
|
case '-':
|
||||||
|
return 1;
|
||||||
|
case '*':
|
||||||
|
return 2;
|
||||||
|
case '/':
|
||||||
|
return 3;
|
||||||
|
case '(':
|
||||||
|
return 4;
|
||||||
|
case ')':
|
||||||
|
return 5;
|
||||||
|
case '#':
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*定义一个算符优先关系矩阵*/
|
||||||
|
char cmp[7][8]= {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=?",">>>>?>>","<<<<<?="};
|
||||||
|
/*算符比较函数,返回优先级:>或<或=*/
|
||||||
|
int Compare(char ch1,char ch2,int *recall,char *errmsg) {
|
||||||
|
if(cmp[change(ch1)][change(ch2)]=='?') {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return cmp[change(ch1)][change(ch2)];
|
||||||
|
}
|
||||||
|
/*检查函数,用来检查输入的表达式的操作数和运算符的合法性*/
|
||||||
|
int Check(char *S,int len) {
|
||||||
|
int i;
|
||||||
|
for(i=0; i<len; i++) {
|
||||||
|
if(S[i]>='0'&&S[i]<='9')continue;
|
||||||
|
if(S[i]=='('||S[i]==')'||S[i]=='*'||S[i]=='/'||S[i]=='+'||S[i]=='-'||S[i]=='.')continue;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculate(char *expre,int *recall,char *errmsg,double *answer) {
|
||||||
|
SetConsoleOutputCP(65001);
|
||||||
|
char opd[9999]; //opd用来存操作数
|
||||||
|
int len;
|
||||||
|
OptorStack Optor;
|
||||||
|
OpndStack Opnd;
|
||||||
|
InitOptor(&Optor);
|
||||||
|
InitOpnd(&Opnd);
|
||||||
|
PushOptor(&Optor,'#',recall,errmsg);
|
||||||
|
len = strlen(expre);
|
||||||
|
int kk=0;
|
||||||
|
for(int i=0;i<len;i++){
|
||||||
|
if(expre[len]>='0'&&expre[len]<='9')continue;
|
||||||
|
else kk=1;
|
||||||
|
}
|
||||||
|
if(kk==0){
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"you should make sure this is a expression.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Check(expre,len) == 0) {
|
||||||
|
*recall=-1;
|
||||||
|
strcpy(errmsg,"Wrong input.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int i,j=0,k=0;
|
||||||
|
double x,y;
|
||||||
|
expre[len] = '#'; //在expre数组后加个#结尾标志
|
||||||
|
for (i=0; i<=len; i++) {
|
||||||
|
if ((expre[i]>='0' && expre[i]<='9') || expre[i] == '.') {
|
||||||
|
opd[k++] = expre[i]; //将数字字符存入操作数数组opd中
|
||||||
|
j = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(j) {
|
||||||
|
opd[k] = '\0';
|
||||||
|
PushOpnd(&Opnd,atof(opd),recall,errmsg);
|
||||||
|
j=0;
|
||||||
|
k=0;
|
||||||
|
}
|
||||||
|
switch (Compare(GetOptor(&Optor,recall,errmsg),expre[i],recall,errmsg)) { //比较运算符栈的栈顶运算符和运算符expre[i]的优先级
|
||||||
|
case '<':
|
||||||
|
PushOptor(&Optor,expre[i],recall,errmsg);
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
PopOptor(&Optor,recall,errmsg);
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
y = GetOpnd(&Opnd,recall,errmsg),PopOpnd(&Opnd,recall,errmsg);
|
||||||
|
x = GetOpnd(&Opnd,recall,errmsg),PopOpnd(&Opnd,recall,errmsg);
|
||||||
|
PushOpnd(&Opnd,Calculate(x,y,GetOptor(&Optor,recall,errmsg),recall,errmsg),recall,errmsg);
|
||||||
|
PopOptor(&Optor,recall,errmsg);
|
||||||
|
i--;
|
||||||
|
break;
|
||||||
|
default:break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(recall==-1)return;
|
||||||
|
*answer = GetOpnd(&Opnd,recall,errmsg);
|
||||||
|
}
|
@ -4,5 +4,14 @@
|
|||||||
|
|
||||||
#ifndef EXTERN_H
|
#ifndef EXTERN_H
|
||||||
#define EXTERN_H
|
#define EXTERN_H
|
||||||
extern char *Username;
|
#define WELCOME_UI 1
|
||||||
|
#define LOGIN_UI 2
|
||||||
|
#define SIGNIN_UI 3
|
||||||
|
#define STUDENT_UI 4
|
||||||
|
#define TEACHER_UI 5
|
||||||
|
#define STU_TEST_UI 6
|
||||||
|
#define STU_HIS_SC_UI 7
|
||||||
|
#define STU_EXC 8
|
||||||
|
#define T_PROBLEM_UI 9
|
||||||
|
#define ADD_UI 10
|
||||||
#endif //EXTERN_H
|
#endif //EXTERN_H
|
||||||
|
@ -14,4 +14,14 @@ void Login(char *username,char*password,int *recall,char *errmsg);
|
|||||||
void Signin(const char *username,const char*password,int *recall,char *errmsg);
|
void Signin(const char *username,const char*password,int *recall,char *errmsg);
|
||||||
|
|
||||||
void myexit();
|
void myexit();
|
||||||
|
|
||||||
|
void db_create(int *recall,char *errmsg);
|
||||||
|
|
||||||
|
int stu_type_check();
|
||||||
|
|
||||||
|
void stu_type_insert(char *name,char *class,char *majority,int *recall,char *errmsg);
|
||||||
|
|
||||||
|
void add(char* test,int *recall,char* errmsg);
|
||||||
|
|
||||||
|
void calculate(char *expre,int *recall,char *errmsg,double *answer);
|
||||||
#endif //FUNCTION_H
|
#endif //FUNCTION_H
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by zhang on 2024/12/25.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "function.h"
|
|
||||||
|
|
||||||
#ifndef MYERROR_H
|
|
||||||
#define MYERROR_H
|
|
||||||
|
|
||||||
void Error_Invalid_input();
|
|
||||||
void Error_Invalid_input(){
|
|
||||||
fprintf(stdout,"Error:不合法的输入!输入'0'以继续");
|
|
||||||
while(getchar() != '0');
|
|
||||||
clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
10
include/ui.h
10
include/ui.h
@ -14,5 +14,15 @@ int TeachersDesktop_ui();
|
|||||||
|
|
||||||
int Welcome_ui();
|
int Welcome_ui();
|
||||||
|
|
||||||
|
void stu_test_ui(int *recall,char *errmsg,char *class);
|
||||||
|
|
||||||
|
void stu_his_sc_ui();
|
||||||
|
|
||||||
|
void stu_exercise_ui();
|
||||||
|
|
||||||
|
int t_problem_ui();
|
||||||
|
|
||||||
|
void create_ui();
|
||||||
|
|
||||||
|
int add_ui();
|
||||||
#endif //O_UI_H
|
#endif //O_UI_H
|
||||||
|
56
login.c
56
login.c
@ -1,56 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include<string.h>
|
|
||||||
#include "./include/function.h"
|
|
||||||
#include "./include/ui.h"
|
|
||||||
void Login(char *username,char*password,int *recall,char *errmsg){
|
|
||||||
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 user, password 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, 1);
|
|
||||||
|
|
||||||
// 如果密码匹配
|
|
||||||
if (db_password && strcmp(db_password, password) == 0) {
|
|
||||||
*recall=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;
|
|
||||||
}
|
|
107
main.c
107
main.c
@ -6,68 +6,71 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "./include/function.h"
|
#include "./include/function.h"
|
||||||
#include "./include/ui.h"
|
#include "./include/ui.h"
|
||||||
#include "./include/myerror.h"
|
|
||||||
#include "./include/extern.h"
|
#include "./include/extern.h"
|
||||||
#include "./include/curses.h"
|
#include "./include/curses.h"
|
||||||
#define WELCOME_UI 1
|
char Username[15];
|
||||||
#define LOGIN_UI 2
|
char class[15];
|
||||||
#define SIGNIN_UI 3
|
void mytest();
|
||||||
void myexit() {
|
int main() {
|
||||||
endwin();
|
initscr(); // 初始化curses
|
||||||
|
cbreak(); // 禁用行缓冲
|
||||||
|
noecho(); // 不显示输入字符
|
||||||
|
curs_set(0); // 隐藏光标
|
||||||
|
keypad(stdscr, TRUE); // 启用键盘按键的特殊处理
|
||||||
|
mousemask(ALL_MOUSE_EVENTS, NULL); // 启用鼠标事件
|
||||||
|
timeout(100); // 设置输入超时,防止程序卡死
|
||||||
|
int recall;
|
||||||
|
char *errmsg[100];
|
||||||
|
db_create(&recall,errmsg);
|
||||||
|
if(recall!=0){
|
||||||
|
fprintf(stderr,"%s\ninput any key to exit.",errmsg);
|
||||||
|
getchar();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
//int code=TEACHER_UI;
|
||||||
//void test() {
|
|
||||||
// // 初始化 ncurses
|
|
||||||
// initscr();
|
|
||||||
// cbreak(); // 禁用行缓冲
|
|
||||||
// noecho(); // 不显示输入字符
|
|
||||||
// curs_set(0); // 隐藏光标
|
|
||||||
//
|
|
||||||
// // 启用所有鼠标事件
|
|
||||||
// mousemask(ALL_MOUSE_EVENTS, NULL);
|
|
||||||
//
|
|
||||||
// // 创建一个新的窗口
|
|
||||||
// WINDOW *win = newwin(10, 30, 5, 5);
|
|
||||||
// box(win, 0, 0); // 为窗口添加边框
|
|
||||||
// mvwprintw(win, 1, 1, "Click inside this window.");
|
|
||||||
// keypad(win,TRUE);
|
|
||||||
// wrefresh(win); // 刷新窗口以显示内容
|
|
||||||
//
|
|
||||||
// MEVENT event; // 用于存储鼠标事件
|
|
||||||
//
|
|
||||||
// while (1) {
|
|
||||||
// int ch = wgetch(win); // 从指定窗口获取输入
|
|
||||||
//
|
|
||||||
// if (ch == KEY_MOUSE) {
|
|
||||||
// if (nc_getmouse(&event) == OK) {
|
|
||||||
// // 打印鼠标事件的信息
|
|
||||||
// mvwprintw(win, 3, 1, "Mouse at (%d, %d), button %d", event.x, event.y, event.bstate);
|
|
||||||
// wrefresh(win); // 刷新窗口以显示鼠标点击位置
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// mvwprintw(win, 4, 1, "You pressed a key: %c", ch);
|
|
||||||
// wrefresh(win); // 刷新窗口以显示按键信息
|
|
||||||
// break; // 按键退出循环
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // 等待用户按键后退出
|
|
||||||
// getch();
|
|
||||||
//
|
|
||||||
// // 清理和结束程序
|
|
||||||
// endwin();
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
int code=Welcome_ui();
|
int code=Welcome_ui();
|
||||||
while(1){
|
while(1){
|
||||||
switch(code){
|
switch(code){
|
||||||
case WELCOME_UI:code=Welcome_ui();break;
|
case WELCOME_UI:code=Welcome_ui();break;
|
||||||
case LOGIN_UI:code=Login_ui();break;
|
case LOGIN_UI:code=Login_ui();break;
|
||||||
case SIGNIN_UI:code=Signin_ui();break;
|
case SIGNIN_UI:code=Signin_ui();break;
|
||||||
case 0:myexit();
|
case STUDENT_UI:code=StudentsDesktop_ui();break;
|
||||||
|
case TEACHER_UI:code=TeachersDesktop_ui();break;
|
||||||
|
case T_PROBLEM_UI:code=t_problem_ui();break;
|
||||||
|
case ADD_UI:code=add_ui();break;
|
||||||
|
case 0:myexit();return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//void mytest(){
|
||||||
|
// sqlite3 *db;
|
||||||
|
// char *errMsg = 0;
|
||||||
|
// int rc;
|
||||||
|
// // 打开数据库,如果数据库文件不存在则创建它
|
||||||
|
// rc = sqlite3_open("./data/msg.db", &db);
|
||||||
|
// for(int i=1;i<=100;i++){
|
||||||
|
// char *sql_insert="INSERT INTO tests (test_name,Creater) VALUES (?, 'xianya');";
|
||||||
|
// sqlite3_stmt *insert;
|
||||||
|
// char test[10];
|
||||||
|
// snprintf(test,7,"test%d",i);
|
||||||
|
// rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
|
||||||
|
// if (rc != SQLITE_OK) {
|
||||||
|
// sqlite3_close(db);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
|
||||||
|
// sqlite3_bind_text(insert, 1, test, -1, SQLITE_STATIC);
|
||||||
|
//
|
||||||
|
// rc = sqlite3_step(insert);
|
||||||
|
// if (rc != SQLITE_DONE) {
|
||||||
|
// sqlite3_free(errMsg);
|
||||||
|
// sqlite3_finalize(insert);
|
||||||
|
// sqlite3_close(db);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// printf("OK");
|
||||||
|
// sqlite3_close(db);
|
||||||
|
// return;
|
||||||
|
//}
|
506
o.c
Normal file
506
o.c
Normal file
@ -0,0 +1,506 @@
|
|||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
63
signin.c
63
signin.c
@ -1,63 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by zhang on 2024/12/29.
|
|
||||||
//
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "./include/function.h"
|
|
||||||
#include "./include/sqlite3.h"
|
|
||||||
|
|
||||||
void Signin(const char *username,const char*password,int *recall,char *errmsg){
|
|
||||||
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_create_table =
|
|
||||||
"CREATE TABLE IF NOT EXISTS users "
|
|
||||||
"("
|
|
||||||
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
||||||
"user TEXT UNIQUE,"
|
|
||||||
"password 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;
|
|
||||||
}
|
|
||||||
const char *sql_insert="INSERT INTO users (user, password) 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将第一个参数 (name) 绑定到 SQL 语句中的第一个 "?"
|
|
||||||
sqlite3_bind_text(insert, 1, username, -1, SQLITE_STATIC);
|
|
||||||
|
|
||||||
// 将第二个参数 (email) 绑定到 SQL 语句中的第二个 "?"
|
|
||||||
sqlite3_bind_text(insert, 2, password, -1, SQLITE_STATIC);
|
|
||||||
|
|
||||||
rc = sqlite3_exec(db,insert,0,0,&errMsg);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
strcpy(errmsg,errMsg);
|
|
||||||
sqlite3_free(errMsg);
|
|
||||||
sqlite3_finalize(insert);
|
|
||||||
sqlite3_close(db);
|
|
||||||
*recall=-1;return;
|
|
||||||
}
|
|
||||||
sqlite3_close(db);
|
|
||||||
*recall=0;
|
|
||||||
return;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user