void nsImageLoadingContent::CancelImageRequests(PRBool aNotify) { AutoStateChanger changer(this, aNotify); ClearPendingRequest(NS_BINDING_ABORTED); ClearCurrentRequest(NS_BINDING_ABORTED); }
void CChainComparer::SequenceIDSensitivePass() { UseSequenceIDChanger changer(m_pHost->GetContext()); // start using sequence ID sensitive stuff for duration of this call GlobalThenLocalBind(); DuplicateBindBySection(Binder::eDefault, DBG_AFTER_LOCAL_DUPLIC_1); VerifyListsAndFindMoves(); DoSentenceAndClauseComparison(); DecomposeStrings(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_1); LocalThenGlobalBind(); DuplicateBindBySection(Binder::eDefault, DBG_AFTER_LOCAL_DUPLIC_2); VerifyListsAndFindMoves(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_2); DisassociateAndDecomposeMoves(); DuplicateBindBySection(Binder::eIncludeMoves, DBG_AFTER_LOCAL_DUPLIC_3); VerifyListsAndFindMoves(); DecomposeWhiteSpaceStrings(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_3); CheckReadabilityAndExpandBridges(true); ReMergeUnMatchedStrings(); Prepare(); }
void removeOriginFromChildPrimitives(const scene::INodePtr& root) { // Disable texture lock during this process registry::ScopedKeyChanger<bool> changer(RKEY_ENABLE_TEXTURE_LOCK, false); OriginRemover remover; Node_traverseSubgraph(root, remover); }
void PrefabSelector::handleSelectionChange() { wxDataViewItem item = _treeView->GetSelection(); if (!item.IsOk()) { clearPreview(); return; } wxutil::TreeModel::Row row(item, *_treeView->GetModel()); if (row[_columns.isFolder].getBool()) { clearPreview(); return; } std::string prefabPath = row[_columns.vfspath]; _mapResource = GlobalMapResourceManager().capture(prefabPath); if (_mapResource == NULL) { clearPreview(); return; } _lastPrefab = prefabPath; // Suppress the map loading dialog to avoid user // getting stuck in the "drag filename" operation registry::ScopedKeyChanger<bool> changer( RKEY_MAP_SUPPRESS_LOAD_STATUS_DIALOG, true ); if (_mapResource->load()) { // Get the node from the resource scene::INodePtr root = _mapResource->getNode(); assert(root != NULL); // Set the new rootnode _preview->setRootNode(root); _preview->getWidget()->Refresh(); } else { // Map load failed rWarning() << "Could not load prefab: " << prefabPath << std::endl; clearPreview(); } updateUsageInfo(); }
//main int main(int argc, char *argv[]) { int matriz[6][4]; srand(time(NULL)); randomizer(matriz); imprimir(matriz); changer(matriz); printf("\n"); imprimir(matriz); system("PAUSE"); return 0; }
matrice partie(matrice M, char *nom, int joueur) { char coup[2]; char *ordi="l\'ordinateur"; int i, j; while ( peut_jouer(M, 1) || peut_jouer(M, 2)) { if (!peut_jouer(M, joueur)) { printf("%s ne peut pas jouer", (joueur==1)?nom:ordi); joueur=changer_joueur(joueur); } else { printf("Au tour de %s : \n", (joueur==1)?nom:ordi); do { affiche_matrice(M); printf("Rentrez un coup :\n"); fscanf(stdin, "%s", coup); if (verif_coup(coup)) { if (verif_coup(coup) == 1) { i=convertir(coup[0]); j=convertir(coup[1]); } else { j=convertir(coup[0]); i=convertir(coup[1]); } } } while (!coup_valide(M, i, j, joueur)); M=changer(M, i, j, joueur); joueur=changer_joueur(joueur); purger(); clear(); } } return M; }
nsresult nsImageLoadingContent::UseAsPrimaryRequest(imgIRequest* aRequest, PRBool aNotify) { // Our state will change. Watch it. AutoStateChanger changer(this, aNotify); // Get rid if our existing images ClearPendingRequest(NS_BINDING_ABORTED); ClearCurrentRequest(NS_BINDING_ABORTED); // Clone the request we were given. nsCOMPtr<imgIRequest>& req = PrepareNextRequest();; nsresult rv = aRequest->Clone(this, getter_AddRefs(req)); if (NS_SUCCEEDED(rv)) TrackImage(req); else return rv; return NS_OK; }
bool GammaBlockUSB::deviceInit() { wxConfigBase* config = wxFileConfig::Get(); wxConfigPathChanger changer(config, "/USBDevice/"); if( deviceReset() && deviceSet(GAMMA_SET_ZOOM, config->ReadLong("Zoom", 127)) && deviceSet(GAMMA_SET_SHIFT_X, config->ReadLong("ShiftX", 127)) && deviceSet(GAMMA_SET_SHIFT_Y, config->ReadLong("ShiftY", 127)) && deviceSet(GAMMA_SET_TMARKER, log10(config->ReadDouble("Tmarker", 10)) + 1) && deviceSet(GAMMA_SET_GATE, config->ReadLong("GateOn", 0)) ) { wxLogStatus("Device init OK."); return true; } else { wxLogStatus("Device init FAILED."); return false; } }
NS_IMETHODIMP nsImageLoadingContent::LoadImageWithChannel(nsIChannel* aChannel, nsIStreamListener** aListener) { NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE); if (!nsContentUtils::GetImgLoader()) { return NS_ERROR_NULL_POINTER; } nsCOMPtr<nsIDocument> doc = GetOurDocument(); if (!doc) { // Don't bother return NS_OK; } // XXX what should we do with content policies here, if anything? // Shouldn't that be done before the start of the load? // XXX what about shouldProcess? // Our state might change. Watch it. AutoStateChanger changer(this, PR_TRUE); // Do the load. nsCOMPtr<imgIRequest>& req = PrepareNextRequest(); nsresult rv = nsContentUtils::GetImgLoader()-> LoadImageWithChannel(aChannel, this, doc, aListener, getter_AddRefs(req)); if (NS_SUCCEEDED(rv)) { TrackImage(req); } else { // If we don't have a current URI, we might as well store this URI so people // know what we tried (and failed) to load. if (!mCurrentRequest) aChannel->GetURI(getter_AddRefs(mCurrentURI)); FireEvent(NS_LITERAL_STRING("error")); return rv; } return NS_OK;; }
/* * Find Available Media (Volume) for Pool * * Find a Volume for a given PoolId, MediaType, and Status. * The unwanted_volumes variable lists the VolumeNames which we should skip if any. * * Returns: 0 on failure * numrows on success */ int db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr, const char *unwanted_volumes) { char ed1[50]; int num_rows = 0; SQL_ROW row = NULL; bool find_oldest = false; bool found_candidate = false; char esc_type[MAX_ESCAPE_NAME_LENGTH]; char esc_status[MAX_ESCAPE_NAME_LENGTH]; db_lock(mdb); mdb->db_escape_string(jcr, esc_type, mr->MediaType, strlen(mr->MediaType)); mdb->db_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); if (item == -1) { find_oldest = true; item = 1; } retry_fetch: if (find_oldest) { /* * Find oldest volume(s) */ Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," "EndFile,EndBlock,LabelType,LabelDate,StorageId," "Enabled,LocationId,RecycleCount,InitialWrite," "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime," "ActionOnPurge,EncryptionKey,MinBlocksize,MaxBlocksize " "FROM Media WHERE PoolId=%s AND MediaType='%s' AND VolStatus IN ('Full'," "'Recycle','Purged','Used','Append') AND Enabled=1 " "ORDER BY LastWritten LIMIT %d", edit_int64(mr->PoolId, ed1), esc_type, item); } else { POOL_MEM changer(PM_FNAME); const char *order; /* * Find next available volume */ if (InChanger) { Mmsg(changer, "AND InChanger=1 AND StorageId=%s", edit_int64(mr->StorageId, ed1)); } if (bstrcmp(mr->VolStatus, "Recycle") || bstrcmp(mr->VolStatus, "Purged")) { order = "AND Recycle=1 ORDER BY LastWritten ASC,MediaId"; /* take oldest that can be recycled */ } else { order = sql_media_order_most_recently_written[db_get_type_index(mdb)]; /* take most recently written */ } Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," "EndFile,EndBlock,LabelType,LabelDate,StorageId," "Enabled,LocationId,RecycleCount,InitialWrite," "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime," "ActionOnPurge,EncryptionKey,MinBlocksize,MaxBlocksize " "FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 " "AND VolStatus='%s' " "%s " "%s LIMIT %d", edit_int64(mr->PoolId, ed1), esc_type, esc_status, changer.c_str(), order, item); } Dmsg1(100, "fnextvol=%s\n", mdb->cmd); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { goto bail_out; } num_rows = sql_num_rows(mdb); if (item > num_rows || item < 1) { Dmsg2(050, "item=%d got=%d\n", item, num_rows); Mmsg2(&mdb->errmsg, _("Request for Volume item %d greater than max %d or less than 1\n"), item, num_rows); num_rows = 0; goto bail_out; } for (int i = 0 ; i < item; i++) { if ((row = sql_fetch_row(mdb)) == NULL) { Dmsg1(050, "Fail fetch item=%d\n", i); Mmsg1(&mdb->errmsg, _("No Volume record found for item %d.\n"), i); sql_free_result(mdb); num_rows = 0; goto bail_out; } /* * See if this is not on the unwanted volumes list. */ if (unwanted_volumes && is_on_unwanted_volumes_list(row[1], unwanted_volumes)) { continue; } /* * Return fields in Media Record */ mr->MediaId = str_to_int64(row[0]); bstrncpy(mr->VolumeName, (row[1] != NULL) ? row[1] : "", sizeof(mr->VolumeName)); mr->VolJobs = str_to_int64(row[2]); mr->VolFiles = str_to_int64(row[3]); mr->VolBlocks = str_to_int64(row[4]); mr->VolBytes = str_to_uint64(row[5]); mr->VolMounts = str_to_int64(row[6]); mr->VolErrors = str_to_int64(row[7]); mr->VolWrites = str_to_int64(row[8]); mr->MaxVolBytes = str_to_uint64(row[9]); mr->VolCapacityBytes = str_to_uint64(row[10]); bstrncpy(mr->MediaType, (row[11] != NULL) ? row[11] : "", sizeof(mr->MediaType)); bstrncpy(mr->VolStatus, (row[12] != NULL) ? row[12] : "", sizeof(mr->VolStatus)); mr->PoolId = str_to_int64(row[13]); mr->VolRetention = str_to_uint64(row[14]); mr->VolUseDuration = str_to_uint64(row[15]); mr->MaxVolJobs = str_to_int64(row[16]); mr->MaxVolFiles = str_to_int64(row[17]); mr->Recycle = str_to_int64(row[18]); mr->Slot = str_to_int64(row[19]); bstrncpy(mr->cFirstWritten, (row[20] != NULL) ? row[20] : "", sizeof(mr->cFirstWritten)); mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten); bstrncpy(mr->cLastWritten, (row[21] != NULL) ? row[21] : "", sizeof(mr->cLastWritten)); mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten); mr->InChanger = str_to_uint64(row[22]); mr->EndFile = str_to_uint64(row[23]); mr->EndBlock = str_to_uint64(row[24]); mr->LabelType = str_to_int64(row[25]); bstrncpy(mr->cLabelDate, (row[26] != NULL) ? row[26] : "", sizeof(mr->cLabelDate)); mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); mr->StorageId = str_to_int64(row[27]); mr->Enabled = str_to_int64(row[28]); mr->LocationId = str_to_int64(row[29]); mr->RecycleCount = str_to_int64(row[30]); bstrncpy(mr->cInitialWrite, (row[31] != NULL) ? row[31] : "", sizeof(mr->cInitialWrite)); mr->InitialWrite = (time_t)str_to_utime(mr->cInitialWrite); mr->ScratchPoolId = str_to_int64(row[32]); mr->RecyclePoolId = str_to_int64(row[33]); mr->VolReadTime = str_to_int64(row[34]); mr->VolWriteTime = str_to_int64(row[35]); mr->ActionOnPurge = str_to_int64(row[36]); bstrncpy(mr->EncrKey, (row[37] != NULL) ? row[37] : "", sizeof(mr->EncrKey)); mr->MinBlocksize = str_to_int32(row[38]); mr->MaxBlocksize = str_to_int32(row[39]); sql_free_result(mdb); found_candidate = true; break; } if (!found_candidate && find_oldest) { item++; goto retry_fetch; } bail_out: db_unlock(mdb); Dmsg1(050, "Rtn numrows=%d\n", num_rows); return num_rows; }
nsresult nsImageLoadingContent::LoadImage(nsIURI* aNewURI, PRBool aForce, PRBool aNotify, nsIDocument* aDocument, nsLoadFlags aLoadFlags) { if (!mLoadingEnabled) { // XXX Why fire an error here? seems like the callers to SetLoadingEnabled // don't want/need it. FireEvent(NS_LITERAL_STRING("error")); return NS_OK; } NS_ASSERTION(!aDocument || aDocument == GetOurDocument(), "Bogus document passed in"); // First, get a document (needed for security checks and the like) if (!aDocument) { aDocument = GetOurDocument(); if (!aDocument) { // No reason to bother, I think... return NS_OK; } } // URI equality check. // // We skip the equality check if our current image was blocked, since in that // case we really do want to try loading again. if (!aForce && NS_CP_ACCEPTED(mImageBlockingStatus)) { nsCOMPtr<nsIURI> currentURI; GetCurrentURI(getter_AddRefs(currentURI)); PRBool equal; if (currentURI && NS_SUCCEEDED(currentURI->Equals(aNewURI, &equal)) && equal) { // Nothing to do here. return NS_OK; } } // From this point on, our image state could change. Watch it. AutoStateChanger changer(this, aNotify); // Sanity check. // // We use the principal of aDocument to avoid having to QI |this| an extra // time. It should always be the same as the principal of this node. #ifdef DEBUG nsCOMPtr<nsIContent> thisContent = do_QueryInterface(this); NS_ABORT_IF_FALSE(thisContent && thisContent->NodePrincipal() == aDocument->NodePrincipal(), "Principal mismatch?"); #endif // Are we blocked? PRInt16 cpDecision = nsIContentPolicy::REJECT_REQUEST; nsContentUtils::CanLoadImage(aNewURI, this, aDocument, aDocument->NodePrincipal(), &cpDecision); if (!NS_CP_ACCEPTED(cpDecision)) { FireEvent(NS_LITERAL_STRING("error")); SetBlockedRequest(aNewURI, cpDecision); return NS_OK; } // Not blocked. Do the load. nsCOMPtr<imgIRequest>& req = PrepareNextRequest(); nsresult rv; rv = nsContentUtils::LoadImage(aNewURI, aDocument, aDocument->NodePrincipal(), aDocument->GetDocumentURI(), this, aLoadFlags, getter_AddRefs(req)); if (NS_SUCCEEDED(rv)) { TrackImage(req); } else { // If we don't have a current URI, we might as well store this URI so people // know what we tried (and failed) to load. if (!mCurrentRequest) mCurrentURI = aNewURI; FireEvent(NS_LITERAL_STRING("error")); return NS_OK; } return NS_OK; }
// Warning - This isn't actually fired when decode is complete. Rather, it's // fired when load is complete. See bug 505385, and in the mean time use // OnStopContainer. NS_IMETHODIMP nsImageLoadingContent::OnStopDecode(imgIRequest* aRequest, nsresult aStatus, const PRUnichar* aStatusArg) { NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE); // We should definitely have a request here NS_ABORT_IF_FALSE(aRequest, "no request?"); NS_PRECONDITION(aRequest == mCurrentRequest || aRequest == mPendingRequest, "Unknown request"); LOOP_OVER_OBSERVERS(OnStopDecode(aRequest, aStatus, aStatusArg)); // XXXbholley - When we fix bug 505385, everything here should go in // OnStopRequest. // Our state may change. Watch it. AutoStateChanger changer(this, PR_TRUE); // If the pending request is loaded, switch to it. if (aRequest == mPendingRequest) { PrepareCurrentRequest() = mPendingRequest; mPendingRequest = nsnull; mCurrentRequestNeedsResetAnimation = mPendingRequestNeedsResetAnimation; mPendingRequestNeedsResetAnimation = PR_FALSE; } NS_ABORT_IF_FALSE(aRequest == mCurrentRequest, "One way or another, we should be current by now"); if (mCurrentRequestNeedsResetAnimation) { nsCOMPtr<imgIContainer> container; mCurrentRequest->GetImage(getter_AddRefs(container)); if (container) container->ResetAnimation(); mCurrentRequestNeedsResetAnimation = PR_FALSE; } // We just loaded all the data we're going to get. If we haven't done an // initial paint, we want to make sure the image starts decoding for 2 // reasons: // // 1) This image is sitting idle but might need to be decoded as soon as we // start painting, in which case we've wasted time. // // 2) We want to block onload until all visible images are decoded. We do this // by blocking onload until all in progress decodes get at least one frame // decoded. However, if all the data comes in while painting is suppressed // (ie, before the initial paint delay is finished), we fire onload without // doing a paint first. This means that decode-on-draw images don't start // decoding, so we can't wait for them to finish. See bug 512435. // We can only do this if we have a presshell nsIDocument* doc = GetOurDocument(); nsIPresShell* shell = doc ? doc->GetShell() : nsnull; if (shell) { // We need to figure out whether to kick off decoding PRBool doRequestDecode = PR_FALSE; // If we haven't got the initial reflow yet, IsPaintingSuppressed actually // returns false if (!shell->DidInitialReflow()) doRequestDecode = PR_TRUE; // Figure out if painting is suppressed. Note that it's possible for painting // to be suppressed for reasons other than the initial paint delay (for // example - being in the bfcache), but we probably aren't loading images in // those situations. if (shell->IsPaintingSuppressed()) doRequestDecode = PR_TRUE; // If we're requesting a decode, do it if (doRequestDecode) mCurrentRequest->RequestDecode(); } // Fire the appropriate DOM event. if (NS_SUCCEEDED(aStatus)) { FireEvent(NS_LITERAL_STRING("load")); } else { FireEvent(NS_LITERAL_STRING("error")); } #ifdef MOZ_SVG nsCOMPtr<nsINode> thisNode = do_QueryInterface(this); nsSVGEffects::InvalidateDirectRenderingObservers(thisNode->AsElement()); #endif return NS_OK; }
/* * Find Available Media (Volume) for Pool * * Find a Volume for a given PoolId, MediaType, and Status. * * Returns: 0 on failure * numrows on success */ int BDB::bdb_find_next_volume(JCR *jcr, int item, bool InChanger, MEDIA_DBR *mr) { SQL_ROW row = NULL; int numrows; const char *order; char esc_type[MAX_ESCAPE_NAME_LENGTH]; char esc_status[MAX_ESCAPE_NAME_LENGTH]; char ed1[50]; bdb_lock(); bdb_escape_string(jcr, esc_type, mr->MediaType, strlen(mr->MediaType)); bdb_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); if (item == -1) { /* find oldest volume */ /* Find oldest volume */ Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId," "Enabled,LocationId,RecycleCount,InitialWrite," "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime,ActionOnPurge " "FROM Media WHERE PoolId=%s AND MediaType='%s' AND VolStatus IN ('Full'," "'Recycle','Purged','Used','Append') AND Enabled=1 " "ORDER BY LastWritten LIMIT 1", edit_int64(mr->PoolId, ed1), esc_type); item = 1; } else { POOL_MEM changer(PM_FNAME); POOL_MEM voltype(PM_FNAME); POOL_MEM exclude(PM_FNAME); /* Find next available volume */ if (InChanger) { Mmsg(changer, " AND InChanger=1 AND StorageId=%s ", edit_int64(mr->StorageId, ed1)); } /* Volumes will be automatically excluded from the query, we just take the * first one of the list */ if (mr->exclude_list && *mr->exclude_list) { item = 1; Mmsg(exclude, " AND MediaId NOT IN (%s) ", mr->exclude_list); } if (strcmp(mr->VolStatus, "Recycle") == 0 || strcmp(mr->VolStatus, "Purged") == 0) { order = "AND Recycle=1 ORDER BY LastWritten ASC,MediaId"; /* take oldest that can be recycled */ } else { order = sql_media_order_most_recently_written[bdb_get_type_index()]; /* take most recently written */ } Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId," "Enabled,LocationId,RecycleCount,InitialWrite," "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime,ActionOnPurge " "FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 " "AND VolStatus='%s' " "%s " "%s " "%s " "%s LIMIT %d", edit_int64(mr->PoolId, ed1), esc_type, esc_status, voltype.c_str(), changer.c_str(), exclude.c_str(), order, item); } Dmsg1(100, "fnextvol=%s\n", cmd); if (!QueryDB(jcr, cmd)) { bdb_unlock(); return 0; } numrows = sql_num_rows(); if (item > numrows || item < 1) { Dmsg2(050, "item=%d got=%d\n", item, numrows); Mmsg2(&errmsg, _("Request for Volume item %d greater than max %d or less than 1\n"), item, numrows); bdb_unlock(); return 0; } /* Note, we previously seeked to the row using: * sql_data_seek(item-1); * but this failed on PostgreSQL, so now we loop * over all the records. This should not be too horrible since * the maximum Volumes we look at in any case is 20. */ while (item-- > 0) { if ((row = sql_fetch_row()) == NULL) { Dmsg1(050, "Fail fetch item=%d\n", item+1); Mmsg1(&errmsg, _("No Volume record found for item %d.\n"), item); sql_free_result(); bdb_unlock(); return 0; } } /* Return fields in Media Record */ mr->MediaId = str_to_int64(row[0]); bstrncpy(mr->VolumeName, row[1]!=NULL?row[1]:"", sizeof(mr->VolumeName)); mr->VolJobs = str_to_int64(row[2]); mr->VolFiles = str_to_int64(row[3]); mr->VolBlocks = str_to_int64(row[4]); mr->VolBytes = str_to_uint64(row[5]); mr->VolMounts = str_to_int64(row[6]); mr->VolErrors = str_to_int64(row[7]); mr->VolWrites = str_to_int64(row[8]); mr->MaxVolBytes = str_to_uint64(row[9]); mr->VolCapacityBytes = str_to_uint64(row[10]); bstrncpy(mr->MediaType, row[11]!=NULL?row[11]:"", sizeof(mr->MediaType)); bstrncpy(mr->VolStatus, row[12]!=NULL?row[12]:"", sizeof(mr->VolStatus)); mr->PoolId = str_to_int64(row[13]); mr->VolRetention = str_to_uint64(row[14]); mr->VolUseDuration = str_to_uint64(row[15]); mr->MaxVolJobs = str_to_int64(row[16]); mr->MaxVolFiles = str_to_int64(row[17]); mr->Recycle = str_to_int64(row[18]); mr->Slot = str_to_int64(row[19]); bstrncpy(mr->cFirstWritten, row[20]!=NULL?row[20]:"", sizeof(mr->cFirstWritten)); mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten); bstrncpy(mr->cLastWritten, row[21]!=NULL?row[21]:"", sizeof(mr->cLastWritten)); mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten); mr->InChanger = str_to_uint64(row[22]); mr->EndFile = str_to_uint64(row[23]); mr->EndBlock = str_to_uint64(row[24]); mr->VolType = str_to_int64(row[25]); /* formerly VolParts */ mr->LabelType = str_to_int64(row[26]); bstrncpy(mr->cLabelDate, row[27]!=NULL?row[27]:"", sizeof(mr->cLabelDate)); mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); mr->StorageId = str_to_int64(row[28]); mr->Enabled = str_to_int64(row[29]); mr->LocationId = str_to_int64(row[30]); mr->RecycleCount = str_to_int64(row[31]); bstrncpy(mr->cInitialWrite, row[32]!=NULL?row[32]:"", sizeof(mr->cInitialWrite)); mr->InitialWrite = (time_t)str_to_utime(mr->cInitialWrite); mr->ScratchPoolId = str_to_int64(row[33]); mr->RecyclePoolId = str_to_int64(row[34]); mr->VolReadTime = str_to_int64(row[35]); mr->VolWriteTime = str_to_int64(row[36]); mr->ActionOnPurge = str_to_int64(row[37]); sql_free_result(); bdb_unlock(); Dmsg1(050, "Rtn numrows=%d\n", numrows); return numrows; }
void DriveTest::testFormat() { auto_ptr<TapeLibraryManager> manager; { ofstream config(configFile.c_str()); config << "4 1 16 10 2 16 10 2 16 10 1 16 10" << endl; } manager.reset( new TapeLibraryManager() ); fs::remove(fileConfig); auto_ptr<Changer> changer(new Changer("3")); Error error; vector<Drive> drives; CPPUNIT_ASSERT( true == changer->GetDriveList(drives,error) ); vector<Slot> slots; CPPUNIT_ASSERT( true == changer->GetSlotList(slots,error) ); vector<Cartridge> cartridges; CPPUNIT_ASSERT( true == changer->GetCartridgeList(cartridges,error) ); string barcode; CPPUNIT_ASSERT( true == drives[0].GetBarcode(barcode,error) ); //CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); //CPPUNIT_ASSERT( fs::exists(ltfsFolder/barcode) ); fs::remove_all(tapeFolder/barcode); fs::remove_all(ltfsFolder/barcode); CPPUNIT_ASSERT( true == changer->MoveCartridge(slots[0],cartridges[0],error) ); CPPUNIT_ASSERT( ! fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( false == drives[0].Format(error) ); CPPUNIT_ASSERT( ! fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( false == drives[0].Mount(error) ); CPPUNIT_ASSERT( ! fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == changer->LoadCartridge(drives[0],cartridges[0],error) ); CPPUNIT_ASSERT( ! fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == drives[0].Format(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == drives[0].Format(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == drives[0].Mount(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( false == drives[0].Format(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == drives[0].Unmount(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == drives[0].Format(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( true == changer->MoveCartridge(slots[0],cartridges[0],error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( false == drives[0].Format(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); CPPUNIT_ASSERT( false == drives[0].Mount(error) ); CPPUNIT_ASSERT( fs::exists(tapeFolder/barcode) ); CPPUNIT_ASSERT( ! fs::exists(ltfsFolder/barcode) ); }
/* * Prune at least one Volume in current Pool. This is called from * catreq.c => next_vol.c when the Storage daemon is asking for another * volume and no appendable volumes are available. * */ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr, STORE *store) { int count; int i; dbid_list ids; struct del_ctx prune_list; POOL_MEM query(PM_MESSAGE), changer(PM_MESSAGE); UAContext *ua; char ed1[50], ed2[100], ed3[50]; POOL_DBR spr; Dmsg1(100, "Prune volumes PoolId=%d\n", jcr->jr.PoolId); if (!jcr->job->PruneVolumes && !jcr->pool->AutoPrune) { Dmsg0(100, "AutoPrune not set in Pool.\n"); return; } memset(&prune_list, 0, sizeof(prune_list)); prune_list.max_ids = 10000; prune_list.JobId = (JobId_t *)malloc(sizeof(JobId_t) * prune_list.max_ids); ua = new_ua_context(jcr); db_lock(jcr->db); /* Edit PoolId */ edit_int64(mr->PoolId, ed1); /* * Get Pool record for Scratch Pool */ memset(&spr, 0, sizeof(spr)); bstrncpy(spr.Name, "Scratch", sizeof(spr.Name)); if (db_get_pool_record(jcr, jcr->db, &spr)) { edit_int64(spr.PoolId, ed2); bstrncat(ed2, ",", sizeof(ed2)); } else { ed2[0] = 0; } if (mr->ScratchPoolId) { edit_int64(mr->ScratchPoolId, ed3); bstrncat(ed2, ed3, sizeof(ed2)); bstrncat(ed2, ",", sizeof(ed2)); } Dmsg1(100, "Scratch pool(s)=%s\n", ed2); /* * ed2 ends up with scratch poolid and current poolid or * just current poolid if there is no scratch pool */ bstrncat(ed2, ed1, sizeof(ed2)); /* * Get the List of all media ids in the current Pool or whose * RecyclePoolId is the current pool or the scratch pool */ const char *select = "SELECT DISTINCT MediaId,LastWritten FROM Media WHERE " "(PoolId=%s OR RecyclePoolId IN (%s)) AND MediaType='%s' %s" "ORDER BY LastWritten ASC,MediaId"; set_storageid_in_mr(store, mr); if (InChanger) { Mmsg(changer, "AND InChanger=1 AND StorageId IN (%s) ", edit_int64(mr->StorageId, ed3)); } Mmsg(query, select, ed1, ed2, mr->MediaType, changer.c_str()); Dmsg1(100, "query=%s\n", query.c_str()); if (!db_get_query_dbids(ua->jcr, ua->db, query, ids)) { Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); goto bail_out; } Dmsg1(100, "Volume prune num_ids=%d\n", ids.num_ids); /* Visit each Volume and Prune it until we find one that is purged */ for (i=0; i<ids.num_ids; i++) { MEDIA_DBR lmr; lmr.MediaId = ids.DBId[i]; Dmsg1(100, "Get record MediaId=%d\n", (int)lmr.MediaId); if (!db_get_media_record(jcr, jcr->db, &lmr)) { Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); continue; } Dmsg1(100, "Examine vol=%s\n", lmr.VolumeName); /* Don't prune archived volumes */ if (lmr.Enabled == 2) { Dmsg1(100, "Vol=%s disabled\n", lmr.VolumeName); continue; } /* Prune only Volumes with status "Full", or "Used" */ if (strcmp(lmr.VolStatus, "Full") == 0 || strcmp(lmr.VolStatus, "Used") == 0) { Dmsg2(100, "Add prune list MediaId=%d Volume %s\n", (int)lmr.MediaId, lmr.VolumeName); count = get_prune_list_for_volume(ua, &lmr, &prune_list); Dmsg1(100, "Num pruned = %d\n", count); if (count != 0) { purge_job_list_from_catalog(ua, prune_list); prune_list.num_ids = 0; /* reset count */ } if (!is_volume_purged(ua, &lmr)) { Dmsg1(100, "Vol=%s not pruned\n", lmr.VolumeName); continue; } Dmsg1(100, "Vol=%s is purged\n", lmr.VolumeName); /* * Since we are also pruning the Scratch pool, continue * until and check if this volume is available (InChanger + StorageId) * If not, just skip this volume and try the next one */ if (InChanger) { if (!lmr.InChanger || (lmr.StorageId != mr->StorageId)) { Dmsg1(100, "Vol=%s not inchanger\n", lmr.VolumeName); continue; /* skip this volume, ie not loadable */ } } if (!lmr.Recycle) { Dmsg1(100, "Vol=%s not recyclable\n", lmr.VolumeName); continue; } if (has_volume_expired(jcr, &lmr)) { Dmsg1(100, "Vol=%s has expired\n", lmr.VolumeName); continue; /* Volume not usable */ } /* * If purged and not moved to another Pool, * then we stop pruning and take this volume. */ if (lmr.PoolId == mr->PoolId) { Dmsg2(100, "Got Vol=%s MediaId=%d purged.\n", lmr.VolumeName, (int)lmr.MediaId); mr->copy(&lmr); set_storageid_in_mr(store, mr); break; /* got a volume */ } } } bail_out: Dmsg0(100, "Leave prune volumes\n"); db_unlock(jcr->db); free_ua_context(ua); if (prune_list.JobId) { free(prune_list.JobId); } return; }