《電子技術應用》
您所在的位置:首頁 > 測試測量 > 設計應用 > SQLite系統構架及虛擬機分析
SQLite系統構架及虛擬機分析
來源:微型機與應用2012年第10期
黨玉春1,翟秀云1,陳明通2
(1.攀枝花學院 機電工程學院,四川 攀枝花617000; 2.攀枝花學院 材料工程學院,四川 攀枝
摘要: 就目前廣泛使用的輕量級數據庫SQLite的構架進行分析,特別是對其中的虛擬數據庫引擎(VDBE)做了原理性的剖析,并結合實例,展示了SQLite的應用及SQLite內部VDBE指令程序的運行方式。
Abstract:
Key words :

摘  要: 就目前廣泛使用的輕量級數據庫SQLite構架進行分析,特別是對其中的虛擬數據庫引擎(VDBE)做了原理性的剖析,并結合實例,展示了SQLite的應用及SQLite內部VDBE指令程序的運行方式。
關鍵詞: SQLite;構架;VDBE;虛擬機

    SQLite是遵守ACID的輕量級關系型數據庫管理系統,完全免費、開源,無需任何配置也無需任何安裝程序[1]。它廣泛應用在各種嵌入式系統中,在iOS和Android等系統中都是集成在各自的庫中。
    虛擬機是當前比較流行的一種軟件構架,特別是在解釋性編程語言領域。在安全領域,虛擬機也被用于實現軟件的加密,是公認的一種非常高效且實用的技術手段。SQLite用較小規模的代碼用C語言實現了一個程序虛擬機,提高了代碼的獨立性,降低了耦合性,同時保持了很高的效率。
1 SQLite數據庫構架
    圖1所示為SQLite系統的總體構架圖[2]。整體上SQLite可以分為前端和后端:前端負責從用戶數據到平臺不相關的指令的轉換;后端處理數據流,深入到具體數據庫數據在磁盤上的操作,這些數據是和平臺相關的。SQLite的平臺無關性通過其內部實現的虛擬數據庫引擎VDME(Virtual Database Engine)來完成,總地來說,就是將SQL語句先翻譯成一種專門設計的語言,然后下層再調用平臺相關的系統API接口,完成相應的功能。

    SQLite的源代碼由96個C語言文件(.c和.h)組成,在編譯之前會由Makefile生成一個完整的文件,即為可以在官方網站上下載的sqlite3.c和sqlite3.h等文件,然后編譯形成所需要的庫或者可執行文件。
    圖1給出了SQLite的主要模塊及相互之間的關系,以下將分別介紹各個部分的功能。
    (1)接口(Interface)
    SQLite庫提供的對外不調用的接口大多數都在main.c、legacy.c和vdbeapi.c中,其他一些散布在源代碼的不同部分。對接口的查詢可以在文檔中找到詳細的介紹。為了避免命名上的沖突,所有外部可以調用的接口都以sqlite3_開頭[3]。
    (2)SQL編譯器(SQL Compiler)
    這是一個比較完整的編譯器構架,分別完成詞法分析、語法分析和中間代碼生成。詞法分析器(Tokenizer)由C語言實現,包含在tokenize.c中;語法分析器(Parser)由Lmon LALR(1)生成,和YACC/BISON類似,不兼容,但是生成的代碼是可重入且線程安全的,代碼包含在parse.c中;代碼生成器(Code Generator)生成虛擬機執行的中間代碼,包含的文件相對較多,例如select.c、update.c等,大多和SQL命令同名對應。
    (3)虛擬機VM(Virtual Machine)
    代碼生成器生成的中間代碼會通過VM執行。這部分后面會有更詳細的分解。
    (4)B-Tree(B-樹)
    數據庫在磁盤上的操作都是通過B-樹的,對應于數據庫中的每一個表或者索引都會有相應的B-樹。實現和接口分別在btree.c和btree.h中[4]。
    (5)頁緩存(Page Cache)
    數據的讀寫都以Chunk為單位進行,這樣可以提高效率。頁緩存負責這部分工作,同時提供了回滾(rollback)等功能,并對數據庫文件進行管理。實現和接口分別在pager.c和pager.h中。
    (6)系統接口(OS Interface)
    SQLite提供了一個系統抽象層,定義在os.h中。每個支持的平臺有自己對應的實現文件,例如os_uinx.c和os_win.c(及相應的頭文件os_unix.h和os_win.h)。
    (7)功能和測試(Utility和Test Code)
2 VDBE框架及關鍵源碼分析
    虛擬數據庫引擎VDBE(Virtual Database Engine)居于SQLite數據庫的核心部分。從整個SQLite的構架可以看出,它處在整個系統的中間部分:前端代碼完成對SQL語言的編譯,相當于簡化版本的一個編譯器;后端完成物理上的操作,即利用B-Tree和Pager對物理硬盤上的數據進行實際的操作。VDBE完成了這個層次上的抽象鏈接。
    整個虛擬數據庫引擎(VDBE)由若干個C語言文件組成,主題實現都包含在了vdbe.c(vdbe.h)中。vdbeInt.h定義了VDBE內部使用的各種結構和函數原型。vdbeaux.c實現了VDBE內部和整個SQLite構建VDBE程序需要的其他功能性函數代碼。vebeaip.c包含了供外部接口函數(SQLite庫外的應用程序,如sqlite3_bind系列函數)使用的一些結構。vdbemen.c 實現了在vdbe的存儲管理。
    對于用戶的SQL語句,編譯器會生成一個虛擬機實例。虛擬機實例在內部和外部是不同的。對內看到的是一個vdbe結構的實例,這個結構定義在vdbeInt.h中,代碼如下:
    struct Vdbe {
    sqlite3 *db;        /* 數據庫連接 */
    Op *aOp;            /* 保存虛擬機的空間 */
    …                /* 其他指令 */
    int nOp;            /* 生成的指令的條數 */
    char *zSql;        /* SQL語句 */
    …                /* 其他指令 */
    SubProgram *pProgram;  /* 虛擬機使用的其他子程序,
鏈表 */
    };
    一個虛擬機實例可以有多個子程序,每個子程序可以由多條指令組成。下面是子程序的結構:
    struct SubProgram {
    VdbeOp *aOp;            /* 指令 */
    int nOp;                /* 指令條數 */
    int nMem;            /* 需要的內部空間 */
    int nCsr;                /* 需要的游標 */
    void *token;            /* 循環觸發時需要的id */
    SubProgram *pNext;    /* 鏈表的下一個 */

 


    };
    現在的SQLite有142條操作指令,都定義在opcodes.h中,在vdbe.c中有相應的源代碼,將解析一些指令作為代表,詳細的技術文檔可以查看官方文檔。所有的指令大概可以分為3類:
    (1)數據操作:包含算術、邏輯運算、字符串操作等;
    (2)數據管理:主要關于內存和磁盤的操作。內存上如棧(stack)操作、數據的傳送等,磁盤操作主要是B-Tree和Pager模塊,包括打開及操作游標、事務的開始與結束等;
    (3)控制流:指令的跳轉。
    SQL語句在生成VDBE程序后,每條指令包含了一個操作碼(opcode)和至多5個操作數(operands:P1、P2、P3、P4和P5)。其中:
    (1)P1、P2、P3都是32 bit的帶符號整數,它們通常引用的是寄存器。
    (2)P2在所有的有跳轉功能的指令中表示目的地址。例如上面的第2條指令將會跳轉到第10條指令,然后順序執行。
    (3)P4可以是32 bit或者64 bit的帶符號整型數據、字符串、BLOB數據(二進制大對象)、函數指針等其他多樣的對象。
    (4)P5通常是無符號的字符,充當的是標識位。
    在SQLite的VDBE內部,所有的指令都是VdbeOp結構的一個實例(定義在vdbe.h中),結構的定義也主要是這5個操作數。
    struct VdbeOp {
    u8 opcode;    /* 操作碼類型 */
    …            /* 其他數據接口 */
    signed char p4type;    /* p4 的類型 */
    u8 p5;        /* p5是無符號字符型 */
    int p1;        /* 操作數1 */
    int p2;        /* 操作數2,通常是跳轉指令的目的 */
    int p3;        /* 操作數3 */
    union { /* ... */ } p4;        /* p4 是一個聯合,
可以有不同的類型 */
    …            /* 其他數據接口 */
};
    由代碼生成器生成的程序交由VM執行。sqlite3_step()會觸發內部vdbe解釋生成的vdbe指令。指令的執行在如下的函數中進行(SQLITE_PRIVATE 即為static關鍵字),此處去掉了煩瑣的細節,只展示其中的關鍵結構和一個指令的執行。
    SQLITE_PRIVATE int sqlite3VdbeExec(
        Vdbe *p                /* VDBE 實例 */
    ) {
        int    pc;                /* 程序計數器 */
        Op    *aOp = p->aOp;    /* 得到所有的指令 */
        Op    *pOp;            /* 當前指令 */
        int    rc=    SQLITE_OK;    /* 返回值 */
        sqlite3* db = p->db;    /* 數據庫連接實例 */
        u8 encoding = ENC(db);/* UTF-8編碼 */
        …                /* 其他初始化代碼 */
        switch ( pOp->opcode )    {    /* 在此之后就是一個
非常大的case代碼
            case OP_Goto: {
                CHECK_FOR_INTERRUPT;
                pc=pOp->p2-1;/* 調整程序計數器 */
                break;
            }
            …    /* 其他的case指令 */
        }
        …        /* 其他指令 */
    }
    這個函數是整個VDBE的核心執行函數,雖然重要,但是代碼的原理非常簡單,就是一系列的switch-case語句。在相應的case情況下,會執行相應的底層代碼,進行數據庫的磁盤操作。
3 實驗
3.1 數據庫編程接口

    SQLite的編程模型比較簡單,下面的例子給出了一個基本的框架。
    #include "sqlite3.h"
    #include <stdlib.h>
    int main(int argc, char **argv)
    {
        char        *file = "./test.db";/* 數據庫文件 */
        sqlite3    *db = NULL;    /* 數據庫連接實例 */
        int        rc = 0;        /* 返回值 */
        sqlite3_initialize();        /* 初始庫 */
        rc= sqlite3_open_v2(file, &db,
SQLITE_OPEN_READWRITE, NULL);
        /* 準備SQL語句,生成VDBE程序 */
        sqlite3_stmt    *stmt = NULL:
        rc=sqlite3_prepare_v2(db, "SELECT * FROM FILM",
 -1, &stmt, NULL);
            if (rc != SQLITE_OK) exit(-1);
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            const char *data = (const char*)
sqlite3_column_text(stmt, 0);
            printf("%s\n", data?data:"[NULL]");
        }
        sqlite3_finalize(stmt);
        sqlite3_close(db);            /* 關閉 */
        sqlite3_shutdown();            /* 釋放資源 */
    }
    在上面的例子中,使用了sqlite3_prepare_v2()和sqlite3_
step()函數,這是和內部的虛擬機聯系非常緊密的兩個函數,也是了解SQLite虛擬機的兩個點。sqlite3_prepare_v2()完成的是將SQL語句提交給SQL編譯器,編譯成VDBE指令程序,sqlite3_step()將驅動VDBE執行指令程序。
    從應用上來說,這僅僅是最簡單的數據庫應用框架,更多的接口信息可以查看官方的文檔。
3.2 VDBE程序分析
    在官方提供的下載中,有編譯好的命令行可執行程序,可以作為完全的SQLite數據庫管理工具。同時,它也考慮了一些Debug和Test功能,可以利用它們深入了解SQLite的內部機制??梢岳肧QLite命令行程序中的explain命令查看由代碼生成器生成的中間代碼的形式,這只需要在相應的SQL代碼前面加上explain就可以了。如以搜索的命令行顯示(如圖2所示,箭頭表示實際執行順序):
    圖2中,“addr”列是虛擬機的地址編號,并不是指令執行的順序,由于跳轉指令的存在,用箭頭標示出了指令運行的實際順序,也可以在SQLite編譯時指定相應的選項,然后利用指令“pragma vdbe_trace=on;”詳細地看到指令的運行過程和堆棧的變化情況。

    指令0~指令12都是對SQLite數據庫內部的準備:由指令1跳轉到指令10,指令10(Transaction)開始一個事務,指令11(VerifyCookie)在執行一個指令前檢查數據庫模式是否發生了變化,當發生了變化時要重置,指令12(TableLock)將要讀的數據庫表鎖起來,指令13(Goto)跳轉到指令2。
    從指令2開始是實際的對數據庫的操作了。指令2(OpenRead)會打開一個數據庫表的只讀游標,P1作為這個游標的標志,P2是打開的數據庫表的根頁(root page),P3==0表明是主數據庫,P4表明數據庫有兩列,P5說明是以P2的值作為根頁。(OpenRead指令的各個操作數還可以有其他含義,這里只是針對這條SQL語句的解釋,請查看技術文檔。)指令3(Rewind)~指令7(Next)完成了對所有查詢數據的遍歷。指令8(Close)關閉游標,指令9(Halt)結束這個VDBE程序。
    VDBE對上層提供的就是這樣的接口,而對下層將是調用相應的接口實現相應的功能,并由此完成模塊上的解耦合。
    由VDBE的定義、代碼分析及以上的實驗,可以總結出SQLite的整體構架:
    外部調用SQLite接口函數sqlite3_prepare(), SQL語句通過SQL編譯器生成對應的VDBE指令程序;
    內部調用sqlite3_step()驅動,內部執行sqlite3VdbeEx-
ec(),switch-case語句執行相應指令。底層通過B-Tree和Pager實現對磁盤數據庫文件的管理,如圖3所示。
    在實際應用中,可以設計一個面向應用的指令集,利用程序虛擬機設計中間抽象層,提高平臺通用性。同時程序虛擬機也為語言虛擬機、系統虛擬機及安全沙盒等技術提供了技術基礎。

參考文獻
[1] OWENS M.The definitive guide to SQLite[M].Apress,2006.
[2] KREIBICH J A.Using SQLite[M].O'Reilly Media,2010.
[3] 李蔚,陳亞峰.嵌入式數據庫SQLite及其應用研究[J].沿海企業與科技,2010(10):45-47.
[4] 杜國祥,石俊杰.SQLite嵌入式數據庫的應用[J].電腦編程技巧與維護,2010(14):43-46.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          91久久久久久久久久久久久| 亚洲网友自拍| 国产精品多人| 国产欧美日韩亚洲一区二区三区| 国产欧美日韩高清| 中日韩在线视频| 狠狠色狠狠色综合日日五| 在线视频日韩精品| 欧美日韩免费观看一区=区三区| 久久久人成影片一区二区三区| 欧美另类人妖| 狠狠久久综合婷婷不卡| 国产精品高潮在线| 久久久久久亚洲精品中文字幕| 亚洲精品视频啊美女在线直播| 夜夜嗨av色一区二区不卡| 激情综合激情| 国产欧美va欧美不卡在线| 99国产精品久久久久久久久久| 欧美成人情趣视频| 美女精品自拍一二三四| 亚洲国产一二三| 亚洲一区二区在线| 久久不射2019中文字幕| 欧美成人免费播放| 在线日韩精品视频| 国产日韩成人精品| 先锋影音久久久| 欧美xxx成人| 欧美—级高清免费播放| 国产主播一区二区三区| 国产色爱av资源综合区| 欧美日韩一区二区三区四区五区| 欧美性做爰毛片| 一区二区三区四区五区视频| 亚洲午夜羞羞片| 在线一区二区三区四区| 久久午夜电影| 亚洲天堂av图片| 久久裸体艺术| 久久人91精品久久久久久不卡| 国产亚洲成精品久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产午夜精品理论片a级大结局| 亚洲国产精彩中文乱码av在线播放| 久久久久久久久岛国免费| 久久精品国产综合精品| 亚洲欧美日韩在线播放| 亚洲一区www| 最新中文字幕一区二区三区| 欧美14一18处毛片| 久久午夜精品| 在线观看亚洲视频啊啊啊啊| 亚洲精品国产精品国自产在线| 久久人人爽人人| 国产精品久久久久久久久久三级| 欧美激情aaaa| 久久国产夜色精品鲁鲁99| 欧美婷婷在线| 国产精品美女主播| 国产精品vip| 国产精品三区www17con| 亚洲在线免费观看| 久久久一二三| 欧美精品激情blacked18| 亚洲一级网站| 久久这里只精品最新地址| 久久成人免费视频| 欧美色综合天天久久综合精品| 亚洲一区国产视频| 国产视频观看一区| 国产精品乱看| 影音先锋欧美精品| 国产一级一区二区| 国产欧美午夜| 欧美四级电影网站| 欧美色123| 亚洲精品日韩精品| 久久久久久久成人| 久色婷婷小香蕉久久| 亚洲专区在线| 鲁鲁狠狠狠7777一区二区| 一区二区激情| 欧美午夜一区二区三区免费大片| 亚洲国产毛片完整版| 欧美日韩在线不卡| 欧美一区二区精品久久911| 欧美中文字幕视频| 国产精品成人久久久久| 亚洲福利专区| 欧美一区国产二区| 久久亚洲精品网站| 欧美亚洲日本一区| 久久久美女艺术照精彩视频福利播放| 欧美日韩日日夜夜| 久久久噜噜噜久久久| 免费观看成人网| 欧美精品日韩一区| 亚洲电影在线观看| 日韩亚洲欧美在线观看| 亚洲一区国产| 久久久综合精品| 亚洲自拍偷拍色片视频| 国产精品进线69影院| 欧美日韩亚洲一区二区三区在线| 久久九九全国免费精品观看| 激情久久久久久久| 国产欧美日韩亚州综合| 久久日韩精品| 一本久久a久久精品亚洲| 欧美日本高清视频| 欧美88av| 久久偷看各类wc女厕嘘嘘偷窃| 午夜视频一区二区| 亚洲精品国产精品国自产观看浪潮| 国产日韩欧美视频在线| 久久riav二区三区| 欧美三级日本三级少妇99| 欧美成人一区二区三区在线观看| 9久草视频在线视频精品| 欧美视频免费看| 男人插女人欧美| 亚洲精选国产| 欧美精品一区二区三区视频| 国产午夜精品视频| 亚洲福利小视频| 午夜宅男久久久| 欧美在线免费观看视频| 久久精品国产99精品国产亚洲性色| 性久久久久久久久久久久| 日韩亚洲欧美成人一区| 久久aⅴ国产紧身牛仔裤| 久久视频国产精品免费视频在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产在线视频不卡二| 欧美一级在线亚洲天堂| 欧美一区二区三区久久精品| 国产精品自在在线| av成人免费在线观看| 另类天堂视频在线观看| 亚洲裸体俱乐部裸体舞表演av| 欧美视频观看一区| 在线播放中文一区| 好吊成人免视频| 久久久国产91| 亚洲午夜电影网| 国产农村妇女精品一区二区| 国产精品videossex久久发布| 欧美激情五月| 国产日韩专区在线| 久久蜜桃香蕉精品一区二区三区| 亚洲乱码国产乱码精品精98午夜| 亚洲肉体裸体xxxx137| 国内精品久久久| 国产精品午夜av在线| 亚洲性xxxx| 欧美视频不卡| 国产伦精品一区二区| 欲色影视综合吧| 久久久久久久久伊人| 国产视频久久网| 亚洲破处大片| 久久一区亚洲| 欧美看片网站| 黑人巨大精品欧美一区二区| 国产日韩一区二区三区在线播放| 亚洲一区二区精品在线观看| 欧美成在线视频| 欧美午夜在线一二页| 久久爱91午夜羞羞| 久久久91精品国产一区二区精品| 99国产精品久久| 国产精品成人国产乱一区| 久久成人精品| 亚洲春色另类小说| 欧美亚州韩日在线看免费版国语版| 韩国v欧美v日本v亚洲v| 在线一区二区日韩| 亚洲国产国产亚洲一二三| 91久久久一线二线三线品牌| 欧美色欧美亚洲另类二区| 久久最新视频| 91久久久久久久久| 国产精品美女诱惑| 国产一区二区三区精品欧美日韩一区二区三区| 欧美色大人视频| 亚洲精品久久久久久下一站| 久久都是精品| 欧美在线视频二区| 亚洲永久精品大片| 国产精品国产精品| 亚洲精品综合久久中文字幕| 亚洲欧美在线一区二区| 美女性感视频久久久| 国产精品久久久久久久久久久久| 国产精品久久久久一区二区三区| 国产午夜精品一区二区三区视频| 亚洲高清资源| 欧美不卡高清| 一二三区精品| 亚洲国产精品一区二区尤物区| 欧美日韩影院| 亚洲电影av在线| 亚洲电影第三页| 一区二区三区我不卡| 欧美日韩亚洲一区二区三区在线观看| 亚洲三级国产| 欧美日韩一卡二卡| 亚洲愉拍自拍另类高清精品| 美脚丝袜一区二区三区在线观看| 亚洲欧洲一区二区三区| 欧美视频一区二区三区四区| 国产色综合天天综合网| 久久久精品国产免费观看同学| 极品少妇一区二区三区| 亚洲欧美日韩电影| 国产乱码精品一区二区三区五月婷| 亚洲欧洲日本一区二区三区| 国产精品毛片a∨一区二区三区| 亚洲人成毛片在线播放女女| 国产一区二区在线免费观看| 欧美大学生性色视频| 国产视频在线观看一区| 噜噜噜在线观看免费视频日韩| 亚洲一卡久久| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产专区| 亚洲一区二区动漫| 在线观看成人网| 亚洲一区二区在线免费观看视频| 国产亚洲欧美一区二区三区| 精品二区久久| 久久伊人精品天天| 亚洲精选大片| 国产精品男gay被猛男狂揉视频| 99亚洲一区二区| 亚洲欧美色婷婷| 午夜久久久久久久久久一区二区| 国产精品羞羞答答xxdd| 欧美日韩精品综合在线| 国产视频一区在线观看一区免费| 欧美一区2区三区4区公司二百| 在线观看欧美日本| 国产精品美女在线观看| 亚洲国产精彩中文乱码av在线播放| 久久久久一本一区二区青青蜜月| 香蕉久久国产| 欧美一区二区视频网站| 亚洲欧美日韩在线不卡| 亚洲三级色网| 国产亚洲午夜高清国产拍精品| 亚洲国产日韩欧美综合久久| 亚洲免费电影在线| 国产日韩精品久久久| 欧美韩日一区二区| 国产亚洲欧洲一区高清在线观看| 制服丝袜激情欧洲亚洲| 亚洲图片激情小说| 亚洲国产精彩中文乱码av在线播放| 亚洲无人区一区| 国产一区二区三区视频在线观看| 久久先锋资源| 久久久国产精品亚洲一区| 国产精品日日做人人爱| 国产亚洲精品久久久久久| 久久综合国产精品台湾中文娱乐网| 亚洲欧美日韩一区| 亚洲午夜91| 亚洲国产精品热久久| 国产精品99久久久久久久vr| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品黄页免费高清在线观看| 伊人精品久久久久7777| 欧美理论片在线观看| 亚洲毛片av| 欧美激情久久久久久| 国产午夜精品福利| 男人的天堂成人在线| 亚洲欧美资源在线| 亚洲人成77777在线观看网| 你懂的国产精品| 国产视频自拍一区| 久久av老司机精品网站导航| 久久精品免视看| 欧美一区二区三区四区夜夜大片| 欧美日韩免费观看一区=区三区| 99综合精品| 激情成人在线视频| 狠狠爱综合网| 香蕉久久夜色精品国产使用方法| 亚洲人成亚洲人成在线观看图片| 国产日韩精品久久| 亚洲欧美日韩爽爽影院| 亚洲国产精品va在线看黑人| 亚洲线精品一区二区三区八戒| 久久久久久久综合狠狠综合| 久久精品国产免费观看| 在线电影院国产精品| 激情综合电影网| 在线不卡中文字幕| 欧美日韩高清免费| 午夜精品久久久久久久久久久久| 免费不卡中文字幕视频| 久久综合九色综合欧美狠狠| 国内一区二区三区| 激情av一区二区| 老牛嫩草一区二区三区日本| 亚洲欧美日韩国产| 99re6热只有精品免费观看| 伊人成人在线| 亚洲天堂男人| 老鸭窝91久久精品色噜噜导演| 国产精品久久久久久av福利软件| 欧美色综合天天久久综合精品| 免费观看在线综合| 9l视频自拍蝌蚪9l视频成人| 老司机精品视频网站| 国产精品视频网| 精品成人免费| 久久视频免费观看| 亚洲欧洲精品一区二区精品久久久| 在线观看成人一级片| 韩国精品久久久999| 午夜精品婷婷| 久久精品国产清自在天天线| 一区二区三区久久网| 欧美.com| 一区二区三区精品|