OES (Oracle Errors&Solutions) proyekti haqqında

Posted on 14 İyul 2010. Filed under: Java, OES, Oracle, SQL | Etiketlər: , , , , , , , , |


Azərbaycanlı bir qrup Oracle administratorlar, proqramçılar və istifadəçilərin fərdi təşəbbüsü ilə birlikdə Oracle ilə bağlı open source proyekt hazırlamaq qərarına gəldik.Təklif professional Oracle DBA olan həmkarım Kamran Ağayevdən gəldi, mən də daxil olmaqla bir çox şəxslər tərəfindən dəstəkləndi. Məqsəd Oracle VBİS-nin rahat idarə olunmasına imkan verən proqram təminatı hazırlamaqdır. Toad, Oracle Enterprise Manager kimi ticari proqramların bütün funksionallıqlarını təkrarlamaq istəmirik, onlardan fərqli olaraq daha çox Oracle DBA-lər üçün spesifik gözəl imkanlar təqdim etməyi fikirləşirik(RMAN ilə backup və recovery işlərini asanlaşdırmaq və avtomatlaşdırmaq, Data guard qurmağı asanlaşdırmaq və s.) Kamranın bu barədə gözəl ideyaları var. Proyektin adına Azerbaijan Open Source Oracle Tool, qısaca AZOT olaraq qərar verdik, müzakirələrimi davam etdirmək üçün yeni qrup yaratdıq: http://groups.google.com/group/azot-az

İlk addım olaraq Oracle xətaları və onların həlli ilə bağlı məlumat bazası və axtarış sistemi qurmaq qərarına gəldik. Unix, Linux əməliyyat sistemlərində Oracle şirkəti OERR adlı utility təqdim edir. Bu proqram konsol rejimində işləyir və Oracle xətaları ilə bağlı məlumat əldə etməyə imkan verir. Belə bir proqramın bütün əməliyyat sistemlərində işləyən qrafik versiyasını hazırlamağa qərar verdik. Qrup daxilindəki müzakirələrdən sonra proyektin adını OES(Oracle Errors&Solutions) seçdik. İnternetə çıxışı olmayan kompüterdə belə bu proqramı istifadə etmək mümkün olsun deyə lokal axtarış üçün Oracle xətaları ilə bağlı məlumatları XML fayllarına yığdıq. XML fayllarının hazırlanmasına görə Zamir Camalova minnətdarlığımı bildirirəm.

OES proqramının hazırlanması ilə mən məşğul oldum. Bütün əməliyyat sistemlərində işləməsi üçün proqramı Java ilə yazdım. Proqramın görünüşü aşağıdakı kimidir:

Mümkün qədər open source proqram təminatı və texnologiyalardan istifadə etməyə çalışdım. Bu proyekt üçün aşağıdakı proqram təminatlarını istifadə etmişəm:

  1. Netbeans 6.7.1 – open source
  2. Notepad++ 5.5.1 – open source
  3. Apache Commons kitabxanaları – open source
  4. Stylus Studio 2010 XML Enterprise Suite – trial

Proqramı Netbeans İDE ilə yazdım. XML sənədləri ilə işləmək üçün Notepad++ istifadə etdim. Onu da qeyd edim ki, eyni XML fayllarını Netbeans-də açmağa çalışdım, Netbeans dondu qaldı, amma Notepad++ ilə eyni anda bir neçə XML faylını açıb rahat istifadə edirdim🙂

Proqramın konfiqurasiya faylını rahat oxumaq üçün open source olan Apache Commons Configuration kitabxanasını istifadə etdim. Qeyd edim ki, bununla XML konfiqurasiya fayllarını və property fayllarını rahat şəkildə oxuyub istifadə etmək mümkündür.

Daha əvvəl də dediyim kimi lokal axtarış üçün XML faylları istifadə etdik. Proqramın cari versiyasında Oracle 10g R2, 11g R1 və 11g R2 üçün XML faylları mövcuddur, 8i, 9i R1, 9i R2, 10g R1 versiyaları üçün XML faylları hazır olanda proqrama əlavə ediləcək. Bu versiyada ancaq ORA-XXXXX xətaları ilə bağlı məlumat mövcuddur, amma versiyada RMAN, import və export xətalarını da əlavə etməyi planlaşdırırıq. XML fayllarında axtarış üçün SAX modelini istifadə etdim, çünki faylların ölçüsü böyük olduğuna görə (1 fayl təxmini 3-4 MB-dır) onun DOM modeli yaddaşda çox yer tutacaq. Mənə verilmiş XML fayllarının ilkin strukturu aşağıdakı kimi idi:

<OraCode>
	<row>
		<code>ORA-38029: object statistics are locked</code>
		<cause>An attempt was made to modify optimizer statistics of the
        object.

        Action</cause>
		<action>Unlock statistics with the DBMS_STATS.UNLOCK_TABLE_STATS
        procedure on base table(s). Retry the operation if it is okay to
        update statistics.</action>
	</row>
	<row>
		<code>ORA-38101: Invalid column in the INSERT VALUES Clause: string</code>
		<cause>INSERT VALUES clause refers to the destination table
        columns

        Action</cause>
		<action>None</action>
	</row>
</OraCode>

SAX modelinə əsasən XML faylını parse etmək və konkret bir Oracle xətasının koduna görə sürətli axtarış etmək üçün XML fayllarını aşağıdakı formata çevirmək qərarına gəldim.

<oracle-errors>
	<metadata>
		<version>Oracle database version</version>
		<prepared-by>Author</prepared-by>
		<last-update-date>Update timestamp</last-update-date>
		<language>English</language>
	</metadata>
	<error-list>
		<error id="ORA-00000">
			<code>ORA-00000: normal, successful completion</code>
			<cause>Normal exit.</cause>
			<action>None</action>
		</error>
		<error id="ORA-00001">
			<code>ORA-00001: unique constraint (string.string) violated</code>
			<cause>An UPDATE or INSERT statement attempted to insert a duplicate key. For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.</cause>
			<action>Either remove the unique restriction or do not insert the key.</action>
		</error>
	</error-list>
</oracle-errors>

Metadata elementi XML faylı haqqında məlumatı göstərir. Xəta kodunu isə error elementinə atribut olaraq əlavə etdim.
XML çevrilməsini reallaşdırmaq üçün XSL və XSLT tətbiq etdim. XSL Extensible Style Sheets, XSLT isə XSL Transformation deməkdir. XSL faylında original XML formatından lazım olan XML formatına çevrilmələr üçün qaydaları yazdım. Hazırladığım XSL faylı aşağıdakı kimidir:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
	<oracle-errors>
		<metadata>
			<version>Oracle database version</version>
			<prepared-by>Author</prepared-by>
			<last-update-date>Last update timestamp</last-update-date>
			<language>English</language>
		</metadata>
		<error-list>
			<xsl:for-each select="OraCode/row">
				<error>
			<xsl:variable name="errorCode" select="substring(code, 1, 9)"></xsl:variable>
					<xsl:attribute name="id">
						<xsl:value-of select="$errorCode"/>
					</xsl:attribute>

			<xsl:variable name="code" select="normalize-space(code)"></xsl:variable>
					<code>
						<xsl:value-of select="$code"></xsl:value-of>
					</code>

		<xsl:variable name="cause" select="normalize-space(cause)"></xsl:variable>
					<cause>
						<xsl:choose>
							<xsl:when test="contains($cause, ' Action')">
								<xsl:value-of select="substring-before($cause, ' Action')"></xsl:value-of>
							</xsl:when>
							<xsl:otherwise>
								<xsl:value-of select="$cause"></xsl:value-of>
							</xsl:otherwise>
						</xsl:choose>
					</cause>

					<xsl:variable name="action" select="normalize-space(action)"></xsl:variable>
				    <action>
						<xsl:value-of select="$action"></xsl:value-of>
					</action>
				</error>
			</xsl:for-each>
		</error-list>
	</oracle-errors>
</xsl:template>

</xsl:stylesheet>

ORA-XXXXX formatında olan kodu <code> elementindən aşağıdakı kimi əldə etmək olar

<xsl:variable name="errorCode" select="substring(code, 1, 9)"></xsl:variable> 

Lazımsız boşluqları təmizləmək üçün normalize-space funksiyasını istifadə etdim.

Oracle 10g R2 üçün olan XML faylında <cause> elementinin sonunda artıq olan Action sözünü aşağıdakı kimi təmizlədim, digər fayllarda belə problem yoxdur.

<xsl:variable name="cause" select="normalize-space(cause)"></xsl:variable>
<xsl:choose>
 <xsl:when test="contains($cause, ' Action')">
 <xsl:value-of select="substring-before($cause, ' Action')"></xsl:value-of>
 </xsl:when>
 <xsl:otherwise>
 <xsl:value-of select="$cause"></xsl:value-of>
 </xsl:otherwise>
 </xsl:choose>

Bu XSL faylını hazırlamaq və test etmək üçün “Stylus Studio 2010 XML Enterprise Suite” proqramının trial versisını yüklədim. Əvvəlki iş yerimdə XML ilə bağlı bir məsələ üçün bu proqramı istifadə etmişdim və çox razı qalmışdım. Belə imkanlara malik open source proqram tapmadığıma görə trial versiyanı istifadə etdim. “Stylus Studio 2010 XML Enterprise Suite” həqiqətən də XML texnologiyaları ilə işləmək üçün güclü imkanlara malik olan bir professional proqramdır.

XSL faylı hazır olduqdan sonra isə XSTL faylları yeni formata çevirmək qalır. Bunun üçün Transformer adlı kiçik bir Java proqramı yazdım və Javada olan standart JAXP APİ ilə çevirməni elədim. Transformer proqramının kodu 1 Java sinifindən ibarətdir və aşağıdakı kimidir:


package transformer;

import java.io.File;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Main {
    public static void main(String[] args) {
      if (args.length != 3) {
        System.out.println("Usage: transformer.Main error.xml transform.xsl result.xml");
      } else {
        try {
          StreamSource xml = new StreamSource(new File(args[0]));
          StreamSource xsl = new StreamSource(new File(args[1]));
          StreamResult result = new StreamResult(new File(args[2]));
          TransformerFactory factory = TransformerFactory.newInstance();
          Transformer t = factory.newTransformer(xsl);
          t.setOutputProperty(OutputKeys.INDENT, "yes");
          t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "8");
          t.transform(xml, result);
       } catch (Exception ex) {
          System.out.println("Error occured during transformation: " + ex.getMessage());
          ex.printStackTrace();
       }
     }
   }
}

Transformer proqramını və Java kodunu buradan yükləyə bilərsiniz: http://www.boxca.com/mju16j6r5ero/Transformer.zip.html

Yeni formatda XML faylları hazır olduqdan sonra onları OES proqramında SAX modeli ilə parse edib istifadəçinin daxil etdiyi xəta kodunu axtardım. XML sənədlərini SAX modeli ilə parse etmək haqqında ayrıca bir yazı hazırlamağı fikirləşirəm, bu barədə orada ətraflı izah verəcəm.

Onlayn axtarış üçün Google və Oracle forumları istifadə olunur. Bu axtarış mexanizmi sadədir, istifadəçi axtardığı koda uyğun nəticələr səhifəsinə yönləndirilir.

Google-da axtarış etmək üçün http://www.google.az/search?q=ORA-XXXXX,  Oracle forumlarında axtarış etmək üçün isə http://forums.oracle.com/forums/search.jspa?q=ORA-XXXXX adresi istifadə olunur. Buradakı XXXXX Oracle xəta kodunun nömrəsini göstərir(məsələn ORA-00001).

Qrupun fayllar bölməsində proqramın ümumi və texniki dokumentasiyasını, XML sənədlərinin strukturunu, XSL faylını və transformer proqramını əldə etmək mümkündür.
Proqramın son versiyasını bu linkdən yükləyib test edə bilərsiniz: http://www.boxca.com/hgso43gyboye/OES_1.1.zip.html
Proyektin kodlarını daha sonra code.google.com-da yerləşdirib, linkini bura qoyacam.

Make a Comment

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

Bir Cavab to “OES (Oracle Errors&Solutions) proyekti haqqında”

RSS Feed for Ramin Orucovun Java və Oracle bloqu Comments RSS Feed

[…] proqramı haqqında bu yazıda qeyd […]


Where's The Comment Form?

    Haqqında

    Java ilə obyekt yönlü proqramlaşdırma, Java web proqramlaşdırma, Oracle SQL, PL/SQL proqramlaşdırma, optimallaşdırma

    RSS

    Subscribe Via RSS

    • Subscribe with Bloglines
    • Add your feed to Newsburst from CNET News.com
    • Subscribe in Google Reader
    • Add to My Yahoo!
    • Subscribe in NewsGator Online
    • The latest comments to all posts in RSS

    Meta

Liked it here?
Why not try sites on the blogroll...

%d bloqqer bunu bəyənir: