亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产精品系列在线观看| 一区二区三区在线免费观看| 欧美日韩国产首页在线观看| 91猫先生在线| 色综合天天综合在线视频| 不卡欧美aaaaa| av综合在线播放| 一本到三区不卡视频| 色综合久久中文字幕| 欧美色窝79yyyycom| 91麻豆精品国产91久久久资源速度 | 狠狠色伊人亚洲综合成人| 琪琪一区二区三区| 乱一区二区av| 丁香天五香天堂综合| av电影天堂一区二区在线观看| 91免费看片在线观看| 欧美午夜片在线观看| 制服丝袜日韩国产| 久久精品综合网| 亚洲视频一二三| 三级久久三级久久| 福利一区福利二区| 在线精品国精品国产尤物884a| 777奇米四色成人影色区| 久久综合九色综合欧美就去吻 | 色欧美乱欧美15图片| 精品视频123区在线观看| 日韩欧美国产一区二区在线播放 | 蜜臀av性久久久久蜜臀aⅴ| 精一区二区三区| 99国产精品视频免费观看| 欧美日韩国产首页| 国产精品丝袜久久久久久app| 亚洲精品一二三| 国产精品中文有码| 欧美日韩国产片| 中文字幕欧美国产| 日本视频免费一区| 91亚洲永久精品| 精品国产乱码久久久久久久| 亚洲三级视频在线观看| 久久精品99国产精品| 一本色道久久综合精品竹菊 | 国产不卡视频一区| 欧美午夜影院一区| 国产精品久久久久久久裸模| 日产精品久久久久久久性色| 91亚洲国产成人精品一区二三 | 国产欧美日韩在线| 日韩在线一区二区三区| 91片黄在线观看| 久久夜色精品一区| 毛片一区二区三区| 在线观看不卡一区| 成人欧美一区二区三区小说| 国产一区二区三区国产| 91精品在线免费| 亚洲午夜在线观看视频在线| gogogo免费视频观看亚洲一| 国产无一区二区| 极品美女销魂一区二区三区 | 午夜精品久久久久久久| 成人免费高清在线| 久久精品视频在线免费观看| 免费不卡在线观看| 555www色欧美视频| 午夜欧美一区二区三区在线播放| 91在线观看视频| 亚洲视频免费在线观看| 不卡影院免费观看| 中文字幕亚洲视频| 北岛玲一区二区三区四区| 国产精品全国免费观看高清| 懂色av一区二区三区免费观看| 国产拍揄自揄精品视频麻豆| 国产成人综合精品三级| 亚洲国产高清在线| 99精品国产视频| 亚洲国产一区二区在线播放| 欧美亚洲国产怡红院影院| 亚洲在线视频一区| 6080yy午夜一二三区久久| 免费观看日韩电影| 欧美成人伊人久久综合网| 国内精品伊人久久久久av一坑| 精品国产一区a| 成人午夜视频免费看| 亚洲乱码中文字幕综合| 欧美三级乱人伦电影| 日本欧美久久久久免费播放网| 精品国产伦理网| 成人黄色小视频| 亚洲国产成人tv| 精品精品国产高清一毛片一天堂| 国产精品77777| 亚洲精品视频观看| 欧美一区二区三区四区高清| 国产麻豆日韩欧美久久| 亚洲欧洲精品天堂一级| 欧美日韩一区二区三区免费看| 美女一区二区在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 成人动漫中文字幕| 午夜精品123| 国产欧美精品日韩区二区麻豆天美| jizz一区二区| 免费视频最近日韩| 最新国产の精品合集bt伙计| 欧美日韩国产精品自在自线| 国产精品一区专区| 亚洲精品国产成人久久av盗摄| 日韩午夜激情av| 色综合久久久久| 国产揄拍国内精品对白| 一区二区免费看| 国产亚洲欧美日韩俺去了| 欧美亚洲综合一区| 国产91精品免费| 亚洲国产婷婷综合在线精品| 欧美韩国日本一区| 日韩写真欧美这视频| 国产在线日韩欧美| 国产精品对白交换视频| 日韩精品一区二区三区视频在线观看| 成人综合在线观看| 三级影片在线观看欧美日韩一区二区| 国产精品国产三级国产普通话蜜臀| 欧美一区永久视频免费观看| 91国产丝袜在线播放| 国产+成+人+亚洲欧洲自线| 日韩影院免费视频| 亚洲黄色免费电影| 国产精品第13页| 欧美精品一区二区在线播放| 欧美视频在线一区| 懂色av中文一区二区三区| 亚洲mv在线观看| 亚洲综合激情小说| 亚洲另类在线一区| 亚洲精品乱码久久久久| 欧美国产综合色视频| 精品国产成人在线影院| 国产亚洲欧洲997久久综合 | 麻豆成人久久精品二区三区小说| 一区二区三区蜜桃| 亚洲人成在线播放网站岛国| 久久精子c满五个校花| 久久久一区二区三区捆绑**| 久久免费午夜影院| 精品99一区二区| 2017欧美狠狠色| 久久一夜天堂av一区二区三区| 日韩精品在线一区| 日韩亚洲欧美综合| 日韩精品一区二区三区三区免费| 欧美一区二区三区视频免费| 3atv一区二区三区| 欧美成人乱码一区二区三区| 精品久久久久久久久久久久久久久久久| 911精品国产一区二区在线| 欧美日韩国产123区| 欧美一区日本一区韩国一区| 日韩精品一区二区在线| 久久久久99精品一区| 欧美高清一级片在线观看| 中文字幕在线观看一区| 亚洲激情中文1区| 日韩—二三区免费观看av| 久久超碰97人人做人人爱| 国产精品一二三四五| 不卡一区在线观看| 欧美揉bbbbb揉bbbbb| 日韩精品在线一区| 中文字幕巨乱亚洲| 亚洲成人免费影院| 精品一区二区三区不卡| 豆国产96在线|亚洲| 欧美唯美清纯偷拍| 久久综合精品国产一区二区三区 | 一区二区三区在线视频观看| 亚洲午夜羞羞片| 国产精品综合一区二区| 在线观看免费一区| 日韩色在线观看| 一区二区中文字幕在线| 日韩国产精品大片| a亚洲天堂av| 555www色欧美视频| 亚洲欧洲韩国日本视频| 裸体一区二区三区| 91色在线porny| 久久亚洲精精品中文字幕早川悠里| 国产精品免费丝袜| 亚洲永久精品国产| 国产精品69毛片高清亚洲| 欧美日韩视频在线一区二区 | 欧美日韩视频在线观看一区二区三区| 精品国产乱码久久久久久免费 | 欧美一区二区三区性视频|