__declspec(dllexport) int WINAPI sqlite3_cursor_rowid(sqlite3_stmt *pstmt, int cursor, sqlite_int64 *prowid) { Vdbe *p = (Vdbe *)pstmt; sqlite3 *db = (p == NULL) ? NULL : p->db; int rc = 0; Cursor *pC; int ret = 0; EnterDbMutex(db); while (1) { if (cursor < 0 || cursor >= p->nCursor) { ret = SQLITE_ERROR; break; } if (p->apCsr[cursor] == NULL) { ret = SQLITE_ERROR; break; } pC = p->apCsr[cursor]; ret = sqlite3VdbeCursorMoveto(pC); if(ret) break; if(pC->rowidIsValid) { *prowid = pC->lastRowid; } else if(pC->pseudoTable) { *prowid = keyToInt(pC->iKey); } else if(pC->nullRow || pC->pCursor==0) { ret = SQLITE_ERROR; break; } else { if (pC->pCursor == NULL) { ret = SQLITE_ERROR; break; } sqlite3BtreeKeySize(pC->pCursor, prowid); *prowid = keyToInt(*prowid); } break; } LeaveDbMutex(db); return ret; }
/* ** If a MoveTo operation is pending on the given cursor, then do that ** MoveTo now. Return an error code. If no MoveTo is pending, this ** routine does nothing and returns SQLITE_OK. */ int sqliteVdbeCursorMoveto(Cursor *p){ if( p->deferredMoveto ){ int res; extern int sqlite_search_count; sqliteBtreeMoveto(p->pCursor, (char*)&p->movetoTarget, sizeof(int), &res); p->lastRecno = keyToInt(p->movetoTarget); p->recnoIsValid = res==0; if( res<0 ){ sqliteBtreeNext(p->pCursor, &res); } sqlite_search_count++; p->deferredMoveto = 0; } return SQLITE_OK; }
/* ** If a MoveTo operation is pending on the given cursor, then do that ** MoveTo now. Return an error code. If no MoveTo is pending, this ** routine does nothing and returns SQLITE_OK. */ int sqlite3VdbeCursorMoveto(Cursor *p){ if( p->deferredMoveto ){ int res; extern int sqlite3_search_count; assert( p->intKey ); if( p->intKey ){ sqlite3BtreeMoveto(p->pCursor, 0, p->movetoTarget, &res); }else{ sqlite3BtreeMoveto(p->pCursor,(char*)&p->movetoTarget,sizeof(i64),&res); } *p->pIncrKey = 0; p->lastRecno = keyToInt(p->movetoTarget); p->recnoIsValid = res==0; if( res<0 ){ sqlite3BtreeNext(p->pCursor, &res); } sqlite3_search_count++; p->deferredMoveto = 0; p->cacheValid = 0; } return SQLITE_OK; }
//Console do elevador void console(void) { int goTo, in; //Objetivo, entrada printf ("Console do Elevador.\n"); do { printf (": "); in = getch(); //Recebe tecla goTo = keyToInt(in); //Recebe inteiro if ((goTo >= 0) && (goTo <= 3) && (goTo != position)) //Verifica��o toMove(goTo); //Chama do procedimento (destino) else if (goTo == -1) //Caso a mesma posi��o { toMove(0); //Desce o elevador ate o t�rreo printf ("Sair.\n"); goTo = -1; } else //Qualquer outro valor printf ("Erro.\n"); } while (goTo != -1); //Condi��o do loop }