Expanded versions of source files are the output of the preprocessor. Lines subject to
conditional compilation are not shown and all compiler pragmas have been stripped. Macros
have been completely expanded.
00001: //
00002: // -------------------------------------------------------------
00003: // Copyright 2004-2008 Synopsys, Inc.
00004: // All Rights Reserved Worldwide
00005: //
00006: // Licensed under the Apache License, Version 2.0 (the
00007: // "License"); you may not use this file except in
00008: // compliance with the License. You may obtain a copy of
00009: // the License at
00010: //
00011: // http://www.apache.org/licenses/LICENSE-2.0
00012: //
00013: // Unless required by applicable law or agreed to in
00014: // writing, software distributed under the License is
00015: // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00016: // CONDITIONS OF ANY KIND, either express or implied. See
00017: // the License for the specific language governing
00018: // permissions and limitations under the License.
00019: // -------------------------------------------------------------
00020: //
00021:
00022:
00024: `define VMM_SQL_DB_SQLITE__SV
:
00025:
00026: import "DPI" function int vmm_sqlite_execute_dpi(string dbname, string sql);
00027: import "DPI" function void vmm_sqlite_close_db_dpi(string dbname);
00028: import "DPI" function int vmm_sqlite_create_db_dpi(string dbname);
00029: import "DPI" function int vmm_sqlite_init_dpi();
00030: import "DPI" function string vmm_sqlite_error_dpi();
00031: import "DPI" function int vmm_sqlite_unique_id_dpi(string dbname);
00032:
00033: typedef class vmm_sql_db_sqlite;
00034:
00035: //MUST be a power of 2.
00036: `define VMM_SQLITE_NUM_TRANS_TO_COMMIT 2047
:
00037: class vmm_sql_db_sqlite extends vmm_sql_db;
00038:
00039: local string dbname;
00040:
00041: local static bit init_done = 0;
00042: local bit last_failed;
00043: local static int num_transactions = 0;
00045: local static int num_transactions_before_commit = 2047;
00046: local static bit uncommitted = 0;
00048:
00049: extern function new(string dbname);
00050: extern virtual function int status();
00051: extern virtual function int statement(string sql_stmt);
00052: extern virtual function void commit();
00053: extern virtual function void close();
00054:
00055: // Return an ID that is unique in the DB
00056: extern local virtual function int get_unique_id();
00057: endclass: vmm_sql_db_sqlite
00058:
00059: //------------------------------------------------------------------
00060: //
00061: // Implementation
00062: //
00063:
00064: function vmm_sql_db_sqlite::new(string dbname);
00065: super.new();
00066: this.dbname = Xexpand_nameX(dbname);
00067: this.last_failed = 0;
00068: this.log = new("SQLdb", this.dbname);
00069: if (!init_done) begin
00070: if (vmm_sqlite_init_dpi()) begin
00071:
: do
: /* synopsys translate_off */
: if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV, "", -1)) begin
: void'(this.log.text(vmm_sqlite_error_dpi()));
: this.log.end_msg();
: end
: /* synopsys translate_on */
: while (0);
00072: this.last_failed = 1;
00073: end else begin
00074: init_done = 1;
00075: end
00076: end
00077: if (vmm_sqlite_create_db_dpi(this.dbname)) begin
00078:
: do
: /* synopsys translate_off */
: if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV, "", -1)) begin
: void'(this.log.text(vmm_sqlite_error_dpi()));
: this.log.end_msg();
: end
: /* synopsys translate_on */
: while (0);
00079: this.last_failed = 1;
00080: end else begin
00081: Xcreate_system_tablesX();
00082: end
00083: endfunction: new
00084:
00085: function int vmm_sql_db_sqlite::status();
00086: return(this.last_failed);
00087: endfunction: status
00088:
00089: function int vmm_sql_db_sqlite::statement(string sql_stmt);
00091: int num_transactions_modulo = num_transactions & num_transactions_before_commit;
00092: if ((num_transactions_modulo == 0) && (this.uncommitted == 0)) begin
00093: vmm_sqlite_execute_dpi(this.log.get_instance(), "BEGIN TRANSACTION;");
00094: this.uncommitted = 1;
00095: end
00097: if(vmm_sqlite_execute_dpi(this.log.get_instance(), sql_stmt)) begin
00098: this.last_failed = 1;
00099:
: do
: /* synopsys translate_off */
: if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV, "", -1)) begin
: void'(this.log.text(vmm_sqlite_error_dpi()));
: this.log.end_msg();
: end
: /* synopsys translate_on */
: while (0);
00100: end else begin
00101: this.last_failed = 0;
00102: end
00104: if (num_transactions_modulo == num_transactions_before_commit) begin
00105: vmm_sqlite_execute_dpi(this.log.get_instance(), "END TRANSACTION;");
00106: this.uncommitted = 0;
00107: end
00109: num_transactions++;
00110: return(this.last_failed);
00111: endfunction: statement
00112:
00113: function void vmm_sql_db_sqlite::commit();
00115: if (this.uncommitted) begin
00116: //commit, and begin a new transaction
00117: vmm_sqlite_execute_dpi(this.log.get_instance(), "END TRANSACTION;");
00118: vmm_sqlite_execute_dpi(this.log.get_instance(), "BEGIN TRANSACTION;");
00119: end
00121: endfunction: commit
00122:
00123: function void vmm_sql_db_sqlite::close();
00125: //if commit has not already happend, commit transaction before closing.
00126: if (this.uncommitted) begin
00127: vmm_sqlite_execute_dpi(this.log.get_instance(), "END TRANSACTION;");
00128: this.uncommitted = 0;
00129: end
00131: vmm_sqlite_close_db_dpi(this.log.get_instance());
00132: endfunction: close
00133:
00134:
00135: function int vmm_sql_db_sqlite::get_unique_id();
00136: // Need to return a unique ID from the DB.
00137: // like the number of rows in the vmm_runs table...
00138: return vmm_sqlite_unique_id_dpi(this.dbname);
00139: endfunction: get_unique_id
00140: