LCOV - code coverage report
Current view: top level - db - db.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 73 86 84.9 %
Date: 2026-09-09 08:39:22 Functions: 16 19 84.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : 
       5             : #include "base/task.h"
       6             : #include "db/db.h"
       7             : #include "db/db_partition.h"
       8             : #include "db/db_table.h"
       9             : #include "db/db_table_walker.h"
      10             : #include "db/db_table_walk_mgr.h"
      11             : 
      12             : using namespace std;
      13             : 
      14             : int DB::partition_count_;
      15             : 
      16             : // factory map is declared as a local static variable in order to avoid
      17             : // static initialization order dependencies.
      18       12948 : DB::FactoryMap *DB::factories() {
      19       12948 :     static FactoryMap factory_map;
      20       12946 :     return &factory_map;
      21             : }
      22             : 
      23          34 : void DB::RegisterFactory(const std::string &prefix, CreateFunction create_fn) {
      24          34 :     DB::factories()->insert(make_pair(prefix, create_fn));
      25          34 : }
      26             : 
      27           9 : void DB::ClearFactoryRegistry() {
      28           9 :     DB::factories()->clear();
      29           9 : }
      30             : 
      31      571561 : int DB::PartitionCount() {
      32             : 
      33             :     // Initialize static partition_count_.
      34      571561 :     if (!partition_count_) {
      35          21 :         partition_count_ = TaskScheduler::GetInstance()->HardwareThreadCount();
      36             :     }
      37      571602 :     return partition_count_;
      38             : }
      39             : 
      40             : // For unit testing only.
      41           0 : void DB::SetPartitionCount(int partition_count) {
      42           0 :     partition_count_ = partition_count;
      43           0 : }
      44             : 
      45        1521 : DB::DB(int task_id) : task_id_(task_id) {
      46        1521 :     if (task_id == -1)
      47         732 :         task_id_ = TaskScheduler::GetInstance()->GetTaskId("db::DBTable");
      48        1521 :     walker_.reset(new DBTableWalker(task_id_));
      49        1521 :     walk_mgr_.reset(new DBTableWalkMgr());
      50        7605 :     for (int i = 0; i < PartitionCount(); i++) {
      51        6084 :         partitions_.push_back(new DBPartition(this, i));
      52             :     }
      53        1521 : }
      54             : 
      55        1521 : DB::~DB() {
      56        1521 :     Clear();
      57        1521 : }
      58             : 
      59       38173 : DBPartition *DB::GetPartition(int index) {
      60       38173 :     return partitions_[index];
      61             : }
      62             : 
      63       65676 : const DBPartition *DB::GetPartition(int index) const {
      64       65676 :     return partitions_[index];
      65             : }
      66             : 
      67       80910 : DBTableBase *DB::FindTable(const string &name) {
      68       80910 :     TableMap::iterator loc = tables_.find(name);
      69       80899 :     if (loc != tables_.end()) {
      70       77486 :         DBTableBase *tbl_base = loc->second;
      71       77487 :         return tbl_base;
      72             :     }
      73        3414 :     return NULL;
      74             : }
      75             : 
      76           0 : DB::iterator DB::FindTableIter(const string &name) {
      77           0 :     return tables_.find(name);
      78             : }
      79             : 
      80      119821 : void DB::AddTable(DBTableBase *tbl_base) {
      81             :     pair<TableMap::iterator, bool> result =
      82      119821 :             tables_.insert(make_pair(tbl_base->name(), tbl_base));
      83      119821 :     assert(result.second);
      84      119821 : }
      85             : 
      86       12905 : void DB::RemoveTable(DBTableBase *tbl_base) {
      87       12905 :     tables_.erase(tbl_base->name());
      88       12905 : }
      89             : 
      90       16596 : bool DB::IsDBQueueEmpty() const {
      91       82036 :     for (int i = 0; i < PartitionCount(); i++) {
      92       65676 :         if (!GetPartition(i)->IsDBQueueEmpty()) return false;
      93             :     }
      94             : 
      95       16360 :     return true;
      96             : }
      97             : 
      98       12904 : DBTableBase *DB::CreateTable(const string &name) {
      99       12904 :     FactoryMap *factory_map = factories();
     100       12899 :     string prefix = name;
     101       21586 :     while (prefix.size()) {
     102       21580 :         FactoryMap::iterator loc = factory_map->find(prefix);
     103       21502 :         if (loc != factory_map->end()) {
     104       12873 :             DBTableBase *tbl_base = (loc->second)(this, name);
     105       12906 :             std::scoped_lock lock(mutex_);
     106       12920 :             tables_.insert(make_pair(name, tbl_base));
     107       12920 :             return tbl_base;
     108       12920 :         }
     109        8641 :         size_t index = prefix.find('.');
     110        8691 :         if (index == string::npos) {
     111           0 :             break;
     112             :         }
     113        8691 :         if (index == (prefix.length()-1)) {
     114           0 :             break;
     115             :         }
     116        8689 :         prefix = prefix.substr(index+1);
     117             :     }
     118           0 :     return NULL;
     119       12920 : }
     120             : 
     121          15 : DBGraph *DB::GetGraph(const std::string &name) {
     122          15 :     GraphMap::iterator loc = graph_map_.find(name);
     123          15 :     if (loc != graph_map_.end()) {
     124          15 :         return loc->second;
     125             :     }
     126           0 :     return NULL;
     127             : }
     128             : 
     129           3 : void DB::SetGraph(const std::string &name, DBGraph *graph) {
     130             :     pair<GraphMap::iterator, bool> result =
     131           3 :         graph_map_.insert(make_pair(name, graph));
     132           3 :     assert(result.second);
     133           3 : }
     134             : 
     135           0 : void DB::SetQueueDisable(bool disable) {
     136           0 :     for (int i = 0; i < PartitionCount(); i++) {
     137           0 :         partitions_[i]->SetQueueDisable(disable);
     138             :     }
     139           0 : }
     140             : 
     141        2244 : void DB::Clear() {
     142        2244 :     STLDeleteElements(&tables_);
     143        2244 :     STLDeleteValues(&partitions_);
     144        2244 : }

Generated by: LCOV version 1.14