Hi ,Dev Gord Thompson The Date stored in Access as a wrong date like "05/03/3900" when I Declared in Class DB as ps.setDate(2, new Date(2000, 02,05)); the format of (Date/Time Type) is Short Date I defined it in Access 2007, I know TheDate of java.sql.Date; is Deprecated Why stored a wrong date , The Class DB when I compilled it separated with static void main() it's run correctly But record as a wrong when I used LocalDate and DatePicker and passes values with set func and I used ps.setObject(2,param from LocalDate);
throw an Exception net.ucanaccess.triggers.TriggerException: Data out of range
I use ucanaccess-4.0.1.jar, jackcess-2.1.6.jar and hsqldb.jar 2.3.1
* All Classes and Database in My Github https://github.com/Abd-Elrazek/Program_Storage
I want to use Christmas Calender with DateFormat (14/2/2019)only without time
DB.java
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.sql.Date;// import java.util.Date;importjava.text.SimpleDateFormat;importjava.time.LocalDate;importjava.util.Properties;publicclassDB{//Variables handle with databaseprivateConnectionconnection=null;privatePreparedStatementps=null;//Variables of InputsprivatelongNbon=2;privateLocalDateDateexchange=null;privateDatedate__;privateStringTypefuel="dffdff";privatelongQuantitybon=3;privatelongCounter=4;privatelongDistance=5;privateStringNamedriver="dfdf";privatelongNnote=6;privateStringNameresponsible="daaaaa";privateStringCodemachine="dfdf33434";//ConstructorpublicDB(){//variables of classes handle with database date__=newDate(2019,2,10);}//we can use either Constructor or set function for insert dat in this class // public DB(long Nbon,Date Dateexchange,String Typefuel, long Quantitybon,long Counter,long Distance, String Namedriver,long Nnote, String Nameresponsible,String Codemachine)// {// this.Nbon = Nbon;// this.Dateexchange = Dateexchange;// this.Typefuel = Typefuel;// this.Quantitybon = Quantitybon;// this.Counter = Counter;// this.Distance = Distance;// this.Namedriver = Namedriver;// this.Nnote = Nnote;// this.Nameresponsible = Nameresponsible;// this.Codemachine = Codemachine;// }//Functions//setConnection funcpublicConnectiongetConnection_F_DB(){//Step 1: Loading or registering Oracle JDBC driver class with ucanaccesstry{Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");}catch(ClassNotFoundExceptioncnfex){System.out.println("Problem in loading or registering MS Access JDBC driver");cnfex.printStackTrace();}//Step 2: Opening database connectiontry{StringmsAccDB="db_main.accdb";StringdbURL="jdbc:ucanaccess://"+msAccDB;//Step 2.A: Create and get connection using DriverManager classconnection=DriverManager.getConnection(dbURL);if(connection!=null){System.out.println("Connected to db...");}}catch(SQLExceptione){e.printStackTrace();}returnconnection;}//func InsertDate and retrieve True if data is inserted False if data not inserted publicbooleaninsertData(){try{//Step 2.B: Creating JDBC PreparedStatement class ps=connection.prepareStatement("INSERT INTO General_db (Nbon, Dateexchange, Typefuel, Quantitybon, Counter, Distance, Namedriver, Nnote, Nameresponsible, Codemachine)values(?,?,?,?,?,?,?,?,?,?)");ps.setLong(1,Nbon);ps.setDate(2,newDate(2000,02,05));ps.setString(3,Typefuel);ps.setLong(4,Quantitybon);ps.setLong(5,Counter);ps.setLong(6,Distance);ps.setString(7,Namedriver);ps.setLong(8,Nnote);ps.setString(9,Nameresponsible);ps.setString(10,Codemachine);// Step 2.C: Executing SQL intresult=ps.executeUpdate();if(result!=0){returntrue;}}catch(SQLExceptionsqlex){sqlex.printStackTrace();}finally{// Step 3: Closing database connectiontry{if(null!=connection){// cleanup resources, once after processingps.close();System.out.println("Data inserted ...");// and then finally close connectionconnection.close();System.out.println("Connection closed");}}catch(SQLExceptionsqlex){sqlex.printStackTrace();}}returnfalse;}//funcs of set VarspublicvoidsetNbon(longnb){this.Nbon=nb;}publicvoidsetDateexchange(LocalDateda){this.Dateexchange=da;}publicvoidsetTypefuel(Stringty){this.Typefuel=ty;}publicvoidsetQuantitybon(longqu){this.Quantitybon=qu;}publicvoidsetCounter(longco){this.Counter=co;}publicvoidsetDistance(longco){this.Distance=co;}publicvoidsetNamedriver(Stringna){this.Namedriver=na;}publicvoidsetNnote(longnn){this.Nnote=nn;}publicvoidsetNameresponsible(Stringnaa){this.Nameresponsible=naa;}publicvoidsetCodemachine(Stringco){this.Codemachine=co;}//End funcs Set //funcs of get VarspubliclonggetNbon(){returnNbon;}publicLocalDategetDateexchange(){returnDateexchange;}publicStringgetTypefuel(){returnTypefuel;}publiclonggetQuantitybon(){returnQuantitybon;}publiclonggetCounter(){returnCounter;}publiclonggetDistance(){returnDistance;}publicStringgetNamedriver(){returnNamedriver;}publiclonggetNnote(){returnNnote;}publicStringgetNameresponsible(){returnNameresponsible;}publicStringgetCodemachine(){returnCodemachine;}//End funcs Get // public static void main(String args []){// DB db = new DB();// if (db.getConnection_F_DB() != null && db.insertData()){// } // }}
Thank you My sir...that's help me alot , if u don't mind to tell my how to insert Date from LocalDate..ps.setObject(2,mylocalDate); ... I try it showing Error
is
Gui running...
Connected to db...
Database opened in 3.856 seconds
Selected date: 2019-02-20
date_ from db.getDateexchange --> 2019-02-20
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 incompatible data type in conversion
at net.ucanaccess.jdbc.UcanaccessPreparedStatement.setObject(UcanaccessPreparedStatement.java:672)
at DB.insertData(DB.java:84)
at Input_data_Controller.saveData(Input_data_Controller.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:3
)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:2
)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:
2)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setObject(Unknown Source)
at net.ucanaccess.jdbc.UcanaccessPreparedStatement.setObject(UcanaccessPreparedStatement.java:669)
... 43 more
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.types.DateTimeType.convertJavaToSQL(Unknown Source)
... 46 more
Data inserted ...
Connection closed
db.insertData return --> false
thank u advance
Last edit: Abdelrazek Nageh 2019-02-14
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
UCanAccess 4.x depends on older versions of Jackcess and HSQLDB that do not support the java.time objects introduced in Java_8, e.g., LocalDateTime. The next release of UCanAccess, version 5.0, will be based on newer versions of Jackcess and HSQLDB that support those features.
👍
1
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
HI Gord,
First : I compilled all files *.java and run correctly at first , when i run again (in same minute mostly) throw Exception WHY??!!! But after +2 minute excute correctly and nothing error and running .....Is that problem with JVM or Memory I ask
Code :
importjavafx.scene.control.Button;importjavafx.scene.control.ChoiceBox;importjavafx.scene.control.DatePicker;importjavafx.scene.control.Label;importjavafx.scene.control.RadioButton;importjavafx.scene.control.Separator;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.control.TextField;importjavafx.scene.control.cell.PropertyValueFactory;importjavafx.scene.effect.Blend;importjavafx.scene.effect.Reflection;importjavafx.scene.layout.AnchorPane;importjavafx.scene.layout.Pane;importjavafx.scene.text.Font;importjavafx.scene.control.ToggleGroup;importjava.time.LocalDate;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.Connection;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjava.sql.Date;importjavafx.scene.Cursor;importjavafx.fxml.Initializable;importjava.net.URL;importjava.util.ResourceBundle;importjava.io.IOException;importjava.sql.SQLException;//import javafx.scene.Parent;importjavafx.scene.Scene;importjavafx.stage.Stage;importjavafx.fxml.FXML;importjavafx.fxml.FXMLLoader;publicclassInput_data_ControllerimplementsInitializable{privateConnectioncon_db=null;//Variables@FXMLprivateTableView<Table_View>viewtable;@FXMLprivateTableColumn<Table_View,Integer>serialn_col;@FXMLprivateTableColumn<Table_View,Integer>nbon_col;@FXMLprivateTableColumn<Table_View,Date>dateexchane_col;@FXMLprivateTableColumn<Table_View,String>typefuel_col;@FXMLprivateTableColumn<Table_View,Integer>quantitybon_col;@FXMLprivateTableColumn<Table_View,Integer>counter_col;@FXMLprivateTableColumn<Table_View,Integer>distance_col;@FXMLprivateTableColumn<Table_View,String>namedriver_col;@FXMLprivateTableColumn<Table_View,Integer>nnote_col;@FXMLprivateTableColumn<Table_View,String>nameresponsible_col;@FXMLprivateTableColumn<Table_View,String>codemachine_col;//TextField vars@FXMLprivateTextFieldnbon_txt;@FXMLprivateTextFieldquantitybon_txt;@FXMLprivateTextFieldcounter_txt;@FXMLprivateTextFieldnamedriver_txt;@FXMLprivateTextFieldnnote_txt;@FXMLprivateTextFieldnameresponsible_txt;@FXMLprivateTextFieldcodemachine_txt;//DatePicker var@FXMLprivateDatePickerdateexchange_datepicker;//Radio Button vars@FXMLprivateRadioButtongas_radiobtn;@FXMLprivateRadioButtonsolar_radiobtn;privateToggleGroupgroup=newToggleGroup();privateStringstore_radio_val="initialize";//ChoiceBox var@FXMLprivateChoiceBoxcodemachine_choicebox;ObservableList<Table_View>table_view_list=FXCollections.observableArrayList();Datedate_ob=null;LocalDatedate_=null;privateDBdb=newDB();privatePreparedStatementps=null;//funcions // this function used to initialize my variables@Overridepublicvoidinitialize(URLurl,ResourceBundlerb){longt0=System.nanoTime();con_db=db.getConnection_F_DB();try{ResultSetrs=con_db.createStatement().executeQuery("SELECT * FROM General_db");while(rs.next()){table_view_list.add(newTable_View(rs.getInt("Serialn"),rs.getInt("Nbon"),rs.getDate("Dateexchange"),rs.getString("Typefuel"),rs.getInt("Quantitybon"),rs.getInt("Counter"),rs.getInt("Distance"),rs.getString("Namedriver"),rs.getInt("Nnote"),rs.getString("Nameresponsible"),rs.getString("Codemachine")));}System.out.printf("Database opened in %.3f seconds%n",((System.nanoTime()-t0)/1000000000.0));}catch(SQLExceptione){e.printStackTrace();}serialn_col.setCellValueFactory(newPropertyValueFactory<>("Serialn"));nbon_col.setCellValueFactory(newPropertyValueFactory<>("Nbon"));typefuel_col.setCellValueFactory(newPropertyValueFactory<>("Typefuel"));quantitybon_col.setCellValueFactory(newPropertyValueFactory<>("Quantitybon"));counter_col.setCellValueFactory(newPropertyValueFactory<>("Counter"));distance_col.setCellValueFactory(newPropertyValueFactory<>("Distance"));namedriver_col.setCellValueFactory(newPropertyValueFactory<>("Namedriver"));nnote_col.setCellValueFactory(newPropertyValueFactory<>("Nnote"));nameresponsible_col.setCellValueFactory(newPropertyValueFactory<>("Nameresponsible"));codemachine_col.setCellValueFactory(newPropertyValueFactory<>("Codemachine"));viewtable.setItems(table_view_list);//initialize of store_radio_val by Banzeeengas_radiobtn.setSelected(true);store_radio_val="بنزين";}//end initialize variables//Save func@FXMLpublicvoidsaveData(){date_=dateexchange_datepicker.getValue();System.out.println("year "+date_.getYear());System.out.println("Month "+date_.getMonthValue());System.out.println("day "+date_.getDayOfMonth());date_ob=newDate((date_.getYear()-1900),date_.getMonthValue()-1,date_.getDayOfMonth());try{//Step 2.B: Creating JDBC PreparedStatement class ps=con_db.prepareStatement("INSERT INTO General_db (Nbon, Dateexchange, Typefuel, Quantitybon, Counter, Distance, Namedriver, Nnote, Nameresponsible, Codemachine)values(?,?,?,?,?,?,?,?,?,?)");ps.setLong(1,Integer.valueOf(nbon_txt.getText()));ps.setDate(2,date_ob);ps.setString(3,store_radio_val);ps.setLong(4,Integer.valueOf(quantitybon_txt.getText()));ps.setLong(5,Integer.valueOf(counter_txt.getText()));ps.setLong(6,Integer.valueOf(quantitybon_txt.getText()));ps.setString(7,namedriver_txt.getText());ps.setLong(8,Integer.valueOf(nnote_txt.getText()));ps.setString(9,nameresponsible_txt.getText());ps.setString(10,codemachine_txt.getText());// Step 2.C: Executing SQL intresult=ps.executeUpdate();if(result!=0){System.out.println("Data inserted correctly");}}catch(SQLExceptionsqlex){sqlex.printStackTrace();}finally{// Step 3: Closing database connectiontry{if(null!=db.getConnection_F_DB()){// cleanup resources, once after processingps.close();System.out.println("Data inserted ...");// and then finally close connectiondb.getConnection_F_DB().close();System.out.println("Connection closed");}}catch(SQLExceptionsqlex){sqlex.printStackTrace();}}}@FXML//Update funcpublicvoidupdateData(){}@FXML//Delete funcpublicvoiddeleteData(){}}
when I discover the error in Library of Ucanaccess.jar by decompiler the Class of Persist2Jet.class
it rturn
Caused by: net.ucanaccess.triggers.TriggerException: Data out of range because val 3333
at net.ucanaccess.triggers.TriggerInsert.fire(TriggerInsert.java:38)
at org.hsqldb.TriggerDef.pushPair(Unknown Source)
at org.hsqldb.Table.fireTriggers(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
at org.hsqldb.StatementInsert.getResult(Unknown Source)
In Class Persist2Let Code as you Know :
packagenet.ucanaccess.converters;importcom.healthmarketscience.jackcess.Column;importcom.healthmarketscience.jackcess.ColumnBuilder;importcom.healthmarketscience.jackcess.Cursor;importcom.healthmarketscience.jackcess.DataType;importcom.healthmarketscience.jackcess.Database;importcom.healthmarketscience.jackcess.IndexBuilder;//import com.healthmarketscience.jackcess.IndexBuilder.Column;importcom.healthmarketscience.jackcess.PropertyMap;importcom.healthmarketscience.jackcess.RelationshipBuilder;importcom.healthmarketscience.jackcess.Row;importcom.healthmarketscience.jackcess.Table;importcom.healthmarketscience.jackcess.TableBuilder;importcom.healthmarketscience.jackcess.impl.DatabaseImpl;importjava.io.File;importjava.io.IOException;importjava.sql.Connection;importjava.sql.DatabaseMetaData;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Timestamp;importjava.util.ArrayList;importjava.util.Collection;importjava.util.GregorianCalendar;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Locale;importjava.util.Map;importjava.util.Set;importjava.util.TimeZone;importjava.util.TreeMap;importnet.ucanaccess.commands.InsertCommand;importnet.ucanaccess.complex.ComplexBase;importnet.ucanaccess.complex.UnsupportedValue;importnet.ucanaccess.jdbc.DBReference;importnet.ucanaccess.jdbc.NormalizedSQL;importnet.ucanaccess.jdbc.OnReloadReferenceListener;importnet.ucanaccess.jdbc.UcanaccessConnection;importnet.ucanaccess.jdbc.UcanaccessDatabaseMetadata;importnet.ucanaccess.jdbc.UcanaccessSQLException;importnet.ucanaccess.jdbc.UcanaccessSQLException.ExceptionMessages;importorg.hsqldb.HsqlDateTime;importorg.hsqldb.SessionInterface;importorg.hsqldb.jdbc.JDBCConnection;importorg.hsqldb.types.BlobData;importorg.hsqldb.types.JavaObjectData;importorg.hsqldb.types.TimestampData;publicclassPersist2Jet{privatestaticHashMap<String,List<String>>columnNamesCache=newHashMap();static{DBReference.addOnReloadRefListener(newOnReloadReferenceListener(){publicvoidonReload(){Persist2Jet.columnNamesCache.clear();}});}publicMap<String,Object>getRowPattern(Object[]varr,Tablet)throwsSQLException{Stringntn=SQLConverter.basicEscapingIdentifier(t.getName()).toUpperCase();LinkedHashMap<String,Object>vl=newLinkedHashMap();inti=0;Iterator<String>it=getColumnNames(ntn).iterator();while(it.hasNext()){vl.put(it.next(),varr[(i++)]);}if(i==0){thrownewSQLException("Cannot read table's metadata");}returnescapeIdentifiers(vl,t);}publicObject[]getValues(Map<String,Object>rowPattern,Tablet)throwsSQLException{Object[]values=newObject[rowPattern.size()];inti=0;for(Objectobj:rowPattern.values()){values[(i++)]=obj;}returnvalues;}privateList<String>getColumnNames(Stringntn)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();ntn=UcanaccessDatabaseMetadata.normalizeName(ntn);Stringpref=conn.getDbIO().getFile().getAbsolutePath();Connectionconq=conn.getHSQLDBConnection();Stringkey=pref+ntn;if(!columnNamesCache.containsKey(key)){ArrayList<String>ar=newArrayList();ResultSetrs=conq.getMetaData().getColumns(null,"PUBLIC",ntn,null);TreeMap<Integer,String>tm=newTreeMap();while(rs.next()){Stringcbase=rs.getString("COLUMN_NAME");Integeri=Integer.valueOf(rs.getInt("ORDINAL_POSITION"));tm.put(i,cbase.toUpperCase());}ar.addAll(tm.values());columnNamesCache.put(key,ar);}return(List)columnNamesCache.get(key);}privateList<String>getColumnNamesCreate(Stringntn)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();ArrayList<String>ar=newArrayList();ResultSetrs=conn.getMetaData().getColumns(null,"PUBLIC",ntn,null);while(rs.next()){Stringcbase=rs.getString("COLUMN_NAME");ar.add(cbase);}returnar;}publicvoidconvertRowTypes(Object[]values,Tablet)throwsSQLException{try{List<?extendsColumn>columns=t.getColumns();Iterator<?extendsColumn>it=columns.iterator();for(inti=0;i<values.length;i++){Objectvalue=values[i];Columncolumn=(Column)it.next();if(value!=null){if(((valueinstanceofTimestampData))&&(column.getType().equals(DataType.SHORT_DATE_TIME))){TimestampDatats=(TimestampData)value;TimeZonezone=TimeZone.getDefault();GregorianCalendarcal=newGregorianCalendar(zone);longmillis=HsqlDateTime.convertMillisToCalendar(cal,ts.getSeconds()*1000L);Timestampval=newTimestamp(millis);val.setNanos(ts.getNanos());values[i]=val;}if((valueinstanceofBlobData)){BlobDatabd=(BlobData)value;JDBCConnectionhsqlConn=(JDBCConnection)UcanaccessConnection.getCtxConnection().getHSQLDBConnection();SessionInterfacesi=hsqlConn.getSession();longlength=bd.length(si);values[i]=((BlobData)value).getBytes(si,0L,(int)length);}if((valueinstanceofJavaObjectData)){JavaObjectDatajod=(JavaObjectData)value;Objectobj=jod.getObject();if(((objinstanceofComplexBase[]))&&(!(objinstanceofUnsupportedValue[]))){values[i]=obj;}else{thrownewUcanaccessSQLException(UcanaccessSQLException.ExceptionMessages.UNSUPPORTED_TYPE);}}if(column.getType().equals(DataType.BYTE)){intvl=((Integer)value).intValue();if((vl<0)||(vl>256)){thrownewSQLException("Data out of range because val "+vl);}}}}}catch(Exceptione){thrownewSQLException(e.getMessage());}}privateLinkedHashMap<String,Object>escapeIdentifiers(LinkedHashMap<String,Object>map,Tablet){List<?extendsColumn>colums=t.getColumns();LinkedHashMap<String,Object>vl=newLinkedHashMap();for(Columncl:colums){Stringkey=cl.getName();Stringkeyu=key.toUpperCase();Stringekey=map.containsKey(keyu)?keyu:SQLConverter.escapeIdentifier(key).toUpperCase();if((!map.containsKey(ekey))&&(map.containsKey(ekey.substring(1,ekey.length()-1)))){ekey=ekey.substring(1,ekey.length()-1);}vl.put(key,map.get(ekey));}returnvl;}privateStringgetNormalizedName(Stringname,Map<String,String>columnMap){if(columnMap==null){returnname;}returncolumnMap.containsKey(name)?(String)columnMap.get(name):name;}privateColumnBuildergetColumn(ResultSetrs,intseq,StringtableName,Map<String,String>columnMap,String[]types)throwsSQLException{Stringname=rs.getString("COLUMN_NAME");Stringnname=getNormalizedName(name,columnMap);ColumnBuildercb=newColumnBuilder(nname);shortlength=(short)rs.getInt("COLUMN_SIZE");bytescale=(byte)rs.getInt("DECIMAL_DIGITS");DataTypedt=null;if((length==0)&&(types!=null)){if(types[seq].equalsIgnoreCase(TypesMap.AccessType.MEMO.name())){dt=DataType.MEMO;cb.setType(dt);}if(types[seq].equalsIgnoreCase(TypesMap.AccessType.TEXT.name())){dt=DataType.TEXT;cb.setType(dt);}}if((types!=null)&&(seq<types.length)&&(types[seq]!=null)&&((types[seq].equalsIgnoreCase(TypesMap.AccessType.LONG.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.BYTE.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.CURRENCY.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.INTEGER.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.SINGLE.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.DOUBLE.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.YESNO.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.DATETIME.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.COUNTER.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.AUTOINCREMENT.name())))){dt=TypesMap.map2Jackcess(TypesMap.AccessType.valueOf(types[seq].toUpperCase(Locale.US)));cb.setType(dt);cb.setLengthInUnits((short)dt.getFixedSize());}if(dt==null){if((types!=null)&&(seq<types.length)&&(types[seq]!=null)&&(types[seq].equalsIgnoreCase(TypesMap.AccessType.NUMERIC.name()))){dt=DataType.NUMERIC;}else{dt=DataType.fromSQLType(rs.getInt("DATA_TYPE"),length);}cb.setType(dt);if((length>0)&&(dt.equals(DataType.TEXT))){cb.setLengthInUnits(length);}if(scale>0){cb.setScale(scale);if(length>0){cb.setPrecision(length);}}}if((types!=null)&&(seq<types.length)){if((types[seq].equalsIgnoreCase(TypesMap.AccessType.COUNTER.name()))||(types[seq].equalsIgnoreCase(TypesMap.AccessType.AUTOINCREMENT.name()))){cb.setAutoNumber(true);}if(types[seq].equalsIgnoreCase(TypesMap.AccessType.GUID.name())){cb.setType(DataType.GUID);cb.setAutoNumber(true);}}returncb;}privateColumnBuildergetColumn(StringtableName,Map<String,String>columnMap,String[]types)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();StringcolumnName=(String)columnMap.keySet().iterator().next();ResultSetrs=conn.getHSQLDBConnection().getMetaData().getColumns(null,"PUBLIC",tableName.toUpperCase(),SQLConverter.preEscapingIdentifier(columnName));if(rs.next()){returngetColumn(rs,0,tableName,columnMap,types);}returnnull;}privateCollection<ColumnBuilder>getColumns(StringtableName,Map<String,String>columnMap,String[]types)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();TreeMap<Integer,ColumnBuilder>ordm=newTreeMap();ResultSetrs=conn.getHSQLDBConnection().getMetaData().getColumns(null,"PUBLIC",tableName.toUpperCase(),null);while(rs.next()){intseq=rs.getInt("ORDINAL_POSITION")-1;ordm.put(Integer.valueOf(seq),getColumn(rs,seq,tableName,columnMap,types));}returnordm.values();}privateList<IndexBuilder>getIndexBuilders(StringtableName,Map<String,String>columnMap)throwsSQLException{ArrayList<IndexBuilder>arcl=newArrayList();addIndexBuildersSimple(tableName,columnMap,arcl);returnarcl;}privatevoidcheckPK(List<IndexBuilder>arcl,IndexBuilderibpk){if(ibpk==null){return;}Iterator<IndexBuilder>itib=arcl.iterator();List<IndexBuilder.Column>clspk=ibpk.getColumns();ArrayList<String>columnNamesPK=newArrayList();for(IndexBuilder.Columnclpk:clspk){columnNamesPK.add(clpk.getName().toUpperCase());}while(itib.hasNext()){IndexBuilderib=(IndexBuilder)itib.next();List<IndexBuilder.Column>cls=ib.getColumns();if(cls.size()==clspk.size()){booleanclsPK=true;for(IndexBuilder.Columncl:cls){if(!columnNamesPK.contains(cl.getName().toUpperCase())){clsPK=false;break;}}if(clsPK){itib.remove();}}}}privateIndexBuildergetIndexBuilderPK(StringtableName,Map<String,String>columnMap)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();ResultSetpkrs=conn.getMetaData().getPrimaryKeys(null,"PUBLIC",tableName.toUpperCase());IndexBuilderindpk=null;while(pkrs.next()){if(indpk==null){StringindexName="PrimaryKey";indpk=newIndexBuilder(indexName);indpk.setPrimaryKey();}indpk.addColumns(newString[]{getNormalizedName(pkrs.getString("COLUMN_NAME"),columnMap)});}returnindpk;}privatevoidaddIndexBuildersSimple(StringtableName,Map<String,String>columnMap,ArrayList<IndexBuilder>arcl)throwsSQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();ResultSetidxrs=conn.getMetaData().getIndexInfo(null,"PUBLIC",tableName,false,false);HashMap<String,IndexBuilder>hi=newHashMap();for(IndexBuilderib:arcl){hi.put(ib.getName(),ib);}while(idxrs.next()){StringcolName=getNormalizedName(idxrs.getString("COLUMN_NAME"),columnMap);StringindexName=idxrs.getString("INDEX_NAME");booleanunique=!idxrs.getBoolean("NON_UNIQUE");Stringad=idxrs.getString("ASC_OR_DESC");booleanasc=(ad==null)||(ad.equals("A"));if(!hi.containsKey(indexName)){IndexBuilderib=newIndexBuilder(indexName);if(unique){ib.setUnique();}arcl.add(ib);hi.put(indexName,ib);}IndexBuildertoIdx=(IndexBuilder)hi.get(indexName);toIdx.addColumns(asc,newString[]{colName});}}privatevoidsaveColumnsDefaults(String[]defaults,Boolean[]required,Columncl,intj)throwsIOException{PropertyMapmap=cl.getProperties();if((defaults!=null)&&(j<defaults.length)&&(defaults[j]!=null)){map.put("DefaultValue",DataType.TEXT,defaults[j]);}if((required!=null)&&(j<required.length)&&(required[j]!=null)&&(!cl.isAutoNumber())){map.put("Required",DataType.BOOLEAN,required[j]);}map.save();}privatevoidsaveColumnsDefaults(String[]defaults,Boolean[]required,Tabletable)throwsIOException{List<?extendsColumn>cols=table.getColumns();intj=0;if((defaults!=null)||(required!=null)){for(Columncl:cols){saveColumnsDefaults(defaults,required,cl,j);j++;}}}privateStringescape4Hsqldb(Stringtn){if(((tn.startsWith("["))&&(tn.endsWith("]")))||((tn.startsWith("`"))&&(tn.endsWith("`")))){tn=tn.substring(1,tn.length()-1);returnSQLConverter.preEscapingIdentifier(tn);}returntn;}privateStringescape4Access(Stringtn){if(((tn.startsWith("["))&&(tn.endsWith("]")))||((tn.startsWith("`"))&&(tn.endsWith("`")))){returntn.substring(1,tn.length()-1);}returntn;}publicvoidcreateTable(StringtableName,Map<String,String>columnMap,String[]types,String[]defaults,Boolean[]notNulls)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();Stringtn=escape4Access(tableName);Stringntn=escape4Hsqldb(tableName);Metadatamtd=newMetadata(conn.getHSQLDBConnection());TableBuildertb=newTableBuilder(tn);intidTable=mtd.newTable(tn,ntn,Metadata.Types.TABLE).intValue();Collection<ColumnBuilder>lcb=getColumns(ntn,columnMap,types);tb.addColumns(lcb);for(ColumnBuildercb:lcb){mtd.newColumn(cb.getName(),SQLConverter.preEscapingIdentifier(cb.getName()),cb.getType().name(),Integer.valueOf(idTable));}List<IndexBuilder>arcl=getIndexBuilders(ntn,columnMap);IndexBuilderibpk=getIndexBuilderPK(ntn,columnMap);checkPK(arcl,ibpk);if(ibpk!=null){arcl.add(ibpk);}for(IndexBuilderixb:arcl){tb.addIndex(ixb);}Tabletable=tb.toTable(db);saveColumnsDefaults(defaults,notNulls,table);LoadJetlj=newLoadJet(conn.getHSQLDBConnection(),db);lj.loadDefaultValues(table);createForeignKeys(tableName);Statementst=null;try{st=conn.createStatement();ResultSetrs=st.executeQuery("SELECT * FROM "+tableName);List<String>clns=getColumnNamesCreate(tn);while(rs.next()){Object[]record=newObject[clns.size()];inti=0;for(StringcolumnName:clns){record[(i++)]=rs.getObject(columnName);}newInsertCommand(table,record,null).persist();}}finally{if(st!=null){st.close();}}}publicvoiddropTable(StringtableName)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();tableName=escape4Access(tableName);Tablet=db.getTable(tableName);if(t==null){return;}Metadatamt=newMetadata(conn.getHSQLDBConnection());mt.dropTable(t.getName());Cursorc=t.getDefaultCursor();while(c.getNextRow()!=null){c.deleteCurrentRow();}DatabaseImpldbi=(DatabaseImpl)db;Tablecat=dbi.getSystemCatalog();Cursorcatc=cat.getDefaultCursor();Map<String,Object>row;while((row=catc.getNextRow())!=null){Stringname=(String)row.get("Name");if((name!=null)&&(name.equalsIgnoreCase(tableName))){Integerid=(Integer)row.get("Id");Tabletsa=db.getSystemTable("MSysACEs");HashMap<String,Object>rowtsa=newHashMap();rowtsa.put("ObjectId",id);Cursorcur=tsa.getDefaultCursor();if(cur.findNextRow(rowtsa)){cur.deleteCurrentRow();}catc.deleteCurrentRow();Tablesrs=db.getSystemTable("MSysRelationships");Cursorsrsc=srs.getDefaultCursor();while((row=srsc.getNextRow())!=null){StringszObject=(String)row.get("szObject");StringszReferencedObject=(String)row.get("szReferencedObject");if(((szObject!=null)&&(szObject.equalsIgnoreCase(tableName)))||((szReferencedObject!=null)&&(szReferencedObject.equalsIgnoreCase(tableName)))){srsc.deleteCurrentRow();}}}}conn.reloadDbIO();}publicvoidrenameTable(StringoldTableName,StringnewTableName)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();oldTableName=escape4Access(oldTableName);Stringtn=escape4Access(newTableName);Stringntn=escape4Hsqldb(newTableName);Tablet=db.getTable(oldTableName);if(t==null){return;}Metadatamt=newMetadata(conn.getHSQLDBConnection());mt.rename(t.getName(),tn,ntn);DatabaseImpldbi=(DatabaseImpl)db;Tablecat=dbi.getSystemCatalog();Cursorcatc=cat.getDefaultCursor();Map<String,Object>row;while((row=catc.getNextRow())!=null){Stringname=(String)row.get("Name");if((name!=null)&&(name.equalsIgnoreCase(oldTableName))){Integerid=(Integer)row.get("Id");HashMap<String,Object>rowtsa=newHashMap();rowtsa.put("ObjectId",id);Rowr=catc.getCurrentRow();r.put("Name",tn);catc.updateCurrentRowFromMap(r);Tablesrs=db.getSystemTable("MSysRelationships");Cursorsrsc=srs.getDefaultCursor();while((row=srsc.getNextRow())!=null){StringszObject=(String)row.get("szObject");StringszReferencedObject=(String)row.get("szReferencedObject");booleanupdated=false;if((szObject!=null)&&(szObject.equalsIgnoreCase(oldTableName))){row.put("szObject",tn);updated=true;}if((szReferencedObject!=null)&&(szReferencedObject.equalsIgnoreCase(oldTableName))){row.put("szReferencedObject",tn);updated=true;}if(updated){srsc.updateCurrentRowFromMap(row);}}}}conn.reloadDbIO();}publicvoidaddColumn(StringtableName,StringcolumnName,Map<String,String>columnMap,String[]types,String[]defaults,Boolean[]notNulls)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();Stringtn=escape4Access(tableName);Stringntn=escape4Hsqldb(tableName);Metadatamtd=newMetadata(conn.getHSQLDBConnection());ColumnBuildercb=getColumn(ntn,columnMap,types);Tablet=db.getTable(tn);Columncl=cb.addToTable(t);intidTable=mtd.getTableId(ntn.toUpperCase()).intValue();mtd.newColumn(cb.getName(),SQLConverter.preEscapingIdentifier(cb.getName()),cb.getType().name(),Integer.valueOf(idTable));saveColumnsDefaults(defaults,notNulls,cl,0);updateNewColumn2Defaut(tableName,columnName,t,cl);setHsqldbNotNull(tableName,columnName,types[0],cl);conn.reloadDbIO();}privatevoidsetHsqldbNotNull(StringtableName,StringcolumnName,Stringtype,Columncl)throwsSQLException,IOException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Booleanreq=(Boolean)cl.getProperties().getValue("Required");req=Boolean.valueOf((req!=null)&&(req.booleanValue()));StatementstNN=null;try{if(req.booleanValue()){stNN=conn.getHSQLDBConnection().createStatement();stNN.execute(SQLConverter.convertSQL("ALTER TABLE "+tableName+" ALTER COLUMN "+columnName+" SET NOT NULL ").getSql());}}finally{if(stNN!=null){stNN.close();}}}privatevoidupdateNewColumn2Defaut(StringtableName,StringcolumnName,Tablet,Columncl)throwsSQLException,IOException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();LoadJetlj=newLoadJet(conn.getHSQLDBConnection(),conn.getDbIO());lj.loadDefaultValues(cl);Stringdefault4SQL=lj.defaultValue4SQL(cl);PreparedStatementps=null;ObjectdefObj=lj.tryDefault(default4SQL);conn.setFeedbackState(true);if(default4SQL!=null){for(Rowrow:t){row.put(cl.getName(),defObj);t.updateRow(row);}conn.getDbIO().flush();}if((default4SQL!=null)||(cl.getType().equals(DataType.BOOLEAN))){try{defObj=(default4SQL==null)&&(cl.getType().equals(DataType.BOOLEAN))?Boolean.FALSE:defObj;ps=conn.getHSQLDBConnection().prepareStatement(SQLConverter.convertSQL("UPDATE "+tableName+" SET "+columnName+"="+"?").getSql());ps.setObject(1,defObj);ps.executeUpdate();}finally{if(ps!=null){ps.close();}}}conn.setFeedbackState(false);}publicvoidcreateIndex(StringtableName,StringindexName)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();Stringntn=escape4Hsqldb(tableName);Stringidn=escape4Hsqldb(indexName);Stringtn=escape4Access(tableName);Stringin=escape4Access(indexName);Tablet=db.getTable(tn);ResultSetidxrs=conn.getHSQLDBConnection().getMetaData().getIndexInfo(null,"PUBLIC",ntn.toUpperCase(),false,false);booleanasc=false;ArrayList<String>cols=newArrayList();IndexBuilderib=newIndexBuilder(in);while(idxrs.next()){StringdbIdxName=idxrs.getString("INDEX_NAME");if(dbIdxName.equalsIgnoreCase(idn)){booleanunique=!idxrs.getBoolean("NON_UNIQUE");if(unique){ib.setUnique();}StringcolName=idxrs.getString("COLUMN_NAME");Metadatamt=newMetadata(conn);colName=mt.getColumnName(ntn,colName);Stringad=idxrs.getString("ASC_OR_DESC");asc=(ad==null)||(ad.equals("A"));cols.add(colName);}}ib.addColumns(asc,(String[])cols.toArray(newString[cols.size()])).addToTable(t);}publicvoidcreatePrimaryKey(StringtableName)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();Stringntn=escape4Hsqldb(tableName);Stringtn=escape4Access(tableName);Tablet=db.getTable(tn);ResultSetpkrs=conn.getHSQLDBConnection().getMetaData().getPrimaryKeys(null,null,ntn.toUpperCase());ArrayList<String>cols=newArrayList();IndexBuilderib=newIndexBuilder("PrimaryKey");ib.setPrimaryKey();while(pkrs.next()){StringcolName=pkrs.getString("COLUMN_NAME");Metadatamt=newMetadata(conn);colName=mt.getColumnName(ntn,colName);cols.add(colName);}ib.addColumns((String[])cols.toArray(newString[cols.size()])).addToTable(t);}publicvoidcreateForeignKey(StringtableName,StringreferencedTable)throwsIOException,SQLException{Stringntn=escape4Hsqldb(tableName);Stringrntn=escape4Hsqldb(referencedTable);Stringtn=escape4Access(tableName);Stringrtn=escape4Access(referencedTable);createForeignKey(ntn,rntn,tn,rtn);}publicvoidcreateForeignKeys(StringtableName)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Stringntn=escape4Hsqldb(tableName);Stringtn=escape4Access(tableName);ResultSetfkrs=conn.getHSQLDBConnection().getMetaData().getImportedKeys(null,null,ntn.toUpperCase());HashSet<String>hs=newHashSet();while(fkrs.next()){hs.add(fkrs.getString("PKTABLE_NAME"));}Metadatamt=newMetadata(conn);for(Stringrntn:hs){createForeignKey(ntn,rntn,tn,mt.getTableName(rntn));}}privatevoidcreateForeignKey(Stringtn4Hsqldb,StringrefTn4Hsqldb,Stringtn4Access,StringrefTn4Access)throwsIOException,SQLException{UcanaccessConnectionconn=UcanaccessConnection.getCtxConnection();Databasedb=conn.getDbIO();Tablet=db.getTable(tn4Access);Tablert=db.getTable(refTn4Access);RelationshipBuilderrb=newRelationshipBuilder(rt,t);rb.setReferentialIntegrity();ResultSetfkrs=conn.getHSQLDBConnection().getMetaData().getCrossReference(null,null,refTn4Hsqldb.toUpperCase(),null,null,tn4Hsqldb.toUpperCase());Metadatamt=newMetadata(conn);while(fkrs.next()){StringcolName=fkrs.getString("FKCOLUMN_NAME");colName=mt.getColumnName(tn4Hsqldb,colName);StringrcolName=fkrs.getString("PKCOLUMN_NAME");rcolName=mt.getColumnName(refTn4Hsqldb,rcolName);rb.addColumns(rcolName,colName);shortdr=fkrs.getShort("DELETE_RULE");shortur=fkrs.getShort("UPDATE_RULE");switch(dr){case0:rb.setCascadeDeletes();break;case2:rb.setCascadeNullOnDelete();}if(ur==0){rb.setCascadeUpdates();}}rb.toRelationship(db);}}
I didn't try to print parameters ,,,
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
So is your code trying to pass 3333 as one of the parameter values? If so, then check the field definition in the Access table to see why it might be rejected.
❤️
1
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I am very grateful to you, you helped me a lot (Dev Gord Thompson) .... the code running correctly .
as you said I Check my definition of my access table , I forget I defined one record of them as Byte(255 char) so I was i pass large number test , in the end I deleted all rows and I defined it again. it's perfect.... thank very very much
🎉
1
Last edit: Abdelrazek Nageh 2019-02-15
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
DB.java
Last edit: Abdelrazek Nageh 2019-02-14
Look here
https://docs.oracle.com/javase/7/docs/api/java/util/Date.html#Date(int,%20int,%20int)
The first argument is
Thank you My sir...that's help me alot , if u don't mind to tell my how to insert Date from LocalDate..
ps.setObject(2,mylocalDate);
... I try it showing Erroris
thank u advance
Last edit: Abdelrazek Nageh 2019-02-14
UCanAccess 4.x depends on older versions of Jackcess and HSQLDB that do not support the
java.time
objects introduced in Java_8, e.g.,LocalDateTime
. The next release of UCanAccess, version 5.0, will be based on newer versions of Jackcess and HSQLDB that support those features.thank you Dev ^_^ that's nice news
HI Gord,
First : I compilled all files *.java and run correctly at first , when i run again (in same minute mostly) throw Exception WHY??!!! But after +2 minute excute correctly and nothing error and running .....Is that problem with JVM or Memory I ask
Code :
Error:
Can you helep me ?? I am sorry I tired you with me but I spent more than a day solving this problem, it 's a strange problem
Perhaps try printing out all of the parameter values. The Date value itself may not be the culprit.
when I discover the error in Library of Ucanaccess.jar by decompiler the Class of Persist2Jet.class
it rturn
In Class Persist2Let Code as you Know :
I didn't try to print parameters ,,,
So is your code trying to pass
3333
as one of the parameter values? If so, then check the field definition in the Access table to see why it might be rejected.I am very grateful to you, you helped me a lot (Dev Gord Thompson) .... the code running correctly .
as you said I Check my definition of my access table , I forget I defined one record of them as Byte(255 char) so I was i pass large number test , in the end I deleted all rows and I defined it again. it's perfect.... thank very very much
Last edit: Abdelrazek Nageh 2019-02-15