IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Sqlite源码解读(二) -> 正文阅读

[大数据]Sqlite源码解读(二)

2021SC@SDUSC

本篇开始解读代码:

开头一堆注释主要说明此文件是基于Windows NT操作系统内核(区分于Unix)

开始分析代码

#if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL)

#? error "WAL mode requires support from the Windows NT kernel, compile\

?with SQLITE_OMIT_WAL."

如果不是windows NT 操作系统且没有引入WAL模式,则会报错。

关于WAL模式:Write ahead logging.WAL是一种日志模式,在3.7版本后被引入,用来保证日志一定先于对应的脏页落盘。Sqlite日志文件主要有DELETE和WAL两种。WAL较于DELETE的优点是:1.WAL支持读写并发,而DELETE读写互斥;2.WAL只需一次fsync调用,而且WAL的顺序写日志优于DELETE 的离散写日志。

#if !SQLITE_OS_WINNT && SQLITE_MAX_MMAP_SIZE>0

#? error "Memory mapped files require support from the Windows NT kernel,\

?compile with SQLITE_MAX_MMAP_SIZE=0."

#endif

mmap是一个内存映射文件的方法,将该文件的磁盘地址映射到进程的虚拟地址。这样进程就可以用指针读写操作该内存,省去了对read()和write()系统函数的调用。

#ifndef NTDDI_WIN8

#? define NTDDI_WIN8???????????? ???????????0x06020000

#endif

#ifndef NTDDI_WINBLUE

#? define NTDDI_WINBLUE???????????????????? 0x06030000

#endif

#ifndef NTDDI_WINTHRESHOLD

#? define NTDDI_WINTHRESHOLD??????????????? 0x06040000

#endif

定义需要用到的SDK版本的常数

SDK包含了开发本Windows版本所需的函数、常数、API、相关工具及示例。

#ifndef SQLITE_WIN32_MAX_PATH_BYTES
#? define SQLITE_WIN32_MAX_PATH_BYTES?? (SQLITE_WIN32_MAX_PATH_CHARS*4)
#endif
 
#ifndef SQLITE_WINNT_MAX_PATH_BYTES
#? define SQLITE_WINNT_MAX_PATH_BYTES?? \
??????????????????????????? (sizeof(WCHAR) * SQLITE_WINNT_MAX_PATH_CHARS)
#endif

对Win32路径名长度规定,每个字符用4个字节表示,采用UTF8编码。

对WinNT路径名长度规定,用Wchar长度乘unicode最大char长度。

#if SQLITE_OS_WINCE
typedef struct winceLock {
? int nReaders;?????? /* Number of reader locks obtained */
? BOOL bPending;????? /* Indicates a pending lock has been obtained */
? BOOL bReserved;???? /* Indicates a reserved lock has been obtained */
? BOOL bExclusive;??? /* Indicates an exclusive lock has been obtained */
} winceLock;
#endif

WINCE是一个操作界面源于Windows的嵌入式新型操作系统。

创建wincelock结构体,并指出三个布尔变量。

typedef struct winFile winFile;
struct winFile {
? const sqlite3_io_methods *pMethod; /*** Must be first ***/
? sqlite3_vfs *pVfs;????? /* The VFS used to open this file */
? HANDLE h;?????????????? /* Handle for accessing the file */
? u8 locktype;??????????? /* Type of lock currently held on this file */
? short sharedLockByte;?? /* Randomly chosen byte used as a shared lock */
? u8 ctrlFlags;?????????? /* Flags.? See WINFILE_* below */
? DWORD lastErrno;??????? /* The Windows errno from the last I/O error */
#ifndef SQLITE_OMIT_WAL
? winShm *pShm;?????????? /* Instance of shared memory on this file */
#endif
? const char *zPath;????? /* Full pathname of this file */
? int szChunk;??????????? /* Chunk size configured by FCNTL_CHUNK_SIZE */
#if SQLITE_OS_WINCE
? LPWSTR zDeleteOnClose;? /* Name of file to delete when closing */
? HANDLE hMutex;????????? /* Mutex used to control access to shared lock */
? HANDLE hShared;???????? /* Shared memory segment used for locking */
? winceLock local;??????? /* Locks obtained by this instance of winFile */
? winceLock *shared;????? /* Global shared lock memory for the file? */
#endif
#if SQLITE_MAX_MMAP_SIZE>0
? int nFetchOut;??????????????? /* Number of outstanding xFetch references */
? HANDLE hMap;????????????????? /* Handle for accessing memory mapping */
? void *pMapRegion;???????????? /* Area memory mapped */
? sqlite3_int64 mmapSize;?????? /* Size of mapped region */
? sqlite3_int64 mmapSizeMax;??? /* Configured FCNTL_MMAP_SIZE value */
#endif
};
 
typedef struct winVfsAppData winVfsAppData;
struct winVfsAppData {
? const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */
? void *pAppData;??????????????????? /* The extra pAppData, if any. */
? BOOL bNoLock;????????????????????? /* Non-zero if locking is disabled. */
};
 
 

创建了winFile结构体

注册时首先声明VFS接口函数,在tvfs_vfs结构体里

static sqlite3_vfs tvfs_vfs

在pAppData记录原来默认的VFS

pVfs->pAppData = (void *)p;//把信息存到pVfs->pAppData里

void *pAppData:该指针指向一个存储有各种文件io操作方法的结构体地址

Win下默认使用的是win32 vfsVFS首先要注册,使用sqlite3_vfs_register函数。

接下来是tcl命令参数。假设注册VFS时新建的命令是tvfs,使用格式为:tvfs shm FILE VALUE。

db eval {CREATE TABLE t1(a TEXT, b INTEGER)} #新建表

db eval {

?? INSERT INTO t1 VALUES('one',1);

?? INSERT INTO t1 VALUES('two',2);?

?? INSERT INTO t1 VALUES(NULL,3);

}? #插入行

??? puts [db eval {SELECT * FROM t1}] #显示表的所有行并输出结果

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:35:16  更:2021-10-11 17:37:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:30:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码