Changeset 7626 for trunk/psLib/src/db/psDB.c
- Timestamp:
- Jun 21, 2006, 2:36:22 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/db/psDB.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/db/psDB.c
r7617 r7626 12 12 * @author Joshua Hoblitt 13 13 * 14 * @version $Revision: 1. 59$ $Name: not supported by cvs2svn $15 * @date $Date: 2006-06-2 1 21:40:12 $14 * @version $Revision: 1.60 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2006-06-22 00:36:22 $ 16 16 * 17 17 * Copyright 2005 Joshua Hoblitt, University of Hawaii … … 37 37 #include "psErrorText.h" 38 38 39 // set the pointer to NULL if we are actually freeing the memory 40 #define PSDB_NULL_FREE(ptr) \ 41 if (psMemGetRefCounter(ptr) == 1) { \ 42 psFree(ptr); \ 43 ptr = NULL; \ 44 } else { \ 45 psFree(ptr); \ 46 } 47 39 48 typedef struct 40 49 { … … 44 53 mysqlType; 45 54 46 //static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER;55 static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER; 47 56 static psHash *pTypeToSQLlookupTable = NULL; 48 57 static psHash *sqlToPTypeLookupTable = NULL; … … 71 80 static mysqlType *psDBPTypeToMySQL(psElemType pType); 72 81 73 static psHash *psDBGetPTypeToSQLTable(void); 82 static psHash *psDBPTypeToSQLTableSetup(void); 83 static psHash *psDBPTypeToSQLTableGet(void); 74 84 static void psDBPTypeToSQLTableCleanup(void); 75 85 76 static psHash *psDBGetSQLToPTypeTable(void); 86 static psHash *psDBSQLToPTypeTableSetup(void); 87 static psHash *psDBSQLToPTypeTableGet(void); 77 88 static void psDBSQLToPTypeTableCleanup(void); 78 89 79 static psHash *psDBGetMySQLToSQLTable(void); 90 static psHash *psDBMySQLToSQLTableSetup(void); 91 static psHash *psDBMySQLToSQLTableGet(void); 80 92 static void psDBMySQLToSQLTableCleanup(void); 81 93 82 static psHash *psDBGetPTypeToMySQLTable(void); 94 static psHash *psDBPTypeToMySQLTableSetup(void); 95 static psHash *psDBPTypeToMySQLTableGet(void); 83 96 static void psDBPTypeToMySQLTableCleanup(void); 84 97 … … 136 149 } 137 150 151 if (psMemGetThreadSafety()) { 152 pthread_mutex_lock(&lookupTableMutex); 153 154 psDBPTypeToSQLTableSetup(); 155 psDBSQLToPTypeTableSetup(); 156 psDBMySQLToSQLTableSetup(); 157 psDBPTypeToMySQLTableSetup(); 158 159 pthread_mutex_unlock(&lookupTableMutex); 160 } else { 161 psDBPTypeToSQLTableSetup(); 162 psDBSQLToPTypeTableSetup(); 163 psDBMySQLToSQLTableSetup(); 164 psDBPTypeToMySQLTableSetup(); 165 } 166 138 167 return dbh; 139 168 } … … 142 171 { 143 172 // Check if argument dbh is NULL 144 if( dbh == NULL) {173 if(!dbh) { 145 174 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 146 175 PS_ERRORTEXT_psDB_INVALID_PSDB); 176 return; 177 } 178 179 // Attempt to close specified database connection 180 mysql_close(dbh->mysql); 181 psFree(dbh); 182 183 // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine 184 // needs to be called first because it refers to 185 // psDBPTypeToSQLTableGet ... 186 // 187 // The *cleanup functions should be thread safe as they just call psFree() 188 // but we don't want to be cleaning up & setting up at the same time 189 if (psMemGetThreadSafety()) { 190 pthread_mutex_lock(&lookupTableMutex); 191 192 psDBSQLToPTypeTableCleanup(); 193 psDBMySQLToSQLTableCleanup(); 194 psDBPTypeToSQLTableCleanup(); 195 psDBPTypeToMySQLTableCleanup(); 196 197 pthread_mutex_unlock(&lookupTableMutex); 147 198 } else { 148 149 // Attempt to close specified database connection150 mysql_close(dbh->mysql);151 dbh->mysql = NULL;152 psFree(dbh);153 154 // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine155 // needs to be called first because it refers to156 // psDBGetPTypeToSQLTable ...157 199 psDBSQLToPTypeTableCleanup(); 158 200 psDBMySQLToSQLTableCleanup(); … … 1548 1590 psU32 pType; // psElemType of a field 1549 1591 1550 mysqlToSQLTable = psDB GetMySQLToSQLTable();1592 mysqlToSQLTable = psDBMySQLToSQLTableGet(); 1551 1593 1552 1594 // lookup MySQL column type … … 1554 1596 sqlType = psHashLookup(mysqlToSQLTable, key); 1555 1597 psFree(key); 1556 psFree(mysqlToSQLTable);1557 1598 1558 1599 if (!sqlType) { … … 1572 1613 1573 1614 // convert MySQL type to PS type 1574 sqlToPSTable = psDB GetSQLToPTypeTable();1615 sqlToPSTable = psDBSQLToPTypeTableGet(); 1575 1616 value = psHashLookup(sqlToPSTable, sqlType); 1576 psFree(sqlToPSTable);1577 1617 1578 1618 if (!value) { … … 1593 1633 char *sqlType; // hash tmp value 1594 1634 1595 pTypeToSQLTable = psDB GetPTypeToSQLTable();1635 pTypeToSQLTable = psDBPTypeToSQLTableGet(); 1596 1636 1597 1637 key = psDBIntToString((psU64)pType); 1598 1638 sqlType = psHashLookup(pTypeToSQLTable, key); 1599 1639 psFree(key); 1600 psFree(pTypeToSQLTable);1601 1640 1602 1641 if (!sqlType) { … … 1617 1656 mysqlType *mType; // mysqlType struct to return 1618 1657 1619 pTypeToMySQLTable = psDB GetPTypeToMySQLTable();1658 pTypeToMySQLTable = psDBPTypeToMySQLTableGet(); 1620 1659 1621 1660 key = psDBIntToString((psU64)pType); 1622 1661 mType = psHashLookup(pTypeToMySQLTable, key); 1623 1662 psFree(key); 1624 psFree(pTypeToMySQLTable);1625 1663 1626 1664 if (!mType) { … … 1635 1673 } 1636 1674 1637 static psHash *psDBGetPTypeToSQLTable(void) 1638 { 1639 1675 // PTypeToSQLTable 1676 1677 static psHash *psDBPTypeToSQLTableSetup(void) 1678 { 1640 1679 if (!pTypeToSQLlookupTable) { 1641 1680 pTypeToSQLlookupTable = psHashAlloc(14); … … 1656 1695 psDBAddToLookupTable(pTypeToSQLlookupTable, PS_TYPE_BOOL,"TINYINT"); 1657 1696 psDBAddToLookupTable(pTypeToSQLlookupTable, PS_DATA_STRING, "VARCHAR"); 1658 } 1659 1660 // simulate true ref counting1661 psMemIncrRefCounter(pTypeToSQLlookupTable);1697 } else { 1698 // increment the ref count by one for every psDB 1699 psMemIncrRefCounter(pTypeToSQLlookupTable); 1700 } 1662 1701 1663 1702 return pTypeToSQLlookupTable; 1664 1703 } 1665 1704 1705 static psHash *psDBPTypeToSQLTableGet(void) 1706 { 1707 return pTypeToSQLlookupTable; 1708 } 1709 1666 1710 static void psDBPTypeToSQLTableCleanup(void) 1667 1711 { 1668 psFree(pTypeToSQLlookupTable); 1669 } 1670 1671 static psHash *psDBGetSQLToPTypeTable(void) 1712 PSDB_NULL_FREE(pTypeToSQLlookupTable); 1713 } 1714 1715 1716 // SQLToPTypeTable 1717 1718 static psHash *psDBSQLToPTypeTableSetup(void) 1672 1719 { 1673 1720 psHash *psToSQLTable; … … 1679 1726 if (!sqlToPTypeLookupTable) { 1680 1727 // invert the PSToSQL table 1681 psToSQLTable = psDB GetPTypeToSQLTable();1728 psToSQLTable = psDBPTypeToSQLTableGet(); 1682 1729 sqlToPTypeLookupTable = psHashAlloc(psToSQLTable->n); 1683 1730 … … 1705 1752 psFree(list); 1706 1753 psFree(psToSQLTable); 1707 } 1708 1709 // simulate true ref counting1710 psMemIncrRefCounter(sqlToPTypeLookupTable);1754 } else { 1755 // increment the ref count by one for every psDB 1756 psMemIncrRefCounter(sqlToPTypeLookupTable); 1757 } 1711 1758 1712 1759 return sqlToPTypeLookupTable; 1713 1760 } 1714 1761 1762 static psHash *psDBSQLToPTypeTableGet(void) 1763 { 1764 return sqlToPTypeLookupTable; 1765 } 1766 1715 1767 static void psDBSQLToPTypeTableCleanup(void) 1716 1768 { 1717 psFree(sqlToPTypeLookupTable); 1718 } 1719 1720 static psHash *psDBGetMySQLToSQLTable(void) 1769 PSDB_NULL_FREE(sqlToPTypeLookupTable); 1770 } 1771 1772 1773 // MySQLToSQLTable 1774 1775 static psHash *psDBMySQLToSQLTableSetup(void) 1721 1776 { 1722 1777 if (!mysqlToSqlLookupTable) { … … 1743 1798 psDBAddToLookupTable(mysqlToSqlLookupTable, FIELD_TYPE_NULL, "NULL-type"); 1744 1799 psDBAddToLookupTable(mysqlToSqlLookupTable, FIELD_TYPE_CHAR, "TINYINT"); 1745 } 1746 1747 // simulate true ref counting1748 psMemIncrRefCounter(mysqlToSqlLookupTable);1800 } else { 1801 // increment the ref count by one for every psDB 1802 psMemIncrRefCounter(mysqlToSqlLookupTable); 1803 } 1749 1804 1750 1805 return mysqlToSqlLookupTable; 1751 1806 } 1752 1807 1808 static psHash *psDBMySQLToSQLTableGet(void) 1809 { 1810 return mysqlToSqlLookupTable; 1811 } 1812 1753 1813 static void psDBMySQLToSQLTableCleanup(void) 1754 1814 { 1755 psFree(mysqlToSqlLookupTable); 1756 } 1757 1758 static psHash *psDBGetPTypeToMySQLTable(void) 1815 PSDB_NULL_FREE(mysqlToSqlLookupTable); 1816 } 1817 1818 1819 // PTypeToMySQLTable 1820 1821 static psHash *psDBPTypeToMySQLTableSetup(void) 1759 1822 { 1760 1823 if (!pTypeToMysqlLookupTable) { … … 1789 1852 // psDBAddVoidToLookupTable(pTypeToMysqlLookupTable, PS_DATA_ASTROM, psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false)); 1790 1853 psDBAddVoidToLookupTable(pTypeToMysqlLookupTable, PS_DATA_UNKNOWN,psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false)); 1791 } 1792 1793 // simulate true ref counting1794 psMemIncrRefCounter(pTypeToMysqlLookupTable);1854 } else { 1855 // increment the ref count by one for every psDB 1856 psMemIncrRefCounter(pTypeToMysqlLookupTable); 1857 } 1795 1858 1796 1859 return pTypeToMysqlLookupTable; 1797 1860 } 1798 1861 1862 static psHash *psDBPTypeToMySQLTableGet(void) 1863 { 1864 return pTypeToMysqlLookupTable; 1865 } 1866 1799 1867 static void psDBPTypeToMySQLTableCleanup(void) 1800 1868 { 1801 psFree(pTypeToMysqlLookupTable);1869 PSDB_NULL_FREE(pTypeToMysqlLookupTable); 1802 1870 } 1803 1871
Note:
See TracChangeset
for help on using the changeset viewer.
