/* ** usage: btree_insert CSR ?KEY? VALUE ** ** Set the size of the cache used by btree $ID. */ static int btree_insert( ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[] ){ BtCursor *pCur; int rc; BtreePayload x; if( objc!=4 && objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "?-intkey? CSR KEY VALUE"); return TCL_ERROR; } memset(&x, 0, sizeof(x)); if( objc==4 ){ if( Tcl_GetIntFromObj(interp, objv[2], &rc) ) return TCL_ERROR; x.nKey = rc; x.pData = (void*)Tcl_GetByteArrayFromObj(objv[3], &x.nData); }else{ x.pKey = (void*)Tcl_GetByteArrayFromObj(objv[2], &rc); x.nKey = rc; } pCur = (BtCursor*)sqlite3TestTextToPtr(Tcl_GetString(objv[1])); sqlite3_mutex_enter(pCur->pBtree->db->mutex); sqlite3BtreeEnter(pCur->pBtree); rc = sqlite3BtreeInsert(pCur, &x, 0, 0); sqlite3BtreeLeave(pCur->pBtree); sqlite3_mutex_leave(pCur->pBtree->db->mutex); Tcl_ResetResult(interp); if( rc ){ Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); return TCL_ERROR; } return TCL_OK; }
void testUpdate() { puts("testUpdate()"); sqlite3 *db; char * file = UPDATE_FILE; int rc = sqlite3_open(file, &db); if (rc != SQLITE_OK) { printf("failed open: %d \n", rc); return; } if (db->nDb == 0) { puts("backends count is zero"); goto close; } Btree *pBt = db->aDb[0].pBt; rc = sqlite3BtreeBeginTrans(pBt, 1); if (rc != SQLITE_OK) { printf("failed begin transaction: %d", rc); goto close; } char* pData = "Test data"; int nData = strlen(pData); BtCursor cur; int x = 0; for (x = 1; x <= 3; x++) { int table = 0; rc = sqlite3BtreeCreateTable(pBt, &table, BTREE_INTKEY | BTREE_LEAFDATA); if (rc != SQLITE_OK) { printf("failed create table: %d", rc); goto close; } memset(&cur, 0, sizeof(BtCursor)); rc = sqlite3BtreeCursor(pBt, table, 0, 0, &cur); if (rc != SQLITE_OK) { printf("failed get cursor: %d", rc); goto close; } int y = 0; for (y = 1; y <= 3; y++) { rc = sqlite3BtreeInsert(&cur, NULL, y, pData, nData, 0, 0); if (rc != SQLITE_OK) { printf("failed insert data: %d", rc); goto close; } } rc = sqlite3BtreeCloseCursor(&cur); if (rc != SQLITE_OK) { printf("failed close cursor: %d", rc); goto close; } } rc = sqlite3BtreeCommit(pBt); if (rc != SQLITE_OK) { printf("failed commit transaction: %d", rc); } else { puts("success commit transaction"); } sqlite3_close(db); rc = sqlite3_open(file, &db); if (rc != SQLITE_OK) { printf("failed open: %d \n", rc); return; } if (db->nDb == 0) { puts("backends count is zero"); goto close; } pBt = db->aDb[0].pBt; rc = sqlite3BtreeBeginTrans(pBt, 1); if (rc != SQLITE_OK) { printf("failed begin transaction: %d", rc); goto close; } int pages = 0; rc = sqlite3PagerPagecount(pBt->pBt->pPager, &pages); if (rc != SQLITE_OK) { printf("failed get pages count: %d \n", rc); goto close; } if (pages == 0) { puts("pages count is zero"); goto close; } printf("pages count: %d \n", pages); pData = "Data test"; nData = strlen(pData); x = 0; for (x = 1; x <= pages; x++) { memset(&cur, 0, sizeof(BtCursor)); rc = sqlite3BtreeCursor(pBt, x, 1, 0, &cur); if (rc != SQLITE_OK) { printf("failed get cursor: %d", rc); goto close; } int next = 0; rc = sqlite3BtreeFirst(&cur, &next); if (rc != SQLITE_OK) { printf("failed first(): %d \n", rc); goto closeCursor; } if (next != 0) { puts("cursor is empty"); goto closeCursor; } sqlite3BtreeCacheOverflow(&cur); do { rc = sqlite3BtreePutData(&cur,0,nData,pData); if (rc != SQLITE_OK) { printf("failed putData(): %d \n", rc); goto closeCursor; } puts("data updated"); } while (SQLITE_OK == sqlite3BtreeNext(&cur, &next) && next == 0); closeCursor: rc = sqlite3BtreeCloseCursor(&cur); if (rc != SQLITE_OK) { printf("failed close cursor: %d", rc); goto close; } } rc = sqlite3BtreeCommit(pBt); if (rc != SQLITE_OK) { printf("failed commit transaction: %d", rc); } else { puts("success commit transaction"); } close: sqlite3_close(db); }