亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcbdb.c

?? Tokyo Cabinet的Tokyo Cabinet 是一個DBM的實現。這里的數據庫由一系列key-value對的記錄構成。key和value都可以是任意長度的字節序列,既可以是二進制也可以是字符
?? C
?? 第 1 頁 / 共 5 頁
字號:
/************************************************************************************************* * The B+ tree database API of Tokyo Cabinet *                                                      Copyright (C) 2006-2009 Mikio Hirabayashi * This file is part of Tokyo Cabinet. * Tokyo Cabinet is free software; you can redistribute it and/or modify it under the terms of * the GNU Lesser General Public License as published by the Free Software Foundation; either * version 2.1 of the License or any later version.  Tokyo Cabinet is distributed in the hope * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public * License for more details. * You should have received a copy of the GNU Lesser General Public License along with Tokyo * Cabinet; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA. *************************************************************************************************/#include "tcutil.h"#include "tchdb.h"#include "tcbdb.h"#include "myconf.h"#define BDBOPAQUESIZ   64                // size of using opaque field#define BDBLEFTOPQSIZ  64                // size of left opaque field#define BDBPAGEBUFSIZ  32768             // size of a buffer to read each page#define BDBNODEIDBASE  ((1LL<<48)+1)     // base number of node ID#define BDBLEVELMAX    64                // max level of B+ tree#define BDBCACHEOUT    8                 // number of pages in a process of cacheout#define BDBDEFLMEMB    128               // default number of members in each leaf#define BDBMINLMEMB    4                 // minimum number of members in each leaf#define BDBDEFNMEMB    256               // default number of members in each node#define BDBMINNMEMB    4                 // minimum number of members in each node#define BDBDEFBNUM     32749             // default bucket number#define BDBDEFAPOW     8                 // default alignment power#define BDBDEFFPOW     10                // default free block pool power#define BDBDEFLCNUM    1024              // default number of leaf cache#define BDBDEFNCNUM    512               // default number of node cache#define BDBDEFLSMAX    16384             // default maximum size of each leaf#define BDBMINLSMAX    512               // minimum maximum size of each leaftypedef struct {                         // type of structure for a record  int ksiz;                              // size of the key region  int vsiz;                              // size of the value region  TCLIST *rest;                          // list of value objects} BDBREC;typedef struct {                         // type of structure for a leaf page  uint64_t id;                           // ID number of the leaf  TCPTRLIST *recs;                       // list of records  int size;                              // predicted size of serialized buffer  uint64_t prev;                         // ID number of the previous leaf  uint64_t next;                         // ID number of the next leaf  bool dirty;                            // whether to be written back  bool dead;                             // whether to be removed} BDBLEAF;typedef struct {                         // type of structure for a page index  uint64_t pid;                          // ID number of the referring page  int ksiz;                              // size of the key region} BDBIDX;typedef struct {                         // type of structure for a node page  uint64_t id;                           // ID number of the node  uint64_t heir;                         // ID of the child before the first index  TCPTRLIST *idxs;                       // list of indices  bool dirty;                            // whether to be written back  bool dead;                             // whether to be removed} BDBNODE;enum {                                   // enumeration for duplication behavior  BDBPDOVER,                             // overwrite an existing value  BDBPDKEEP,                             // keep the existing value  BDBPDCAT,                              // concatenate values  BDBPDDUP,                              // allow duplication of keys  BDBPDDUPB,                             // allow backward duplication  BDBPDADDINT,                           // add an integer  BDBPDADDDBL,                           // add a real number  BDBPDPROC                              // process by a callback function};typedef struct {                         // type of structure for a duplication callback  TCPDPROC proc;                         // function pointer  void *op;                              // opaque pointer} BDBPDPROCOP;/* private macros */#define BDBLOCKMETHOD(TC_bdb, TC_wr) \  ((TC_bdb)->mmtx ? tcbdblockmethod((TC_bdb), (TC_wr)) : true)#define BDBUNLOCKMETHOD(TC_bdb) \  ((TC_bdb)->mmtx ? tcbdbunlockmethod(TC_bdb) : true)#define BDBLOCKCACHE(TC_bdb) \  ((TC_bdb)->mmtx ? tcbdblockcache(TC_bdb) : true)#define BDBUNLOCKCACHE(TC_bdb) \  ((TC_bdb)->mmtx ? tcbdbunlockcache(TC_bdb) : true)#define BDBTHREADYIELD(TC_bdb) \  do { if((TC_bdb)->mmtx) sched_yield(); } while(false)/* private function prototypes */static void tcbdbclear(TCBDB *bdb);static void tcbdbdumpmeta(TCBDB *bdb);static void tcbdbloadmeta(TCBDB *bdb);static BDBLEAF *tcbdbleafnew(TCBDB *bdb, uint64_t prev, uint64_t next);static bool tcbdbleafcacheout(TCBDB *bdb, BDBLEAF *leaf);static bool tcbdbleafsave(TCBDB *bdb, BDBLEAF *leaf);static BDBLEAF *tcbdbleafload(TCBDB *bdb, uint64_t id);static bool tcbdbleafcheck(TCBDB *bdb, uint64_t id);static BDBLEAF *tcbdbgethistleaf(TCBDB *bdb, const char *kbuf, int ksiz, uint64_t id);static bool tcbdbleafaddrec(TCBDB *bdb, BDBLEAF *leaf, int dmode,                            const char *kbuf, int ksiz, const char *vbuf, int vsiz);static BDBLEAF *tcbdbleafdivide(TCBDB *bdb, BDBLEAF *leaf);static bool tcbdbleafkill(TCBDB *bdb, BDBLEAF *leaf);static BDBNODE *tcbdbnodenew(TCBDB *bdb, uint64_t heir);static bool tcbdbnodecacheout(TCBDB *bdb, BDBNODE *node);static bool tcbdbnodesave(TCBDB *bdb, BDBNODE *node);static BDBNODE *tcbdbnodeload(TCBDB *bdb, uint64_t id);static void tcbdbnodeaddidx(TCBDB *bdb, BDBNODE *node, bool order, uint64_t pid,                            const char *kbuf, int ksiz);static bool tcbdbnodesubidx(TCBDB *bdb, BDBNODE *node, uint64_t pid);static uint64_t tcbdbsearchleaf(TCBDB *bdb, const char *kbuf, int ksiz);static BDBREC *tcbdbsearchrec(TCBDB *bdb, BDBLEAF *leaf, const char *kbuf, int ksiz, int *ip);static void tcbdbremoverec(TCBDB *bdb, BDBLEAF *leaf, BDBREC *rec, int ri);static bool tcbdbcacheadjust(TCBDB *bdb);static void tcbdbcachepurge(TCBDB *bdb);static bool tcbdbopenimpl(TCBDB *bdb, const char *path, int omode);static bool tcbdbcloseimpl(TCBDB *bdb);static bool tcbdbputimpl(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz,                         int dmode);static bool tcbdboutimpl(TCBDB *bdb, const char *kbuf, int ksiz);static bool tcbdboutlist(TCBDB *bdb, const char *kbuf, int ksiz);static const char *tcbdbgetimpl(TCBDB *bdb, const char *kbuf, int ksiz, int *sp);static int tcbdbgetnum(TCBDB *bdb, const char *kbuf, int ksiz);static TCLIST *tcbdbgetlist(TCBDB *bdb, const char *kbuf, int ksiz);static bool tcbdbrangeimpl(TCBDB *bdb, const char *bkbuf, int bksiz, bool binc,                           const char *ekbuf, int eksiz, bool einc, int max, TCLIST *keys);static bool tcbdbrangefwm(TCBDB *bdb, const char *pbuf, int psiz, int max, TCLIST *keys);static bool tcbdboptimizeimpl(TCBDB *bdb, int32_t lmemb, int32_t nmemb,                              int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts);static bool tcbdbvanishimpl(TCBDB *bdb);static bool tcbdblockmethod(TCBDB *bdb, bool wr);static bool tcbdbunlockmethod(TCBDB *bdb);static bool tcbdblockcache(TCBDB *bdb);static bool tcbdbunlockcache(TCBDB *bdb);static bool tcbdbcurfirstimpl(BDBCUR *cur);static bool tcbdbcurlastimpl(BDBCUR *cur);static bool tcbdbcurjumpimpl(BDBCUR *cur, const char *kbuf, int ksiz, bool forward);static bool tcbdbcuradjust(BDBCUR *cur, bool forward);static bool tcbdbcurprevimpl(BDBCUR *cur);static bool tcbdbcurnextimpl(BDBCUR *cur);static bool tcbdbcurputimpl(BDBCUR *cur, const char *vbuf, int vsiz, int mode);static bool tcbdbcuroutimpl(BDBCUR *cur);static bool tcbdbcurrecimpl(BDBCUR *cur, const char **kbp, int *ksp, const char **vbp, int *vsp);static bool tcbdbforeachimpl(TCBDB *bdb, TCITER iter, void *op);/* debugging function prototypes */void tcbdbprintmeta(TCBDB *bdb);void tcbdbprintleaf(TCBDB *bdb, BDBLEAF *leaf);void tcbdbprintnode(TCBDB *bdb, BDBNODE *node);/************************************************************************************************* * API *************************************************************************************************//* Get the message string corresponding to an error code. */const char *tcbdberrmsg(int ecode){  return tcerrmsg(ecode);}/* Create a B+ tree database object. */TCBDB *tcbdbnew(void){  TCBDB *bdb;  TCMALLOC(bdb, sizeof(*bdb));  tcbdbclear(bdb);  bdb->hdb = tchdbnew();  TCMALLOC(bdb->hist, sizeof(*bdb->hist) * BDBLEVELMAX);  tchdbtune(bdb->hdb, BDBDEFBNUM, BDBDEFAPOW, BDBDEFFPOW, 0);  tchdbsetxmsiz(bdb->hdb, 0);  return bdb;}/* Delete a B+ tree database object. */void tcbdbdel(TCBDB *bdb){  assert(bdb);  if(bdb->open) tcbdbclose(bdb);  TCFREE(bdb->hist);  tchdbdel(bdb->hdb);  if(bdb->mmtx){    pthread_mutex_destroy(bdb->cmtx);    pthread_rwlock_destroy(bdb->mmtx);    TCFREE(bdb->cmtx);    TCFREE(bdb->mmtx);  }  TCFREE(bdb);}/* Get the last happened error code of a B+ tree database object. */int tcbdbecode(TCBDB *bdb){  assert(bdb);  return tchdbecode(bdb->hdb);}/* Set mutual exclusion control of a B+ tree database object for threading. */bool tcbdbsetmutex(TCBDB *bdb){  assert(bdb);  if(!TCUSEPTHREAD) return true;  if(bdb->mmtx || bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    return false;  }  TCMALLOC(bdb->mmtx, sizeof(pthread_rwlock_t));  TCMALLOC(bdb->cmtx, sizeof(pthread_mutex_t));  bool err = false;  if(pthread_rwlock_init(bdb->mmtx, NULL) != 0) err = true;  if(pthread_mutex_init(bdb->cmtx, NULL) != 0) err = true;  if(err){    TCFREE(bdb->cmtx);    TCFREE(bdb->mmtx);    bdb->cmtx = NULL;    bdb->mmtx = NULL;    return false;  }  return tchdbsetmutex(bdb->hdb);}/* Set the custom comparison function of a B+ tree database object. */bool tcbdbsetcmpfunc(TCBDB *bdb, TCCMP cmp, void *cmpop){  assert(bdb && cmp);  if(bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    return false;  }  bdb->cmp = cmp;  bdb->cmpop = cmpop;  return true;}/* Set the tuning parameters of a B+ tree database object. */bool tcbdbtune(TCBDB *bdb, int32_t lmemb, int32_t nmemb,               int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts){  assert(bdb);  if(bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    return false;  }  bdb->lmemb = (lmemb > 0) ? tclmax(lmemb, BDBMINLMEMB) : BDBDEFLMEMB;  bdb->nmemb = (nmemb > 0) ? tclmax(nmemb, BDBMINNMEMB) : BDBDEFNMEMB;  bdb->opts = opts;  uint8_t hopts = 0;  if(opts & BDBTLARGE) hopts |= HDBTLARGE;  if(opts & BDBTDEFLATE) hopts |= HDBTDEFLATE;  if(opts & BDBTBZIP) hopts |= HDBTBZIP;  if(opts & BDBTTCBS) hopts |= HDBTTCBS;  if(opts & BDBTEXCODEC) hopts |= HDBTEXCODEC;  bnum = (bnum > 0) ? bnum : BDBDEFBNUM;  apow = (apow >= 0) ? apow : BDBDEFAPOW;  fpow = (fpow >= 0) ? fpow : BDBDEFFPOW;  return tchdbtune(bdb->hdb, bnum, apow, fpow, hopts);}/* Set the caching parameters of a B+ tree database object. */bool tcbdbsetcache(TCBDB *bdb, int32_t lcnum, int32_t ncnum){  assert(bdb);  if(bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    return false;  }  if(lcnum > 0) bdb->lcnum = tclmax(lcnum, BDBLEVELMAX);  if(ncnum > 0) bdb->ncnum = tclmax(ncnum, BDBLEVELMAX);  return true;}/* Set the size of the extra mapped memory of a B+ tree database object. */bool tcbdbsetxmsiz(TCBDB *bdb, int64_t xmsiz){  assert(bdb);  if(bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    return false;  }  return tchdbsetxmsiz(bdb->hdb, xmsiz);}/* Open a database file and connect a B+ tree database object. */bool tcbdbopen(TCBDB *bdb, const char *path, int omode){  assert(bdb && path);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbopenimpl(bdb, path, omode);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Close a B+ tree database object. */bool tcbdbclose(TCBDB *bdb){  assert(bdb);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbcloseimpl(bdb);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Store a record into a B+ tree database object. */bool tcbdbput(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(bdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbputimpl(bdb, kbuf, ksiz, vbuf, vsiz, BDBPDOVER);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Store a string record into a B+ tree database object. */bool tcbdbput2(TCBDB *bdb, const char *kstr, const char *vstr){  assert(bdb && kstr && vstr);  return tcbdbput(bdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Store a new record into a B+ tree database object. */bool tcbdbputkeep(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(bdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbputimpl(bdb, kbuf, ksiz, vbuf, vsiz, BDBPDKEEP);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Store a new string record into a B+ tree database object. */bool tcbdbputkeep2(TCBDB *bdb, const char *kstr, const char *vstr){  assert(bdb && kstr && vstr);  return tcbdbputkeep(bdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Concatenate a value at the end of the existing record in a B+ tree database object. */bool tcbdbputcat(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(bdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbputimpl(bdb, kbuf, ksiz, vbuf, vsiz, BDBPDCAT);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Concatenate a string value at the end of the existing record in a B+ tree database object. */bool tcbdbputcat2(TCBDB *bdb, const char *kstr, const char *vstr){  assert(bdb && kstr && vstr);  return tcbdbputcat(bdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Store a record into a B+ tree database object with allowing duplication of keys. */bool tcbdbputdup(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(bdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool rv = tcbdbputimpl(bdb, kbuf, ksiz, vbuf, vsiz, BDBPDDUP);  BDBUNLOCKMETHOD(bdb);  return rv;}/* Store a string record into a B+ tree database object with allowing duplication of keys. */bool tcbdbputdup2(TCBDB *bdb, const char *kstr, const char *vstr){  assert(bdb && kstr && vstr);  return tcbdbputdup(bdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Store records into a B+ tree database object with allowing duplication of keys. */bool tcbdbputdup3(TCBDB *bdb, const void *kbuf, int ksiz, const TCLIST *vals){  assert(bdb && kbuf && ksiz >= 0 && vals);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){    tcbdbsetecode(bdb, TCEINVALID, __FILE__, __LINE__, __func__);    BDBUNLOCKMETHOD(bdb);    return false;  }  bool err = false;  int ln = TCLISTNUM(vals);  for(int i = 0; i < ln; i++){    const char *vbuf;    int vsiz;    TCLISTVAL(vbuf, vals, i, vsiz);    if(!tcbdbputimpl(bdb, kbuf, ksiz, vbuf, vsiz, BDBPDDUP)) err = true;  }  BDBUNLOCKMETHOD(bdb);  return !err;}/* Remove a record of a B+ tree database object. */bool tcbdbout(TCBDB *bdb, const void *kbuf, int ksiz){  assert(bdb && kbuf && ksiz >= 0);  if(!BDBLOCKMETHOD(bdb, true)) return false;  if(!bdb->open || !bdb->wmode){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品理论片| 日韩免费一区二区| 色偷偷久久人人79超碰人人澡| 国产宾馆实践打屁股91| 国产曰批免费观看久久久| 激情都市一区二区| 韩日欧美一区二区三区| 国产精品一二二区| 国产精品18久久久久久久网站| 国产乱子伦一区二区三区国色天香| 韩国毛片一区二区三区| 国产激情偷乱视频一区二区三区| 成人性视频免费网站| av中文字幕一区| 99久久国产综合精品色伊 | 欧美自拍偷拍午夜视频| 91国产成人在线| 欧美日韩一区二区在线观看视频| 在线不卡的av| 欧美mv和日韩mv的网站| 久久精品一区二区三区不卡牛牛| 国产欧美1区2区3区| 亚洲色图一区二区三区| 亚洲国产成人av网| 精品亚洲成a人| av一区二区三区| 欧美日韩中文字幕精品| 日韩免费性生活视频播放| 欧美国产一区二区在线观看 | 成人激情小说乱人伦| 99精品桃花视频在线观看| 色婷婷av久久久久久久| 7777精品伊人久久久大香线蕉的 | 麻豆专区一区二区三区四区五区| 极品少妇xxxx精品少妇| 成人国产电影网| 欧美日韩美少妇| 久久久精品国产免大香伊| 亚洲免费大片在线观看| 日欧美一区二区| 国产成人av自拍| 在线观看一区二区视频| 26uuu亚洲综合色| 一区二区久久久久| 激情综合五月婷婷| 在线一区二区视频| 久久精品免视看| 午夜成人免费视频| 国产91对白在线观看九色| 欧美日韩午夜在线| 国产亚洲1区2区3区| 亚洲高清不卡在线观看| 国产激情精品久久久第一区二区| 91黄色激情网站| 国产日韩精品一区二区浪潮av| 亚洲第一在线综合网站| 成人短视频下载| 精品久久人人做人人爰| 亚洲国产sm捆绑调教视频| 粉嫩在线一区二区三区视频| 91超碰这里只有精品国产| 国产精品亲子乱子伦xxxx裸| 久久精品国产精品亚洲红杏| 欧洲av在线精品| 中文幕一区二区三区久久蜜桃| 免费的成人av| 欧美日韩大陆一区二区| 亚洲欧美日韩人成在线播放| 国产精品一区二区久久精品爱涩| 欧美日韩在线播| 综合亚洲深深色噜噜狠狠网站| 国产一区二区三区美女| 欧美一区二区久久久| 亚洲一区在线视频观看| aaa欧美大片| 国产日产欧美一区二区视频| 美女在线观看视频一区二区| 欧美性色综合网| 亚洲女性喷水在线观看一区| 丁香婷婷深情五月亚洲| 久久久亚洲综合| 久久91精品久久久久久秒播| 欧美一级二级三级乱码| 午夜久久电影网| 欧美日韩精品欧美日韩精品一| 亚洲免费视频中文字幕| 99久久精品国产麻豆演员表| 中文av字幕一区| 成人av片在线观看| 国产精品网友自拍| 国产精品中文字幕日韩精品| 久久综合九色综合97婷婷 | 欧美美女喷水视频| 亚洲欧美一区二区久久| 色综合色狠狠综合色| 国产精品成人免费| 成人av在线播放网址| 国产精品区一区二区三| 波多野结衣中文字幕一区二区三区| 国产日韩欧美麻豆| 成人激情综合网站| 亚洲视频一区在线| 在线观看亚洲精品视频| 亚洲精品日日夜夜| 欧美午夜影院一区| 五月婷婷色综合| 欧美一二三区在线| 捆绑紧缚一区二区三区视频| 精品久久久久99| 国产电影一区二区三区| 国产精品盗摄一区二区三区| 91视频在线观看免费| 亚洲综合一二三区| 91精品国产综合久久婷婷香蕉| 日本韩国精品在线| 午夜私人影院久久久久| 9191成人精品久久| 久久精品噜噜噜成人av农村| 久久久精品tv| 91在线播放网址| 天天综合天天综合色| 精品国产乱码久久久久久影片| 国产精品一级在线| 亚洲免费观看高清完整版在线观看 | 欧美日本一区二区三区| 日本不卡一二三| 精品国产一区二区三区不卡| 高清av一区二区| 亚洲精品免费一二三区| 欧美乱妇20p| 黄色日韩三级电影| 最好看的中文字幕久久| 欧美美女直播网站| 国产精品一区二区男女羞羞无遮挡 | 亚洲国产sm捆绑调教视频| 日韩久久久精品| 粉嫩av一区二区三区| 一区二区三区精品在线观看| 91麻豆精品国产91久久久更新时间 | 中文字幕成人在线观看| 欧洲一区在线观看| 久久精品国产澳门| 一区视频在线播放| 91麻豆精品国产91久久久使用方法| 国产精品亚洲综合一区在线观看| 亚洲精品日韩专区silk| 精品国产区一区| 色综合咪咪久久| 九九视频精品免费| 亚洲精品老司机| 久久久久久一二三区| 在线精品亚洲一区二区不卡| 久久99热这里只有精品| 亚洲免费成人av| 久久综合色一综合色88| 欧美午夜在线观看| 成人免费毛片aaaaa**| 日韩电影一区二区三区| 亚洲啪啪综合av一区二区三区| 欧美videofree性高清杂交| 91国内精品野花午夜精品| 国产福利不卡视频| 日韩国产欧美在线观看| 亚洲欧美另类久久久精品2019| 久久久精品综合| 欧美一区二区黄| 欧美午夜精品久久久久久超碰| 国产成人精品免费视频网站| 日本大胆欧美人术艺术动态| 亚洲欧美日韩综合aⅴ视频| 久久久久久久久久久久久女国产乱 | 欧美日韩国产高清一区二区| 成人综合在线观看| 久久99精品久久久久久动态图| 亚洲一区中文在线| 亚洲丝袜美腿综合| 中文字幕欧美国产| 久久网这里都是精品| 欧美日韩国产另类不卡| 色婷婷亚洲精品| 成人av中文字幕| 国产**成人网毛片九色| 久久国产人妖系列| 日韩不卡免费视频| 亚洲v日本v欧美v久久精品| 亚洲精品国产无套在线观| 日本一区二区三级电影在线观看| 精品久久一二三区| 日韩精品影音先锋| 欧美精品久久一区| 欧美日韩国产经典色站一区二区三区| 91免费看片在线观看| 成人a免费在线看| 成人免费视频视频在线观看免费| 国产在线精品一区二区不卡了 | 欧美在线色视频| 欧美亚洲一区二区在线| 色狠狠色噜噜噜综合网| 日本二三区不卡| 日本丶国产丶欧美色综合|