整个电子词典是分块做的:包含的Dic_Server.c,Dic_Client.c,db.c,query.c,xprtcl.c,dict.h,xprtcl.h,dict.txt(单词文件)

下面是db.c代码:主要用创建子进程实现服务器端的并发操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

#include "dict.h"
#include "xprtcl.h"

#define DATABASE "dict.db"
#define T_USERS "users" /* table name for login users */
#define T_HISTORY "history" /* table name for query history */
#define MAXLEN_SQL 256

sqlite3 *g_db = NULL;
const char *login_name;
const char *login_passwd;

void db_close()
{
if (sqlite3_close(g_db) != SQLITE_OK) {
fprintf(stderr,
"error: close database: %s\n",
sqlite3_errmsg(g_db));
}
}

static int cb_tbl_isexist(
void* arg,
int count,
char** column_value,
char** column_name)
{
dprintf("cb_tbl_isexist was called once\n");
*((int*)arg) = 1; /* set existence flag as 1 */
return 0;
}

static int tbl_isexist(sqlite3 *db, const char *table_name)
{
char sqlstr[MAXLEN_SQL];

int exist;
char *errmsg;

if (snprintf(sqlstr, MAXLEN_SQL,
"select name from sqlite_master "
"where type='table' and name='%s'", table_name) < 0) {
dprintf("snprintf SQL error");
return 0;
}
dprintf("SQL: %s\n", sqlstr);

/*
* Note: this flag "exist" will be passed into the callback.
* If the callback occurred, it will be modified by
* the callback internally.
*/
exist = 0;
if (SQLITE_OK != sqlite3_exec(
db,
sqlstr,
cb_tbl_isexist,
&exist,
&errmsg)) {
dprintf("sqlite3_exec error (table[%s] existence): %s\n",
table_name, errmsg);
sqlite3_free(errmsg);
}
return exist;
}

static int tbl_create_usrs(sqlite3 *db) /*在数据库中创建需要的表格:usrs*/
{
char sqlstr[MAXLEN_SQL];
char *errmsg;

if (1 == tbl_isexist(db, T_USERS)) /*如果创建的表存在,退出*/
{
dprintf("table users already exists\n");
return 0;
}

if (snprintf(
sqlstr,
MAXLEN_SQL,
"create table users(usrname text, passwd text, state text);"
) < 0) {
perror("snprintf error");
return -1;
}
dprintf("SQL: %s\n", sqlstr);

if (SQLITE_OK != sqlite3_exec(
db,
sqlstr,
NULL,
NULL,
&errmsg)) {
fprintf(stderr, "error: create users: %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}

return 0;
}

static int tbl_create_history(sqlite3 *db) /*在数据库中创建需要的表格:usrs*/
{
char sqlstr[MAXLEN_SQL];
char *errmsg;

if (1 == tbl_isexist(db, T_HISTORY)) /*如果创建的表存在,退出*/
{
dprintf("table history already exists\n");
return 0;
}

if (snprintf(
sqlstr,
MAXLEN_SQL,
"create table history(usrname text, word text, time text);"
) < 0) {
perror("snprintf error");
return -1;
}
dprintf("SQL: %s\n", sqlstr);

if (SQLITE_OK != sqlite3_exec(
db,
sqlstr,
NULL,
NULL,
&errmsg)) {
fprintf(stderr, "error: create users: %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}

return 0;
}

int db_init()
{
int result;

result = sqlite3_open(DATABASE, &g_db);
if (result != SQLITE_OK)
{
if (NULL != g_db)
{
fprintf(stderr, "error: open database: %s\n",
sqlite3_errmsg(g_db));
}
else
{
fprintf(stderr, "error: failed to allocate memory!\n");
}
return -1;
}

if (tbl_create_usrs(g_db) < 0) {
goto _error_exit;
}

if (tbl_create_history(g_db) < 0) {
goto _error_exit;
}

return 0;

_error_exit:
db_close();
return -1;
}

static int cb_user_isexist(
void* arg,
int count,
char** column_value,
char** column_name)
{
dprintf("cb_user_isexist was called once\n");
*((int*)arg) = 1; /* set existence flag as 1 */
return 0;
}

static int user_isexist(sqlite3 *db, const char *user_name,const char *user_passwd)
{
char sqlstr[MAXLEN_SQL];

int exist;
char *errmsg;

if (snprintf(sqlstr, MAXLEN_SQL,
"select * from %s "
"where usrname='%s'", T_USERS, user_name) < 0) {
dprintf("snprintf SQL error");
return 0;
}
dprintf("SQL: %s\n", sqlstr);

/*
* Note: this flag "exist" will be passed into the callback.
* If the callback occurred, it will be modified by
* the callback internally.
*/
exist = 0;
if (SQLITE_OK != sqlite3_exec(
db,
sqlstr,
cb_user_isexist,
&exist,
&errmsg)) {
dprintf("sqlite3_exec error (user[%s] existence): %s\n",
user_name, errmsg);
sqlite3_free(errmsg);
}
return exist;
}

/*注册的账号*/
int tbl_insert_users(const char *name, const char *passwd)
{
char sqlstr[MAXLEN_SQL];
char *errmsg;

/* validating syntax of username and passwd ...... */

/* checking if user exists with the input name */

if (user_isexist(g_db, name, passwd)) /*账号已存在,退出*/
{
return -1;
}

/* in case passed checking */ /*账号不存在,向数据库中录入账号和密码*/
if (snprintf(sqlstr, MAXLEN_SQL, "insert into users values('%s', '%s', '0')",
name, passwd)< 0)
{
perror("snprintf error");
return -1;
}
dprintf("SQL: %s\n", sqlstr);

if (SQLITE_OK != sqlite3_exec(g_db, sqlstr, NULL, NULL, &errmsg))
{
fprintf(stderr, "error: insert users: %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}

return 0;
}
/*登录验证的回调函数*/
static int login_user_isexist(
void* arg,
int count,
char** column_value,
char** column_name)
{
//int i=0;
char sqlstr[MAXLEN_SQL];
char *errmsg;
dprintf("cb_user_isexist was called once\n");
if((*column_value[0] == *login_name) && (*column_value[1] == *login_passwd))
{
if((*column_value[2])== '0') /*验证账号是否已登录*/

{
//printf("entry this function\n");
if (snprintf(sqlstr, MAXLEN_SQL,
"update users set state = 1 where usrname = '%s'",
column_value[0])< 0)
{
perror("snprintf error");
return -1;
}
dprintf("SQL: %s\n", sqlstr);

if (SQLITE_OK != sqlite3_exec(g_db, sqlstr, NULL, NULL, &errmsg))
{
fprintf(stderr, "error: insert users: %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
*((int*)arg) = 1;/*set existence flag as 1 */
}
if((*column_value[2])== '1')
{
*((int*)arg) = 2;
}
}
return 0;
}

static int login_user_true(sqlite3 *db, const char *user_name,const char *user_passwd)
{
char sqlstr[MAXLEN_SQL];

int exist;
char *errmsg;

if (snprintf(sqlstr, MAXLEN_SQL,
"select * from %s "
"where usrname='%s'", T_USERS, user_name) < 0) {
dprintf("snprintf SQL error");
return 0;
}
dprintf("SQL: %s\n", sqlstr);

/*
* Note: this flag "exist" will be passed into the callback.
* If the callback occurred, it will be modified by
* the callback internally.
*/
exist = 0;
if (SQLITE_OK != sqlite3_exec(
db,
sqlstr,
login_user_isexist,
&exist,
&errmsg)) {
dprintf("sqlite3_exec error (user[%s] existence): %s\n",
user_name, errmsg);
sqlite3_free(errmsg);
}
return exist;
}

/*验证登陆账号是否注册*/
int login_users(const char *name, const char *passwd)
{
//char sqlstr[MAXLEN_SQL];
//char *errmsg;
int login_flag;

login_name = name;
login_passwd = passwd;

/* validating syntax of username and passwd ...... */

/* checking if user exists with the input name */
login_flag = login_user_true(g_db, name, passwd);
if (login_flag==1) /*账号是否已注册和登录*/
{
printf("login successfuly\n");
return 0;
}
if(login_flag==2) /*账号已登录*/
{
printf("Accounts have been online\n");
return 1;
}

return -1;
}

电子词典的相关子函数db.c程序的更多相关文章

  1. Python实现电子词典(图形界面)

    Python实现电子词典(图形界面) 终端电子词典:https://www.cnblogs.com/noonjuan/p/11341375.html 文件一览: .├── client.py├── d ...

  2. Python实现电子词典

    代码一览: dictionary/├── code│   ├── client.py│   ├── func.py│   ├── server.py│   └── settings.py├── dat ...

  3. SQLServer学习笔记<>相关子查询及复杂查询

    二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...

  4. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  5. C++第15周(春)项目3 - OOP版电子词典(一)

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序中须要的相 ...

  6. 第14周 项目三-OOP版电子词典

    做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对比的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词.显示词性和中文释义. ...

  7. 使用Android简单实现有道电子词典

    前言: 毕业设计的内容,仅仅有Java基础.没学过Android. 本着用到什么学什么.花费了10多个晚上完毕毕业设计. 当然,仅仅是简单的实线了电子词典功能,自始至终没有考虑过性能等问题. 本电子词 ...

  8. wxWidgets+wxSmith版电子词典

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关 ...

  9. C++第15周(春)项目3 - OOP版电子词典(二)

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关 ...

随机推荐

  1. JS加密库Crypto-JS SEA加密

    http://www.seacha.com/tools/aes.html 在该网站测试 CryptoJS有很多加密方式网上查阅后有 CryptoJS (crypto.js) 为 JavaScript ...

  2. 怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框

    从远程客户端访问服务器上的WebService能够显示,但点击调用相关的方法时显示“只能用于来自本地计算机的请求”,这时提醒我们还需要在服务器进行相关的配置才能让其他机器正常访问该WebService ...

  3. Python学习笔记(0)

    Python 是什么类型的语言 Python是脚本语言 Python下载地址:https://www.python.org/downloads/ Python版本:Python 3.4.2 - 64b ...

  4. createjs 更新

    使用0.8.2版本 不在需要单独 引入 MovieClip 文件了

  5. Pycharm使用问题# 程序界面出现方框字符

    Pycharm 程序至今依旧存在国际化问题,有时会出现程序界面有方框的现象,windows和linux好像都会出现,如下图:

  6. 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。

    如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和.不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2):而且求一个长度为n的 ...

  7. JS重要知识点

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  8. HTML 图像<img>

    定义和用法: img元素向网页中嵌入一副图像. 请注意:从技术上讲,<img>标签并不会在网页中插入图像,而是从网页上链接图像.<img>标签创建的是被引用图像的占位空间. 属 ...

  9. PHP中字符串的连接和换行

    PHP中字符串的连接使用点,不是加号.换行\n需要用双引号括起来,不能用单引号. eg. <?php print_r("hello"."\n"); pri ...

  10. Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题

    使用PL/SQL时, 每次第一次打开表的时候会提示"动态执行表不可访问,本会话的自动统计被禁止"的错误,一消息如下: V$SESSION,V$SESSTAT,V$STATNAME没 ...