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

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

?? btree.c

?? 新版輕量級嵌入式數據庫
?? C
?? 第 1 頁 / 共 5 頁
字號:
){  int rc;  if( pgno==0 ){    return SQLITE_CORRUPT_BKPT;   }  rc = getPage(pBt, pgno, ppPage);  if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){    rc = initPage(*ppPage, pParent);  }  return rc;}/*** Release a MemPage.  This should be called once for each prior** call to getPage.*/static void releasePage(MemPage *pPage){  if( pPage ){    assert( pPage->aData );    assert( pPage->pBt );    assert( &pPage->aData[pPage->pBt->pageSize]==(unsigned char*)pPage );    sqlite3pager_unref(pPage->aData);  }}/*** This routine is called when the reference count for a page** reaches zero.  We need to unref the pParent pointer when that** happens.*/static void pageDestructor(void *pData, int pageSize){  MemPage *pPage;  assert( (pageSize & 7)==0 );  pPage = (MemPage*)&((char*)pData)[pageSize];  if( pPage->pParent ){    MemPage *pParent = pPage->pParent;    pPage->pParent = 0;    releasePage(pParent);  }  pPage->isInit = 0;}/*** During a rollback, when the pager reloads information into the cache** so that the cache is restored to its original state at the start of** the transaction, for each page restored this routine is called.**** This routine needs to reset the extra data section at the end of the** page to agree with the restored data.*/static void pageReinit(void *pData, int pageSize){  MemPage *pPage;  assert( (pageSize & 7)==0 );  pPage = (MemPage*)&((char*)pData)[pageSize];  if( pPage->isInit ){    pPage->isInit = 0;    initPage(pPage, pPage->pParent);  }}/*** Open a database file.** ** zFilename is the name of the database file.  If zFilename is NULL** a new database with a random name is created.  This randomly named** database file will be deleted when sqlite3BtreeClose() is called.*/int sqlite3BtreeOpen(  const char *zFilename,  /* Name of the file containing the BTree database */  sqlite3 *pSqlite,       /* Associated database handle */  Btree **ppBtree,        /* Pointer to new Btree object written here */  int flags               /* Options */){  BtShared *pBt;          /* Shared part of btree structure */  Btree *p;               /* Handle to return */  int rc;  int nReserve;  unsigned char zDbHeader[100];#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)  const ThreadData *pTsdro;#endif  /* Set the variable isMemdb to true for an in-memory database, or   ** false for a file-based database. This symbol is only required if  ** either of the shared-data or autovacuum features are compiled   ** into the library.  */#if !defined(SQLITE_OMIT_SHARED_CACHE) || !defined(SQLITE_OMIT_AUTOVACUUM)  #ifdef SQLITE_OMIT_MEMORYDB  const int isMemdb = !zFilename;  #else  const int isMemdb = !zFilename || (strcmp(zFilename, ":memory:")?0:1);  #endif#endif  p = sqliteMalloc(sizeof(Btree));  if( !p ){    return SQLITE_NOMEM;  }  p->inTrans = TRANS_NONE;  p->pSqlite = pSqlite;  /* Try to find an existing Btree structure opened on zFilename. */#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)  pTsdro = sqlite3ThreadDataReadOnly();  if( pTsdro->useSharedData && zFilename && !isMemdb ){    char *zFullPathname = sqlite3OsFullPathname(zFilename);    if( !zFullPathname ){      sqliteFree(p);      return SQLITE_NOMEM;    }    for(pBt=pTsdro->pBtree; pBt; pBt=pBt->pNext){      assert( pBt->nRef>0 );      if( 0==strcmp(zFullPathname, sqlite3pager_filename(pBt->pPager)) ){        p->pBt = pBt;        *ppBtree = p;        pBt->nRef++;        sqliteFree(zFullPathname);        return SQLITE_OK;      }    }    sqliteFree(zFullPathname);  }#endif  /*  ** The following asserts make sure that structures used by the btree are  ** the right size.  This is to guard against size changes that result  ** when compiling on a different architecture.  */  assert( sizeof(i64)==8 || sizeof(i64)==4 );  assert( sizeof(u64)==8 || sizeof(u64)==4 );  assert( sizeof(u32)==4 );  assert( sizeof(u16)==2 );  assert( sizeof(Pgno)==4 );  pBt = sqliteMalloc( sizeof(*pBt) );  if( pBt==0 ){    *ppBtree = 0;    sqliteFree(p);    return SQLITE_NOMEM;  }  rc = sqlite3pager_open(&pBt->pPager, zFilename, EXTRA_SIZE, flags);  if( rc!=SQLITE_OK ){    if( pBt->pPager ) sqlite3pager_close(pBt->pPager);    sqliteFree(pBt);    sqliteFree(p);    *ppBtree = 0;    return rc;  }  p->pBt = pBt;  sqlite3pager_set_destructor(pBt->pPager, pageDestructor);  sqlite3pager_set_reiniter(pBt->pPager, pageReinit);  pBt->pCursor = 0;  pBt->pPage1 = 0;  pBt->readOnly = sqlite3pager_isreadonly(pBt->pPager);  sqlite3pager_read_fileheader(pBt->pPager, sizeof(zDbHeader), zDbHeader);  pBt->pageSize = get2byte(&zDbHeader[16]);  if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE       || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){    pBt->pageSize = SQLITE_DEFAULT_PAGE_SIZE;    pBt->maxEmbedFrac = 64;   /* 25% */    pBt->minEmbedFrac = 32;   /* 12.5% */    pBt->minLeafFrac = 32;    /* 12.5% */#ifndef SQLITE_OMIT_AUTOVACUUM    /* If the magic name ":memory:" will create an in-memory database, then    ** do not set the auto-vacuum flag, even if SQLITE_DEFAULT_AUTOVACUUM    ** is true. On the other hand, if SQLITE_OMIT_MEMORYDB has been defined,    ** then ":memory:" is just a regular file-name. Respect the auto-vacuum    ** default in this case.    */    if( zFilename && !isMemdb ){      pBt->autoVacuum = SQLITE_DEFAULT_AUTOVACUUM;    }#endif    nReserve = 0;  }else{    nReserve = zDbHeader[20];    pBt->maxEmbedFrac = zDbHeader[21];    pBt->minEmbedFrac = zDbHeader[22];    pBt->minLeafFrac = zDbHeader[23];    pBt->pageSizeFixed = 1;#ifndef SQLITE_OMIT_AUTOVACUUM    pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0);#endif  }  pBt->usableSize = pBt->pageSize - nReserve;  assert( (pBt->pageSize & 7)==0 );  /* 8-byte alignment of pageSize */  sqlite3pager_set_pagesize(pBt->pPager, pBt->pageSize);#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)  /* Add the new btree to the linked list starting at ThreadData.pBtree.  ** There is no chance that a malloc() may fail inside of the   ** sqlite3ThreadData() call, as the ThreadData structure must have already  ** been allocated for pTsdro->useSharedData to be non-zero.  */  if( pTsdro->useSharedData && zFilename && !isMemdb ){    pBt->pNext = pTsdro->pBtree;    sqlite3ThreadData()->pBtree = pBt;  }#endif  pBt->nRef = 1;  *ppBtree = p;  return SQLITE_OK;}/*** Close an open database and invalidate all cursors.*/int sqlite3BtreeClose(Btree *p){  BtShared *pBt = p->pBt;  BtCursor *pCur;#ifndef SQLITE_OMIT_SHARED_CACHE  ThreadData *pTsd;#endif  /* Close all cursors opened via this handle.  */  pCur = pBt->pCursor;  while( pCur ){    BtCursor *pTmp = pCur;    pCur = pCur->pNext;    if( pTmp->pBtree==p ){      sqlite3BtreeCloseCursor(pTmp);    }  }  /* Rollback any active transaction and free the handle structure.  ** The call to sqlite3BtreeRollback() drops any table-locks held by  ** this handle.  */  sqlite3BtreeRollback(p);  sqliteFree(p);#ifndef SQLITE_OMIT_SHARED_CACHE  /* If there are still other outstanding references to the shared-btree  ** structure, return now. The remainder of this procedure cleans   ** up the shared-btree.  */  assert( pBt->nRef>0 );  pBt->nRef--;  if( pBt->nRef ){    return SQLITE_OK;  }  /* Remove the shared-btree from the thread wide list. Call   ** ThreadDataReadOnly() and then cast away the const property of the   ** pointer to avoid allocating thread data if it is not really required.  */  pTsd = (ThreadData *)sqlite3ThreadDataReadOnly();  if( pTsd->pBtree==pBt ){    assert( pTsd==sqlite3ThreadData() );    pTsd->pBtree = pBt->pNext;  }else{    BtShared *pPrev;    for(pPrev=pTsd->pBtree; pPrev && pPrev->pNext!=pBt; pPrev=pPrev->pNext){}    if( pPrev ){      assert( pTsd==sqlite3ThreadData() );      pPrev->pNext = pBt->pNext;    }  }#endif  /* Close the pager and free the shared-btree structure */  assert( !pBt->pCursor );  sqlite3pager_close(pBt->pPager);  if( pBt->xFreeSchema && pBt->pSchema ){    pBt->xFreeSchema(pBt->pSchema);  }  sqliteFree(pBt->pSchema);  sqliteFree(pBt);  return SQLITE_OK;}/*** Change the busy handler callback function.*/int sqlite3BtreeSetBusyHandler(Btree *p, BusyHandler *pHandler){  BtShared *pBt = p->pBt;  pBt->pBusyHandler = pHandler;  sqlite3pager_set_busyhandler(pBt->pPager, pHandler);  return SQLITE_OK;}/*** Change the limit on the number of pages allowed in the cache.**** The maximum number of cache pages is set to the absolute** value of mxPage.  If mxPage is negative, the pager will** operate asynchronously - it will not stop to do fsync()s** to insure data is written to the disk surface before** continuing.  Transactions still work if synchronous is off,** and the database cannot be corrupted if this program** crashes.  But if the operating system crashes or there is** an abrupt power failure when synchronous is off, the database** could be left in an inconsistent and unrecoverable state.** Synchronous is on by default so database corruption is not** normally a worry.*/int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){  BtShared *pBt = p->pBt;  sqlite3pager_set_cachesize(pBt->pPager, mxPage);  return SQLITE_OK;}/*** Change the way data is synced to disk in order to increase or decrease** how well the database resists damage due to OS crashes and power** failures.  Level 1 is the same as asynchronous (no syncs() occur and** there is a high probability of damage)  Level 2 is the default.  There** is a very low but non-zero probability of damage.  Level 3 reduces the** probability of damage to near zero but with a write performance reduction.*/#ifndef SQLITE_OMIT_PAGER_PRAGMASint sqlite3BtreeSetSafetyLevel(Btree *p, int level, int fullSync){  BtShared *pBt = p->pBt;  sqlite3pager_set_safety_level(pBt->pPager, level, fullSync);  return SQLITE_OK;}#endif/*** Return TRUE if the given btree is set to safety level 1.  In other** words, return TRUE if no sync() occurs on the disk files.*/int sqlite3BtreeSyncDisabled(Btree *p){  BtShared *pBt = p->pBt;  assert( pBt && pBt->pPager );  return sqlite3pager_nosync(pBt->pPager);}#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM)/*** Change the default pages size and the number of reserved bytes per page.**** The page size must be a power of 2 between 512 and 65536.  If the page** size supplied does not meet this constraint then the page size is not** changed.**** Page sizes are constrained to be a power of two so that the region** of the database file used for locking (beginning at PENDING_BYTE,** the first byte past the 1GB boundary, 0x40000000) needs to occur** at the beginning of a page.**** If parameter nReserve is less than zero, then the number of reserved** bytes per page is left unchanged.*/int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){  BtShared *pBt = p->pBt;  if( pBt->pageSizeFixed ){    return SQLITE_READONLY;  }  if( nReserve<0 ){    nReserve = pBt->pageSize - pBt->usableSize;  }  if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE &&        ((pageSize-1)&pageSize)==0 ){    assert( (pageSize & 7)==0 );    assert( !pBt->pPage1 && !pBt->pCursor );    pBt->pageSize = sqlite3pager_set_pagesize(pBt->pPager, pageSize);  }  pBt->usableSize = pBt->pageSize - nReserve;  return SQLITE_OK;}/*** Return the currently defined page size*/int sqlite3BtreeGetPageSize(Btree *p){  return p->pBt->pageSize;}int sqlite3BtreeGetReserve(Btree *p){  return p->pBt->p

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜精品网| 亚洲免费在线视频一区 二区| 91免费视频网址| 丁香天五香天堂综合| 蜜桃视频一区二区| 热久久免费视频| 久久9热精品视频| 精品伊人久久久久7777人| 免费人成网站在线观看欧美高清| 亚洲一区二区欧美日韩| 亚洲一区二区在线免费看| 一区二区三区四区不卡在线| 一区二区在线观看免费| 一区二区三区不卡视频| 亚洲成人在线观看视频| 日本不卡一区二区| 国产酒店精品激情| 国产盗摄精品一区二区三区在线| 国产九色sp调教91| 色综合天天综合狠狠| 欧美日韩视频一区二区| 欧美高清精品3d| 亚洲精品在线观看网站| 欧美韩日一区二区三区四区| 亚洲日本在线观看| 亚洲国产一区二区三区| 美国三级日本三级久久99| 韩国欧美国产一区| 91麻豆国产福利精品| 欧洲一区二区av| 2024国产精品| 亚洲狠狠丁香婷婷综合久久久| 三级影片在线观看欧美日韩一区二区| 日本中文在线一区| 丁香啪啪综合成人亚洲小说| 欧美亚洲国产bt| 久久午夜国产精品| 亚洲一二三级电影| 国产福利一区二区| 911精品国产一区二区在线| 久久综合色之久久综合| 一区二区三区蜜桃网| 久久精品国产一区二区三区免费看| 粉嫩av一区二区三区在线播放| 欧美三级三级三级爽爽爽| 国产亚洲成aⅴ人片在线观看| 亚洲男人的天堂一区二区| 韩国毛片一区二区三区| 欧美性色黄大片手机版| 中文字幕精品三区| 老司机免费视频一区二区| 91玉足脚交白嫩脚丫在线播放| 在线综合亚洲欧美在线视频| 亚洲人成人一区二区在线观看 | 色屁屁一区二区| 精品三级av在线| 亚洲福中文字幕伊人影院| 成人激情开心网| 久久蜜桃av一区二区天堂| 爽爽淫人综合网网站| 色香蕉成人二区免费| 中文字幕欧美日韩一区| 狠狠色丁香婷综合久久| 欧美一卡二卡在线| 亚洲va在线va天堂| 91国产丝袜在线播放| 最好看的中文字幕久久| 国产成人免费在线| 精品福利一二区| 久久成人综合网| 欧美一级片在线观看| 日韩精品1区2区3区| 欧美日韩电影在线| 亚洲国产精品精华液网站 | 综合欧美一区二区三区| 国产精品亚洲视频| 国产色产综合色产在线视频| 国产精品一区专区| 2023国产精华国产精品| 国产精品123| 国产精品欧美一级免费| 成人午夜视频网站| 欧美—级在线免费片| 成人av资源下载| 亚洲男人天堂一区| 欧美三级韩国三级日本三斤| 亚洲国产精品久久一线不卡| 欧美美女一区二区三区| 蜜臀av一区二区在线免费观看| 欧美r级在线观看| 国产不卡视频一区| 亚洲日本在线看| 在线成人小视频| 国产久卡久卡久卡久卡视频精品| 国产喂奶挤奶一区二区三区 | 综合分类小说区另类春色亚洲小说欧美| 国产69精品一区二区亚洲孕妇| 国产精品久久久久影院亚瑟 | 日日摸夜夜添夜夜添精品视频 | 99视频一区二区| 亚洲在线中文字幕| 欧美一级理论片| 成人黄色在线看| 亚洲h精品动漫在线观看| 欧美成人一级视频| 成人ar影院免费观看视频| 亚洲一区影音先锋| xnxx国产精品| 一本高清dvd不卡在线观看| 男女激情视频一区| 亚洲欧洲无码一区二区三区| 欧美高清一级片在线| 国产91精品精华液一区二区三区 | 制服.丝袜.亚洲.中文.综合| 激情小说欧美图片| 亚洲综合激情网| 国产亲近乱来精品视频| 欧美日韩一二区| 成人av一区二区三区| 蜜桃一区二区三区在线| 亚洲男人天堂一区| 久久精品一区四区| 欧美高清视频不卡网| 91美女片黄在线观看91美女| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品免费av| 久久亚洲影视婷婷| 欧美日韩一区二区在线观看 | 国产中文字幕一区| 日韩精品1区2区3区| 亚洲免费成人av| 中文字幕第一页久久| 日韩三级免费观看| 欧美日韩美少妇| 在线亚洲一区观看| 99久久er热在这里只有精品15 | 国产一区二区调教| 五月天婷婷综合| 一区二区三区视频在线看| 国产精品初高中害羞小美女文| 久久―日本道色综合久久 | 国产精品一区二区三区99| 午夜精品久久久久久久| 亚洲综合小说图片| 亚洲毛片av在线| 一区二区中文视频| 最好看的中文字幕久久| 国产婷婷精品av在线| 国产偷国产偷亚洲高清人白洁| 日韩精品一区二| 欧美一区二区三区四区五区 | 国产亲近乱来精品视频| 久久综合九色综合97_久久久| 欧美一区二区女人| 精品免费国产一区二区三区四区| 日韩一区二区三区在线观看| 欧美精品丝袜久久久中文字幕| 欧美日本一区二区| 欧美精品123区| 日韩精品一区二区在线观看| 日韩一区二区三区四区| 欧美mv日韩mv| 久久久久99精品国产片| 国产精品女同一区二区三区| 国产精品嫩草99a| 一区二区三区四区高清精品免费观看| 亚洲人精品午夜| 亚洲成a人片综合在线| 日本特黄久久久高潮| 国产一区二区三区蝌蚪| 成人精品视频网站| 成人精品一区二区三区四区| 一本大道久久a久久综合| 在线观看免费视频综合| 777a∨成人精品桃花网| 久久久亚洲精品石原莉奈| 亚洲欧洲日韩综合一区二区| 亚洲成年人影院| 国产高清精品久久久久| 色综合久久中文综合久久牛| 欧美精品乱码久久久久久| 精品粉嫩超白一线天av| 国产精品久久久久久福利一牛影视| 亚洲色图视频网| 美女视频黄免费的久久| a亚洲天堂av| 欧美第一区第二区| 亚洲天堂福利av| 久久精品国产第一区二区三区| 99精品国产视频| 亚洲精品一线二线三线| 亚洲精品美国一| 国产不卡免费视频| 欧美一区二区三区四区高清| 成人欧美一区二区三区1314| 日韩和的一区二区| 99久久er热在这里只有精品66| 精品国产青草久久久久福利| 一区二区在线免费观看| 国产麻豆精品在线|